claudeers.
// Developer Tools

orrery

A local-first cockpit for your AI coding agents: Claude Code, Kimi Code, DSH, Codex, OpenCode, Z Code and Antigravity sessions in one window — accurate token…

// Developer Tools[ cli ][ api ][ desktop ][ web ][ claude ]#claude#ai-agents#antigravity#claude-code#codex#deepseek#developer-tools#kimi-code#devtools◷ MIT$open-sourceupdated 15 days ago
Actively maintained
100/100
last commit 9 days ago
last release 9 days ago
releases 4
open issues 2

Install with your AI

Paste into Claude Code, Cursor, or any agent — it reads the repo and wires the tool into your project.

Install and set up orrery (git-clone project) into my current project.
Found on https://claudeers.com/orrery
Repo: https://github.com/arvelvale/orrery
Homepage/docs: —
Detected install method: git-clone → git clone https://github.com/arvelvale/orrery
Category: devtools. Platforms: cli, api, desktop, web.
Read the repo's README for exact setup and env vars, then install it and wire it into my project.

Claudeers Health Verdict:
active; community-verified: false. Confirm the source before running anything.
// or clone
git clone https://github.com/arvelvale/orrery

// compatibility

Platformscli, api, desktop, web
Operating systems—
AI compatibilityclaude
LicenseMIT
Pricingopen-source
LanguageRust

Get your FREE $2.50 API credits to access TickAtlas financial data ↗
Orrery logo

Orrery

A local-first cockpit for your AI coding agents.

Every Claude Code, Kimi Code, DSH (DeepSeek), Codex, OpenCode, Z Code and Antigravity session on your machine in one window: tokens, disk usage, projects, subagents. Delete what you no longer need (Z Code is read-only), and route every harness through one local model proxy. Nothing leaves your computer.

English · 简体中文 · 日本語

Filtering sessions by harness, opening one, and the delete dialog

[!NOTE] The UI speaks English, 简体中文 and 日本語. It follows your system language, and you can switch anytime from the top bar.

Why

If you run several agent harnesses side by side, you hit the same friction every day:

  1. Sessions are scattered. Each tool keeps its own JSONL or session folder, in its own format. You can't search, compare or resume across them.
  2. Usage is invisible. How many tokens did that session really burn? How much disk are hundreds of transcripts eating?
  3. Model switching is manual. Every harness has its own env vars and config files.

Orrery reads what the harnesses already write to disk and puts it all on one board. It doesn't wrap, fork or re-implement any agent.

What works today

CapabilityStatusNotes
Session hub: Claude Code✅~/.claude/projects, subagents folded into their parent session
Session hub: Kimi Code✅~/.kimi-code/sessions, both old and new state.json layouts
Session hub: DSH (DeepSeek)✅~/.dsh/sessions, zstd-compressed event logs, v0 and v3 formats
Session hub: Codex✅~/.codex/sessions, rollouts sharing an id are merged, guardian subagents folded in
Session hub: OpenCode✅Read-only opencode.db under $XDG_DATA_HOME/opencode or ~/.local/share/opencode; nested subagents folded in; requires session token-summary columns
Session hub: Z Code✅Read-only ~/.zcode/cli/db/db.sqlite; size includes each session's model I/O log, artifacts and image cache, which are most of its disk footprint
Session hub: Antigravity CLI✅Read-only ~/.gemini/antigravity-cli/: one SQLite per conversation plus conversation_summaries.db; usage decoded from each call's protobuf record; resume with agy --conversation
Session hub: your own OpenCode-style tool✅Register it in ~/.orrery/harnesses.json and Orrery reads its SQLite the same way — handy for forks and private builds
Accurate token accounting✅Deduplicated per API call, split into input / cache write / cache read / output
Disk usage per session and per harness✅Status page shows totals and a per-harness breakdown
Search by title, path and model✅
UI in English / 简体中文 / 日本語✅Follows the system language; switch from the top bar
Instant cold start✅The parsed index is kept on disk, so a restart only re-reads files that changed (188 sessions: 5.5s → 0.12s)
Delete sessions to free disk space✅Pick one or many, sort by size; Recycle Bin or permanent; each tool's own index is cleaned too
Local model proxy (127.0.0.1:8787)✅Real forwarding, OpenAI and Anthropic shapes, streaming passthrough, start/stop from the app; verified against live providers
Resume in terminal✅Opens a terminal in the session's folder and runs that harness's own resume command. DSH falls back to its web UI when only the web profile is installed; registered tools have no resume command
Orrery status page with storage breakdown

How token counting works

Every harness records usage per API call, and none of them can simply be added up:

SourcePitfallOrrery does
Claude Codemessage.usage on assistant linesStreaming writes one line per content block, each repeating the same usage (4,034 lines → 1,558 real calls in one session)Deduplicates by message.id, keeping the last line
Kimi Codeusage.record events in agents/*/wire.jsonlusageScope: "session" records are separate context-compaction calls, not totalsCounts every record once
DSHdata.usage on assistant/message events, inside multi-frame zstd logsUpgraded sessions keep both a v0 and a v3 log of the same historyReads only v3 when both exist
Codextoken_count events, plus token_usage_record in newer versionstotal_token_usage is per process and resets on resume; input_tokens already includes cached tokens; older token_count misses compaction callsSums deduplicated per-call usage, prefers token_usage_record where it exists, subtracts cached tokens from input
OpenCodeSQLite session.tokens_*Reasoning is a separate bucket; child sessions have their own totalsAdds reasoning to output and recursively folds children into their root session; API call count is unavailable
Z Codemodel_usage, one row per API callinput_tokens already contains cache reads, and turn_usage leaves out side calls such as title generationSums every call in model_usage, and uses each row's computed_total_tokens to decide whether caches and reasoning are inside input/output, so the buckets always add up to the provider's total
Antigravitygen_metadata, one protobuf row per API callOutput already includes thinking tokens; cache reads are reported separately from inputSums input, output, cache write and cache read directly; cancelled calls with no usage are not counted
Registered toolsession.tokens_* when present, otherwise the tokens object on each messageOlder OpenCode forks have no token columns on the sessionDetects which layout the database uses and sums accordingly; reasoning always folds into output

The session total adds up the main agent and every subagent. How it was checked:

  • Claude Code: matches its own cost-state ledger exactly (input, cache read, output) over the same process window.
  • DSH: matches DSH's own projection cache exactly up to the event the cache was built from.
  • Codex: token_count and token_usage_record agree exactly in 8 of 12 files that have both; in the other 4 the difference is exactly the context-compaction calls.

Old Codex alpha sessions only stored a total without a breakdown. Orrery shows that part as unsplit instead of guessing.

OpenCode was checked per session against independent SQL and opencode stats: 53 records become 41 sessions plus 12 folded subagents. Input 108.4M, cache read 1853.0M and cache write 1.2M agree; output 4.7M includes 1.3M reasoning tokens. Session size measures UTF-8 payload bytes in message/part/event, not reclaimable SQLite file space. Windows desktop verified; macOS/Linux remain untested on hardware. Existing screenshots predate this adapter.

Known limits: the ledger resets on --resume, so Orrery rebuilds totals from the transcript instead. The ledger also counts side calls that never reach the transcript, such as title generation, so Orrery's Claude Code totals can read about 1–5% lower.

Getting started

Just want to run it? Grab the installer for your platform from the latest release:

PlatformFile
Windows 10/11 x64_x64-setup.exe (per-user, no admin) or _x64_en-US.msi
macOS 11+ (Intel & Apple silicon)_universal.dmg
Linux x64_amd64.AppImage (portable) or _amd64.deb / .rpm

Nothing is code-signed, so the first launch needs one confirmation: Windows SmartScreen → More info → Run anyway; macOS → right-click the app → Open, or xattr -cr /Applications/Orrery.app; Linux → chmod +x the AppImage.

[!NOTE] Windows is what the author uses daily. The macOS and Linux builds are produced and tested by CI (clippy + unit tests on all three platforms), but nobody has run the app on a Mac or a Linux desktop yet. If something is broken there, an issue with the output of orrery from a terminal is very welcome.

Building from source — requirements

  • Rust — MSVC toolchain on Windows
  • Node.js 18+
  • Windows: Visual Studio Build Tools with MSVC and a Windows SDK; WebView2 (preinstalled on Windows 10/11)
  • macOS: Xcode command line tools
  • Linux: libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf libxdo-dev
git clone https://github.com/arvelvale/orrery.git
cd orrery
npm install
npm run dev        # desktop app, reads your real sessions

Just want to look at the UI? No Rust needed:

npm run preview    # http://127.0.0.1:1420 with mock data

[!TIP] Run Rust builds from PowerShell, not Git Bash. Git ships its own link.exe, which is not the MSVC linker.

Project layout

orrery/
├─ ui/                      # index.html · styles.css · app.js · i18n.js (shared by WebView and browser)
├─ src-tauri/
│  └─ src/
│     ├─ adapters/
│     │  ├─ mod.rs          # SessionSummary, TokenUsage, cache, shared helpers
│     │  ├─ claude_code.rs
│     │  ├─ kimi_code.rs
│     │  ├─ dsh.rs
│     │  ├─ codex.rs
│     │  └─ cleanup.rs      # session deletion and index cleanup
│     ├─ proxy/             # local model proxy
│     │  ├─ mod.rs         # start / stop / status
│     │  ├─ config.rs      # providers and routes (~/.orrery/proxy.json)
│     │  ├─ server.rs      # HTTP surface and upstream forwarding
│     │  └─ state.rs       # counters, last request, last error
│     └─ lib.rs             # Tauri commands
├─ scripts/preview.mjs      # zero-dependency static preview
├─ docs/                    # design docs (Chinese)
└─ DESIGN.md                # visual spec

Local model proxy

Point a harness at http://127.0.0.1:8787/v1 and Orrery forwards its requests upstream, so you can swap the model from the app instead of editing each tool's config.

Orrery proxy panel
EndpointsPOST /v1/chat/completions (OpenAI shape) · POST /v1/messages (Anthropic shape) · GET /v1/models · GET /health
Model routingSend x-orrery-harness: <id> and the proxy rewrites model to whatever that harness is set to on the Models page. Without the header your requested model is kept.
Provider choiceBy model prefix (claude* → anthropic, kimi* → moonshot …). No match is an explicit error, never a silent fallback to some other provider.
StreamingSSE is passed through chunk by chunk, not buffered.
KeysTwo options per provider. Environment variable (recommended): the config stores only the variable name and the key is read at request time. Typed into the app: saved in plain text in ~/.orrery/proxy.json (owner-only 0600 on macOS/Linux). Keys are never logged, and the status list shows only whether a key is set.
BindingLoopback only. A non-loopback listen value is refused.
# 1. put the key in the environment the app can see
setx ANTHROPIC_API_KEY sk-...        # Windows, then restart Orrery

# 2. start the proxy from the Models page, then point a harness at it
set ANTHROPIC_BASE_URL=http://127.0.0.1:8787

Providers, routes and the listen address live in ~/.orrery/proxy.json:

{
  "listen": "127.0.0.1:8787",
  "auto_start": false,
  "routes": { "cc": "claude-sonnet-4.6", "kimi": "kimi-k3" },
  "providers": {
    "anthropic": {
      "base_url": "https://api.anthropic.com/v1",
      "api_key_env": "ANTHROPIC_API_KEY",
      "wire": "anthropic",
      "model_prefixes": ["claude"]
    }
  }
}

Deleting sessions

Every session is just files on disk, so Orrery can remove the ones you no longer need. Nothing is deleted without a confirmation dialog that lists each session and the space it frees.

Orrery delete dialog
  • Recycle Bin by default. Permanent deletion is a separate mode that needs an extra checkbox.
  • Sessions in use are protected. Anything written in the last 10 minutes, or open in a running Claude Code, is skipped.
  • Each tool's own index is cleaned too, so no dead entries are left behind. Index files are backed up to ~/.orrery/backups/ before they change.
  • Codex goes through the official codex delete, which also clears Codex's history database. Orrery never writes to another tool's database.
  • OpenCode goes through the official opencode session delete, subagents included. OpenCode has no Recycle Bin, so in that mode each session is first exported to ~/.orrery/exports/ with a RESTORE.txt that lists the opencode import commands. OpenCode's database file doesn't shrink right away; it reuses the freed space.
  • Antigravity conversations open in a running agy are skipped. Only the conversation's own files are moved; agy's summary database is left alone, so its history list may keep the title.
  • Paths are resolved by the backend from the session id and must stay inside that tool's data folder.
ToolFiles removedIndex entries removed
Claude Codeprojects/<p>/<id>.jsonl, projects/<p>/<id>/, file-history/<id>/, session-env/<id>/, tasks/<id>/—
Kimi Codesessions/<ws>/<id>/session_index.jsonl, file-history/<ws>
DSHsessions/<ws>/<id>/, its projection cachestorages/workspace.json
Codexthe session's rollouts plus its subagent rolloutsCodex database (via codex delete), session_index.jsonl
OpenCode— (all in opencode.db)Session and subagents, via opencode session delete
Z CodeNot supported (read-only)No changes
Antigravityconversations/<id>.db (+ -wal/-shm), brain/<id>/, annotations/<id>.pbtxt, and the same for child conversations— (agy's own history list may still show the title; opening it starts a new conversation)
Registered toolNot supported (read-only)No changes

[!TIP] Close the tool before deleting its sessions. A running Kimi Code or Codex may write the removed entries back into its index.

Privacy

  • Orrery only writes to harness folders when you delete sessions, as described above.
  • Its own files live in ~/.orrery/: your route config (including any API key you typed into the app, in plain text), index backups, and index.json — the parsed session list (titles, paths, token counts) that makes restarts instant. Delete it anytime; it is rebuilt on the next scan.
  • No network calls and no telemetry. The proxy listens on 127.0.0.1 only.
  • Fields that may contain pasted secrets (for example Kimi's lastPrompt) are never read.

Roadmap

  • Tauri 2 shell and session hub
  • Claude Code, Kimi Code, DSH and Codex adapters
  • Token and disk accounting
  • Local model proxy with real forwarding
  • Persistent index for instant cold start
  • Resume a session in its own CLI
  • Tray, global shortcut, installer

Design docs, in Chinese: positioning · architecture · roadmap

// faq

What is orrery?

A local-first cockpit for your AI coding agents: Claude Code, Kimi Code, DSH, Codex, OpenCode, Z Code and Antigravity sessions in one window — accurate token accounting, disk usage, session cleanup, and a local model proxy.. It is open-source on GitHub.

Is orrery free to use?

orrery is open-source under the MIT license, so it is free to use.

What category does orrery belong to?

orrery is listed under devtools in the Claudeers registry of Claude-compatible tools.

5 views
★ 37 stars
unclaimed
updated 15 days ago

// embed badge

orrery on Claudeers
[![Claudeers](https://claudeers.com/api/badge/orrery.svg)](https://claudeers.com/orrery)

// retro hit counter

orrery hit counter
[![Hits](https://claudeers.com/api/counter/orrery.svg)](https://claudeers.com/orrery)

// reviews

// guestbook

0/500

// related in Developer Tools

🔓

The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Curs…

// devtoolsaffaan-m/⟨JavaScript⟩★ 267,519◷ MIT[ claude ]
🔓

Makes your AI agent think like the laziest senior dev in the room. The best code is the code you never wrote.

// devtoolsDietrichGebert/⟨JavaScript⟩★ 148,251◷ MIT[ claude ]
🔓

Use Garry Tan's exact Claude Code setup: 23 opinionated tools that serve as CEO, Designer, Eng Manager, Release Manager, Doc Engineer, and QA

// devtoolsgarrytan/⟨TypeScript⟩★ 134,274◷ MIT[ claude ]
🔓

AI coding assistant skill (Claude Code, Codex, OpenCode, Cursor, Gemini CLI, and more). Turn any folder of code, SQL schemas, R scripts, shell scripts, docs,…

// devtoolssafishamsi/⟨Python⟩★ 123,348◷ MIT[ claude ]
→ see how orrery connects across the ecosystem