SKILL.md
ClickClack
Use this for ClickClack product/runtime ops, deploys, hosted app checks, and domain questions.
What
- Repo:
~/Projects/clickclack/https://github.com/openclaw/clickclack - Product: self-hostable Slack-style chat for OpenClaw/community/agent workflows.
- Surfaces:
https://clickclack.chatproduct sitehttps://app.clickclack.chathosted apphttps://docs.clickclack.chatGitHub Pages docs fromdocs/
Prod
- Hetzner:
clickclack-prod-01 - IPv4:
157.90.237.80 - IPv6:
2a01:4f8:1c1c:fb96::/64 - SSH:
root@157.90.237.80 - Labels:
app=clickclack,env=prod - OS: Ubuntu 24.04, Caddy + Docker
- Source on host:
/opt/clickclack-src(clean export, not a git checkout) - Previous source:
/opt/clickclack-src.prevplus timestamped older prev dirs - Data:
/var/lib/clickclackbind-mounted to/app/data - Container:
clickclack, port127.0.0.1:8080->8080 - Caddy:
/etc/caddy/Caddyfileproxiesclickclack.chat, app.clickclack.chatto127.0.0.1:8080;wwwredirects to apex. - DNS truth:
~/Projects/manager/DOMAINS.mdand~/Projects/manager/DNS.md
Deploy
Golden path:
- Local refresh:
cd ~/Projects/clickclackgit status --short --branchgit fetch origin- If on
mainwith no upstream:git merge --ff-only origin/main
- Decide deployed delta:
- Last known deploy may be the old local
HEADbefore pull; verify/opt/clickclack-src/.deploy-commitif present. git log --oneline <old>..HEADgit diff --stat <old>..HEAD
- Last known deploy may be the old local
- Archive clean HEAD only:
- Do not rsync untracked local files.
short=$(git rev-parse --short=12 HEAD)git archive --format=tar HEAD | ssh root@157.90.237.80 "rm -rf /opt/clickclack-src.next && mkdir -p /opt/clickclack-src.next && tar -C /opt/clickclack-src.next -xf - && printf '%s\n' '$short' > /opt/clickclack-src.next/.deploy-commit"
- Preserve env without printing secrets:
docker inspect clickclack --format '{{range .Config.Env}}{{println .}}{{end}}' > /root/clickclack.env.current
- Backup before migrations:
mkdir -p /var/lib/clickclack/backupschown 1000:1000 /var/lib/clickclack/backupsdocker exec clickclack clickclack backup --data /app/data --out /app/data/backups/clickclack-before-$(date -u +%Y%m%dT%H%M%SZ).db
- Build:
docker build --label org.opencontainers.image.revision="$short" -t clickclack:"$short" -t clickclack:latest /opt/clickclack-src.next
- Replace container:
docker stop clickclack && docker rm clickclackdocker run -d --name clickclack --restart unless-stopped --env-file /root/clickclack.env.current -p 127.0.0.1:8080:8080 -v /var/lib/clickclack:/app/data clickclack:latest serve --addr :8080 --data /app/data
- Rotate source dirs:
- Move old
/opt/clickclack-src.prevto timestamped backup. - Move
/opt/clickclack-srcto/opt/clickclack-src.prev. - Move
/opt/clickclack-src.nextto/opt/clickclack-src.
- Move old
Verify
- Host:
docker ps --filter name=clickclackdocker inspect clickclack --format '{{index .Config.Labels "org.opencontainers.image.revision"}}'cat /opt/clickclack-src/.deploy-commitcurl -fsS http://127.0.0.1:8080/ >/tmp/clickclack-root.htmlcurl -fsS http://127.0.0.1:8080/app >/tmp/clickclack-app.html
- Public:
curl -I https://clickclack.chatcurl -I https://app.clickclack.chatcurl -I https://docs.clickclack.chat
Guardrails
- Do not print OAuth secrets or magic tokens.
- Use a throwaway
UserKnownHostsFileif local SSH host-key state is stale; confirm server identity withhcloud server describe clickclack-prod-01first. clickclack serveruns migrations on boot; always back up SQLite before replacing the container.- Keep deploys from clean git archives, not dirty working trees.