accelr8
v3.8.2
Published
Collaborative ascii canvas in your terminal. Real multiplayer, live cursors, mouse-driven TUI.
Maintainers
Readme
accelr8
Collaborative ascii canvas in your terminal. A real CLI app: mouse-driven TUI, real multiplayer, and live cursors that glide as your friends move them.
('-. ('-. _ .-')
( OO ).-. _( OO) ( \( -O )
/ . --. / .-----. .-----. (,------. ,--. ,------. .-----.
| \-. \ ' .--./ ' .--./ | .---' | |.-') | /`. ' / .-. \
.-'-' | | | |('-. | |('-. | | | | OO ) | / | | | \_.' /
\| |_.' | /_) |OO ) /_) |OO ) (| '--. | |`-' | | |_.' | / .-. '.
| .-. | || |`-'| || |`-'| | .--' (| '---.' | . '.' | | | |
| | | | (_' '--'\ (_' '--'\ | `---. | | | |\ \ \ '-' /
`--' `--' `-----' `-----' `------' `------' `--' '--' `----''Install
npm install -g accelr8Use
accelr8 # open the app
accelr8 join XYMRAU # jump straight into a friend's project
accelr8 --name pat # pick your display name (remembered)Create a project in the Projects tab, paint on the Canvas by clicking and dragging (right-click erases), and grab the join code from the Members tab. Everyone in a project sees everyone else's cursor move live.
accelr8 collaborative ascii canvas you ●
Projects Canvas Members ● live
────────────────────────────────────────────────────────────────────────
brush █ ▓ ▒ ░ ● ◆ ★ ▲ ■ · # @ * ⌫ erase clear
┌─ canvas 100×30 ───────────────────────────────────────────────────────┐
│ █ │
│ █ ▲ alice │
│ █ │
│ ▲ bob │
└────────────────────────────────────────────────────────────────────────┘
landing page redesign · code XYMRAU · 3 online [tab] switch [q] quitControls
| Input | Action |
|---|---|
| Mouse click | tabs, buttons, project rows, palette |
| Click + drag on canvas | paint with the current brush |
| Right-click on canvas | erase a cell |
| Tab / 1 2 3 | switch tabs |
| q / Ctrl-C | quit |
How the live cursors work
The terminal reports mouse motion via ANSI escape sequences (any-event
tracking, ESC[?1003h). The app:
- Throttles outgoing cursor positions to ~25/sec.
- Interpolates on the receiving side: each remote cursor lerps toward its
last reported position every frame (
x += (target - x) * 0.35), so it glides smoothly instead of teleporting between throttled updates.
Sparse sends plus client-side smoothing is what makes it feel live.
Sync server
By default the CLI talks to the hosted sync server (a Cloudflare Worker with a
Durable Object, source in worker/). You can point it anywhere:
accelr8 --server ws://localhost:8787 # or export ACCELR8_SERVER=...Self-hosting
accelr8 serve # starts a sync server on :8787
accelr8 serve --port 9000 # custom portExpose it beyond your machine with a quick tunnel:
cloudflared tunnel --url http://localhost:8787
# friends then run: accelr8 --server wss://something.trycloudflare.comDeploy your own copy of the hosted worker:
cd worker && npx wrangler deployDevelopment
npm install
npm run dev # run the TUI from source
npm run serve # run the sync server from source
npm run smoketest # headless two-client sync test (needs a server)
npm run rendertest # headless frame dumps of every screen
npm run build # bundle dist/cli.jsLayout:
src/protocol.tsshared wire types + constants (fixed 100×30 logical canvas)src/cli.tsentry point, arg parsingsrc/client.tsthe TUI: mouse/keyboard, flicker-free rendering, cursor lerpsrc/server.tsself-host sync server (Node,ws)worker/hosted sync server (Cloudflare Worker + Durable Object)
