// Benchtalks GoRW v1.2.0
Benchtalks Changelog
[1.2.0] — 2026-03-02 This release is a complete rewrite of Benchtalks in Go and marks the first open source release under AGPL-3.0.
Changed
- Full rewrite from Node.js to Go — replaced Express, ws, and better-sqlite3 with a single Go binary using gorilla/websocket.
- Fully ephemeral architecture — removed SQLite database and disk storage entirely; all state lives in memory and disappears when rooms empty.
- Single binary deployment — static files (HTML, CSS, JS) are embedded directly into the binary at build time via Go's embed package; no separate file serving needed.
- Docker image reduced to ~15MB — multi-stage build using a scratch final image instead of a full Node runtime.
Added
- NATS federation — benches can now peer into a park; public rooms federate messages across all connected benches while private rooms stay local
- Public/private rooms — rooms are private by default; admins can make a room public via the admin dropdown (one-way, cannot be reversed)
- Admin dropdown — replaced the old delete button with a proper dropdown menu containing Invite people, Create new bench, Make room public, and Delete this bench
- Bench identity — each bench has a BENCH_ID for stable identity in the park, auto-generated if not configured
- Loop prevention — federated messages include a BenchID envelope so benches discard their own messages when received back via NATS
- GitHub Actions release workflow — pushing a version tag automatically builds binaries for linux/amd64, linux/arm64, darwin/amd64, darwin/arm64 and pushes a multi-platform Docker image to ghcr.io
- README — self-hosting guide, federation setup, contributing guidelines
- SECURITY.md — responsible disclosure policy
- LICENSE — AGPL-3.0
Removed
- SQLite database (better-sqlite3)
- Disk-based encrypted image storage (/uploads)
- Node.js runtime dependency
- nixpacks.toml build configuration
- Room expiry cleanup jobs (rooms now vanish instantly when empty)
- HTTP API endpoints (/api/create-room, /api/upload, /api/download, /api/room/:id) — all communication now goes through WebSocket
- Typing indicators — not yet reimplemented in the Go version