A minimal self-hosted WebSocket server with ed25519 signatures, tag-based routing, access control, and paginated history.
Real-time pub/sub with multiple concurrent subscriptions per connection.
Every message is signed. Clients prove identity cryptographically, not with passwords.
Messages carry tags. Subscribe to exactly what you need with flexible filters.
Per-message allow/disallow lists. Control exactly who sees what.
Cursor-based pagination over HTTP. Never miss a message, even paginating slowly.
Single binary. SQLite storage. Run it anywhere with one command.
One command to run. Auto-generates a token on first start.
# 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"}'
TypeScript client for Bun and the browser.
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" }, });