You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Wavy is a real-time collaborative workspace that lets users draw together on a shared canvas and compete in multiplayer typing sprints -- all from the browser. Rooms are created instantly, shared via an 8-character code, and feature built-in WebRTC voice chat so participants can talk while they collaborate.
Create a .env file in both backend/ and frontend/ directories (see section below).
4. Start the development servers
# Terminal 1 -- Backendcd backend
npm run dev # uses nodemon, restarts on file changes# Terminal 2 -- Frontendcd frontend
npm run dev # Vite dev server on http://localhost:5173
Canvas rooms are persisted in MongoDB. When all users disconnect, the room document is deleted.
Typing rooms are stored in-memory on the server (not persisted). They are cleaned up when the last user leaves.
Voice chat uses peer-to-peer WebRTC connections. The server only handles signaling (offer/answer/ICE exchange). Audio streams flow directly between browsers.
Anti-cheat in typing mode flags users for paste events, suspiciously fast input rates, and large text deltas. Flagged users are visible on the leaderboard.
Scoring is character-level: +1 for each correct character, -1 for each incorrect character, -1 for extra characters beyond the expected word length.
Deployment
Frontend (Vercel)
The frontend includes a vercel.json with SPA rewrites. Deploy by connecting the frontend/ directory to a Vercel project. Set the VITE_BACKEND_URL environment variable to the deployed backend URL.
Backend
Deploy the backend to any Node.js hosting provider (Render, Railway, Fly.io, etc.). Ensure the following:
Set all environment variables (PORT, MONGO_URI, CLIENT_URL).
CLIENT_URL must include the deployed frontend origin for CORS.
The hosting provider must support WebSocket connections for Socket.IO.
License
This project does not currently specify a license. Contact the author for usage terms.