
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.
| Platform | |
|---|---|
| iOS / iPadOS | |
| Android |
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. |
📥 Download & load a model

💬 Chat

🎭 Pals & PalsHub
Create personalized assistants: - Assistant Pal — pick a default model, set a system prompt (write it yourself or have the app generate one), and customize the chat input color. - Roleplay Pal — everything above, plus location, the AI's role, and other contextual parameters.
Switch personas with the Pal picker on the chat page. Browse PalsHub in-app to discover community Pals, including premium ones via in-app checkout (US iOS & Android).

Creating a cocktail-recipe assistant
📊 Benchmark your device

🔑 Set up a Hugging Face token (for gated models)

💌 Send feedback
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.
Repository layout
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/
Tech stack
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.12.4 → llama.cpp · GGUF |
| TTS | react-native-speech 2.3.1 + onnxruntime-react-native 1.23.2 · ONNX |
| Tooling | Yarn 1 (Classic), ESLint, Prettier, Jest, Husky + Commitlint |
Extending PocketPal
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:
- A new Talent — implement a TalentEngine and register it in src/services/talents/.
- A new TTS engine — add it under src/services/tts/engines/.
- A new locale — add a JSON file in 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 nat$ claude mcp add pocketpal-ai \
-- python -m otcore.mcp_server <graph>