Version 0.6.0

A chat client that is just a Mac app

Acai is native SwiftUI: one small binary, no Electron, no bundled runtime, no account. It talks to Anthropic, OpenAI, Gemini, Bedrock or a gateway on your own machine, using your key. Chats are Markdown files in your home directory.

macOS 14 or later · bring your own API key

Refactor the parser claude-opus-5

Which files still parse the old front matter?

Two of them. I read the history directory to check.

fs__read_dir  ~/.acai/history  → 41 files

OKFParser.swift and HistoryStore.swift. The rest go through the shared decoder already.

Ask anything…

Everything you need

No account. No runtime. No lock-in.

Everything Acai knows lives in ~/.acai — a TOML file, your chats as Markdown, and the tools and agents you point it at. Nothing is hidden in a database, and nothing is exposed to a model unless you switch it on.

Any provider.
Anthropic, OpenAI, Gemini and Bedrock are built in. Anything OpenAI-shaped — Ollama, LM Studio, vLLM, LiteLLM — is one base_url away.
Your keys stay yours.
Keys come from your config or your environment and go only to the provider. They are withheld from every MCP server Acai spawns.
Switch models mid-chat.
Every reply records the model that produced it, and the transcript marks where it changed. Start on a cheap model, finish on a good one.
Tools and remote agents.
MCP servers over stdio or HTTP, and A2A agents whose skills sit in the same catalogue. Per-chat switches decide what a model may reach.
Config is a file.
config.toml holds providers, prompt and switches. ⌘R reloads settings, servers and skills without a restart.
History you can grep.
One Markdown file per chat — YAML front matter, then the turns. Readable, greppable, editable, and yours if you ever stop using Acai.

Point it at a model and go

A provider is a few lines of TOML. Keep several and switch between them from the toolbar — a frontier model for hard work, something local for the rest.

anthropic
Messages API, SSE streaming, native tool use, prompt caching on by default.
openai
Also the shape every local gateway speaks.
gemini
Streaming, with tool schemas reduced to the subset Gemini accepts.
bedrock
Converse API with a bearer key.
~/.acai/config.toml
default_provider = "claude"
system_prompt = "You are Acai, a concise and helpful assistant."
max_tool_rounds = 8

[providers.claude]
kind = "anthropic"
model = "claude-opus-5"
api_key_env = "ANTHROPIC_API_KEY"
max_tokens = 8192

[providers.local]
kind = "openai"
model = "llama3.3"
base_url = "http://localhost:11434"

Frequently asked questions

Can’t find what you’re after? The README goes further, or open an issue.

Do I need a subscription?
No. Acai has no account and no server of its own. You bring an API key — or a local gateway, which costs nothing — and pay whoever serves the model, if anyone.
Where does my data go?
To the provider you configured, and nowhere else. No telemetry, no analytics, no crash reporting. Chats, logs and settings stay in ~/.acai.
What does it cost to run?
Whatever your provider charges for the tokens. Acai caps the replayed history at a token budget you set and places prompt-cache breakpoints where the provider supports them, so a long chat doesn’t quietly become an expensive one.
Can it use my own tools?
Yes — any MCP server, over stdio or HTTP, described by a JSON file in ~/.acai/tools. Remote A2A agents go in ~/.acai/agents. Nothing is offered to a model until you enable it for that chat.
What do I need to run it?
macOS 14 or later. The release build is signed and notarized, so it opens without a Gatekeeper detour. To build it yourself you need a Swift 6 toolchain and make app.
Why not Electron?
Because a chat window doesn’t need a browser inside it. Acai is one ~1.3 MB binary with zero third-party packages — even the TOML parser and the AWS event-stream decoder are in-tree.

Download Acai

Drag it to Applications, add a key, start a chat.