A minimal mobile-first, invite-only, real-time anonymous chat web application.
Hosting on https://wysper.tnychn.dev on a Raspberry Pi 4B with Alpine Linux via Cloudflare Tunnel.
- invite-code-based registration using 6-character alphanumeric codes
- access-controlled registration restricted to CUHK network and night hours
- toggleable hidden messages for unauthenticated users
- emoji reactions with client-side optimistic updates
- rate-limited API with bot protection via Cloudflare Turnstile
- real-time message & reaction broadcasting with WebSocket API
- live online presence tracking via WebSocket connections
- neobrutalist design inspired user interface
- mobile-first neobrutalist design inspired user interface
Go 1.26
net/http+github.com/tnychn/httpxfor HTTP server and handlersgithub.com/go-chi/chifor API routing
modernc.org/sqliteas SQLite driversqlcfor type-safe SQL query generation
github.com/golang-jwt/jwtfor JWT-based authenticationgithub.com/go-playground/validatorrequest data validationargon2idfor password hashing
TypeScript 6
- Solid.js for reactive user interface
- Tailwind 4 for styling
npmfor package managementvitefor bundling and development serveroxlint/oxfmtfor code formatting and linting
The server is configured via the following environment variables.
| Variable | Required | Default | Description |
|---|---|---|---|
HOST |
No | 0.0.0.0 |
server bind host |
PORT |
No | 6969 |
server bind port |
URL |
No | — | frontend URL for CORS (development only) |
DATABASE |
No | :memory: |
SQLite file path (e.g. data.db) |
AUTH_SECRET_KEY |
Yes | — | JWT signing secret |
TURNSTILE_SECRET_KEY |
Yes | — | Cloudflare Turnstile secret key |
Backend:
cd server
go run . -debugThe -debug flag bypasses CUHK network and time restrictions, and enables CORS and logging.
Frontend:
cd web
npm install
npm run dev./build.shThis script:
- Builds the frontend SPA.
- Embeds the SPA bundle into the Go binary via the
webbuild tag. - Produces a single self-contained binary named
start.
server/repository/seed.sql creates a root user and the initial invite code TNYCHN to bootstrap access on the first server run.
~ crafted with ♥︎ by tnychn ~
MIT © 2026 Tony Chan

