Local QR — Casey Tunturi

Open index.html in a browser. It works offline; no installation or server is needed.
To host it, put index.html on any static web server.

Local service: install Node.js 22 or newer, then run:
  node server.cjs
Open http://localhost:8787
No npm install, build step, or account is required.

Self-hosting: put an HTTPS reverse proxy in front of port 8787 with WebSocket support.
Set PUBLIC_ORIGIN to the browser-facing origin, e.g. https://tools.example.org.
Set HOST=0.0.0.0 only when you intend to expose the service to your network.
PORT defaults to 8787; DATA_DIR defaults to ./data beside server.cjs.
Run one process per DATA_DIR; retain that directory for presence counts.
Forwarded IP headers are ignored; behind a proxy, its connections share a rate limit.

Transfer needs a direct WebRTC path between peers. No STUN or TURN is configured.
Some routers and firewalls prevent a connection. Files stay in browser memory (512 MB limit).
Signed presence uses localhost or HTTPS and a browser supporting Ed25519.
Command-line client: node knock.mjs http://localhost:8787

The utility code is shared with the website. Source files and dependency licenses are included.
The source/ folder is a reading copy; rebuild from the caseytunturi.com repository with npm ci and npm run build:tools.
No website credentials, career records, or runtime data are included.
