A cross-platform, peer-to-peer multiplayer crossword application where people can solve crosswords together simultaneously and collaboratively.
Try it now at msfstef.dev/crossing-words
- Real-time collaboration - Solve puzzles together with friends, seeing each other's inputs instantly
- Peer-to-peer sync - No central server storing your data; puzzle state syncs directly between devices
- Cross-platform - Works on any device with a modern browser (desktop, tablet, mobile)
- Offline-capable - Install as a PWA and solve puzzles offline; changes sync when you reconnect
- Multiple puzzle sources - Download puzzles from Universal Crossword, Washington Post, Wall Street Journal, and more
Crossing Words uses WebRTC for peer-to-peer communication, allowing puzzle state to sync directly between collaborators without going through a central server. The app uses CRDTs (Conflict-free Replicated Data Types) via Yjs to handle concurrent edits gracefully.
Since the app relies on WebRTC for peer-to-peer connections:
- Firewalls & VPNs - Strict corporate firewalls or VPNs may block WebRTC connections, preventing collaboration from working
- NAT traversal - The app uses a TURN relay server as fallback, but some network configurations may still cause issues
- Local-only mode - If P2P connections fail, you can still solve puzzles locally; they'll sync when connectivity is restored
This project was built entirely using Claude Code, Anthropic's agentic coding tool. From initial scaffolding to feature implementation, bug fixes, and documentation - every line of code was written through conversational AI pair programming.
- Node.js 18+
- npm
npm install
npm run devP2P collaboration requires a WebRTC signaling server for peers to discover each other. In development, use the bundled y-webrtc signaling server.
-
Start the signaling server (in one terminal):
npm run signal
-
Start the app (in another terminal):
npm run dev
-
Open http://localhost:5173 in multiple browser windows
-
In one window, click Share and copy the link
-
Paste the link in another window to join the session
Both windows should now show connected collaborators and sync entries in real-time.
# Run all Playwright tests (auto-starts signaling server)
npx playwright test
# Run collaboration-specific tests
npx playwright test e2e/collaboration.spec.tsNote: Playwright tests automatically start the signaling server via playwright.config.ts.
The app consists of two components that need to be deployed:
The frontend is automatically deployed to GitHub Pages when changes are pushed to main.
- URL:
https://msfstef.dev/crossing-words/ - Workflow:
.github/workflows/deploy.yml
The Cloudflare Worker provides:
- WebRTC signaling server for peer-to-peer collaboration
- CORS proxy for fetching puzzles
Important: The proxy MUST be deployed for peer-to-peer collaboration to work in production.
Set these in your GitHub repository settings:
CLOUDFLARE_API_TOKEN: Cloudflare API token with Workers Deploy permissionCLOUDFLARE_ACCOUNT_ID: Your Cloudflare account ID
cd proxy
npm install
wrangler deploySee proxy/README.md for detailed deployment instructions.