The terminal coding agent that runs on your gateway.
Any model. Any provider. No account. No telemetry. No ads.
ONYX is the terminal coding agent of the Innotel Platform Stack: it speaks any OpenAI-compatible gateway — the bundled OmniRoute, or one you already run — so any model or provider can drive it, with no account, no telemetry and no hosted backend. The agent, its tools and its token counting run locally; only the gateway sees a request, and the compose stack brings that gateway up beside it. Landing page: innotelinc.github.io/freebuff
| Problem | Answer |
|---|---|
| A hosted coding agent holds the code and the account. | Run the agent locally against a gateway you control. |
| Every agent wants a different provider. | One OpenAI-compatible gateway serves them all. |
| Observability usually means phoning home. | There is no telemetry and no user account. |
Its place in the stack is docs/stack.md; the canonical definition of the shared layers is the Innotel Platform Stack.
Onyx is a multi-agent coding agent for your terminal that ditches the hosted backend entirely. Point it at any OpenAI-compatible gateway — OmniRoute, LiteLLM, OpenRouter, Ollama, vLLM, your own router — and every request goes to your infrastructure:
┌──────────────┐ ┌─────────────────────┐ ┌──────────────────┐
│ Onyx TUI │──────▶│ Your gateway │──────▶│ Any provider │
│ (this repo) │ ◀────── │ :20128/v1 │ ◀────── │ free & paid │
└──────────────┘ └─────────────────────┘ └──────────────────┘
▲ ▲
└── zero hosted-backend └── one API key, one endpoint,
traffic — ever 350+ providers behind it
- 🧠 Specialized agents — context gathering, planning, editing, review, and research agents divide the work instead of one monolithic prompt
- 🔀 Any model, any agent — every mode (DEFAULT / LITE / MAX / PLAN) is unlocked; route them all through one model or let the gateway decide
- 🐳 One-command stack —
docker compose upbrings the gateway, a key generator, and Onyx up together - 🔒 Nothing leaves the machine — no analytics, no health pings, no ad auctions, no update checks; verified by tests
- ⚡ Fast & local-first — built on Bun, tools run in-process, token counting is local
git clone https://github.com/innotelinc/freebuff.git
cd freebuff
docker compose up -d --build omniroute # start the gateway
docker compose run --rm onyx # open the Onyx TUIThe entrypoint waits for the gateway, auto-generates an API key, selects
the free coding model pool (auto/coding:free), and drops you into the TUI
with your project mounted at /workspace.
Or pull the prebuilt client image instead of building (pinned to the latest
verified release):
ghcr.io/innotelinc/onyx:v0.1.0 — see
docs/omniroute-docker.md. latest tracks main;
every release gets its own v* tag. The publish workflow builds and pushes the
image, and runs the live round-trip smoke test on the way where a gateway is
declared for the repository (ONYX_SMOKE_GATEWAY=true) — a hosted runner has no
providers of its own to round-trip through.
bun install
export OMNIROUTE_BASE_URL='http://localhost:20128/v1' # your gateway, /v1 included
export OMNIROUTE_API_KEY='...' # optional
export OMNIROUTE_MODEL='anthropic/claude-sonnet-4' # optional: pin one model
bun start-cliThat's it — no login, no session admission, no credits. The CLI boots straight into chat and talks only to your gateway.
| Variable | Required | What it does |
|---|---|---|
OMNIROUTE_BASE_URL |
yes | Gateway base URL including the version path (…/v1) |
OMNIROUTE_API_KEY |
no | Bearer token for the gateway (defaults to a local placeholder) |
OMNIROUTE_MODEL |
no | Force every agent onto one model id; unset = gateway decides |
Because there is no hosted backend, everything that would have talked to one is refused locally (and pinned by tests):
| Surface | Behavior in gateway mode |
|---|---|
| PostHog analytics + log mirror | never created / never ships |
| Free-session admission, login wall, ads | switched off |
| Usage/subscription/streak queries | never fire |
| Feedback, sponsored proposals | refuse locally with a message |
| Health pings, remote agent validation | local answers only |
| Self-update + binary downloads | disabled |
Full details in docs/omniroute.md.
Don't have one? The bundled OmniRoute submodule is pinned and containerized — see docs/omniroute-docker.md for the two-minute setup, or bring your own OpenAI-compatible endpoint.
| Path | What lives there |
|---|---|
cli/ |
the terminal UI (OpenTUI + React) |
sdk/ |
the agent SDK — model & backend routing |
common/ |
shared types, tools, schemas, gateway cfg |
packages/agent-runtime |
agent loop, tool handlers, web APIs |
agents/ |
bundled agent definitions |
docker/ |
container entrypoint (key generation) |
docs/ |
gateway mode + docker guides |
The client image is published to GHCR by CI. Where a live gateway is configured for the repository, the round-trip smoke test runs before the push. Pin to a release tag:
docker pull ghcr.io/innotelinc/onyx:v0.1.0Releases are cut with Actions → Release (enter a version like 0.1.1);
it tags the repo, opens the GitHub release with generated notes, and the
publish workflow pushes the matching ghcr.io/innotelinc/onyx:v… image.
The package is public: docker pull ghcr.io/innotelinc/onyx needs no docker login.
This is a TypeScript monorepo built with Bun:
git clone https://github.com/innotelinc/freebuff.git
cd freebuff
bun install
bun start-cliRun the checks before opening a PR:
cd cli && bun run typecheck && bun test