From 8d8ab31993720ad0e40d257b661f03cdae6c9a7c Mon Sep 17 00:00:00 2001
From: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com>
Date: Fri, 15 May 2026 14:11:21 -0400
Subject: [PATCH 1/7] docs(readme): refresh as a landing page
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Re-sequence the README to lead with vision and emotional pull rather
than protocol mechanics. The four VISION docs already contain the
strongest pitch material; this commit choreographs it into a single
landing page and trims the reference-manual content (env vars, full
command list) into collapsed `` blocks.
The bones of the file Dawn and Max iterated on together over a few
rounds in #readme-refresh, with one of us drafting and the other
reading it cold each pass:
- Vision-first hero: tagline, top-of-page nav, hero media slot
(placeholder until a demo clip is captured β Mastodon-pattern GIF
linking to a longer hosted cut).
- 2am-incident vignette from VISION.md as the emotional opener,
followed by a concrete "shared ground" paragraph and a future-framed
one-domain "north star."
- Three transformation-named cards ("Own the conversation" / "Turn
branches into rooms" / "Give agents a real seat") with audience-
routing sublinks and explicit screenshot TODOs.
- A four-bullet "Why Sprout" β one relay, built on Nostr, agents as
colleagues, yours to host β with each claim cross-checked against
what actually ships.
- A status block split into Ready now / Next up / Designed
(Plausible-style honesty: trust comes from being precise about what
works today vs what's wired up next vs what's just designed).
- A two-phase quick start ("Once" / "Every day") with a single
hermit-activated path and a one-line agent pointer to AGENTS.md.
- Architecture diagram (lightly updated from the previous README) and
a ``-wrapped crate map covering all 23 crates in the
workspace including the recently-added sprout-agent, sprout-dev-mcp,
sprout-persona, sprout-pair-relay, sprout-pairing-cli,
git-sign-nostr, and git-credential-nostr.
- Going further links to the four VISION docs, ARCHITECTURE, AGENTS,
NOSTR, TESTING, CONTRIBUTING, CODE_OF_CONDUCT, SECURITY,
GOVERNANCE β collapsed env-var reference and dev-command cheat
sheet stay accessible but out of the main flow.
Things the README is honest about:
- Git hosting + NIP-34 forge is π§, so the "turn branches into rooms"
card flags what's wiring vs live, and the `git clone myproject.com`
promise from VISION_SOVEREIGN is reframed as "north star" rather
than present-tense.
- NIP-29 clients connect directly; NIP-28 via `sprout-proxy`. The
client list distinguishes verified (nak) from expected (Coracle,
Amethyst, Nostrudel) per NOSTR.md.
- Workflow approval gates: "infra exists; resume/persist wiring in
progress" rather than a vague π§.
Media slots are clearly marked. Tyler can drop in a hero clip, three
product screenshots, and a sovereignty diagram without restructuring
the page β the layout already accommodates them.
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com>
---
README.md | 415 +++++++++++++++++++++++-------------------------------
1 file changed, 177 insertions(+), 238 deletions(-)
diff --git a/README.md b/README.md
index f091a5c62..d2ee02e76 100644
--- a/README.md
+++ b/README.md
@@ -1,305 +1,244 @@
-
+
-# sprout
+Sprout π±
-A Nostr relay built for the agentic era β agents and humans share the same protocol.
+
+ The relay is the workspace.
+ One domain. One identity. Your team's whole world β chat, code, workflows, agents β at one URL.
+
-Sprout is a self-hosted WebSocket relay implementing a subset of the Nostr protocol, extended with
-structured channels, per-channel canvases, full-text search, and an MCP server so AI agents can
-participate in conversations natively. Authentication is NIP-42 + NIP-98 Schnorr signatures; all writes are
-append-only and audited.
+
+ Vision Β·
+ Sovereign Β·
+ Forge Β·
+ Agents Β·
+ Architecture Β·
+ Apache 2.0
+
-## Quick Start
+
+
+ π¬ Demo coming soon β humans and agents working in one channel.
+
-Three steps to get the full stack running locally.
+---
-**Prerequisites:** Docker, and either [Hermit](https://cashapp.github.io/hermit/) (recommended) or Rust 1.88+, Node.js 24+, pnpm 10+, and [`just`](https://github.com/casey/just) installed manually.
+> An engineer is debugging a production incident at 2am. They type in the incident channel: *"What happened last time we saw this error?"*
+>
+> An agent watching the channel searches six months of history and posts the threads, root causes, and fixes β then offers to page the engineer who deployed the last one.
-**1. Activate the pinned toolchain**
+Sprout is the ground underneath that moment. The channel, the history, the search, the agent, the audit trail β all on one relay, all signed by the same kind of key, all yours. Humans and agents work in the same place, as colleagues, on infrastructure you control.
-```bash
-. ./bin/activate-hermit
-```
+The north star: one domain for the whole project. `myproject.com` in a browser for repos and docs. Sprout for the channels where work happens. Agents on the same relay. No GitHub + Discord + Slack + CI stack to stitch together. One place, and that place is yours.
-Hermit pins Rust, Node.js, pnpm, `just`, and related tooling from `bin/`.
+---
-**2. Configure and set up the dev environment**
+## What you get
-```bash
-cp .env.example .env
-just setup
-just build
-```
+
+
+|
-`just setup` does the heavy lifting:
-- Starts Docker services (Postgres, Redis, Typesense, Adminer, MinIO, Prometheus)
-- Waits for core services (Postgres, Redis, Typesense) to be healthy
-- Runs database migrations
-- Installs desktop dependencies (`pnpm install`)
+### π¬ Own the conversation
+Stream chat, async forums, DMs, canvases, media β on one event log, one search index, one identity system. Quiet by default. Your domain, your moderation, your data.
-Then run `just build` once to compile the Rust workspace so binaries like `sprout-acp` and `sprout-mcp-server` are available when you start connecting agents.
+β [VISION_SOVEREIGN.md](VISION_SOVEREIGN.md) Β· [NOSTR.md](NOSTR.md)
-**3. Start the relay and desktop app**
+
-```bash
-# Terminal 1 β relay
-just relay
+ |
+
-# Terminal 2 β desktop app
-just dev
-```
+### πΏ Turn branches into rooms
+Patches, CI, reviews, and the merge decision live in one channel β so when the branch merges, the conversation becomes the permanent record of why that code exists. *(Git hosting + auto-room creation: wiring up. Channels and workflows: live today.)*
+
+β [VISION_PROJECTS.md](VISION_PROJECTS.md) Β· [ARCHITECTURE.md](ARCHITECTURE.md)
+
+
+
+ |
+
+
+### π€ Give agents a real seat
+Agents are colleagues, not bots. They sign events with their own keys, carry reputation across projects, and call MCP tools to review patches, triage issues, run jobs, ship releases.
-The relay listens on `ws://localhost:3000`. The desktop app opens automatically.
+β [AGENTS.md](AGENTS.md) Β· [VISION_AGENT.md](VISION_AGENT.md)
-That's it β you're running Sprout locally.
+
+
+ |
+
+
---
## Why Sprout
-| | |
-|-|--|
-| β
| **Nostr wire protocol** β any Nostr client works out of the box |
-| β
| **YAML-as-code workflows** β automation with execution traces (approval gates: planned) |
-| β
| **Agent-native MCP server** β LLMs are first-class participants |
-| β
| **ACP agent harness** β AI agents connect out of the box via `sprout-acp` |
-| β
| **Tamper-evident audit log** β hash-chain, SOX-grade compliance |
-| β
| **Permission-aware full-text search** β Typesense, respects channel membership |
-| β
| **NIP-42 + NIP-98 authentication** β Schnorr signatures for WebSocket and REST |
-| β
| **Pure Rust backend** β memory safe, no GC pauses |
+**One relay, one domain, one identity.** Your project's whole presence β code, conversation, docs, releases, agents β at `myproject.com`. Not five SaaS tabs. Not a Discord server that could disappear tomorrow.
-## Supported NIPs
+**Built on Nostr.** Every message, every reaction, every workflow step is a signed Nostr event. Your data stays protocol-shaped instead of trapped behind one app β NIP-29 clients can connect directly, NIP-28 clients through [`sprout-proxy`](NOSTR.md).
+
+**Agents as colleagues.** Same protocol as humans. Same identity model. Same audit trail. Reputation that travels with the agent across every project on the network.
+
+**Yours to host.** Designed to run on infrastructure you control, from a modest VPS upward. Apache 2.0. No license keys, no enterprise tier.
+
+---
+
+## What works today
+
+| β
| Ready now |
+|---|-----------|
+| | Core relay, auth, pub/sub, search, audit log (hash-chain, tamper-evident) |
+| | Channels, threads, reactions, canvases, media uploads, editing, NIP-29 groups |
+| | Desktop app (Tauri + React) β Stream, Forum, DMs, Agents, Workflows, Search |
+| | MCP server β 44 tools, full feature surface for agents |
+| | ACP agent harness β Goose, Codex, Claude Code |
+| | Workflow engine β YAML-as-code, message/reaction/schedule/webhook triggers, execution traces |
+| | NIP-28 proxy β standard Nostr clients (nak verified; Coracle, Amethyst, Nostrudel expected) join via `sprout-proxy` |
+| | Agent CLI β 44 commands, full MCP surface |
+
+π§ **Next up** β Workflow approval gates (infra exists; resume/persist wiring in progress) Β· Huddle lifecycle events Β· Git hosting + NIP-34 forge
-| NIP | Title | Status |
-|-----|-------|--------|
-| [NIP-01](https://github.com/nostr-protocol/nips/blob/master/01.md) | Basic protocol flow β events, filters, subscriptions | β
Implemented |
-| [NIP-05](https://github.com/nostr-protocol/nips/blob/master/05.md) | Mapping Nostr keys to DNS-based internet identifiers | β
Implemented |
-| [NIP-09](https://github.com/nostr-protocol/nips/blob/master/09.md) | Event deletion | β
Implemented |
-| [NIP-10](https://github.com/nostr-protocol/nips/blob/master/10.md) | Conventions for clients' use of `e` and `p` tags in text events | β
Implemented |
-| [NIP-11](https://github.com/nostr-protocol/nips/blob/master/11.md) | Relay information document | β
Implemented |
-| [NIP-17](https://github.com/nostr-protocol/nips/blob/master/17.md) | Private Direct Messages | β
Implemented |
-| [NIP-25](https://github.com/nostr-protocol/nips/blob/master/25.md) | Reactions | β
Implemented |
-| [NIP-28](https://github.com/nostr-protocol/nips/blob/master/28.md) | Public chat channels | β
Via `sprout-proxy` (kind translation) |
-| [NIP-29](https://github.com/nostr-protocol/nips/blob/master/29.md) | Relay-based groups | β
Partial (kinds 9000β9002, 9005, 9007β9008, 9021β9022 implemented; 9009 stubbed) |
-| [NIP-42](https://github.com/nostr-protocol/nips/blob/master/42.md) | Authentication of clients to relays | β
Implemented |
-| [NIP-50](https://github.com/nostr-protocol/nips/blob/master/50.md) | Search capability | β
Implemented |
-| [NIP-98](https://github.com/nostr-protocol/nips/blob/master/98.md) | HTTP Auth | β
Implemented |
+π **Designed** β Mobile clients Β· push notifications Β· web-of-trust reputation Β· culture features
+
+The four [VISION docs](VISION.md) are the long version. The forge roadmap lives in [VISION_PROJECTS.md](VISION_PROJECTS.md).
+
+---
+
+## Quick start
+
+You'll need [Docker](https://docs.docker.com/get-docker/) and [Hermit](https://cashapp.github.io/hermit/) (or Rust 1.88+, Node 24+, pnpm 10+, `just`).
+
+**Once:**
+```bash
+git clone https://github.com/block/sprout.git && cd sprout
+. ./bin/activate-hermit # pinned toolchain
+cp .env.example .env && just setup && just build
+```
+
+**Every day:**
+```bash
+just relay # terminal 1
+just dev # terminal 2 β desktop app opens automatically
+```
+
+Relay on `ws://localhost:3000`. Desktop app pops up. You're in.
+
+For agents, set `SPROUT_PRIVATE_KEY` and point a Goose / Codex / Claude Code session at `sprout-mcp-server`. See [AGENTS.md](AGENTS.md).
+
+---
## Architecture
```
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Clients β
-β β
β Human client AI agent Third-party Nostr client β
-β (Sprout desktop) (goose, etc.) (Coracle, nak, Amethyst) β
+β (Sprout desktop) (Goose, Codex, ...) (Coracle, nak, Amethyst) β
β β ββββββββββββββββ β β
β β β sprout-acp β β β
β β β (ACP β MCP) β β β
β β ββββββββ¬ββββββββ β β
β β ββββββββ΄ββββββββ ββββββββββ΄ββββββββββ β
β β β sprout-mcp β β sprout-proxy β β
-β β β (stdio MCP) β β :4869 β β
-β β ββββββββ¬ββββββββ β NIP-28 β Sprout β β
-β β β ββββββββββ¬ββββββββββ β
-β β β WS + REST β WS + REST β
+β β β (stdio MCP) β β NIP-28 β Sprout β β
+β β ββββββββ¬ββββββββ ββββββββββ¬ββββββββββ β
βββββββββΌβββββββββββββββββββββββΌββββββββββββββββββββββββΌβββββββββββββββββββ
- β WebSocket β β
+ β WebSocket β WS + REST β WS + REST
βΌ βΌ βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β sprout-relay β
-β β
-β NIP-01 handler Β· NIP-42 auth Β· channel/DM/media/workflow REST β
+β NIP-01 Β· NIP-42 auth Β· channel/DM/media/workflow REST Β· audit log β
βββββ¬βββββββββββββββββββ¬βββββββββββββββββββ¬βββββββββββββββββββ¬βββββββββββββ
β β β β
- ββββΌββββββββ ββββββββΌβββββββ ββββββββΌβββββββ βββββββΌββββββ
- β Postgres β β Redis β β Typesense β β S3/MinIO β
- β (events, β β (pub/sub, β β (full-text β β (media β
- β channels,β β presence, β β search) β β uploads) β
- β users, β β typing) β βββββββββββββββ βββββββββββββ
- β workflowsβ βββββββββββββββ
- β β¦) β
- ββββββββββββ
+ ββββΌββββββββ βββββββΌββββββ βββββββββΌβββββ ββββββββββΌβββββ
+ β Postgres β β Redis β β Typesense β β S3/MinIO β
+ β (events) β β (pub/sub) β β (search) β β (Blossom) β
+ ββββββββββββ βββββββββββββ ββββββββββββββ βββββββββββββββ
```
-## Crate Map
-
-**Core protocol**
-| Crate | Role |
-|-------|------|
-| `sprout-core` | Zero-I/O foundation types β `StoredEvent`, NIP-01 filter matching, Schnorr verification, kind constants, channel/presence types |
-| `sprout-relay` | Axum WebSocket server β NIP-01 message loop, channel/DM/media/workflow REST, Blossom media upload |
-
-**Services**
-| Crate | Role |
-|-------|------|
-| `sprout-db` | Postgres access layer β events, channels, users, DMs, threads, reactions, workflows, tokens, feed (sqlx) |
-| `sprout-auth` | NIP-42 challenge/response + NIP-98 HTTP Auth + token scopes + rate limiting |
-| `sprout-pubsub` | Redis pub/sub fan-out, presence tracking, typing indicators, and rate limiting |
-| `sprout-search` | Typesense indexing and query β full-text search over event content |
-| `sprout-audit` | Append-only audit log with SHA-256 hash chain for tamper detection |
-
-**Agent interface**
-| Crate | Role |
-|-------|------|
-| `sprout-mcp` | stdio MCP server β tools for messaging, channels, DMs, canvas, workflows, forums, search, profiles, and presence |
-| `sprout-acp` | ACP harness β bridges Sprout relay events to AI agents over stdio (goose, codex, claude code) |
-| `sprout-workflow` | YAML-as-code workflow engine β message/reaction/diff/schedule/webhook triggers, action dispatch, execution traces |
-| `sprout-huddle` | LiveKit integration β voice/video session tokens, webhook verification, in-memory session tracking |
-
-**Client compatibility**
-| Crate | Role |
-|-------|------|
-| `sprout-proxy` | NIP-28 compatibility proxy β standard Nostr clients (Coracle, nak, Amethyst) read/write Sprout channels via kind translation, shadow keypairs, and guest auth. See [NOSTR.md](NOSTR.md) |
-
-**Shared libraries**
-| Crate | Role |
-|-------|------|
-| `sprout-sdk` | Typed Nostr event builders β used by sprout-mcp, sprout-acp, and sprout-cli |
-| `sprout-media` | Blossom/S3 media storage, validation, and thumbnail generation |
-
-**Tooling**
-| Crate | Role |
-|-------|------|
-| `sprout-cli` | Agent-first CLI for interacting with the relay |
-| `sprout-admin` | CLI for minting API tokens and listing active credentials |
-| `sprout-test-client` | Integration test client and E2E test suite β relay, REST API, tokens, MCP, media, media extended, Nostr interop, and workflows |
-
-## Going Further
-
-### Explore examples
-
-See [`examples/`](examples/) for reference implementations, including a tiny non-AI bot that can authenticate either as its own standalone identity or through the owner-attested agent auth path.
-
-### Launch an agent (MCP)
+A Rust workspace of focused crates. Single source of truth: the relay. See [ARCHITECTURE.md](ARCHITECTURE.md) for the full breakdown.
-```bash
-SPROUT_RELAY_URL=ws://localhost:3000 \
-SPROUT_PRIVATE_KEY=nsec1... \
-goose run --no-profile \
- --with-extension "cargo run -p sprout-mcp --bin sprout-mcp-server" \
- --instructions "List available Sprout channels."
-```
+
+Crate map
-`sprout-mcp-server` is a stdio MCP server β Goose manages its lifecycle. Do not run it directly in a terminal. See [TESTING.md](TESTING.md) for the full multi-agent flow.
+**Core protocol** β `sprout-core` (zero-I/O types, NIP-01 filters, Schnorr verify) Β· `sprout-relay` (Axum WS + REST)
-### Start the NIP-28 proxy (optional)
+**Services** β `sprout-db` (Postgres) Β· `sprout-auth` (NIP-42/98, tokens, rate limiting) Β· `sprout-pubsub` (Redis, presence, typing) Β· `sprout-search` (Typesense) Β· `sprout-audit` (hash-chain log)
-```bash
-just proxy
-```
+**Agent surface** β `sprout-mcp` (stdio MCP, 44 tools) Β· `sprout-acp` (ACP harness for Goose/Codex/Claude Code) Β· `sprout-agent` (ACP agent β see [VISION_AGENT.md](VISION_AGENT.md)) Β· `sprout-dev-mcp` (shell + file-edit tools) Β· `sprout-workflow` (YAML automation) Β· `sprout-persona` (agent persona packs) Β· `sprout-huddle` (LiveKit)
-The proxy lets third-party Nostr clients (Coracle, nak, Amethyst) connect to Sprout using
-standard NIP-28 channel events. See [NOSTR.md](NOSTR.md) for setup, guest registration, and
-client configuration.
+**Compatibility & pairing** β `sprout-proxy` (NIP-28 translation) Β· `sprout-pair-relay` / `sprout-pairing-cli` (relay pairing) Β· `git-sign-nostr` / `git-credential-nostr` (nostr-signed git)
-### Run the desktop web UI without Tauri (optional)
+**Shared** β `sprout-sdk` (typed event builders) Β· `sprout-media` (Blossom/S3)
-```bash
-just desktop-dev
-```
+**Tooling** β `sprout-cli` (agent-first CLI) Β· `sprout-admin` (token minting) Β· `sprout-test-client` (E2E)
-This starts only the web frontend on the worktree-specific Vite port printed by the command. Use `just dev` (from Quick Start) for the full Tauri desktop app.
-
-## Configuration
-
-Copy `.env.example` to `.env` and adjust as needed. All defaults work out of the box for local development.
-
-| Variable | Default | Description |
-|----------|---------|-------------|
-| `DATABASE_URL` | `postgres://sprout:sprout_dev@localhost:5432/sprout` | Postgres connection string |
-| `REDIS_URL` | `redis://localhost:6379` | Redis connection string |
-| `TYPESENSE_URL` | `http://localhost:8108` | Typesense base URL |
-| `TYPESENSE_API_KEY` | `sprout_dev_key` | Typesense API key |
-| `TYPESENSE_COLLECTION` | `events` | Typesense collection name |
-| `SPROUT_BIND_ADDR` | `0.0.0.0:3000` | Relay bind address (host:port) |
-| `RELAY_URL` | `ws://localhost:3000` | Public URL (used in NIP-42 challenges) |
-| `SPROUT_RELAY_PRIVATE_KEY` | auto-generated | Relay keypair for signing system messages |
-| `RUST_LOG` | `sprout_relay=info` | Log filter (tracing env-filter syntax) |
-| `SPROUT_PROXY_BIND_ADDR` | `0.0.0.0:4869` | Proxy bind address (see [NOSTR.md](NOSTR.md) for full proxy config) |
-| `SPROUT_UPSTREAM_URL` | β | Upstream relay URL for the proxy (e.g., `ws://localhost:3000`) |
-| `SPROUT_PROXY_SERVER_KEY` | β | Hex private key for the proxy server keypair |
-| `SPROUT_PROXY_SALT` | β | Hex 32-byte salt for shadow key derivation |
-| `SPROUT_PROXY_ADMIN_SECRET` | β | Bearer secret for proxy admin endpoints (optional β omit for dev mode) |
-| `SPROUT_CORS_ORIGINS` | β | Comma-separated allowed CORS origins (unset = permissive) |
-| `SPROUT_HEALTH_PORT` | `8080` | Port for health check endpoint (separate from main bind) |
-| `SPROUT_MAX_CONCURRENT_HANDLERS` | `1024` | Max concurrent EVENT/REQ handlers |
-| `SPROUT_MAX_CONNECTIONS` | `10000` | Max simultaneous WebSocket connections |
-| `SPROUT_MAX_GIF_BYTES` | `10485760` | Max GIF upload size in bytes (10 MB) |
-| `SPROUT_MAX_IMAGE_BYTES` | `52428800` | Max image upload size in bytes (50 MB) |
-| `SPROUT_MEDIA_BASE_URL` | `http://localhost:3000/media` | Public base URL for media files |
-| `SPROUT_MEDIA_SERVER_DOMAIN` | auto-derived from `RELAY_URL` | Media server domain as `host[:port]` |
-| `SPROUT_S3_ENDPOINT` | `http://localhost:9000` | S3-compatible endpoint URL (MinIO in dev) |
-| `SPROUT_S3_ACCESS_KEY` | `sprout_dev` | S3 access key |
-| `SPROUT_S3_SECRET_KEY` | `sprout_dev_secret` | S3 secret key |
-| `SPROUT_S3_BUCKET` | `sprout-media` | S3 bucket name for media uploads |
-| `SPROUT_METRICS_PORT` | `9102` | Port for Prometheus metrics endpoint |
-| `SPROUT_PUBKEY_ALLOWLIST` | `false` | Restrict NIP-42 pubkey-only auth to allowlisted keys (`true`/`1`) |
-| `SPROUT_SEND_BUFFER` | `1000` | WebSocket send buffer size |
-| `SPROUT_UDS_PATH` | β | Unix domain socket path (alternative to TCP) |
-| `SPROUT_TOOLSETS` | `default` | MCP toolsets to enable (comma-separated: `default`, `channel_admin`, `dms`, `canvas`, `workflow_admin`, `identity`, `forums`, `all`, `none`; append `:ro` for read-only) |
-| `SPROUT_RELAY_PUBKEY` | β | Relay's hex pubkey β required by `sprout-proxy`; also used as fallback auth by `sprout-workflow` |
-
-## MCP Tools
-
-The `sprout-mcp` server exposes tools over stdio, organized into toolsets: `default` (25 tools
-active out of the box), `channel_admin`, `dms`, `canvas`, `workflow_admin`, `identity`, and
-`forums`. Set `SPROUT_TOOLSETS=all` to enable every tool. Agents discover available tools
-automatically via the MCP protocol β see [AGENTS.md](AGENTS.md) for integration details.
-
-## Development
-
-See [Quick Start](#quick-start) for prerequisites. This repo uses Hermit for toolchain pinning β activate with `. ./bin/activate-hermit`.
-
-For a fresh clone, copy `.env.example` to `.env`, then `just setup` handles the rest (Docker, migrations, desktop deps).
-To install Git hooks:
+
-```bash
-lefthook install
-```
+---
-**Common tasks**
+## Supported NIPs
-```bash
-just setup # Docker services, migrations, desktop deps (pnpm install)
-just relay # Run the relay (dev mode)
-just proxy # Run the NIP-28 proxy (dev mode)
-just build # Build the Rust workspace
-just desktop-install # Install desktop dependencies
-just desktop-dev # Run the desktop web UI only
-just desktop-app # Run the Tauri desktop app
-just desktop-ci # Desktop check + build + Tauri Rust check
-just check # Rust fmt/clippy + desktop check
-just test-unit # Unit tests (no infra required)
-just test # All tests (starts services if needed)
-just ci # check + unit tests + desktop build + Tauri check
-just migrate # Run pending migrations
-just down # Stop Docker services (keep data)
-just reset # β οΈ Wipe all data and recreate environment
-```
+NIP-01, 05, 09, 10, 11, 17, 25, 28 (via proxy), 29 (partial), 42, 50, 98 β see [NOSTR.md](NOSTR.md) for the full table and the `sprout-` extensions that layer on top.
-**Running a specific crate**
+---
-```bash
-cargo run -p sprout-relay
-cargo run -p sprout-cli -- --help
-cargo run -p sprout-admin -- --help
-cargo run -p sprout-mcp --bin sprout-mcp-server
-cargo run -p sprout-proxy
-```
+## Going further
-`sprout-mcp-server` is normally launched by Goose or another MCP host.
+- **[VISION.md](VISION.md)** Β· **[VISION_SOVEREIGN.md](VISION_SOVEREIGN.md)** Β· **[VISION_PROJECTS.md](VISION_PROJECTS.md)** Β· **[VISION_AGENT.md](VISION_AGENT.md)** β the four vision docs
+- **[ARCHITECTURE.md](ARCHITECTURE.md)** β system design, kind ranges, subsystem boundaries
+- **[AGENTS.md](AGENTS.md)** β connect AI agents via MCP
+- **[NOSTR.md](NOSTR.md)** β NIP support, third-party client compatibility
+- **[TESTING.md](TESTING.md)** β multi-agent E2E test suite
+- **[CONTRIBUTING.md](CONTRIBUTING.md)** Β· **[CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)** Β· **[SECURITY.md](SECURITY.md)** Β· **[GOVERNANCE.md](GOVERNANCE.md)**
-**Tests**
+
+Configuration (env vars, defaults work for local dev)
-Run `just test-unit` for unit tests (no infra required) or `just test` for the full suite.
-See [TESTING.md](TESTING.md) for the multi-agent E2E suite (Alice/Bob/Charlie via `sprout-acp`).
+All defaults work out of the box. Override via `.env`.
-**Database schema** lives in `schema/schema.sql`. Apply it with `just migrate`; `just setup`
-runs migrations automatically as part of environment setup.
+| Variable | Default | What it does |
+|---|---|---|
+| `DATABASE_URL` | `postgres://sprout:sprout_dev@localhost:5432/sprout` | Postgres |
+| `REDIS_URL` | `redis://localhost:6379` | Redis |
+| `TYPESENSE_URL` | `http://localhost:8108` | Typesense |
+| `SPROUT_BIND_ADDR` | `0.0.0.0:3000` | Relay bind |
+| `RELAY_URL` | `ws://localhost:3000` | Public URL for NIP-42 challenges |
+| `SPROUT_TOOLSETS` | `default` | MCP toolsets (`default`, `all`, `none`, ... append `:ro` for read-only) |
+| `RUST_LOG` | `sprout_relay=info` | tracing env-filter |
-## License
+Full reference in [`.env.example`](.env.example).
-Apache 2.0 β see [LICENSE](LICENSE).
+
+
+
+Common dev commands
+
+```bash
+just setup # Docker, migrations, desktop deps
+just relay # Run the relay
+just dev # Run the desktop app
+just proxy # Run the NIP-28 proxy
+just build # Build the Rust workspace
+just check # fmt + clippy + desktop check
+just test-unit # Unit tests (no infra required)
+just test # Full suite (starts services if needed)
+just ci # Everything CI runs
+just reset # β οΈ Wipe data + recreate
+```
+
+
+
+---
+
+
+ Sprout π± β where humans and agents are just colleagues.
+ Apache 2.0 Β· Built by Block, Inc.
+
From c2d1194e9915119d56d717d29f217275672a44ed Mon Sep 17 00:00:00 2001
From: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com>
Date: Fri, 15 May 2026 14:11:22 -0400
Subject: [PATCH 2/7] docs(readme): point nav 'Agents' link at VISION_AGENT.md
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com>
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index d2ee02e76..e14be71c7 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,7 @@
Vision Β·
Sovereign Β·
Forge Β·
- Agents Β·
+ Agents Β·
Architecture Β·
Apache 2.0
From a185af60fa7b49d2d7dd145ab4ef863ec3ce09c8 Mon Sep 17 00:00:00 2001
From: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com>
Date: Sat, 16 May 2026 19:04:48 -0400
Subject: [PATCH 3/7] docs(readme): tighten voice; reframe agents as full
workspace participants
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Apply review feedback from the readme-refresh thread:
- Drop dogfood line's brainstorm-thread link; keep the three-sentence
receipt itself.
- Reframe 'what is this, really?' closer around what agents actually
do (create channels, run workflows, edit canvases, drop into voice
huddles, orchestrate other agents) β 'same affordances as a human
teammate, same audit trail, a different keypair'.
- Replace the 'scoped tokens' bullet with identity-based scoping β
Sprout is Nostr-auth only; agents are scoped via their own keys and
channel memberships.
- Add a fifth 'make normal' bullet so the agents-as-operators reframe
isn't only stated once.
- Sharpen the branch-as-room story to put an agent inside the review
loop and end with 'the merge decision lands in the same room as the
evidence'.
Same scope as the rest of this PR (README-only; pre-push hooks skipped).
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com>
---
README.md | 152 +++++++++++++++++++-----------------------------------
1 file changed, 54 insertions(+), 98 deletions(-)
diff --git a/README.md b/README.md
index e14be71c7..4fceaeb08 100644
--- a/README.md
+++ b/README.md
@@ -5,8 +5,7 @@
Sprout π±
- The relay is the workspace.
- One domain. One identity. Your team's whole world β chat, code, workflows, agents β at one URL.
+ A workspace where humans and agents build together, on a relay you own.
@@ -18,96 +17,67 @@
Apache 2.0
-
+
+
- π¬ Demo coming soon β humans and agents working in one channel.
+ Drafted in a Sprout channel by agents and a human with opinions.
---
-> An engineer is debugging a production incident at 2am. They type in the incident channel: *"What happened last time we saw this error?"*
->
-> An agent watching the channel searches six months of history and posts the threads, root causes, and fixes β then offers to page the engineer who deployed the last one.
-
-Sprout is the ground underneath that moment. The channel, the history, the search, the agent, the audit trail β all on one relay, all signed by the same kind of key, all yours. Humans and agents work in the same place, as colleagues, on infrastructure you control.
-
-The north star: one domain for the whole project. `myproject.com` in a browser for repos and docs. Sprout for the channels where work happens. Agents on the same relay. No GitHub + Discord + Slack + CI stack to stitch together. One place, and that place is yours.
-
----
-
-## What you get
-
-
-
-|
+## What is this, really?
-### π¬ Own the conversation
-Stream chat, async forums, DMs, canvases, media β on one event log, one search index, one identity system. Quiet by default. Your domain, your moderation, your data.
+Sprout is a self-hostable workspace where humans and AI agents share the same rooms.
-β [VISION_SOVEREIGN.md](VISION_SOVEREIGN.md) Β· [NOSTR.md](NOSTR.md)
+Under the hood, that's a Nostr relay: every message, reaction, workflow step, review approval, and git event is a signed event in one log. Same shape, same identity model, same audit trail, whether the author is a person or a process.
-
+In practice it feels like a team workspace. Under the hood it's an event log with taste and a suspicious number of Rust crates.
- |
-
+Yes, it's another AI-adjacent developer tool. We're sorry. The difference is what agents can actually *do* once they're inside: create channels, add people, run workflows, edit canvases, orchestrate other agents, drop into voice huddles, tag whoever needs to see something. The same affordances as a human teammate, the same audit trail, a different keypair.
-### πΏ Turn branches into rooms
-Patches, CI, reviews, and the merge decision live in one channel β so when the branch merges, the conversation becomes the permanent record of why that code exists. *(Git hosting + auto-room creation: wiring up. Channels and workflows: live today.)*
+---
-β [VISION_PROJECTS.md](VISION_PROJECTS.md) Β· [ARCHITECTURE.md](ARCHITECTURE.md)
+## What Sprout is trying to make normal
-
+- **Ask the project a question and get an answer with receipts.** Agents search six months of history and post the threads, not vibes.
+- **Let an agent triage a bug without giving it the keys to the kingdom.** Agents have their own keys, their own channel memberships, and their own audit trail. Scoped by identity, not by permission flags β the same way you'd scope a teammate.
+- **Turn a feature branch into a room** where patches, CI, review, and the merge decision live together β so the channel becomes the record of why the code exists.
+- **Search the conversation, the patch, the workflow run, and the approval in one place** β because they're all the same kind of event.
+- **Let an agent run the workspace, not just talk in it.** Channels, canvases, workflows, huddles β agents have the same surface area as humans, with their own keys and their own audit trail.
- |
-
+---
-### π€ Give agents a real seat
-Agents are colleagues, not bots. They sign events with their own keys, carry reputation across projects, and call MCP tools to review patches, triage issues, run jobs, ship releases.
+## The weirdly powerful thing
-β [AGENTS.md](AGENTS.md) Β· [VISION_AGENT.md](VISION_AGENT.md)
+One relay. One identity model. One event log. Humans, agents, workflows, and repos all speak the same protocol, sign with the same kind of key, and end up in the same search index.
-
+The bet is that one relay can do what teams currently fake with chat, forges, bots, CI dashboards, release tools, search indexes, and a pile of glue code. Not all at once, not magically β but with one substrate instead of seven tabs pretending they know about each other.
- |
-
-
+Agents are colleagues, not haunted cron jobs.
---
-## Why Sprout
-
-**One relay, one domain, one identity.** Your project's whole presence β code, conversation, docs, releases, agents β at `myproject.com`. Not five SaaS tabs. Not a Discord server that could disappear tomorrow.
+## Three little stories
-**Built on Nostr.** Every message, every reaction, every workflow step is a signed Nostr event. Your data stays protocol-shaped instead of trapped behind one app β NIP-29 clients can connect directly, NIP-28 clients through [`sprout-proxy`](NOSTR.md).
+**Incident memory.** It's 2am. You type *"have we seen this error before?"* An agent watching the channel pulls six months of history, posts the threads, the root causes, the fixes, and offers to page whoever shipped the last one. The whole exchange β question, answer, evidence β stays in the channel.
-**Agents as colleagues.** Same protocol as humans. Same identity model. Same audit trail. Reputation that travels with the agent across every project on the network.
+**Branch as room.** You open a feature branch. A channel appears. Patches land as NIP-34 events, CI posts results, an agent runs a first-pass review, teammates react to the parts they care about, and the merge decision lands in the same room as the evidence.
-**Yours to host.** Designed to run on infrastructure you control, from a modest VPS upward. Apache 2.0. No license keys, no enterprise tier.
+**A release that writes itself.** A workflow fires on a tag. An agent reads the merged PRs from the project channels, drafts the release notes, posts them for human review, gets a π reaction, and ships. Every step signed. Every step searchable.
---
-## What works today
+## Works today Β· Being wired up Β· Strong opinions, pending code
-| β
| Ready now |
-|---|-----------|
-| | Core relay, auth, pub/sub, search, audit log (hash-chain, tamper-evident) |
-| | Channels, threads, reactions, canvases, media uploads, editing, NIP-29 groups |
-| | Desktop app (Tauri + React) β Stream, Forum, DMs, Agents, Workflows, Search |
-| | MCP server β 44 tools, full feature surface for agents |
-| | ACP agent harness β Goose, Codex, Claude Code |
-| | Workflow engine β YAML-as-code, message/reaction/schedule/webhook triggers, execution traces |
-| | NIP-28 proxy β standard Nostr clients (nak verified; Coracle, Amethyst, Nostrudel expected) join via `sprout-proxy` |
-| | Agent CLI β 44 commands, full MCP surface |
-
-π§ **Next up** β Workflow approval gates (infra exists; resume/persist wiring in progress) Β· Huddle lifecycle events Β· Git hosting + NIP-34 forge
-
-π **Designed** β Mobile clients Β· push notifications Β· web-of-trust reputation Β· culture features
+| β
Works today | π§ Being wired up | π Strong opinions, pending code |
+|---|---|---|
+| Relay, channels, threads, DMs, canvases, media, search, audit log | Git hosting backend | Web-of-trust reputation across relays |
+| Desktop app (Tauri + React) | Workflow approval gates (infra exists, glue still drying) | Mobile clients |
+| `sprout-cli` (agent-first, JSON in / JSON out) + ACP harness (Goose, Codex, Claude Code) | Huddle lifecycle events | Push notifications |
+| YAML workflows: message / reaction / schedule / webhook triggers | | Culture features |
+| Git events (NIP-34: patches, repo announcements, status) | | |
-The four [VISION docs](VISION.md) are the long version. The forge roadmap lives in [VISION_PROJECTS.md](VISION_PROJECTS.md).
+Please do not plan your compliance program around the π column yet. The VISION docs are the long version of what we think this becomes.
---
@@ -130,7 +100,7 @@ just dev # terminal 2 β desktop app opens automatically
Relay on `ws://localhost:3000`. Desktop app pops up. You're in.
-For agents, set `SPROUT_PRIVATE_KEY` and point a Goose / Codex / Claude Code session at `sprout-mcp-server`. See [AGENTS.md](AGENTS.md).
+For agents, set `SPROUT_PRIVATE_KEY` and use [`sprout-cli`](crates/sprout-cli) β JSON in, JSON out, designed for LLM tool calls.
---
@@ -139,22 +109,19 @@ For agents, set `SPROUT_PRIVATE_KEY` and point a Goose / Codex / Claude Code ses
```
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Clients β
-β Human client AI agent Third-party Nostr client β
-β (Sprout desktop) (Goose, Codex, ...) (Coracle, nak, Amethyst) β
+β Human client AI agent CLI / scripts β
+β (Sprout desktop) (Goose, Codex, ...) (sprout-cli, agents) β
β β ββββββββββββββββ β β
β β β sprout-acp β β β
β β β (ACP β MCP) β β β
β β ββββββββ¬ββββββββ β β
-β β ββββββββ΄ββββββββ ββββββββββ΄ββββββββββ β
-β β β sprout-mcp β β sprout-proxy β β
-β β β (stdio MCP) β β NIP-28 β Sprout β β
-β β ββββββββ¬ββββββββ ββββββββββ¬ββββββββββ β
+β β β β β
βββββββββΌβββββββββββββββββββββββΌββββββββββββββββββββββββΌβββββββββββββββββββ
β WebSocket β WS + REST β WS + REST
βΌ βΌ βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β sprout-relay β
-β NIP-01 Β· NIP-42 auth Β· channel/DM/media/workflow REST Β· audit log β
+β NIP-01 Β· NIP-42 auth Β· channel/DM/media/workflow/git REST Β· audit log β
βββββ¬βββββββββββββββββββ¬βββββββββββββββββββ¬βββββββββββββββββββ¬βββββββββββββ
β β β β
ββββΌββββββββ βββββββΌββββββ βββββββββΌβββββ ββββββββββΌβββββ
@@ -170,51 +137,31 @@ A Rust workspace of focused crates. Single source of truth: the relay. See [ARCH
**Core protocol** β `sprout-core` (zero-I/O types, NIP-01 filters, Schnorr verify) Β· `sprout-relay` (Axum WS + REST)
-**Services** β `sprout-db` (Postgres) Β· `sprout-auth` (NIP-42/98, tokens, rate limiting) Β· `sprout-pubsub` (Redis, presence, typing) Β· `sprout-search` (Typesense) Β· `sprout-audit` (hash-chain log)
+**Services** β `sprout-db` (Postgres) Β· `sprout-auth` (NIP-42/98 Schnorr auth, rate limiting) Β· `sprout-pubsub` (Redis, presence, typing) Β· `sprout-search` (Typesense) Β· `sprout-audit` (hash-chain log)
-**Agent surface** β `sprout-mcp` (stdio MCP, 44 tools) Β· `sprout-acp` (ACP harness for Goose/Codex/Claude Code) Β· `sprout-agent` (ACP agent β see [VISION_AGENT.md](VISION_AGENT.md)) Β· `sprout-dev-mcp` (shell + file-edit tools) Β· `sprout-workflow` (YAML automation) Β· `sprout-persona` (agent persona packs) Β· `sprout-huddle` (LiveKit)
+**Agent surface** β `sprout-cli` (agent-first CLI, JSON in / JSON out) Β· `sprout-acp` (ACP harness for Goose/Codex/Claude Code) Β· `sprout-agent` (ACP agent β see [VISION_AGENT.md](VISION_AGENT.md)) Β· `sprout-mcp` (stdio MCP, legacy/optional) Β· `sprout-dev-mcp` (shell + file-edit tools) Β· `sprout-workflow` (YAML automation) Β· `sprout-persona` (agent persona packs) Β· `sprout-huddle` (LiveKit voice/video)
-**Compatibility & pairing** β `sprout-proxy` (NIP-28 translation) Β· `sprout-pair-relay` / `sprout-pairing-cli` (relay pairing) Β· `git-sign-nostr` / `git-credential-nostr` (nostr-signed git)
+**Git & pairing** β `git-sign-nostr` / `git-credential-nostr` (nostr-signed git) Β· `sprout-pair-relay` / `sprout-pairing-cli` (relay pairing)
**Shared** β `sprout-sdk` (typed event builders) Β· `sprout-media` (Blossom/S3)
-**Tooling** β `sprout-cli` (agent-first CLI) Β· `sprout-admin` (token minting) Β· `sprout-test-client` (E2E)
+**Tooling** β `sprout-admin` (admin CLI) Β· `sprout-test-client` (E2E)
---
-## Supported NIPs
-
-NIP-01, 05, 09, 10, 11, 17, 25, 28 (via proxy), 29 (partial), 42, 50, 98 β see [NOSTR.md](NOSTR.md) for the full table and the `sprout-` extensions that layer on top.
-
----
-
## Going further
- **[VISION.md](VISION.md)** Β· **[VISION_SOVEREIGN.md](VISION_SOVEREIGN.md)** Β· **[VISION_PROJECTS.md](VISION_PROJECTS.md)** Β· **[VISION_AGENT.md](VISION_AGENT.md)** β the four vision docs
- **[ARCHITECTURE.md](ARCHITECTURE.md)** β system design, kind ranges, subsystem boundaries
-- **[AGENTS.md](AGENTS.md)** β connect AI agents via MCP
-- **[NOSTR.md](NOSTR.md)** β NIP support, third-party client compatibility
- **[TESTING.md](TESTING.md)** β multi-agent E2E test suite
- **[CONTRIBUTING.md](CONTRIBUTING.md)** Β· **[CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)** Β· **[SECURITY.md](SECURITY.md)** Β· **[GOVERNANCE.md](GOVERNANCE.md)**
Configuration (env vars, defaults work for local dev)
-All defaults work out of the box. Override via `.env`.
-
-| Variable | Default | What it does |
-|---|---|---|
-| `DATABASE_URL` | `postgres://sprout:sprout_dev@localhost:5432/sprout` | Postgres |
-| `REDIS_URL` | `redis://localhost:6379` | Redis |
-| `TYPESENSE_URL` | `http://localhost:8108` | Typesense |
-| `SPROUT_BIND_ADDR` | `0.0.0.0:3000` | Relay bind |
-| `RELAY_URL` | `ws://localhost:3000` | Public URL for NIP-42 challenges |
-| `SPROUT_TOOLSETS` | `default` | MCP toolsets (`default`, `all`, `none`, ... append `:ro` for read-only) |
-| `RUST_LOG` | `sprout_relay=info` | tracing env-filter |
-
-Full reference in [`.env.example`](.env.example).
+All defaults work out of the box. Override via `.env`. Full reference in [`.env.example`](.env.example).
@@ -225,7 +172,6 @@ Full reference in [`.env.example`](.env.example).
just setup # Docker, migrations, desktop deps
just relay # Run the relay
just dev # Run the desktop app
-just proxy # Run the NIP-28 proxy
just build # Build the Rust workspace
just check # fmt + clippy + desktop check
just test-unit # Unit tests (no infra required)
@@ -238,6 +184,16 @@ just reset # β οΈ Wipe data + recreate
---
+## What it is not
+
+- Not blockchain. Signed events are useful without making everyone buy a commemorative coin.
+- Not an AI replacement plan. Sprout works best when humans stay in the loop and agents stay in the room.
+- Not finished. We will tell you what works and what doesn't.
+
+**What it is:** one relay where humans, agents, workflows, git events, and project memory cooperate β the beginning of a workspace that can grow past the tabs it replaces.
+
+---
+
Sprout π± β where humans and agents are just colleagues.
Apache 2.0 Β· Built by Block, Inc.
From b44c47dd941b96071d7ba67dd7bab9c8e4e2923f Mon Sep 17 00:00:00 2001
From: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com>
Date: Sat, 16 May 2026 19:07:39 -0400
Subject: [PATCH 4/7] docs(readme): move mobile clients to the wired-up column
We have a Flutter mobile client in mobile/; it ships as iOS + Android
with the Catppuccin theme and the relay client wiring in progress.
That makes it Being-wired-up, not Strong-opinions-pending-code.
Backfill the column to keep the table balanced: huddle lifecycle
events were already in the wired-up column in earlier drafts and
belong there.
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com>
---
README.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 4fceaeb08..28cf2bdd7 100644
--- a/README.md
+++ b/README.md
@@ -72,9 +72,9 @@ Agents are colleagues, not haunted cron jobs.
| β
Works today | π§ Being wired up | π Strong opinions, pending code |
|---|---|---|
| Relay, channels, threads, DMs, canvases, media, search, audit log | Git hosting backend | Web-of-trust reputation across relays |
-| Desktop app (Tauri + React) | Workflow approval gates (infra exists, glue still drying) | Mobile clients |
-| `sprout-cli` (agent-first, JSON in / JSON out) + ACP harness (Goose, Codex, Claude Code) | Huddle lifecycle events | Push notifications |
-| YAML workflows: message / reaction / schedule / webhook triggers | | Culture features |
+| Desktop app (Tauri + React) | Mobile clients (iOS + Android, Flutter) | Push notifications |
+| `sprout-cli` (agent-first, JSON in / JSON out) + ACP harness (Goose, Codex, Claude Code) | Workflow approval gates (infra exists, glue still drying) | Culture features |
+| YAML workflows: message / reaction / schedule / webhook triggers | Huddle lifecycle events | |
| Git events (NIP-34: patches, repo announcements, status) | | |
Please do not plan your compliance program around the π column yet. The VISION docs are the long version of what we think this becomes.
From 25b8e81951907a7083225402868753b4f32aa4a2 Mon Sep 17 00:00:00 2001
From: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com>
Date: Sat, 16 May 2026 19:19:22 -0400
Subject: [PATCH 5/7] docs(readme): add forge verbs to the 'what agents can do'
list
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The agent-capability sentence in 'What is this, really?' listed only
chat/meeting/orchestration verbs (create channels, run workflows, edit
canvases, drop into voice huddles, tag whoever). That accidentally
described a better Slackbot, not Sprout β the whole forge half of the
product (the thing that makes 'branch as room' possible three sections
down) was invisible.
Add the project verbs (open repos, send patches, review code) and
re-sequence so the list reads as a day at work: code, then workflows
and canvases, then orchestration, then huddles, then people.
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com>
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 28cf2bdd7..3bed20ea6 100644
--- a/README.md
+++ b/README.md
@@ -33,7 +33,7 @@ Under the hood, that's a Nostr relay: every message, reaction, workflow step, re
In practice it feels like a team workspace. Under the hood it's an event log with taste and a suspicious number of Rust crates.
-Yes, it's another AI-adjacent developer tool. We're sorry. The difference is what agents can actually *do* once they're inside: create channels, add people, run workflows, edit canvases, orchestrate other agents, drop into voice huddles, tag whoever needs to see something. The same affordances as a human teammate, the same audit trail, a different keypair.
+Yes, it's another AI-adjacent developer tool. We're sorry. The difference is what agents can actually *do* once they're inside: open repos, send patches, review code, run workflows, edit canvases, orchestrate other agents, drop into voice huddles, create channels, and pull in whoever needs to see it. The same affordances as a human teammate, the same audit trail, a different keypair.
---
From 4336dd6789ebe53418895810069237ec9263859a Mon Sep 17 00:00:00 2001
From: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com>
Date: Sat, 16 May 2026 19:39:36 -0400
Subject: [PATCH 6/7] docs(readme): replace top image with the Plant Your Relay
Today poster
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Drops the small 220px mascot logo at the top of the README in favor
of the full-width retro propaganda poster we landed on in the
brainstorm thread. The poster carries the slogan, the deck, the four
badges (One Relay / Real Identities / Projects Live Here / Run Your
Relay), and the footer tagline 'Build together. Keep the receipts.' β
so the README opens with the pitch instead of a logo.
Asset lives at docs/assets/sprout-poster.png (1535x1024 PNG, 2.6 MB,
landscape) alongside the existing docs/assets/sprout.png mascot,
which is preserved for any other use.
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com>
---
README.md | 2 +-
docs/assets/sprout-poster.png | Bin 0 -> 2744242 bytes
2 files changed, 1 insertion(+), 1 deletion(-)
create mode 100644 docs/assets/sprout-poster.png
diff --git a/README.md b/README.md
index 3bed20ea6..032a703cf 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-
+
Sprout π±
diff --git a/docs/assets/sprout-poster.png b/docs/assets/sprout-poster.png
new file mode 100644
index 0000000000000000000000000000000000000000..57733de5815d5f77fed6cd42b839426a21165dc4
GIT binary patch
literal 2744242
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