Nostr-native · no server · no signup
rd is one CLI, driven the same by people and AI agents. Create, claim, close.
No server, no login, no database. Every item is a signed event in a log on your machine.
It works offline, keeps every receipt, and encrypts what's private.
No account · Works offline · Single binary · Signed history · Confidential by default · Open source
Why rd
Every issue tracker wants a server, an account, and a browser tab. rd wants a terminal
and a key. That one swap is why agents can drive it, why it works on a plane, and why nobody loses
your history but you.
No agent API. No MCP server. A person and a Claude Code session run the same commands. Pipe them, script them, done.
No Postgres, no Redis, no SaaS login. Drop in the binary, run rd init, get to work.
Your key is minted on first use.
Your local log is the boss; relays just copy it around. Kill the wifi and every command still runs. Writes catch up when you're back.
Each move is a signed event. Who did it, when, and why. Provable, permanent, never compacted or archived away.
Titles and descriptions are encrypted. Members read them; the relay sees noise. --public
when you actually want it open.
for is who needs it. by is who's on it. Agents escalate to you with
rd gate; you answer with rd approve.
See it run
Real output from the rd binary. Hit play: the core loop, confidential boards, a team
sharing a queue, an agent kicking a decision up to a human, and two agents on one board.
How it works
Three verbs. Same for you at a keyboard and an agent reading a prompt. Priority sets the clock: P0 is now, P3 is three days out.
Views filter the log by who you are and what's live. rd ready is the default. The rest
slice by status, owner, and time.
Hand it off, chain a dependency, or kick a decision up to a human. All from the terminal.
Runbooks, release prep, rollouts. Stamp a template into real items with the deps already wired. Stop rebuilding the same tree by hand.
Every op is a plain signed event. Point any nostr client at a relay and read the boards and cards
straight off it. No rd-specific anything.
rd init --name <project> | Start a project. Local log + a nostr board. Confidential by default; --public opts out. |
rd create "..." --type task --priority p1 | New item. Prints the ID when piped. |
rd ready | What needs you now. |
rd list [--status ...] [--by ...] [--all] | List with filters. |
rd show <id> | Details plus the full history. |
rd claim <id> | Take it. You're the performer. |
rd delegate <id> --to <identity> | Hand it to a person, agent, or bot. |
rd done <id> --reason "..." | Close it. The reason lands in history. |
rd gate <id> --gate-type design | Kick a decision to a human. |
rd approve <id> --reason "..." | Answer a gate. |
rd follow <owner> | Join an owner's boards from another machine — one command, keeps your key. |
rd grant <pubkey> | Add a member; they can read + write. Role is optional, defaults to contributor. |
rd revoke <pubkey> | Drop a member. Confidential boards rotate the board key. |
rd status | What state am I in, and the one command to fix it. |
rd link <board> | Bind this repo to a board. |
rd invite / rd join <token> | One-use invite token — if you'd rather not share an email or npub. |
rd engage <playbook> | Stamp a template into wired-up items. |
Ways to use it
Same tool, same commands, at every size. Nothing to migrate. Free wherever you host it yourself. You only pay if you want us running the relays.
Free · Local
No account, no server. rd init and go.
Free · Local
One key signs across everything you own.
Free · Self-hosted or hosted
$RD_ACTORA teammate or a swarm of agents, same board. No key exchange, no manual pull.
Prefer a one-use token instead? rd invite / rd join <token> still works.
Hosted · Talk to us
Owner-rooted grants, forward-secret revoke, a history that never expires.
For agents
rd's main users are AI agents. Humans too. Drop one of these in and Claude Code starts tracking
work. No MCP server, no integration. Just rd on PATH.
Claude reads it at session start and uses rd like any other CLI. It even finds its place
again after a context reset.
Grab SKILL.md into .claude/skills/rd/. Claude Code finds it and
learns every command.
Spin up parallel Claude Code agents on a shared queue. Each gets its own key. The filesystem keeps them apart. No env-var juggling.
It hits a call it shouldn't make alone. It posts a gate. You answer from any terminal. No dashboard, no ticket queue.
Every actor signs with its own secp256k1 key under $RD_HOME. $RD_ACTOR picks
which. Owner and agent on the same box, attributed apart.
Nothing separate for agents to learn or keep in sync. Whatever you can do, they do with the same command. That's why a person and a swarm share one board without collisions.
Confidential boards
On a confidential board (the default), the free text is encrypted so only members can read it. Everything the relay needs to sync and filter stays clear. There's no server to trust because there's no server.
Encrypted: title, description, close reason. Clear, so sync and queries keep working: status, deps, priority, assignees, due date. Labels get tokenized, so members filter by them and everyone else sees hashes.
The board key is wrapped to each member inside a signed grant (NIP-44). Hold your identity key and you recover it from the log. Nothing extra to back up. The relay never sees a key or a word of plaintext.
rd init gives you a confidential board. --public if you want it open.
Members read plaintext with zero key wrangling.
Only the owner hands out the key, inside the same grant that gives write access. Membership is the read key. One move, not two.
ChaCha20-Poly1305 on the content, NIP-44 to wrap the key, checked against the official test vectors. The relay is a dumb cache of ciphertext.
Nostr-native, no server
rd isn't an app with a backend. It's a convention: a set of work operations that map onto plain signed nostr events. That's the whole architecture.
rd create signs an item card (kind 30302) and a status event, appends both to your
local log, and publishes to your relays. rd claim appends another. An item's current
state is computed by replaying the log. There's no database to drift.
Every actor is a secp256k1 keypair under $RD_HOME, minted on first use. No signup. The
same key signs your events and unwraps confidential board keys. Membership is owner-rooted role grants
(kind 39301): revocable, graded, all derivable from the signed log.
A relay just moves signed events between machines. Run your own, rent one, point at several. Lose them all and your local log is fine. The work never lived on the relay.
Each project is its own nostr board (kind 30301) with its own local log as the authority. Relays sync boards between machines. No central server to go down or hold your data.
The append-only log is the history. Every create, claim, delegate, gate, and grant is a signed event, written once and kept.
Boards and cards, NIP-34 status, NIP-44 encryption, NIP-77 sync. No custom protocol. Any nostr client already speaks it, and the events are the API.
Get started
One binary. No server, no ceremony. Run this, then rd init, and you're tracking work.