clickclack/docs
2026-05-08 09:45:07 +01:00
..
api docs: document agent-friendly cli 2026-05-08 08:01:33 +01:00
architecture docs: add project documentation site 2026-05-08 06:27:24 +01:00
features fix: auto-join GitHub users to default workspace 2026-05-08 09:45:07 +01:00
agent-friendly-cli.md docs: document agent-friendly cli 2026-05-08 08:01:33 +01:00
cli.md docs: document agent-friendly cli 2026-05-08 08:01:33 +01:00
CNAME docs: use docs subdomain 2026-05-08 06:30:42 +01:00
configuration.md feat: gate hosted app with GitHub org auth 2026-05-08 09:11:41 +01:00
data-model.md docs: add project documentation site 2026-05-08 06:27:24 +01:00
deployment.md feat: gate hosted app with GitHub org auth 2026-05-08 09:11:41 +01:00
development.md ci: add goreleaser release workflow 2026-05-08 08:53:47 +01:00
install.md ci: add goreleaser release workflow 2026-05-08 08:53:47 +01:00
quickstart.md feat(web): add product site and app surface 2026-05-08 08:11:08 +01:00
README.md ci: add goreleaser release workflow 2026-05-08 08:53:47 +01:00
releasing.md ci: add goreleaser release workflow 2026-05-08 08:53:47 +01:00
sdk.md docs: document agent-friendly cli 2026-05-08 08:01:33 +01:00

title description permalink
ClickClack A self-hostable chat server with Slack-style threads, an OpenAPI-first surface, embedded SQLite, and a TypeScript SDK. One Go binary. Bring your own pincers. /

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, reverse-proxy if you want TLS. SQLite ships inside.
  • Realtime that recovers. WebSocket is a pipe; SQLite is the truth. Reconnect with a cursor and you're back, even after a long offline.
  • Threads that don't nest. One level deep, on purpose. Discussion stays scannable.
  • Bots that aren't second-class. Same auth surface as humans, a typed TypeScript SDK, a scriptable CLI client, and a Mattermost-shaped webhook for drop-in scripts.
  • Crustacean, lightly. Lobster mascot, claw reactions, :molting: status. 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.

Get the full quickstart →

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
Magic-link auth, GitHub OAuth, dev fallback Auth
Mattermost-shaped webhooks and slash commands Integrations
TypeScript SDK + bot example SDK

Operate it

  • CLI — server, admin, backup/export, and remote chat client commands.
  • Agent-friendly CLI — scriptable chat client commands for humans, agents, and CI jobs.
  • Configuration — flag/env/file precedence.
  • Deployment — single binary, Docker, data layout, OAuth.
  • Development — pnpm scripts, monorepo layout, gates.
  • Releasing — GoReleaser targets, artifacts, and tag flow.

Look under the hood

  • Architecture — durable vs realtime, where each layer lives.
  • API overview — REST/WebSocket surface, auth headers.
  • Data model — tables, IDs, thread invariants.
  • SPEC.md — locked 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, Docker — is implemented. Multi-node websocket fanout, Postgres, federation, voice/video, and full Mattermost compatibility are intentionally out of scope.

Made with ✦ and a little brine. The lobster is on duty.