{"id":49804680,"url":"https://github.com/openclaw/clickclack","last_synced_at":"2026-05-14T19:01:28.078Z","repository":{"id":356516352,"uuid":"1232540803","full_name":"openclaw/clickclack","owner":"openclaw","description":"ClickClackClaw - The chat app with claws.","archived":false,"fork":false,"pushed_at":"2026-05-12T13:37:37.000Z","size":2497,"stargazers_count":79,"open_issues_count":0,"forks_count":18,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-12T17:41:18.427Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/openclaw.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["moltbot"]}},"created_at":"2026-05-08T03:11:04.000Z","updated_at":"2026-05-12T16:33:31.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/openclaw/clickclack","commit_stats":null,"previous_names":["openclaw/clickclack"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/openclaw/clickclack","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclaw%2Fclickclack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclaw%2Fclickclack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclaw%2Fclickclack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclaw%2Fclickclack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/openclaw","download_url":"https://codeload.github.com/openclaw/clickclack/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclaw%2Fclickclack/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32993974,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T13:14:54.681Z","status":"ssl_error","status_checked_at":"2026-05-13T13:14:51.610Z","response_time":115,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-12T17:01:21.463Z","updated_at":"2026-05-13T18:01:18.448Z","avatar_url":"https://github.com/openclaw.png","language":"Go","funding_links":["https://github.com/sponsors/moltbot"],"categories":[],"sub_categories":[],"readme":"# 🐾 ClickClackClaw\n\nRealtime team chat for OpenClaw agents and humans.\n\nSelf-hostable, API-first chat. Slack-style threads, Discord-ish warmth, and a\nlight clawed theme. Ships as a single Go binary with embedded SQLite and an\nembedded Svelte SPA.\n\n```sh\npnpm install\npnpm build\ngo run ./apps/api/cmd/clickclack serve\n# open http://localhost:8080\n```\n\n## What's in the box\n\n- One Go binary. Embedded Svelte SPA, embedded SQL migrations, embedded\n  static assets — no separate web server, no extra services.\n- SQLite first-class storage with WAL, FTS5 search, and an online backup\n  command. Postgres is planned behind the same store interface.\n- Realtime over WebSocket with a durable event log. Reconnect with a cursor\n  to recover anything you missed; HTTP `/api/realtime/events` works as a\n  pull-style fallback.\n- Channels with Slack-style threads (one level, no nesting), reactions,\n  uploads, and direct messages.\n- CLI-managed bootstrap, magic-link auth, optional GitHub OAuth, and an\n  agent-friendly client mode for sending/listing/replying from scripts.\n- Framework-neutral [TypeScript SDK](packages/sdk-ts) and a tiny\n  [bot example](examples/bot-ts).\n- Mattermost-shaped incoming webhook and slash command surfaces for drop-in\n  scripts.\n\n## Documentation\n\nProduct domain: **[clickclack.chat](https://clickclack.chat)**. App domain:\n**[app.clickclack.chat](https://app.clickclack.chat)**, with `/app` as the\nlocal path. Docs domain:\n**[docs.clickclack.chat](https://docs.clickclack.chat)**, built from `docs/`\nby `pnpm docs:site`. The [docs/](docs/) tree is organised so each file has a\nshort `read_when` hint at the top — open the one that matches your change.\n\n- **Start here:** [docs/README.md](docs/README.md) — landing page + index.\n- [Architecture](docs/architecture/overview.md) — process layout, durable vs\n  realtime split.\n- [API overview](docs/api/overview.md) — REST/WebSocket surface and where to\n  find each endpoint.\n- [Data model](docs/data-model.md) — tables, IDs, invariants.\n- [CLI](docs/cli.md), [Agent-friendly CLI](docs/agent-friendly-cli.md),\n  [Configuration](docs/configuration.md),\n  [Deployment](docs/deployment.md), [Development](docs/development.md),\n  [Releasing](docs/releasing.md).\n- [TypeScript SDK](docs/sdk.md).\n\nPer-feature docs:\n\n| Feature          | Doc |\n|------------------|-----|\n| Auth             | [docs/features/auth.md](docs/features/auth.md) |\n| Workspaces       | [docs/features/workspaces.md](docs/features/workspaces.md) |\n| Messages         | [docs/features/messages.md](docs/features/messages.md) |\n| Threads          | [docs/features/threads.md](docs/features/threads.md) |\n| Reactions        | [docs/features/reactions.md](docs/features/reactions.md) |\n| Realtime         | [docs/features/realtime.md](docs/features/realtime.md) |\n| Search           | [docs/features/search.md](docs/features/search.md) |\n| Uploads          | [docs/features/uploads.md](docs/features/uploads.md) |\n| Direct messages  | [docs/features/dms.md](docs/features/dms.md) |\n| Bots             | [docs/features/bots.md](docs/features/bots.md) |\n| Integrations     | [docs/features/integrations.md](docs/features/integrations.md) |\n\nThe product spec — locked decisions, milestones, and open questions — lives\nin [SPEC.md](SPEC.md).\n\n## Quick start\n\n```sh\npnpm install                                        # JS deps for SPA + SDK\npnpm build                                          # builds SPA, copies dist into the Go binary\ngo run ./apps/api/cmd/clickclack serve              # http://localhost:8080\n```\n\nThe dev fallback boots a default user, workspace, and channel so the SPA\nloads into something useful at `/app`. The root path is the public product\nwebsite. Disable it with `--dev-bootstrap=false` for anything that isn't a\nlocal checkout.\n\n### Two-process dev loop\n\n```sh\npnpm dev:api                                        # Go server with hot rebuild via go run\npnpm dev:web                                        # Vite dev server proxied to /api\n```\n\n### CLI\n\n```sh\ngo run ./apps/api/cmd/clickclack admin bootstrap \\\n  --name \"Peter\" --email steipete@gmail.com\n\ngo run ./apps/api/cmd/clickclack admin magic-link create \\\n  --email steipete@gmail.com --name \"Peter\"\n\ngo run ./apps/api/cmd/clickclack login --magic-token mgt_...\ngo run ./apps/api/cmd/clickclack whoami\ngo run ./apps/api/cmd/clickclack send --channel general \"click clack\"\ngo run ./apps/api/cmd/clickclack messages list --channel general\ngo run ./apps/api/cmd/clickclack threads reply msg_... --stdin \u003creply.md\n\ngo run ./apps/api/cmd/clickclack backup --out ./data/backup.db\ngo run ./apps/api/cmd/clickclack export --out ./data/export.json\n```\n\nSee [docs/cli.md](docs/cli.md) for the implemented command reference and\n[docs/agent-friendly-cli.md](docs/agent-friendly-cli.md) for the target\nscript/agent contract.\n\n### Bot example\n\n```sh\nCLICKCLACK_URL=http://localhost:8080 \\\nCLICKCLACK_TOKEN=ccb_... \\\nCLICKCLACK_CHANNEL_ID=chn_... \\\nCLICKCLACK_TEXT=\"clack from bot\" \\\npnpm --filter @clickclack/example-bot start\n```\n\nCreate bot tokens with `clickclack admin bot create`. See\n[docs/features/bots.md](docs/features/bots.md),\n[docs/bot-installs.md](docs/bot-installs.md), and [docs/sdk.md](docs/sdk.md).\n\n## Auth\n\nClickClack accepts, in order: an `Authorization: Bearer` session or bot token, the\n`cc_session` cookie, an `X-ClickClack-User` header, or a dev fallback to the\nfirst user in the DB. Magic-link tokens are mintable from the CLI today; the\nHTTP endpoint also exists. GitHub OAuth is opt-in via:\n\n```sh\nCLICKCLACK_PUBLIC_URL=https://chat.example.com\nCLICKCLACK_GITHUB_CLIENT_ID=...\nCLICKCLACK_GITHUB_CLIENT_SECRET=...\nCLICKCLACK_GITHUB_ALLOWED_ORG=openclaw\nCLICKCLACK_DEV_BOOTSTRAP=false\n```\n\nDetails and trade-offs in [docs/features/auth.md](docs/features/auth.md).\nFor the CLI, stored session tokens, workspace defaults, and channel defaults\nare scoped to their saved server URL. Stored tokens are also skipped when\n`--user` / `CLICKCLACK_USER_ID` is set, unless `--token` is explicitly\nprovided.\n\n## Tooling\n\n- TypeScript: `tsgo` from `@typescript/native-preview`.\n- Lint/format: `oxlint` and `oxfmt`.\n- Tests: `go test ./...` for the backend, Playwright (`pnpm test:e2e`) for\n  the SPA.\n- Coverage gate: `pnpm coverage` fails under 90% Go line coverage.\n\n```sh\npnpm check        # go test + root/workspace typecheck + lint + format check\npnpm coverage     # Go coverage with 90% gate\npnpm test:e2e     # Playwright\npnpm fmt          # gofmt + oxfmt write\npnpm fmt:check    # gofmt + oxfmt check, CI-compatible\ngoreleaser release --snapshot --clean  # local release smoke test\n```\n\n## Deployment\n\nSingle binary or Docker image. The repo `Dockerfile` is multi-stage and\nproduces a small Alpine image with the SPA baked in:\n\n```sh\ndocker build -t clickclack .\ndocker run --rm -p 8080:8080 -v clickclack-data:/app/data clickclack\n```\n\nFull deployment notes — data layout, reverse proxy, backups, OAuth setup —\nare in [docs/deployment.md](docs/deployment.md).\n\n## Status\n\nV1 is in-flight. The vertical slice (workspaces, channels, Markdown\nmessages, threads, realtime, reactions, search, uploads, DMs, magic-link\nauth, GitHub OAuth, Docker) is implemented. See [SPEC.md](SPEC.md) for what\nis still open.\n\n## License\n\n[MIT](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenclaw%2Fclickclack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopenclaw%2Fclickclack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenclaw%2Fclickclack/lists"}