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 TTLNo black box. The entire server is a single server.js - readable in the install script itself. Download it, open it, verify it does exactly what it says.
server.js. No dependencies, no build step, no minified bundle. Plain Node.js you can read top to bottom in five minutes.cat it, then run it. No compiled binaries, no obfuscation, no surprise.Root 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