Real-time messages,
cryptographic identity

A minimal self-hosted WebSocket server with ed25519 signatures, tag-based routing, access control, and paginated history.

WebSocket

Real-time pub/sub with multiple concurrent subscriptions per connection.

🔑

Ed25519 Identity

Every message is signed. Clients prove identity cryptographically, not with passwords.

Tag Routing

Messages carry tags. Subscribe to exactly what you need with flexible filters.

🔒

Access Control

Per-message allow/disallow lists. Control exactly who sees what.

📄

Paginated History

Cursor-based pagination over HTTP. Never miss a message, even paginating slowly.

Self-Hosted

Single binary. SQLite storage. Run it anywhere with one command.

Quick start

One command to run. Auto-generates a token on first start.

terminal
# run the server
$ gizmo run

# generate a keypair
$ gizmo keygen
secret_key: 4a2f...
public_key: e8c1...

# send a message
$ gizmo publish --tags chat --body '{"text":"hello world"}'

Client library

TypeScript client for Bun and the browser.

app.ts
import { GizmoClient, Signer } from "./bun";

const signer = Signer.generate();
const client = new GizmoClient({
  url: "https://gizmo.voltrevo.com",
  token: "your-token",
  signer,
});

await client.connect();
await client.subscribe((msg) => console.log(msg));
await client.publish({
  tags: ["chat"],
  body: { text: "hello" },
});