Tiny chat. Big claws.
ClickClack is a self-hostable chat server that fits in a single Go binary. SQLite by default, an embedded Svelte SPA, Slack-style threads, durable realtime over a WebSocket pipe, and a framework-neutral TypeScript SDK so the bots feel at home.
It's built for small teams, internal tools, communities, and anyone who would rather host their own.
Product domain: clickclack.chat. App domain: app.clickclack.chat, with /app as the local path. Docs domain: docs.clickclack.chat.
#Why ClickClack
- One binary, zero ceremony. Drop it on a box, point at a data directory,
- Realtime that recovers. WebSocket is a pipe; SQLite is the truth. Reconnect
- Threads that don't nest. One level deep, on purpose. Discussion stays
- Bots that aren't second-class. Same auth surface as humans, a typed
- Crustacean, lightly. Lobster mascot, claw reactions,
:molting:status.
reverse-proxy if you want TLS. SQLite ships inside.
with a cursor and you're back, even after a long offline.
scannable.
TypeScript SDK, a scriptable CLI client, and a Mattermost-shaped webhook for drop-in scripts.
Normal controls stay normal.
#Five-minute test drive
pnpm install
pnpm build
go run ./apps/api/cmd/clickclack serve
# open http://localhost:8080
The dev fallback boots a default user, workspace, and channel so the SPA loads into something useful at /app. The root path is the product website. Disable it for anything that isn't a local clone.
#What's in the box
| Feature | Doc |
|---|---|
| Channels, messages, edits, soft-delete | Messages |
| Slack-style threads, one level deep | Threads |
| Reactions on every message | Reactions |
| Realtime over WebSocket with cursor recovery | Realtime |
| SQLite FTS5 full-text search | Search |
| Local file uploads + message attachments | Uploads |
| Workspace-scoped direct messages | Direct messages |
| Human and bot identities | Bots |
| Creating and installing bot tokens | Bot installs |
| Profile settings, handles, avatars | Profiles |
| Magic-link auth, GitHub OAuth, dev fallback | Auth |
| Guest waiting-room roles, approvals, timeouts, blocks | Moderation |
| Mattermost-shaped webhooks and slash commands | Integrations |
| TypeScript SDK + bot example | SDK |
#Operate it
- CLI — server, admin, backup/export, and remote chat client
- Agent-friendly CLI — scriptable chat client commands
- Configuration — flag/env/file precedence.
- Deployment — single binary, Docker, data layout, OAuth.
- Bot installs — create bot identities and wire their
- Development — pnpm scripts, monorepo layout, gates.
- Releasing — GoReleaser targets, artifacts, and tag flow.
commands.
for humans, agents, and CI jobs.
tokens into OpenClaw or SDK runtimes.
#Look under the hood
- Architecture — durable vs realtime, where each
- API overview — REST/WebSocket surface, auth headers.
- Data model — tables, IDs, thread invariants.
- SPEC.md — locked
layer lives.
V1 decisions, milestones, open questions.
#Status
V1 is in flight. The vertical slice — workspaces, channels, Markdown messages, threads, realtime, reactions, search, uploads, DMs, magic-link auth, GitHub OAuth, guest-room moderation, Postgres, R2 uploads, and Docker — is implemented. Multi-node websocket fanout, federation, voice/video, and full Mattermost compatibility are intentionally out of scope.
Made with ✦ and a little brine. The lobster is on duty.