An orchestrator for the Claude Code era.
Multi-worktree development is a coordination problem, not a coding problem. Orra composes a briefing the moment you open Claude — and once armed, keeps checking the work in the background while you focus on yours.
You open Claude Code. This is what happens.
auth-refactor· pull a fresh worktree from main
· run the reproducer
· trace the failure
· post findings to
.orra/memory/notes/AUTH-198.md
agent_3xj, running detached.“Five worktrees, three blocked agents, two stale rebases, a Jira ticket I just got assigned, and a PR waiting on a review I forgot about. The coding part isn’t the bottleneck anymore.”
— anyone running more than one Claude Code session at a time
Three things, all in service of focus.
Awareness
Scans every worktree, ticket, and agent in one pass. Classifies status, surfaces what's due, and pre-computes summaries — so the briefing is composed before you finish typing.
Learning
A markdown memory layer. Daily notes, commitments, per-worktree context — all persisted across sessions, all grep-friendly. Yesterday's first move shows up in today's briefing.
Side tasks
Spawn detached claude --print agents for routine work — bug investigations, rebases, lint fixes. They run in the background; Orra surfaces their state on the next scan.
Arm the heartbeat. Orra checks itself.
Orra isn't a daemon — it lives inside your Claude Code session. But arm the heartbeat with one line, and every directive starts firing on its own declared cadence: every 5 min, every 30 min, on session start. While you focus on one thing, Orra's checking the others.
stop heartbeat. Each directive owns its own cadence; /loop is just the engine.A heartbeat, not a daemon.
Most MCP tools are reactive — you ask, they answer. Orra inverts that within your session. Each directive declares its own cadence, and the heartbeat tick wakes them on schedule. While you're heads-down on one thing, the other things still get checked.
When the heartbeat surfaces something that needs you, it surfaces. When it doesn't, it stays out of your way — and the timeline keeps building so you can read it back later.
Connect any MCP. Make it proactive.
A directive is just a markdown file. If you have an MCP installed (Linear, Slack, Sentry, Jira, your own), write a directive that calls its tools — declare the lane and the cadence, drop it in .orra/directives/, and the heartbeat does the rest. No code, no plugin API.
Ten ship in the box
Or write your own
— illustrative examples; you supply the matching MCP.
--- a directive is just markdown with frontmatter ---
---
name: sentry-on-call
cadence: 5m
lane: incident-watch
memory:
read: [on-call-rotation.md]
write: [incidents/YYYY-MM-DD.md]
---
### My Lane
On every heartbeat tick, check the Sentry MCP for new high-priority
issues assigned to whoever's on call. Surface anything new, summarize
the stack trace, suggest spawning an investigation agent if it looks
fixable.