No accounts. No history. No noise.
Spin up a room in 60 seconds, share the link, talk, close the tab. Done.
Same core. Same one-command install. Both ask which ports to bind at setup time - default 80 and 443, change to anything.
sessions.json, 7-day TTLRoot on Linux, ports free. That's it. Installer asks for ports interactively - just hit enter to accept defaults.
One command. Installs Node.js if missing, generates TLS cert, asks for ports, creates a systemd service.
# run as root curl -fsSL https://mirror.ditch.lyntric.de/ditch-public.sh | bash # installer asks: # HTTP port [default: 80]: _ # HTTPS port [default: 443]: _ # just press enter to use defaults
Open http://YOUR-IP (or :PORT if you changed it) in a browser. Share it.
Both installers prompt for HTTP and HTTPS ports during setup. Enter any valid port (1–65535) or hit enter to accept the default.
# example: run on 8080 / 8443 HTTP port [default: 80]: 8080 HTTPS port [default: 443]: 8443
The chosen ports are written to /opt/ditch/config.json and read by the server on startup. To change ports after install:
nano /opt/ditch/config.json # edit port_http and port_https systemctl restart ditch
/etc/systemd/system/ditch.service) and change User=root accordingly.Same flow as public but also asks for a password. A 48-byte random token is issued on each successful login and stored in sessions.json.
curl -fsSL https://mirror.ditch.lyntric.de/ditch-private.sh | bash # HTTP port [default: 80]: _ # HTTPS port [default: 443]: _ # set chat password: •••••••• # confirm password: ••••••••
To change the password later without touching config manually:
bash /opt/ditch/change-password.sh
To immediately kick everyone out:
bash /opt/ditch/revoke-sessions.sh
All config lives in /opt/ditch/config.json. Ports are set by the installer; other limits are constants at the top of server.js.
| key / constant | default | description |
|---|---|---|
| port_http | 80 | HTTP port (config.json) |
| port_https | 443 | HTTPS port (config.json) |
| MAX_MESSAGES | 200 | Messages kept in JSON file (server.js) |
| MAX_MSG_LEN | 500 | Max characters per message (server.js) |
| RATE_LIMIT_MS | 1000 | Min ms between sends per IP (server.js) |
| TOKEN_TTL_MS | 7 days | Session token lifetime - private only (server.js) |
nano /opt/ditch/server.js systemctl restart ditch
All endpoints unauthenticated on public. Private requires the ditch_token cookie (set automatically after login).
| method | endpoint | description |
|---|---|---|
| GET | /api/messages | Last N messages as JSON array |
| POST | /api/send | Send: {"n":"nick","m":"text"} |
| GET | /api/stream | SSE real-time event stream |
| GET | /api/online | Online count: {"count":N} |
| POST | /auth | Private only - submit password, receive token cookie |
| POST | /logout | Private only - revoke token server-side |
curl -X POST http://your-server/api/send \ -H 'Content-Type: application/json' \ -d '{"n":"bot","m":"hi"}'
Ditch auto-generates a self-signed cert at install. Swap it for Let's Encrypt:
# stop ditch so the port is free for certbot systemctl stop ditch certbot certonly --standalone -d yourdomain.com cp /etc/letsencrypt/live/yourdomain.com/fullchain.pem /opt/ditch/cert.pem cp /etc/letsencrypt/live/yourdomain.com/privkey.pem /opt/ditch/key.pem systemctl start ditch
systemctl status ditch journalctl -u ditch -f systemctl restart ditch systemctl stop ditch # clear chat history echo '[]' > /opt/ditch/messages.json # private: revoke all sessions bash /opt/ditch/revoke-sessions.sh # private: change password bash /opt/ditch/change-password.sh
Removes everything. Node.js is left in place.
systemctl stop ditch systemctl disable ditch rm -rf /opt/ditch rm /etc/systemd/system/ditch.service systemctl daemon-reload