Nostr-native · no server · no signup

Your agents need a work queue. So do you.

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.

curl -fsSL https://ready.3dl.dev/install.sh | sh

No account · Works offline · Single binary · Signed history · Confidential by default · Open source

Not another web app

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.

🤝

One CLI, humans and agents

No agent API. No MCP server. A person and a Claude Code session run the same commands. Pipe them, script them, done.

📦

One binary, no server

No Postgres, no Redis, no SaaS login. Drop in the binary, run rd init, get to work. Your key is minted on first use.

📴

Works offline

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.

🔏

Every receipt, forever

Each move is a signed event. Who did it, when, and why. Provable, permanent, never compacted or archived away.

🔐

Confidential by default

Titles and descriptions are encrypted. Members read them; the relay sees noise. --public when you actually want it open.

🔀

Made for handoffs

for is who needs it. by is who's on it. Agents escalate to you with rd gate; you answer with rd approve.

Don't take my word for it

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.

Create → Claim → Close

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.

# Create an item. Piped, it just prints the ID. rd create "Ship login page" --priority p1 --type task myproject-45e # What needs me right now? rd ready myproject-45e p1 inbox 3h Ship login page # Grab it. You're the performer now. rd claim myproject-45e claimed myproject-45e # Close it with a reason. The reason is the point. rd done myproject-45e --reason "Login page ships with JWT auth" closed myproject-45e (done)

The attention engine

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.

# ready, work, pending, overdue, delegated, my-work rd ready --view overdue rd list --status active --priority p0 rd list --by atlas/worker-3 --all --json

Delegate, block, escalate

Hand it off, chain a dependency, or kick a decision up to a human. All from the terminal.

rd delegate api-a1b --to atlas/worker-3 rd dep add api-a1b api-9f2 rd gate api-a1b --gate-type design \ --description "PKCE or device flow?"

Playbooks

Runbooks, release prep, rollouts. Stamp a template into real items with the deps already wired. Stop rebuilding the same tree by hand.

rd playbook list rd engage release-checklist --project api engaged playbook release-checklist → 6 items

The log is the API

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.

The commands

rd init --name <project>Start a project. Local log + a nostr board. Confidential by default; --public opts out.
rd create "..." --type task --priority p1New item. Prints the ID when piped.
rd readyWhat 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 designKick 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 statusWhat 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.

One repo or your whole org

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.

Solo

One project

Free · Local

  • Local log per project
  • Your machine is the source of truth
  • Fully offline
  • The whole CLI
  • Views & the attention engine
  • Signed history, kept forever
rd init --name myproject initialized myproject (confidential) board: 30301:9f2a1c...:myproject log: .ready/nostr-log.jsonl ITEM=$(rd create "Ship login" --priority p1 --type task) rd claim $ITEM && rd done $ITEM --reason "..."

No account, no server. rd init and go.

Individual

Many projects

Free · Local

  • Everything in Solo
  • One key, every project
  • Delegate across projects
  • Query across projects
  • A board + log per project
  • Auto-detects the project
# Each project keeps its own board + log cd ~/api && rd init --name api cd ~/frontend && rd init --name frontend # One key, query anywhere rd ready --project api rd list --project frontend --all

One key signs across everything you own.

Enterprise

Org-wide

Hosted · Talk to us

  • Everything in Shared queue
  • Discovery across projects
  • Graded, revocable roles
  • Owner-rooted grants + forward secrecy
  • Portable history that never expires
  • Bridges to Slack, Teams
# Add a member. Revoke rotates the key. rd grant 9f2a1c... contributor rd revoke 9f2a1c... revoked — new items sealed under a fresh key # Every change is a signed event, kept forever rd show api-d4e

Owner-rooted grants, forward-secret revoke, a history that never expires.

Built for the ones doing the work

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.

1 · Paste it into CLAUDE.md

Claude reads it at session start and uses rd like any other CLI. It even finds its place again after a context reset.

## Work Management rd is on PATH and auto-detects the project. - Start every session: `rd ready` - Claim before working: `rd claim <id>` - Close with a reason: `rd done <id> --reason "..."` - Lost the thread? `rd ready --view work`, then `rd show <id>` - New items: `ITEM=$(rd create "..." --type task --priority p1)` - Repeating work? `rd playbook list` before decomposing by hand - Everything speaks `--json`

2 · Or drop in the skill

Grab SKILL.md into .claude/skills/rd/. Claude Code finds it and learns every command.

mkdir -p .claude/skills/rd curl -fsSL https://ready.3dl.dev/SKILL.md -o .claude/skills/rd/SKILL.md

3 · Point a swarm at one queue

Spin up parallel Claude Code agents on a shared queue. Each gets its own key. The filesystem keeps them apart. No env-var juggling.

# Seed the queue rd create "Build auth" --priority p0 --type task rd create "Build API" --priority p1 --type task rd create "Write tests" --priority p1 --type task # Each agent follows the owner from its own worktree, keeps its key rd follow baron@3dl.dev --board api ITEM=$(rd ready | head -1) rd claim $ITEM && rd done $ITEM --reason "Auth done"

4 · Let an agent ask you

It hits a call it shouldn't make alone. It posts a gate. You answer from any terminal. No dashboard, no ticket queue.

# Agent: "I need a ruling." rd gate myapp-d4e --gate-type design \ --description "PKCE or device flow for mobile auth?" {"id":"myapp-d4e","gate_type":"design","status":"waiting"} # You: decide, move on. rd gates myapp-d4e p1 design PKCE or device flow rd approve myapp-d4e --reason "PKCE. Need the browser redirect." # Its item flips back to active. It picks up from there.

A key per actor, no config

Every actor signs with its own secp256k1 key under $RD_HOME. $RD_ACTOR picks which. Owner and agent on the same box, attributed apart.

Same commands. Always.

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.

Some work has secrets. Keep them.

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.

Sealed vs. clear

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.

# What a non-member pulls off the relay: kind: 30302 (item card) d: api-d4e ← clear (routing) status: active ← clear priority: p1 ← clear l: 7f3a9c… ← tokenized label content: kJ4d…b2== ← sealed: title + body

Keys live in the log

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.

Revoke and it rotates Drop a member and rd mints a new key for the rest. They keep what they already read and lose everything after. No re-encrypting the past, no shared-password reset.

On by default

rd init gives you a confidential board. --public if you want it open. Members read plaintext with zero key wrangling.

🔑

You hold the root

Only the owner hands out the key, inside the same grant that gives write access. Membership is the read key. One move, not two.

🔒

Real crypto

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.

Signed events, not a database

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.

State is just the log, replayed

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.

The verbs, on the wire

work:create new item work:claim take it work:status change status work:delegate reassign work:block chain a dependency work:gate ask a human work:gate-resolve answer work:grant add a member work:update edit fields work:close close with a reason

Identity is a key, not an account

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.

Relays are throwaway

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.

Federated, no mothership

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.

Relays (self-hosted, 2+ so nothing is a SPOF, untrusted by design) ├ authz: signed owner-rooted grants, checked at projection ├ Board: api (local log = truth) ├ Board: frontend (local log = truth) └ Board: infra (local log = truth)

Nothing to compact

The append-only log is the history. Every create, claim, delegate, gate, and grant is a signed event, written once and kept.

It survives Relays can drop old data. Your local log doesn't. Nothing is archived away, and nothing needs to be.

Plain open nostr

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.

Install rd

One binary. No server, no ceremony. Run this, then rd init, and you're tracking work.

Shell (Linux / macOS)

curl -fsSL https://ready.3dl.dev/install.sh | sh

Go install

go install github.com/3dl-dev/ready/cmd/rd@latest

From source

git clone https://github.com/3dl-dev/ready cd ready && go build -o rd ./cmd/rd