Northstar is a protocol for personal computing on the open web. Every user is a DID, every node is a server they own, every beam lives on the author's node. Channels, rooms, and live streams federate between nodes through signed events and gossip. No platforms in the middle.
The whole protocol fits in your head. If you've worked with event sourcing, you'll recognize most of it. The surface area is small enough to learn in an afternoon.
Decentralized identifier from an Ed25519 keypair — did:key:z6Mk…. Self-certifying: the public key is embedded in the DID. Portable across nodes. Private key never leaves your client.
const client = await NorthstarClient.connect( "wss://your-node.example" ) console.log(client.did) // did:key:z6Mk…
channel for public broadcast. dm for private groups. stream for live broadcast. Each space has owner, members, append-only event log.
const channel = await client.space.create({ type: "channel", name: "My Channel", uniqueId: "my-channel", })
Beams are content-addressed at beam/{authorHash}/{id} and stored on the author's node. Spaces store refs, not copies. SDK signs automatically.
await client.space.beam(channel.id, { title: "On sovereign substrates", body: "Email is older than platforms…", }) // Stored on your node, ref gossiped
Owner node assigns sequence and signs. Broadcasts via tier-based DAG tree. Events reach all member nodes within seconds, no central relay.
await client.subscribe(channel.id) client.on("event", (event) => { // signed, sequenced, deduped console.log(event.body) })
Privacy-preserving payments using RSA blind signatures. Payer anonymous, payee known. Push and pull payments. No blockchain fees.
await client.wallet.create() await client.wallet.send({ recipientHash: "bob_hash", amount: "5.00", })
A Reddit-equivalent on Northstar is hundreds of lines of application code, not a multi-year platform engineering project, because the substrate handles identity, authentication, signed history, federation, and gossip.
The SDK handles authentication, signing, and cross-node routing. Connect to your node, join a space, and beam. The content lives on your node; the channel stores a reference.
import { NorthstarClient } from "@northstar/client" // Connect and authenticate (automatic) const client = await NorthstarClient.connect( "wss://your-node.example" ) // Join a remote space await client.space.join( "northstar://other-node.example/channel/z6MkfA/protocols" ) // Beam into space · SDK handles signing await client.space.beam("channel/z6MkfA/protocols", { title: "On sovereign substrates", body: "Email is older than most platforms…", }) // Space owner verifies, assigns sequence, // gossips to 5 random member nodes.
import { NorthstarClient } from "@northstar/client" const client = await NorthstarClient.connect("wss://node.example") // Create a private space const room = await client.space.create({ type: "dm", name: "Project Chat", uniqueId: "project-chat", }) // Share space link · members join themselves const link = NorthstarClient.toLink(room) // → "northstar://node.example/dm/z6Mk.../abc" // Subscribe to space events await client.subscribe(room.id) client.on("event", render) // Send a message · SDK signs automatically await client.space.append(room.id, { type: "message", body: "hey, this room is up", })
// ═══ BROADCASTER ═══════════════════════════════════════ const broadcaster = await NorthstarClient.connect("wss://node.example") const stream = await broadcaster.stream.start({ title: "Studio session", latencyProfile: "low", }) // Share stream link const link = NorthstarClient.toLink(stream) // Capture → encode → push signed chunks const recorder = new MediaRecorder(mediaStream) recorder.ondataavailable = async (e) => { const bytes = await e.data.arrayBuffer() await broadcaster.stream.chunk({ streamId, data: bytes }) } recorder.start(1000) // ═══ VIEWER ════════════════════════════════════════════ const viewer = await NorthstarClient.connect("wss://viewer.example") const info = await viewer.stream.join(link) viewer.stream.onChunk(info.joined, (chunk) => { sourceBuffer.appendBuffer(chunk) })
Each of these solves a real problem. Northstar's bet is that programmable per-entity policy plus a coordination substrate generalizes further than any single application protocol.
| Protocol | Federation unit | Transport | Policy model | Native value |
|---|---|---|---|---|
| Northstarv0.5 · 2026 | per-DID (you) | HTTP | space rules + gossip | GNU Taler (native) |
| AT ProtocolBluesky | per-account (PDS) | HTTP / WebSocket | external labelers | — |
| ActivityPubMastodon | per-instance | HTTP | instance admins | — |
| MatrixElement | per-homeserver | HTTP / WebSocket | room admins | — |
| Nostrrelays | per-keypair | WebSocket | relay-level | Lightning (out of band) |
The protocol is implemented and running. Everything listed below works today, tested against real infrastructure.
Read the spec. Browse the source. Run a node. The protocol is open, the implementation is real, the deadline is shipping.