The apps, and the React Native project

One Expo Router codebase becomes the iPhone app, the Android app, the website and the desktop app. What that means for how it behaves, and how to run it yourself.
On your phone
0:41
The mobile client doing the same work as the desktop app, on the same account.

One codebase, four clients

The apps are a single Expo Router project written in React Native and TypeScript. The same source is compiled to a native iOS app, a native Android app, a static web export, and the desktop app — which loads the web bundle rather than reimplementing anything.
Expo SDK 53, React Native 0.79, React 19
Expo Router for navigation — routes are files under app/, exactly as the URLs read
React Native Web for the browser and desktop builds
This is why the desktop app and the website are visually identical, and why a route that works on the web works on a phone: they are the same screen, rendered by different platform layers.

Local inference on native

On iOS and Android the app links llama.rn, which executes GGUF weights in-process. There is no local server and no companion daemon — the model runs inside the app, which is what makes aeroplane mode a fair test of the offline claim.
The browser build cannot use llama.rn, so it uses WebLLM and a small set of WebGPU model builds instead. The Using models page covers exactly which models that leaves you on each client.

Running it from source

You do not need to build the app to use Local Keep AI — the released apps are in the stores and on the downloads page. This is for contributing, or for running a modified client.
npm install install dependencies
npm start Expo dev server, then pick a platform
npm run web browser only
npm run ios build and launch the iOS app (needs Xcode)
npm run android build and launch the Android app (needs Android Studio)
iOS and Android builds are real native builds, not Expo Go: llama.rn is a native module, so it needs a development build with the module compiled in.

Rebuilding the native projects

The ios/ and android/ directories are generated. Regenerating them wipes hand edits, so anything that has to survive lives in a post-build script that runs immediately afterwards.
npm run prebuild:clean regenerate both native projects, then re-apply the post-build steps
If you are changing native configuration, change it in the post-build script rather than in ios/ or android/ directly. An edit made only in the generated directory disappears on the next clean build, and it disappears silently — the build succeeds, it just no longer does what you changed.

Tests

npm test Jest unit and component tests
npm run lint ESLint over app/
npm run test:e2e:web Playwright against the web build
npm run test:e2e:ios / :android Detox against a simulator or emulator

How it talks to the backend

Every client authenticates against the same account and calls the same API, so a conversation started in the terminal appears on your phone. Local inference is the exception by design: when a model runs on your device, the prompt is never sent anywhere, so there is nothing for the other clients to sync until you say something that leaves the machine.

All documentation

Installation
Install the CLI on macOS, Linux or Windows, and sign in.
Setup, start to finish
The whole path on one page: install, sign in, pick local or hosted, get an answer.
Connecting accounts
One account everywhere, registering devices for the SMS bridge, and OAuth integrations.
Models
Pull open-weight models, switch between them, and run fully local.
Using models on every client
What runs locally in a terminal, a browser tab, a phone and the desktop app.
Commands
Every terminal command and every slash command, each with its own page.
Editor integrations
VS Code, Cursor, JetBrains, Neovim, Sublime, Zed, Godot, Unity, gh and git hooks.
The SMS bridge
Send a task to your own machine from your phone, and get the answer back.
Automation Studio
Idea to production: flows, per-step models, your machines or ours, live editing.
Enterprise seats
Licensed team seats under one owner account — invites, billing, and how seats resolve.
API reference
API keys, authentication, chat completions, pricing and errors — for your own software.
Notifications
Four channels, all opt-in, how to change them, and the limits on re-engagement.
Privacy
What leaves your machine, what never does, and how anonymisation works.
Troubleshooting
When a model will not load, a command hangs, or the CLI cannot be found.