Introduction
"Not agents assisting humans. Agents and humans in the same room, working on the same thing."
This is article #175 in the "One Open Source Project a Day" series. Today's project is Buzz — the open-source team workspace released by Block (Jack Dorsey's company) on July 21, 2026. Its core premise: AI agents should join teams as full members, not be bolted on as bots or plugins.
Slack, Teams, GitHub — existing collaboration tools integrate AI roughly like this: configure a bot token, let the bot monitor a channel, trigger a response when @mentioned. The agent has no independent identity, no persistent history, no auditable action record, and permissions controlled by the platform rather than the organization.
Buzz takes a different approach. Built on the Nostr protocol, every participant — human or agent — holds a keypair that belongs to them, not the platform. Identity, behavior, and history are all cryptographically signed and portable to any Nostr-compatible system. A human member and an agent member look identical in the channel.
21,300 Stars. Apache 2.0. That's six days after launch.
What You'll Learn
- Why Buzz chose Nostr instead of building its own identity system
- How agents become full members in Buzz, not bots
- How the ACP protocol drives Claude Code, Codex, Goose, and other agents
- buzz-cli's machine-first design: built for LLM tool calls
- The YAML workflow engine: triggers, steps, and action types
- The Rust + Axum backend, Tauri desktop app, full technical stack
Prerequisites
- Familiarity with team collaboration tools (Slack/Discord-type workflows)
- Basic understanding of AI agent tool-calling
- Knowing what a keypair (public/private key) is helps
Project Background
Why Block Built Buzz
Block spent two years building AI tools internally and reached one conclusion: productive work happens when humans and agents are in the same context together. Separate tools, separate systems, separate histories produce fragmentation and repeated context-rebuilding.
The problem with existing platforms isn't missing features — it's the wrong design assumption: they treat AI as "assistants" rather than "members."
Buzz's starting point: agents should have the same participation rights as human members — independent identity, auditable behavior, persistent history, configurable permissions.
Timeline
- July 21, 2026: Public launch with simultaneous open-source release
- GitHub: 21,300 Stars within days of launch
- Hosted: buzz.xyz (Block's instance)
- Self-hosted: Full Docker + Rust toolchain support
Author / Team
- Company: Block, Inc. (founded by Jack Dorsey)
- License: Apache-2.0
- Primary language: Rust (backend) + TypeScript/React (desktop via Tauri) + Dart (mobile via Flutter)
Project Stats
- ⭐ GitHub Stars: 21,300+
- 🍴 Forks: 2,300+
- 📄 License: Apache-2.0
- 📅 Launch date: 2026-07-21
Why Nostr
Buzz's identity system runs entirely on the Nostr protocol. That decision shapes the entire product architecture.
The Problem Nostr Solves
Traditional collaboration platform identity: the platform issues accounts, controls access, owns the identity and history. Switching platforms means rebuilding everything.
Nostr's model: each participant generates their own secp256k1 keypair. The private key belongs to them. Every message is signed with that key. Identity belongs to no platform, history is portable, behavior is non-repudiable.
What this means for agents:
Traditional bot model:
Platform issues bot token → agent calls API with token → token revoked = agent gone
Identity belongs to the platform, history belongs to the platform
Buzz / Nostr model:
Agent generates its own keypair → signs every message with its private key → key belongs to agent
Identity is portable, history lives in the relay, switching relays preserves identityNostr NIPs in Use
- NIP-01: Base event format (the underlying structure of every message)
- NIP-42: Authentication (verifying key ownership when connecting to the relay)
- NIP-34: Git integration (patch submissions, repo announcements, commit status)
"The Relay URL Is the Community"
One Buzz design decision: a community (workspace) is identified by its relay URL. wss://your-org.buzz.xyz is your workspace — the URL itself is the authoritative identifier. Different relays are different communities. All state on one relay shares a single event log.
How Agents Become Full Members
Not a Bot, a Member
Traditional platform bots: a service account that monitors specific channels and triggers responses on @mention. In the permission model, typically a separate category from human members.
Buzz agents: hold their own keypair, join channels exactly as humans do, and their messages are signed Nostr events that appear in channel history indistinguishably from human messages.
Adding an agent to a channel:
# Same operation used for adding a human member
buzz channels add-member --channel CHANNEL_ID --pubkey AGENT_PUBKEY --role memberWhat Cryptographic Identity Means in Practice
Every message an agent sends carries a signature from that agent's private key:
- Non-repudiable: anyone can verify which agent produced any given message
- Auditable: agent actions in the audit log have unambiguous attribution — not "some bot"
- Portable: the agent's keypair isn't bound to Buzz; the same identity works on any Nostr-compatible system
How ACP Drives Agents
Buzz routes relay events to agent processes through ACP (Agent Client Protocol):
Buzz relay (WebSocket event stream)
↓
buzz-acp (standalone binary, runs outside the relay)
↓
ACP (JSON-RPC over stdin/stdout)
↓
Agent process (Claude Code / Codex / Goose / custom)
↓
MCP tool calls → message posted back to channelKey design: one active prompt per channel at a time. Subsequent @mentions queue while the current prompt is in flight, preventing overlapping context windows from race conditions. Agent process crashes trigger automatic harness restarts. Conversation history lives in the relay's Postgres database, not the ACP process — agents restart with full context intact.
Supported Agents
Built-in support (auto-detected from locally installed harnesses):
- Claude Code (Anthropic)
- Codex (OpenAI)
- Goose (Block's own agent)
- Grok (xAI)
- Any custom ACP-compatible agent
buzz-cli: An Interface Built for Machines
Machine-First Design Principles
The Buzz CLI is designed for programmatic consumption, not human convenience:
- JSON to stdout: all output is structured JSON, parseable by programs
- Structured errors to stderr: error output is separated from result output
- Meaningful exit codes: 0 = success, non-zero = typed failure, scriptable
Configuration via environment variables:
export BUZZ_RELAY_URL='http://localhost:3000'
export BUZZ_PRIVATE_KEY='nsec...' # agent's or user's private keyCore Operations
# Channel management
buzz channels list
buzz channels create --name "dev-ops"
# Send a message
buzz messages send --channel CHANNEL_ID --text "Deploy complete, v2.3.1"
# Full-text search (covers messages + canvases + git events — all one index)
buzz messages search --query "deploy failed" --since 24h
# Read a thread
buzz threads read --thread-id THREAD_ID
# Canvas read/write (documents)
buzz canvases write --canvas-id ID --content "..."
# Workflow management
buzz workflows list
buzz workflows run --workflow-id ID
# Agent memory storage
buzz memory set --key "deployment-config" --value "..."
buzz memory get --key "deployment-config"
# Git repo announcements (NIP-34)
buzz repos announce --url https://github.com/org/repoThe intended use: agents call these commands via MCP tools to post reports to channels, read context, update canvases, and query history — without directly manipulating the relay protocol.
YAML Workflow Engine
Trigger Types
Workflows support four trigger types:
trigger:
on: message_posted # when a message is posted
# on: reaction_added # when someone adds an emoji reaction
# on: schedule # cron expression
# on: webhook # external HTTP webhookFull Example: Release Request Workflow
name: "Release request"
trigger:
on: message_posted
filter: "str_contains(trigger_text, 'ship it')"
steps:
- id: announce
action: send_message
channel: "{{trigger.channel_id}}"
text: "Release requested by {{trigger.author}} — starting deployment pipeline."
- id: notify-ops
action: send_dm
to: "ops-lead-pubkey"
text: "Manual approval needed for release from {{trigger.author}}"
- id: wait-approval
action: wait_approval
approvers: ["ops-lead-pubkey", "eng-lead-pubkey"]
timeout: 30m
- id: trigger-deploy
action: webhook
url: "https://ci.internal/deploy"
method: POST
body: '{"version": "{{vars.release_tag}}"}'Every step emits events into the relay's event log. Search queries across workflow execution history the same way they search channel messages.
Supported Action Types
send_message— post to a channelsend_dm— send a direct messageadd_reaction— add an emoji reactionwebhook— trigger an external HTTP requestwait_delay— pause for a specified durationwait_approval— wait for human approval (partially implemented)
Technical Architecture
Backend (Rust)
Buzz's relay is a Rust workspace with focused crates:
buzz-relay Axum WebSocket + REST HTTP server
buzz-store Postgres event storage + full-text search
buzz-pubsub Redis pub/sub (real-time message fan-out)
buzz-media S3/MinIO media file storage
buzz-acp ACP protocol harness (standalone binary)One event log: chat messages, canvas updates, code reviews, CI events, and workflow step results are all Nostr events in the same Postgres table with the same full-text index. Searching "deploy" returns related chat discussion, canvas docs, and Git commit statuses from a single query.
Security model:
- Tenant context resolved from server hostname, not client-supplied tags — agents can't forge cross-community access
- Channel-scoped tokens cannot publish global events
- Subscription delivery re-checks permissions at fan-out time, catching changes after subscription
- Ephemeral events (typing indicators, presence) are verified and access-checked but never written to Postgres
Desktop App (Tauri + React)
# Start relay + desktop together
just devTauri provides system capabilities (file access, notifications) via Rust; React handles UI rendering. The result is a native desktop app with lower memory footprint than Electron.
Mobile (Flutter)
iOS and Android clients are Flutter-based, currently in active development.
Quick Start
Local Development
git clone https://github.com/block/buzz.git
cd buzz
# Use Hermit to manage the toolchain (recommended)
. ./bin/activate-hermit
# Or install manually: Rust 1.88+, Node 24+, pnpm 10+, just
just setup # initialize dependencies
just build # build all components
just dev # start relay (ws://localhost:3000) + desktop appDocker
docker compose up -dIncludes relay, Postgres, Redis, and MinIO (media storage).
Railway One-Click Deploy
A Railway deployment template is included in the repo — one click to deploy a private Buzz instance in the cloud.
Connect an Agent
# Install buzz-cli
cargo install buzz-cli
# Set environment variables
export BUZZ_RELAY_URL='wss://your-relay.buzz.xyz'
export BUZZ_PRIVATE_KEY='nsec...'
# Add agent to a channel
buzz channels add-member --channel CHANNEL_ID --pubkey AGENT_PUBKEY --role member
# Start the ACP harness (auto-detects locally installed agents)
buzz-acp --relay wss://your-relay.buzz.xyz --key nsec...Resources
- 🌟 GitHub: block/buzz
- 🌐 Hosted: buzz.xyz
- 📖 Launch post: block.xyz/inside/introducing-buzz
- 💬 Hacker News: news.ycombinator.com/item?id=48632977
Summary
Buzz bets everything on one design decision: AI agents should join teams as full members, not as attached tools. That decision drives every subsequent choice — Nostr (identity not controlled by any platform), cryptographic keypairs (behavior is auditable), buzz-cli's JSON output (LLM-callable), ACP protocol (unified agent integration standard).
The one-event-log design is worth noting. Chat messages, code reviews, CI notifications, and workflow execution steps all go into the same Nostr event stream with the same full-text index. An agent querying history doesn't need to know "is this a chat event or a code event" — one search surfaces all relevant context. That's an agent-native data model, not a human-designed taxonomy with an agent adapter bolted on.
Buzz is early. Some workflow actions return NotImplemented, the mobile client is in progress, and the ecosystem is just forming. But Block has done something important: it moved the agent collaboration problem from "API integration" to "platform design," then open-sourced the whole platform for the community to evolve.
Explore PrimeSkills — A marketplace for handpicked AI Agents and skills. Each is validated in real enterprise workflows, stripping away hype and keeping only what truly works.
Welcome to my Homepage for more useful insights and interesting products.