An app that brings language models directly to your phone.
TypeScript
8,606
742 commits
updated Oct 12, 2026
A private AI assistant that runs entirely on your phone.
Chat with language models, give them a voice, and let them use tools — all on-device. No account, no cloud, no internet required.
pocketpal.dev · Get the app · Leaderboard · PalsHub · Discussions
Most AI apps are a thin window onto someone else's server — every message you type gets shipped off, logged, and analyzed somewhere you can't see. PocketPal flips that around: the AI lives on your phone, and your conversations never leave it.
Privacy note: The only data that ever leaves your device is what you explicitly choose to share — benchmark results (if you opt into the leaderboard) and feedback you submit through the app.
Three steps to your first chat:
You don't need to know any of this to use PocketPal — but if you're curious how a phone runs real AI offline, here's the short version.
PocketPal is a four-layer stack, from the silicon up to the chat UI. Each layer has one job, and the dependency direction is strictly top-down — the JS app talks to native bridges, bridges talk to inference engines, engines target hardware backends.
| Layer | What runs here |
|---|---|
| UI & Tool Use | The React Native app (UI via React Native Paper, state via MobX, chat history in WatermelonDB). The AgentRunner drives each chat turn — streaming tokens, dispatching Talents (tools) when the model calls them, and feeding results back for follow-up reasoning. Pals are configurable personas; PalsHub is the in-app marketplace for sharing and buying them. |
| Bridging | Native modules that connect JavaScript to the engines. llama.rn bridges LLM inference over JSI; react-native-speech and onnxruntime-react-native bridge text-to-speech. |
| Engine | The inference engines. llama.cpp runs language models in the quantized GGUF format. ONNX Runtime runs TTS voice models in the ONNX format. |
| Hardware | Where the math actually happens. PocketPal targets CPU (universal fallback), GPU (Metal on iOS, OpenCL on Qualcomm Adreno for Android), and NPU (Qualcomm Hexagon) — falling back gracefully and offloading partial layers when a full backend isn't available. |
Create personalized assistants:
Switch personas with the Pal picker on the chat page. Browse PalsHub in-app to discover community Pals, including premium ones via in-app purchase.
Creating a cocktail-recipe assistant
Go to App Info → "Sharing your thoughts", type your feedback — feature requests, suggestions, anything — and submit.
PocketPal is a standard React Native app. If you can build a React Native project, you can build PocketPal.
.nvmrc (currently 22.21.0); run nvm use to match it. Older Node will fail the engines check.packageManager is pinned to yarn@1.22.22.See the React Native environment setup for platform details.
git clone https://github.com/a-ghorbani/pocketpal-ai
cd pocketpal-ai
nvm use # match the pinned Node version
yarn install # install JS dependencies
(cd ios && pod install) # iOS only
yarn start # Metro bundler
yarn ios # build + run on iOS simulator
yarn android # build + run on Android emulator
Core on-device chat works without any backend keys; only PalsHub/auth features need additional configuration.
Native-change rule: if you change
package.json, a native module,ios/,android/, the Podfile, orbuild.gradle, re-runpod installand rebuild both platforms — a JS reload won't pick up native changes.
yarn lint # ESLint
yarn typecheck # tsc --noEmit
yarn test # Jest
yarn l10n:validate # validate locale JSON (placeholders, integrity)
Run yarn lint && yarn typecheck && yarn test before opening a PR. Commits are validated by Commitlint (Conventional Commits) via a Husky hook.
src/
├── screens/ # Chat, Models, Pals, Benchmark, Settings, About, …
├── components/ # Reusable UI
├── store/ # MobX stores (Model, ChatSession, Pal, TTS, HF, Benchmark, …)
├── services/
│ ├── agent/ # AgentRunner — the chat / tool loop
│ ├── talents/ # Tool engines + registries
│ ├── tts/ # TTS engines (kokoro, kitten, supertonic, system)
│ ├── palshub/ # PalsHub marketplace integration
│ └── downloads/ # Model download manager
├── database/ # WatermelonDB schema, models, migrations
├── repositories/ # Data-access layer over the DB
├── locales/ # i18n JSON + lazy loader (index.ts is the registry)
└── hooks/ api/ theme/ utils/ config/ specs/
Versions are pinned in package.json; the highlights:
| Area | Choice |
|---|---|
| Framework | React Native 0.82.1, React 19.1.1 (New Architecture) |
| Language | TypeScript 5.0.4 |
| UI | React Native Paper 5.14.5, React Navigation |
| State | MobX 6 (mobx, mobx-react, mobx-persist-store) |
| Persistence | WatermelonDB (chat history), AsyncStorage (settings), Keychain (secrets) |
| LLM | llama.rn 0.13.0-rc.5 → llama.cpp b11118 · GGUF |
| TTS | react-native-speech 2.3.1 + onnxruntime-react-native 1.23.2 · ONNX |
| Tooling | Yarn 1 (Classic), ESLint, Prettier, Jest, Husky + Commitlint |
A Talent is a tool the model can call mid-conversation. Engines are registered in a TalentRegistry, exposed to the model as tool schemas; the AgentRunner detects a call, runs the engine, and returns the result for the next turn.
| Talent | Engine | Does |
|---|---|---|
calculate | CalculateEngine | Arithmetic / expression evaluation |
datetime | DatetimeEngine | Current date / time |
render_html | RenderHtmlEngine | Renders model-produced HTML in chat |
Good first contributions:
TalentEngine and register it in src/services/talents/.src/services/tts/engines/.src/locales/ (or translate on Weblate).Contributions are welcome — bug reports, fixes, features, translations, and docs all help.
git checkout -b feature/your-feature-nameyarn ios / yarn android). Re-run pod install + rebuild if you touched native code.yarn lint && yarn typecheck && yarn testgit commit -m "feat: add new talent"Please read the Contributing Guidelines and Code of Conduct first. Want to translate PocketPal into your language? Join us on Weblate.
Have an idea or found a bug? Open an issue or start a discussion.
Licensed under the MIT License.
PocketPal AI stands on the shoulders of the open-source community, including:
Made with ❤️ for people who want AI that stays on their phone.
If PocketPal is useful to you, consider giving it a ⭐ — it helps others find the project.
(top 24 of 46)
3,910 followers · starred Dec 2024
78 followers · starred Dec 2024
13,582 followers · starred Oct 2024
749 followers · starred Oct 2024
An app that brings language models directly to your phone.
TypeScript
8,606
742 commits
updated Oct 12, 2026
A private AI assistant that runs entirely on your phone.
Chat with language models, give them a voice, and let them use tools — all on-device. No account, no cloud, no internet required.
pocketpal.dev · Get the app · Leaderboard · PalsHub · Discussions
Most AI apps are a thin window onto someone else's server — every message you type gets shipped off, logged, and analyzed somewhere you can't see. PocketPal flips that around: the AI lives on your phone, and your conversations never leave it.
Privacy note: The only data that ever leaves your device is what you explicitly choose to share — benchmark results (if you opt into the leaderboard) and feedback you submit through the app.
Three steps to your first chat:
You don't need to know any of this to use PocketPal — but if you're curious how a phone runs real AI offline, here's the short version.
PocketPal is a four-layer stack, from the silicon up to the chat UI. Each layer has one job, and the dependency direction is strictly top-down — the JS app talks to native bridges, bridges talk to inference engines, engines target hardware backends.
| Layer | What runs here |
|---|---|
| UI & Tool Use | The React Native app (UI via React Native Paper, state via MobX, chat history in WatermelonDB). The AgentRunner drives each chat turn — streaming tokens, dispatching Talents (tools) when the model calls them, and feeding results back for follow-up reasoning. Pals are configurable personas; PalsHub is the in-app marketplace for sharing and buying them. |
| Bridging | Native modules that connect JavaScript to the engines. llama.rn bridges LLM inference over JSI; react-native-speech and onnxruntime-react-native bridge text-to-speech. |
| Engine | The inference engines. llama.cpp runs language models in the quantized GGUF format. ONNX Runtime runs TTS voice models in the ONNX format. |
| Hardware | Where the math actually happens. PocketPal targets CPU (universal fallback), GPU (Metal on iOS, OpenCL on Qualcomm Adreno for Android), and NPU (Qualcomm Hexagon) — falling back gracefully and offloading partial layers when a full backend isn't available. |
Create personalized assistants:
Switch personas with the Pal picker on the chat page. Browse PalsHub in-app to discover community Pals, including premium ones via in-app purchase.
Creating a cocktail-recipe assistant
Go to App Info → "Sharing your thoughts", type your feedback — feature requests, suggestions, anything — and submit.
PocketPal is a standard React Native app. If you can build a React Native project, you can build PocketPal.
.nvmrc (currently 22.21.0); run nvm use to match it. Older Node will fail the engines check.packageManager is pinned to yarn@1.22.22.See the React Native environment setup for platform details.
git clone https://github.com/a-ghorbani/pocketpal-ai
cd pocketpal-ai
nvm use # match the pinned Node version
yarn install # install JS dependencies
(cd ios && pod install) # iOS only
yarn start # Metro bundler
yarn ios # build + run on iOS simulator
yarn android # build + run on Android emulator
Core on-device chat works without any backend keys; only PalsHub/auth features need additional configuration.
Native-change rule: if you change
package.json, a native module,ios/,android/, the Podfile, orbuild.gradle, re-runpod installand rebuild both platforms — a JS reload won't pick up native changes.
yarn lint # ESLint
yarn typecheck # tsc --noEmit
yarn test # Jest
yarn l10n:validate # validate locale JSON (placeholders, integrity)
Run yarn lint && yarn typecheck && yarn test before opening a PR. Commits are validated by Commitlint (Conventional Commits) via a Husky hook.
src/
├── screens/ # Chat, Models, Pals, Benchmark, Settings, About, …
├── components/ # Reusable UI
├── store/ # MobX stores (Model, ChatSession, Pal, TTS, HF, Benchmark, …)
├── services/
│ ├── agent/ # AgentRunner — the chat / tool loop
│ ├── talents/ # Tool engines + registries
│ ├── tts/ # TTS engines (kokoro, kitten, supertonic, system)
│ ├── palshub/ # PalsHub marketplace integration
│ └── downloads/ # Model download manager
├── database/ # WatermelonDB schema, models, migrations
├── repositories/ # Data-access layer over the DB
├── locales/ # i18n JSON + lazy loader (index.ts is the registry)
└── hooks/ api/ theme/ utils/ config/ specs/
Versions are pinned in package.json; the highlights:
| Area | Choice |
|---|---|
| Framework | React Native 0.82.1, React 19.1.1 (New Architecture) |
| Language | TypeScript 5.0.4 |
| UI | React Native Paper 5.14.5, React Navigation |
| State | MobX 6 (mobx, mobx-react, mobx-persist-store) |
| Persistence | WatermelonDB (chat history), AsyncStorage (settings), Keychain (secrets) |
| LLM | llama.rn 0.13.0-rc.5 → llama.cpp b11118 · GGUF |
| TTS | react-native-speech 2.3.1 + onnxruntime-react-native 1.23.2 · ONNX |
| Tooling | Yarn 1 (Classic), ESLint, Prettier, Jest, Husky + Commitlint |
A Talent is a tool the model can call mid-conversation. Engines are registered in a TalentRegistry, exposed to the model as tool schemas; the AgentRunner detects a call, runs the engine, and returns the result for the next turn.
| Talent | Engine | Does |
|---|---|---|
calculate | CalculateEngine | Arithmetic / expression evaluation |
datetime | DatetimeEngine | Current date / time |
render_html | RenderHtmlEngine | Renders model-produced HTML in chat |
Good first contributions:
TalentEngine and register it in src/services/talents/.src/services/tts/engines/.src/locales/ (or translate on Weblate).Contributions are welcome — bug reports, fixes, features, translations, and docs all help.
git checkout -b feature/your-feature-nameyarn ios / yarn android). Re-run pod install + rebuild if you touched native code.yarn lint && yarn typecheck && yarn testgit commit -m "feat: add new talent"Please read the Contributing Guidelines and Code of Conduct first. Want to translate PocketPal into your language? Join us on Weblate.
Have an idea or found a bug? Open an issue or start a discussion.
Licensed under the MIT License.
PocketPal AI stands on the shoulders of the open-source community, including:
Made with ❤️ for people who want AI that stays on their phone.
If PocketPal is useful to you, consider giving it a ⭐ — it helps others find the project.
(top 24 of 46)
3,910 followers · starred Dec 2024
78 followers · starred Dec 2024
13,582 followers · starred Oct 2024
749 followers · starred Oct 2024