Every model.
One private home.
Facet is an open-source AI chat app for Android. Bring your own OpenAI, Anthropic, Google or OpenRouter key, pick any model, and keep every conversation end-to-end encrypted across your devices.
Free and open source under Apache-2.0. Requires Android 8.0 or later.
Debounce helper in Kotlin?
Here’s a small helper that cancels the pending call whenever a new one arrives:
fun <T> debounce( waitMs: Long, scope: CoroutineScope, action: (T) -> Unit, ): (T) -> Unit { var job: Job? = null return { value -> job?.cancel() job = scope.launch { delay(waitMs) action(value) } } }
Each call restarts the timer, so only the last one runs.
Bring your own keys. Use any model.
Add a key and Facet loads that provider’s current model list. Switch models in the middle of a conversation; Facet only shows the controls each model actually supports.
- OpenAI
- Anthropic
- Google Gemini
- OpenRouter
- Groq
- Mistral
- DeepSeek
- xAI
- Together
- Perplexity
- Fireworks
- Cerebras
- Ollama
- LM Studio
- Any OpenAI-compatible endpoint
You pay each provider directly at its API prices. Facet shows the tokens and estimated cost of every reply, including cached and reasoning tokens.
Claude Opus 5.5
Anthropic, 1M token context
Show thinkingStream reasoning summaries as the model works
Web searchLet the model search the web and cite sources
Fast modeFaster output at premium pricing
Tools that follow you everywhere.
- Web search for every modelClaude, GPT and Gemini search on their own. Add a Brave, Tavily, Exa, Jina or SearXNG key and every other model can search and read pages too, with sources cited.
- MCP serversConnect remote Model Context Protocol servers, with a token or a browser sign-in. Their tools work with any model that supports tools. Anything that changes data asks first, unless you turn on YOLO mode and let it run.
- SkillsReusable instructions the model loads when a task calls for them. Write your own or import SKILL.md files and bundles.
- Set up onceSearch keys, servers, sign-ins and skills sync to all your devices, end-to-end encrypted, and are ready in every new chat.
Encrypted before it leaves your phone.
Chats, files, assistants and API keys are encrypted on your device with a key only you hold. The sync server stores ciphertext it can’t read, and it never receives your password.
What the sync server can see
- Your email address
- How many encrypted items you’ve synced, their rounded-up sizes and when they changed
- Names of your signed-in devices and their IP addresses
What it can’t read
- Conversations, messages and attachments
- Your API keys
- Assistants, saved prompts and settings
- Your password — only a derived key ever leaves the device
Prompts go straight from your phone to the AI provider you choose, under that provider’s terms; Facet’s server never relays them. If you forget your password, your recovery code restores access. Without it, encrypted data can’t be recovered by anyone, including us. Read the privacy policy.
Open source, and yours to host.
Facet is licensed under Apache-2.0, and the app and sync server live in one repository. Use the hosted server at facet.dtsoftware.io, or run your own and point the app at it from Settings.
$ git clone <repository URL>
$ cd facet/deploy
$ cp .env.example .env
# set your domain and two random secrets
$ docker compose up -d
Native, light and quick.
- Kotlin and Jetpack ComposeNo web views, no ad or analytics SDKs. Just the app.
- Steady streamingReplies arrive at an even pace and render block by block, so long answers full of code and tables don’t stutter.
- Works without an accountEverything is stored on your phone. Create an account later and your chats sync, encrypted.
- Keeps going in the backgroundLeave mid-reply and the response still finishes. You get a notification when it’s ready.
- Locks when you wantOptional biometric lock, and previews hidden from the app switcher.
Get started in three steps.
-
Install Facet
Download the APK and open it on any phone running Android 8.0 or later.
-
Add an API key
Paste a key from OpenAI, Anthropic, Google, OpenRouter or another provider. Facet checks it and loads the models.
-
Create an account, if you like
Sign up to sync encrypted chats across your devices, and keep the recovery code Facet gives you somewhere safe.