# foghorn > Multi-tenant WebSocket pub/sub. Projects hold a public key (browser-safe: > connect + subscribe) and a secret key (server-only: emit). Clients subscribe > to named channels over a WebSocket; your backend emits JSON payloads to a > channel over a plain HTTP endpoint, and every subscribed connection receives > it. Not a document-sync/CRDT/presence framework — a relay, with no message > persistence or replay. ## Docs - [Step-by-step guide](docs/guide.md): the fastest path to a working integration — creating a project/keys, the client-side (browser, public key, `@foghorn/sdk`) integration, and the server-side (backend, secret key) emit call, each spelled out in order. Also rendered as a normal web page at `/docs` for human readers. - [Full reference](docs/reference.md): overview, authentication, WebSocket protocol (connection URL, message envelope, every message type both directions, close/error behavior), HTTP API (every control-plane and emit-endpoint route with request/response schemas and every error status), a single errors table, exact rate/payload limits, the `@foghorn/sdk` client reference, task-oriented recipes, and a dated changelog. Also rendered at `/docs/reference`. - `@foghorn/sdk` is published on npm: `npm install @foghorn/sdk`. ## Other files - [websocket-as-a-service-plan.md](websocket-as-a-service-plan.md): the original build plan and architecture rationale (control plane vs. connection plane, data model, phased build order). Useful for *why* something is built the way it is; `docs/reference.md` is the source of truth for *current behavior*. - [README.md](README.md): local dev setup, monorepo layout, running migrations, deploying.