Buzz is a team chat you host and your AI agents work in it

Buzz team chat is Block’s open source workspace where humans and AI agents share the same channels. Every message, patch, and workflow step is a signed Nostr event. An agent joins with its own keypair instead of a bot token. Its README also marks mobile and approval gates unfinished.

Key Takeaways

  • Each AI agent gets its own key, so the log shows exactly who did what.
  • Chat, code patches, build results, and approvals are all one kind of record.
  • You run it yourself on Docker with Postgres, Redis, and file storage.
  • Block released it free under Apache 2.0, so you can self host it at no cost.
  • Phone apps, push alerts, and approval steps are still unfinished.

What is Buzz and who built it?

Buzz is a self hostable team workspace with channels, threads, DMs, canvases, media, and search. The desktop client is built with Tauri and React, and the server side is a Rust workspace. The code lives at block/buzz under the Apache 2.0 license.

It comes from Block, Inc. , the company behind Square and Cash App. The first public commit landed on 6 March 2026, so the project is roughly five months old. That youth shows in the roadmap.

The project pitches itself as a workspace where humans and agents build together on a relay you own. Where it departs from a Slack clone is what an agent can do once it is inside: open repos, send patches, review code, run workflows, edit canvases, orchestrate other agents, join voice huddles, and create channels. Same powers as a human teammate, same audit trail, different keypair.

In practice, Buzz aims at a whole stack of tools at once. It wants chat from Slack or Discord, plus patches and repos from a forge like GitHub or Gitea . It also wants the CI dashboard you’d otherwise build from Gitea Actions runners , and the pile of webhook glue holding those three together.

A Buzz project channel where people and an agent coordinate on a release plan
The Buzz desktop client with a channel list, a message thread, and a side panel
Image: block/buzz

Why agents with keypairs beat webhook bots

A webhook bot carries one shared token, so when three teams share it, the log can’t say which team triggered what. Buzz gives each agent its own Nostr keypair, its own channel memberships, and its own audit trail. You scope an agent by identity, the same way you scope a teammate. Adding an agent to a private channel is the same action as adding a person.

The effect shows up during cleanup. When an agent triages a bug, the record names which agent, in which channel, signed with which key. Revoking its access means removing a member. The shared token stays untouched, along with the five other integrations that depend on it.

People and agents collaborating in a Buzz engineering channel and reacting with emoji
Agents post in the same channel as their human teammates
Image: block/buzz

Underneath, everything is a signed event in one log: messages, reactions, workflow steps, review approvals, and git events. Git activity uses NIP-34 , the Nostr spec for repository announcements, patches, and status updates. The broader spec set lives in the nostr-protocol/nips repo.

Because those records share one shape, search crosses surfaces. A single query can return the conversation, the patch, the workflow run, and the approval together. The buzz-audit crate also hash chains every entry with SHA-256. Each entry stores the hash of the one before it. A verify_chain() call then walks the log and recomputes them, so tampering with history shows up.

How the Buzz architecture fits together

One relay is the single source of truth. buzz-relay is an Axum server speaking both WebSocket and REST, handling NIP-01 subscriptions and NIP-42 authentication challenges. Clients, agents, and scripts all talk to it.

The storage layer is three familiar pieces. Postgres holds the events and the full text search index. Redis handles pub/sub, presence, and typing indicators, while S3 or MinIO stores media through the Blossom protocol. A dev stack also runs Adminer and Prometheus.

Before you commit, look at how the event log grows. The events table is monthly range partitioned on created_at. Search then runs over a generated search_tsv column backed by a GIN index. So an append only log stays queryable as it fills up, and you can detach old months instead of scanning them. Privacy sensitive kinds get a NULL tsvector, which makes them unsearchable at the storage level.

A video playing in Buzz with frame-anchored comments in a side panel
Media uploads land in S3 or MinIO and carry comments pinned to a frame
Image: block/buzz

Buzz splits the agent surface in two:

  • buzz-cli is agent first, JSON in and JSON out, and it calls the relay’s REST API. Any harness that can run a shell command can drive it.
  • buzz-acp is a separate bridge for the Agent Client Protocol . It supports any agent speaking ACP over stdio, with Goose, Codex, and Claude Code named as the tested paths.

Automation lives in buzz-workflow, which runs YAML workflows triggered by messages, reactions, schedules, or webhooks. Git integration comes from git-sign-nostr and git-credential-nostr, which sign git operations with a Nostr key. Patches then land as NIP-34 events instead of pull requests on a third party forge.

On multi tenancy, one relay serves one community by default. The URL is authoritative for the workspace. A hosted operator can still serve many communities behind many domains. In that mode, the host name picks the community, and that community scopes every row, cache key, search document, and audit chain.

How to self host a Buzz relay and desktop client

Install the prerequisites

Install Docker and either Hermit or a manual toolchain of Rust 1.88 or newer, Node 24 or newer, pnpm 10, and just.

Clone the repository

Run git clone https://github.com/block/buzz.git && cd buzz to fetch the Rust workspace and the desktop client.

Activate the pinned toolchain

Run . ./bin/activate-hermit so every tool version matches what the project tests against. Tools download on first use.

Bootstrap the stack

Run just setup && just build. This copies .env.example to .env, downloads the tools, and starts the Docker services plus database migrations.

Start the relay and app

Run just dev to launch the relay on ws://localhost:3000 and open the Tauri desktop client against it. For separate logs, use just relay in one terminal and just desktop-dev in another.

Give an agent its own identity

Generate a keypair with buzz-admin generate-key, register the public key with buzz-admin add-member, then set BUZZ_PRIVATE_KEY for the agent process. Drive the workspace with buzz-cli, which takes JSON in and returns JSON out.

Move to a real box

Swap the root docker-compose.yml for the production bundle in deploy/compose/ when you move to a VPS. That bundle brings Postgres, Redis, MinIO, and an optional Caddy TLS front end . It needs Docker Compose 2.24.4 or newer.

Block publishes no RAM or disk footprint numbers for the stack. Still, you’re running Postgres, Redis, an object store, and a Rust relay. Size the box the way you would for any database you host yourself , then add headroom for the rest.

What works today and what does not

The README splits its feature set into three columns, and that candour is the most useful thing in it.

StatusFeatures
Works todayRelay, channels, threads, DMs, canvases, media, search, audit log. Tauri desktop app for macOS, Linux, and Windows. buzz-cli plus the ACP harness. YAML workflows. Git events and a git hosting backend.
Being wired upMobile clients for iOS and Android in Flutter. Workflow approval gates. Huddle lifecycle events.
Pending codeWeb of trust reputation across relays. Push notifications. Culture features.

The project attaches its own warning to that third column, and asks you not to build a compliance program around anything sitting in it yet.

The architecture doc goes further and lists verified gaps. Two stand out for anyone weighing a real deployment. Rate limiting is defined but not enforced: the RateLimiter trait has four configured tiers and only a test stub implementation. Approval gates also break, because a run that hits a gate gets marked as failed.

The relay also has no REST or event API for managing channel members yet. So adding an agent to a private channel means creating that channel through the CLI, where the creator becomes a member automatically.

The Add a channel dialog in Buzz with search, filters, and channels to join or create
Channel creation in the desktop client, the surface the relay has no member management API for yet
Image: block/buzz

No push notifications and no shipped mobile client makes Buzz a desktop plus CLI tool today. That rules out the on-call use case most teams expect from a chat product.

How Buzz team chat compares to Matrix, Rocket.Chat, and Zulip

The mature self hosted chat options solve a different problem, so the useful comparison is what an automated participant can be.

ProjectLicenseData storesAgent identity modelMobile apps
BuzzApache 2.0Postgres, Redis, S3 or MinIOOwn keypair, own memberships, own audit chainNot shipped
Matrix (Synapse)Apache 2.0PostgresApplication service or bot user with a shared access tokenMature, many clients
Rocket.ChatMIT, plus paid tiersMongoDB replica setBot user with a personal access tokenMature
ZulipApache 2.0Postgres, Redis, RabbitMQBot user with an API keyMature

Agent identity is the row that separates them. Matrix, Rocket.Chat, and Zulip all model automation as a bot account holding a token. Buzz models it as a member holding a key, which is why revocation and audit read differently.

Who should actually run Buzz right now

The clearest fit is a small engineering team already running coding agents. It needs to be comfortable operating Postgres and Redis, and interested in an auditable record of what those agents did. The audit chain and cross-surface search both work today. A second group gets value too: anyone who wants to see Nostr used as an application substrate for real software. Buzz is a large NIP-01 and NIP-34 implementation in Rust, and its ARCHITECTURE.md reads like a design tour.

The poor fits are easier to name. Any team that needs mobile access, push notifications, enforced rate limits, or compliance ready approval gates should wait. Every one of those sits in an unfinished column. Anyone shopping for a drop-in Slack replacement should also look elsewhere. Buzz carries strong opinions, and the bet is that one event log can replace seven tabs. At five months old, that bet is unproven. Try it on a side project, and revisit when mobile and approval gates move columns.