claude-orchestrator
A personal control plane for a Claude Code setup that spans multiple accounts, multiple machines, and a pile of hand-installed skills — so none of that state is pinned to whichever login happens to be active right now.
orc never calls the Anthropic API and never checks your subscription. It only reads and writes local files: your existing ~/.claude/projects/*/memory/*.md, your session transcripts (~/.claude/projects/*/*.jsonl, where real token-usage numbers come from), your ~/.claude/skills/*, and its own small private data store. It works with no Claude account logged in at all — the only network call anywhere in it is orc sync, and that talks to your own git remote, not Anthropic.
Why
Three problems, one root cause — state trapped on a single machine/account instead of following the person:
- Memory is fragmented and misfiled. Claude Code's own per-project memory is keyed by working-directory path, not topic. Notes about one long-running effort end up scattered across a dozen unrelated project folders purely because of whatever
cwdyou happened to be in. - Accounts rotate. Your own account, a shared one, a client's — swapped whenever one hits a rate limit. Nothing should leak into someone else's environment, and nothing should vanish when you step away from your own login.
- Skills are ad-hoc. Some come from a marketplace, some are hand-downloaded from random GitHub repos with no record of source, version, or whether they're still wanted.
Architecture: two repos, on purpose
This code is public. Your actual data is not — and never touches this repo.
flowchart TB
subgraph Code["This repo (public, code only)"]
CLI["src/orc — the orc CLI"]
end
subgraph Data["Your own private repo (ORC_DATA_DIR)"]
Memory["memory/ — topic-keyed, deduped"]
Skills["skills-registry/ — adopted/installed skills"]
AgentLog["agent-log/ — run history, identity log"]
end
subgraph ClaudeHome["~/.claude (Claude Code's own files)"]
Transcripts["projects/*/*.jsonl — session transcripts"]
LocalMemory["projects/*/memory/*.md"]
LocalSkills["skills/*"]
end
CLI -- "reads (never writes)" --> Transcripts
CLI -- "orc memory sync" --> LocalMemory
CLI -- "orc skill adopt/enable/disable" --> LocalSkills
CLI -- reads/writes --> Memory
CLI -- reads/writes --> Skills
CLI -- reads/writes --> AgentLog
CLI -- "orc sync push/pull" --> Data
style Code fill:#1e293b,color:#fff,stroke:#64748b
style Data fill:#0f172a,color:#fff,stroke:#64748b
style ClaudeHome fill:#111827,color:#fff,stroke:#374151
ORC_DATA_DIR (default ~/.orc-data) points at your private data repo. Update this tool with a normal git pull on this repo; sync your data with orc sync, which operates on ORC_DATA_DIR, never on this checkout.
Install
Pick one:
As a Python package (recommended — gives you a real orc command, no PATH setup):
pip install claude-orc # or: pipx install claude-orc
Zero-install, from a clone:
git clone https://github.com/Pranav-error/claude-orchestrator ~/claude-orchestrator
echo 'export PATH="$HOME/claude-orchestrator/bin:$PATH"' >> ~/.zshrc # or ~/.bashrc
source ~/.zshrc
Either way, then:
orc init # bootstraps your private data directory + git repo
orc identity set mine
orc dashboard
orc init prints the one manual step left (creating an actual private remote — gh repo create --private or any git host) so your data can sync across machines too. No dependencies beyond Python 3.10+ and git — the CLI is stdlib-only.
As a Claude Code plugin (adds /orc and an auto-invoked skill that reaches for orc on its own when relevant — install the CLI above first, this just teaches Claude about it):
/plugin marketplace add Pranav-error/claude-orchestrator
/plugin install claude-orchestrator@claude-orchestrator
What it does
| Memory | orc memory sync mirrors Claude Code's scattered per-project memory into one topic-keyed, deduped store. orc memory search, orc memory links/link for [[wiki-style]] cross-references. |
| Identity | orc identity set <label> records which account is active on this machine right now — since Claude Code itself never does, and a filesystem never changes on an account swap on the same box (only a different machine needs orc sync). |
| Usage | orc usage report --by day|project|model|identity — real token counts read straight from Claude Code's own transcripts. Nothing tracked manually. |
| Skills | orc skill adopt/install/enable/disable — takes custody of a skill (moves it into your data repo, symlinks it back), so hand-downloaded skills have a recorded source and travel with orc sync instead of needing manual reinstall per machine. |
| Agent log | orc agent log/list — append-only record of subagent runs, filterable by account/outcome/date. |
| Sync | orc sync push/pull/status — wraps git for your private data repo. Refuses to pull over uncommitted local changes rather than guessing how to merge them. |
| Dashboard | orc dashboard — a colored snapshot rendered directly in your terminal (boxed header, usage bar chart, skills, recent runs). No browser, no server. --html opts into a shareable file instead. |
| Config | orc config show/set — theme (amber/ocean/sunset/mono), icons on/off, usage window, forced color. |
Full command reference: USAGE.md.
Bare orc (no arguments) drops into a numbered interactive menu covering all of the above — useful when you don't want to remember flag names.
Using it from inside Claude Code
Installing the plugin (above) gives you both pieces automatically:
/orc <words>— a slash command that maps plain words onto the rightorcinvocation:/orc status,/orc search <query>,/orc dashboard, etc. Seecommands/orc.mdfor how the mapping works, and whyorc dashboardspecifically needs--color alwayswhen run through Claude's own Bash tool.- A skill named
claude-orchestrator(skills/claude-orchestrator/SKILL.md) that Claude can reach for on its own — ask "how much have I used today" or "search my memory for X" without typing/orcat all.
Not using the plugin system? Copy or symlink commands/orc.md to ~/.claude/commands/orc.md for just the slash command.
To make sync automatic at the start/end of every Claude Code session (any account, any project), add to your ~/.claude/settings.json:
"hooks": {
"SessionStart": [{ "hooks": [{ "type": "command",
"command": "~/claude-orchestrator/bin/orc sync pull >> ~/.orc-sync.log 2>&1 || true" }] }],
"SessionEnd": [{ "hooks": [{ "type": "command",
"command": "~/claude-orchestrator/bin/orc sync push >> ~/.orc-sync.log 2>&1 || true" }] }]
}
Testing
python3 -m unittest discover -s tests -v
64 tests, stdlib unittest only, fully isolated via tmp-dir path overrides — none of them touch your real ~/.claude or your data repo. Includes a real two-machine push/pull simulation over a local bare git remote. Runs automatically on every push via GitHub Actions (badge above).
Releases & versioning
This follows semver. See CHANGELOG.md for what changed in each version, and RELEASING.md for the maintainer release process (tag a version, CI builds and publishes to PyPI automatically via trusted publishing — no manual upload step). pip install --upgrade claude-orchestrator to get the latest.
License
MIT — see LICENSE.
Metadata
Release files for claude-orc 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| claude_orc-0.1.0.tar.gz | 32.2 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| claude_orc-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 62.6 kB
Release files / claude_orc-0.1.0.tar.gz
| Download URL | claude_orc-0.1.0.tar.gz |
|---|---|
| Size | 32.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
495fcb8a8efb662649d43bba49226269eb0a95634e8b5bf68fc77873ce622384
|
|
BLAKE2b-256 checksum How to use checksums |
5433e886eb309872bc6578efd0ad69e5734d38b3c34d030eab38b4b07c73e680
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency logRelease files / claude_orc-0.1.0-py3-none-any.whl
| Download URL | claude_orc-0.1.0-py3-none-any.whl |
|---|---|
| Size | 30.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8c0e53a941f84f863814081707ea2945359ed3618c8d11bec42a0c41efd3b6b2
|
|
BLAKE2b-256 checksum How to use checksums |
4850c8f139ec6640fe3b3b541957a97ade306c9aff190a774c805cf3afd94441
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency logSecurity for claude-orc 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for claude_orc-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.