How it works

A shell around your tools, not a fork of them.

OpenAxis doesn't rebuild three open-source apps and it doesn't ship a cloud. It runs them as native processes, routes their AI calls through one local proxy, and styles them with an injection layer that survives every upstream update.

ELECTRON (the shell — the only holder of your real keys) │ ├─ Sidebar Chat · Code · Work · Design · Orchestrator · Config │ ├─ Views three tools, each in its own native process, │ state preserved when you switch │ Work → openwork │ Code → opencode │ Design → open-design │ ├─ One config ~/.config/opencode/opencode.json │ points every tool at the local proxy │ ├─ Proxy :9999 127.0.0.1 only · Bearer required │ holds the real keys · routes to your provider │ injects project context + memory + web search │ └─ Secrets secrets.enc → memory → env vars at spawn (encrypted file, never plaintext on disk)
Four ideas

Everything follows from four decisions.

Each decision exists to remove a specific kind of friction.

One window holds everything, with state intact

Each tool opens in its own isolated view. Switch from Code to Design and back, your session is exactly where you left it. The shell keeps tools alive in the background instead of restarting them every time you switch.

One config sets up all three tools at once

The three integrated tools all run on the same underlying engine (OpenCode). So one config file covers all of them. Configure once — Work, Code, Design all inherit it. Add a provider and every tool can reach it immediately.

One proxy holds the keys; the tools only see a token

A small server runs on 127.0.0.1:9999. It holds your real API keys, reads from secrets.enc, and exposes a single OpenAI-compatible endpoint. The tools get a fake local token, never your real keys. The proxy routes each call to the right provider. It also applies a Stable Prefix Strategy for DeepSeek and Anthropic prompt caching — ~99% cache hit rate on DeepSeek models across Chat, Code, Work, and Design, and ~80% on the Orchestrator (being improved). Web search and context injection happen here too.

One override layer customizes apps without forking them

OpenAxis never edits a tool's source. The unified theme, the hidden native settings, the added features — all of it is CSS and JS injected at runtime. The overrides target stable selectors and re-apply themselves as the apps navigate. A git pull upstream lands cleanly. No merge conflicts.

Bring your own models

Five providers. Mix cloud and local freely.

One proxy speaks to all of them. Use a frontier model for hard work and a local one for the rest, switched per request.

Anthropic OpenAI OpenRouter Ollama (local) Google Gemini
Native, not containerized

No Docker. No daemon zoo. Just macOS.

The tools need to read and write your real files — that's the whole point of a code agent and a design tool. So they run as native macOS processes, not inside containers. OpenAxis starts them, pins the right runtime for each, captures their ports, and shuts them down with the app.

No virtualization layer to install. No compose file to babysit. You download one .dmg, drag it to Applications, and the app manages everything it needs.

For the full spec — ports, security model, config cascade, override catalog — see ARCHITECTURE.md.

Download it. Add your keys. Create.

Drag OpenAxis to your Applications folder, then add your API keys in the Config panel. Apple Silicon, macOS 14 and up.