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.

Claude Opus 5.5

Debounce helper in Kotlin?

Thought for 8s

Here’s a small helper that cancels the pending call whenever a new one arrives:

kotlin
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.

Web search Effort: High
Message Claude

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.

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.

Your own server, with automatic HTTPS
$ 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.

  1. Install Facet

    Download the APK and open it on any phone running Android 8.0 or later.

  2. Add an API key

    Paste a key from OpenAI, Anthropic, Google, OpenRouter or another provider. Facet checks it and loads the models.

  3. 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.