TOON cuts ~65% off every reply
Compact field aliases, enum codes, and bare values mean a 400-token JSON ticket lands in your context as ~120 TOON tokens.
Orkestra is a single ~20 MB Docker container that exposes 13 MCP tools and replies in TOON — a compact format that cuts ~65% off every response. No cloud. No rate limits. No per-request bill.
PROJECT_ID=myapp go run ./cmd/serversqlite WAL ready · /data/orkestra.dbmcp listener on :8080 · 13 tools registeredTOON/1 · backups every 1h
Edit the JSON on the left. The right side is what your agent actually sees in its context window. The badge in the middle is the savings.
TOON/1 T{id:myapp-001,t:"Fix auth bug",s:ip,p:h,typ:bug,lbl:[auth,security],ca:2024-01-15,ua:2024-01-15T10:00:00Z}Purpose-built primitives for agentic workflows.
Compact field aliases, enum codes, and bare values mean a 400-token JSON ticket lands in your context as ~120 TOON tokens.
A single ~20 MB Docker image. SQLite WAL. No telemetry, no phone-home, no cloud sync. The only network surface is the MCP HTTP listener.
Built so a swarm of agents can chew through a backlog without stepping on each other. No leader election, no leases — just one CAS.
Spawn an epic. Drop child tickets. Watch a fleet of agents pick them up in parallel —
ticket_claim is an atomic CAS, so no two agents ever grab the same ticket.
ticket_claim is atomic — no two agents grab the same one.
Filter by category, search by keyword, click any card to expand its full schema.
Same data your agent sees on /skill.
Create a new ticket. Always lands in backlog (s=bk).
| Name | Type | Default | Notes |
|---|---|---|---|
title * | string | — | Non-empty |
type | enum | tsk | bug · ft · tsk · ep · chr |
priority | enum | m | cr · h · m · l |
description | string | — | |
labels | string[] | [] | |
parent_id | string | — | Parent ticket ID |
exec_mode | enum | par | par · seq |
exec_order | integer | — | Required for seq children; UNIQUE(parent_id, exec_order) |
T{...}TOON/1 T{id:myapp-011,t:Fix login bug,s:bk,p:h,typ:bug,ca:2024-01-15,ua:2024-01-15T10:00:00Z}Fetch a single ticket with full relations (comments, links, child IDs).
| Name | Type | Default | Notes |
|---|---|---|---|
id * | string | — |
T{...} including cmt, lnk, ch arraysnot_foundAtomically take ownership. Moves bk/td/bl → ip.
| Name | Type | Default | Notes |
|---|---|---|---|
id * | string | — |
T{s:ip,...} — save ua as your etagconflictseq_blockednot_foundUpdate any field. Always supply etag when working with concurrent agents.
| Name | Type | Default | Notes |
|---|---|---|---|
id * | string | — | |
etag | string | — | ua from last read; stale → conflict |
title | string | — | |
status | enum | — | bk · td · ip · dn · bl · cl |
priority | enum | — | |
type | enum | — | |
description | string | — | |
assignee | string | — | |
labels | string[] | — | Replaces entire array |
exec_mode | enum | — | |
exec_order | integer | — |
T{...}conflictnot_foundinvalidSoft-delete. Sets archived_at. Excluded from all queries.
| Name | Type | Default | Notes |
|---|---|---|---|
id * | string | — |
{ok:true}Filter tickets across any combination of fields. Ordered by created_at DESC.
| Name | Type | Default | Notes |
|---|---|---|---|
status | enum | — | |
priority | enum | — | |
type | enum | — | |
labels | string[] | — | AND filter |
limit | integer | 50 | max 200 |
include_archived | boolean | false |
[T{...}]Priority-ordered view of bk tickets. Use this to decide what to do next.
| Name | Type | Default | Notes |
|---|---|---|---|
priority | enum | — | |
type | enum | — | |
labels | string[] | — | |
limit | integer | 50 |
[T{...}] ordered cr → h → m → l, oldest-first within priorityKanban snapshot grouped by status.
| Name | Type | Default | Notes |
|---|---|---|---|
type | enum | — | |
labels | string[] | — |
BOARD{bk:[...],td:[...],ip:[...],dn:[...],bl:[...],cl:[...]}Full-text search across title, description, labels via SQLite FTS5.
| Name | Type | Default | Notes |
|---|---|---|---|
query * | string | — | FTS5-ranked; supports phrase search |
include_archived | boolean | false |
[T{...}] ranked by relevanceList children of a ticket, sorted by exec_order.
| Name | Type | Default | Notes |
|---|---|---|---|
id * | string | — | |
recursive | boolean | false | |
depth | integer | 3 | 1-10; only when recursive=true |
[T{...}]Mermaid flowchart of ticket hierarchy with status colors.
| Name | Type | Default | Notes |
|---|---|---|---|
id * | string | — | Root of the diagram |
depth | integer | 3 | 1-10 |
Mermaid flowchart TDAppend a note to a ticket.
| Name | Type | Default | Notes |
|---|---|---|---|
id * | string | — | |
body * | string | — | |
author | string | llm |
Updated T{...} with new entry in cmtCreate a directional relationship between two tickets.
| Name | Type | Default | Notes |
|---|---|---|---|
from_id * | string | — | |
to_id * | string | — | |
link_type * | enum | — | blk · rel · dup |
{ok:true} (idempotent)Auto-detects Claude Code, Cursor, Copilot, Windsurf, and Zed.
Pick your setup. They all land at the same place: a local MCP endpoint your agent talks to.
git clone https://github.com/Vijay431/Orkestra cd Orkestra PROJECT_ID=myapp ./install.sh
Detects Claude Code · Cursor · Copilot · Windsurf · Zed · Continue.dev and wires up the MCP entry for you.
PROJECT_ID=myapp docker compose up -d curl http://localhost:8080/health
Single ~20 MB scratch image. SQLite lives in a named volume; survives compose down (but not down -v).
PROJECT_ID=dev DB_PATH=/tmp/dev.db go run ./cmd/server
Go 1.22+. Pure-Go SQLite (modernc.org/sqlite) — no CGO needed.
claude mcp add orkestra-myapp \ --transport http http://localhost:8080/sse
After the server is up, register it as an MCP endpoint.
Orkestra runs offline, on your hardware, with the same MCP surface as the cloud alternatives. MIT-licensed. Fork it, ship it.