The world's first chat room, reborn. Real-time, character-by-character chat where everyone sees you type as you type, just like the original 1973 PLATO system.
Talkomatic was created in 1973 on the PLATO system at the University of Illinois. It was the first multi-user chat room ever built. This project is a faithful modern remake: no message log, no send button. Each person gets a section of the screen and everyone watches everyone else type live, letter by letter.
- Live typing: characters appear for everyone the moment you press them
- Rooms: public, semi-private (6-digit access code), and private, in horizontal or vertical layouts
- Community suggestion board: post ideas, reply, upvote, and see what gets approved and shipped
- Discord avatars: optionally show your Discord profile picture next to your name
- Built-in apps: a collaborative whiteboard and minigames
- Themes: swappable full-page themes, plus community themes
- Moderation: staff dashboard with audit log, reports, appeals, IP bans, and a word filter
- Bot API: token-based access for bots, with REST and Socket.IO
Node.js, Express, and Socket.IO on the server. Vanilla JavaScript on the client with no build step and no framework. State persists to plain JSON files, so there is no database to run.
Requires Node.js 18 or newer.
git clone https://github.com/mohdmahmodi/talkomatic-classic.git
cd talkomatic-classic
npm install
npm startOpen http://localhost:3000 and you are chatting.
Everything works with zero configuration. To customize, copy .env.example to .env:
| Variable | Default | Purpose |
|---|---|---|
SESSION_SECRET |
random per boot | Set this in production so sessions survive restarts |
PORT |
3000 |
Port to listen on |
HOST |
0.0.0.0 |
Bind address |
ALLOWED_ORIGINS |
none | Comma-separated public URLs of your instance. Required when deploying on your own domain |
DATA_DIR |
repo root | Where runtime JSON state is written |
TRUST_PROXY |
1 |
Reverse-proxy hops to trust. Set 0 if exposed directly |
DEV_KEY_HASH |
none | SHA-256 hash of the owner dev key |
docker compose up -d --buildThe container listens on port 3000, binds 0.0.0.0, and keeps all runtime state in a volume mounted at /app/data.
- Create an Application pointing at this repository and set the build type to Dockerfile.
- Set environment variables:
SESSION_SECRET(generate withopenssl rand -hex 32) andALLOWED_ORIGINS(the URL you will serve the app at, for examplehttps://chat.example.com). - Add a volume mount for
/app/dataso rooms, bans, and identity data survive redeploys. - Point your domain at container port 3000. Dokploy's Traefik proxy handles HTTPS and the server already trusts one proxy hop.
The live status page for the official instance is at status.talkomatic.co. Three public endpoints are made for uptime monitors like Uptime Kuma:
| Endpoint | Purpose | Suggested check |
|---|---|---|
/healthz |
Liveness | HTTP 200 |
/api/v1/health |
Detailed health with subsystems | keyword "status":"ok" |
/api/v1/status |
Public stats for a status page | keyword "status":"online" |
Issues and pull requests are welcome. Read the contributing guide and the code of conduct first. If you want to suggest a feature as a user, the in-app Suggestion Board in the lobby is the fastest way to reach us.
Built and maintained by Mohd Mahmodi (@mohdmahmodi) with the Talkomatic community. Inspired by the original Talkomatic by Doug Brown and David R. Woolley (PLATO, 1973).