Your AI. Your machine. Your rules.
A desktop chat app for Ollama models that keeps everything — conversations, files, settings — on your own computer. No account. No cloud. No telemetry. No exceptions.
English · Português · Español · Français · Deutsch · Italiano · Русский · 简体中文 · 日本語
Every mainstream AI chat app asks you to trade your thinking for convenience. You sign up, you type something personal, and it lands on somebody else's server — logged, retained, and used on terms you did not write.
Øxygen is the opposite trade. Open it, type, get an answer, close it. The model
runs on your hardware. The database is a file in your home directory that you can
read, back up, move, or delete with rm. There is nothing to log out of because
there was never anything to log into.
Open it, type, get your answer, done. That is the whole product.
| Chat | Streaming replies from any Ollama model, with reasoning shown separately for models that think out loud. |
| Files and photos | Drop in PDFs, Word, PowerPoint, Excel, OpenDocument, code, or plain text and it reads them. Images go to vision models. |
| Library | Keep documents you return to often; attach them to any conversation in one click. |
| Search by meaning | With an embedding model installed, finds the right passage in your files and history even when you don't recall the exact words. |
| Web search | Off by default. When you turn it on, only your search terms leave the machine — never your conversation. |
| Deep search | Splits a question into sub-questions, gathers evidence from your files and the web, checks what's missing, then answers with citations. |
| Voice | Speak instead of typing, transcribed by a local Whisper — the recording is deleted the moment it's transcribed. |
| Pictures | Generate images through a local Stable Diffusion server. Your prompt never leaves the machine. |
| Nine languages | English, Português (Brasil), Español, Français, Deutsch, Italiano, Русский, 简体中文, 日本語. |
| Accessibility | Three contrast levels, reduced motion, larger text, bolder text, wider letter spacing, focus outlines. |
| Your data | Turn off storage entirely, set a retention window, export everything to JSON or Markdown, delete it all in one click. |
Øxygen does not ship a model and never downloads one behind your back. Get Ollama from ollama.com, then pull at least one chat model:
ollama pull llama3.2That is the only requirement. Everything else is optional and the app tells you, in plain language, what each extra model is for.
Prebuilt bundles are on the releases page. To build it yourself:
git clone <this-repository>
cd oxygen
pnpm install
pnpm tauri build # or: pnpm tauri devPrerequisites: Rust 1.77+, Node 18+, and pnpm. On Debian or Ubuntu you also need the WebKit stack:
sudo apt install libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev \
librsvg2-dev build-essential curl file patchelfOptional but recommended: poppler-utils for PDF text and ffmpeg for voice.
Open Settings → Setup inside the app and it shows this list with live install status and a copy-ready command for anything missing.
| Model | ollama pull |
What it does for you |
|---|---|---|
| Chat | llama3.2 |
Answers you. The only model Øxygen genuinely cannot work without. |
| Small chat | gemma3:1b |
A fast fallback if you have little memory to spare. |
| Embeddings | nomic-embed-text |
Makes your files, history and web results searchable by meaning rather than exact words. |
| Vision | llava |
Reads photos, screenshots and scanned pages you attach. |
| Reasoning | deepseek-r1:8b |
Works a problem out step by step, shown in a collapsible panel. |
Two features need a separate program because Ollama does not provide them:
- Voice needs whisper.cpp with a
ggml model, or
pip install openai-whisper. - Pictures need Stable Diffusion WebUI
running with
--api, or ComfyUI.
Both run locally. Both are opt-in. Neither is required to chat.
One folder. On Linux:
~/.local/share/app.oxygen.desktop/
├── oxygen.db SQLite: chats, messages, settings, search index
├── attachments/ files you sent in conversations
├── library/ files you saved for reuse
├── generated/ pictures you generated
└── exports/ anything you exported
macOS uses ~/Library/Application Support/app.oxygen.desktop, Windows uses
%APPDATA%\app.oxygen.desktop. Settings → Data controls → Open data folder
takes you straight there.
Back it up by copying the folder. Delete everything by deleting the folder. There is no other copy anywhere.
Being specific matters more than a promise, so here is the complete list:
| Destination | When | What is sent |
|---|---|---|
Your local Ollama (127.0.0.1:11434) |
Every message | Your prompt and the conversation history |
Your local image server (127.0.0.1:7860) |
Only if you enable pictures | Your image description |
| A search engine you choose | Only if you enable web search and press the search button on a message | Your search terms only — never the conversation |
That's it. No analytics, no crash reporting, no update pings, no accounts, no usage statistics. The web search provider defaults to DuckDuckGo; point it at your own SearXNG instance if you want even that under your control.
Ctrl/Cmd + N |
New chat |
Ctrl/Cmd + K |
Search your history |
Ctrl/Cmd + , |
Settings |
Ctrl/Cmd + B |
Toggle sidebar |
Enter |
Send · Shift + Enter for a new line |
src/ React + TypeScript. Design tokens drive theme, contrast,
density and text size — one attribute on <html> restyles
the whole app.
src-tauri/ Rust. Ollama client, SQLite storage, file text extraction,
embeddings, search, voice capture, image generation.
Some notable choices and why:
- No FTS5. Candidate rows come back with
LIKEand are ranked in Rust. At personal-archive scale that is fast enough, and it keeps the schema free of virtual tables that would complicate export and migration. - Vectors in a plain table. Tens of thousands of chunks is microseconds of dot products. A real vector index would be complexity with no payoff here.
- Voice capture in a subprocess.
getUserMediasupport in WebKitGTK varies too much across distributions to depend on. - Ephemeral chats use an in-memory SQLite database. When you turn storage off, reads and writes take the identical code path — only the connection differs, and nothing reaches disk.
Contributions are welcome. Start with CONTRIBUTING.md, and please read CODE_OF_CONDUCT.md.
Adding a language is genuinely a one-file change — copy src/i18n/en.ts,
translate the values, and add one line to src/i18n/index.ts. Missing keys fall
back to English, so a partial translation is still useful.
MIT — see LICENSE. Use it, fork it, sell it, embed it. Third-party components are credited in NOTICE.md.