A quick peer-to-peer word chain with shared turns and a round clock.
Live → https://baditaflorin.github.io/mesh-word-chain/
Source → https://github.com/baditaflorin/mesh-word-chain
Tip the dev (buy a coffee) → https://www.paypal.com/paypalme/florinbadita
Two peers, side-by-side, in the same room. Drop a
tests/demo/scenario.mjsexportingdefault async (a, b) => …and runnpm run demoto regeneratedocs/preview.pngplusdocs/demo-a.webm/docs/demo-b.webmclips.
A rootless-computing peer-to-peer browser app. No backend of its own beyond the self-hosted WebRTC stack listed below. State lives in a Yjs mesh shared by everyone in the same room.
Read the principles → https://baditaflorin.github.io/rootless-computing/principles.html
Open the live URL on two devices in the same room (set in ⚙ settings, or scan the room QR). Everything else is in-app.
For local hacking:
git clone https://github.com/baditaflorin/mesh-common
git clone https://github.com/baditaflorin/mesh-word-chain
cd mesh-word-chain
npm install
npm run devmesh-common must sit as a sibling directory because package.json references it via file:../mesh-common.
| Repo | Endpoint | Purpose |
|---|---|---|
| https://github.com/baditaflorin/signaling-server | wss://turn.0docker.com/ws |
y-webrtc signaling fan-out |
| https://github.com/baditaflorin/turn-token-server | https://turn.0docker.com/credentials |
HMAC TURN creds, 1-hour TTL |
| https://github.com/baditaflorin/coturn-hetzner | turn:turn.0docker.com:3479 |
TURN relay |
The settings drawer lets the user override signaling and TURN endpoints. localStorage keys:
mesh-word-chain:signalingUrlmesh-word-chain:turnTokenUrlmesh-word-chain:iceServersmesh-word-chain:room
If endpoints are blank or unreachable, the app falls back to STUN-only.
The bottom-right footer on every screen of the live app shows:
source→ this repotip ♥→ PayPalvX.Y.Z · <short-sha>— version frompackage.jsonplus the build-time git commit
GitHub Pages serves the committed docs/ directory on the main branch. There is no GitHub Actions build workflow; local Husky-style hooks gate formatting / typecheck / smoke build before each push.
npm run smoke # build + sanity-check docs/
bash ../mesh-common/scripts/screenshot-app.sh # regenerate docs/screenshot.pngEverything you publish to a room is visible to every peer in that room. Your local device's name, key, and choices stay local. Cryptographic signatures prove who wrote each entry; they do not prevent peers from reading or copying entries. The room URL is the access control — share it deliberately.
See docs/privacy.md for the full threat model — capabilities used, what other peers in the mesh see, what the self-hosted infra sees, what stays local.
MIT — see LICENSE.

