A drawing tool that can be used to draw P2P or alone
Rust
1
28 commits
updated Sep 23, 2026
A real-time collaborative whiteboard. Draw on a shared canvas with friends over a peer-to-peer connection — no accounts, no installs beyond the app itself, just a room code.
Built in Rust with macroquad for rendering/input and matchbox for WebRTC peer-to-peer networking.
| Action | Input |
|---|---|
| Draw | Left-click drag (Pen tool) |
| Erase | Left-click drag (Eraser / Stroke Eraser tool) |
| Pan | Right-click drag |
| Zoom | Mouse wheel |
| Change tool size | Up / Down arrow keys |
| Switch to Pen | D |
| Switch to Eraser | E |
| Switch to Stroke Eraser | R |
| Undo | Ctrl+Z |
| Redo | Ctrl+Y |
| Open menu (host/join/leave lobby) | Esc |
Requires a Rust toolchain.
cargo run --release
By default the app connects to a public signaling server for matchmaking. To point it at your own instead, set OS_PAINT_SIGNALING_SERVER before launching:
OS_PAINT_SIGNALING_SERVER=wss://your-signaling-server.example {your binary}
Every push builds Windows, macOS, and Linux binaries via GitHub Actions (see .github/workflows/build.yml); grab them from that workflow's run artifacts, or from the latest release, which is republished automatically on every push to master.
| File | Responsibility |
|---|---|
| src/main.rs | App loop: state, input dispatch, undo/redo, lobby lifecycle |
| src/canvas.rs | Canvas dimensions, pan/zoom clamping, screen↔canvas coordinate mapping |
| src/stroke.rs | Stroke and Tool types |
| src/input.rs | Mouse/keyboard handling for drawing, erasing, panning, zooming |
| src/render.rs | Drawing strokes, the canvas border, and peer cursors to screen |
| src/ui.rs | Toolbar, size slider, color wheel, and their icons |
| src/menu.rs | Pause menu: host/join/leave a lobby |
| src/network.rs | Packet types and WebRTC peer sync (strokes, erases, snapshots, cursors) |
Rooms are just everyone who connects to the signaling server with the same 6-digit code — there's no dedicated game server holding state. Each peer:
28 commits
Rust
100.0%
A drawing tool that can be used to draw P2P or alone
Rust
1
28 commits
updated Sep 23, 2026
A real-time collaborative whiteboard. Draw on a shared canvas with friends over a peer-to-peer connection — no accounts, no installs beyond the app itself, just a room code.
Built in Rust with macroquad for rendering/input and matchbox for WebRTC peer-to-peer networking.
| Action | Input |
|---|---|
| Draw | Left-click drag (Pen tool) |
| Erase | Left-click drag (Eraser / Stroke Eraser tool) |
| Pan | Right-click drag |
| Zoom | Mouse wheel |
| Change tool size | Up / Down arrow keys |
| Switch to Pen | D |
| Switch to Eraser | E |
| Switch to Stroke Eraser | R |
| Undo | Ctrl+Z |
| Redo | Ctrl+Y |
| Open menu (host/join/leave lobby) | Esc |
Requires a Rust toolchain.
cargo run --release
By default the app connects to a public signaling server for matchmaking. To point it at your own instead, set OS_PAINT_SIGNALING_SERVER before launching:
OS_PAINT_SIGNALING_SERVER=wss://your-signaling-server.example {your binary}
Every push builds Windows, macOS, and Linux binaries via GitHub Actions (see .github/workflows/build.yml); grab them from that workflow's run artifacts, or from the latest release, which is republished automatically on every push to master.
| File | Responsibility |
|---|---|
| src/main.rs | App loop: state, input dispatch, undo/redo, lobby lifecycle |
| src/canvas.rs | Canvas dimensions, pan/zoom clamping, screen↔canvas coordinate mapping |
| src/stroke.rs | Stroke and Tool types |
| src/input.rs | Mouse/keyboard handling for drawing, erasing, panning, zooming |
| src/render.rs | Drawing strokes, the canvas border, and peer cursors to screen |
| src/ui.rs | Toolbar, size slider, color wheel, and their icons |
| src/menu.rs | Pause menu: host/join/leave a lobby |
| src/network.rs | Packet types and WebRTC peer sync (strokes, erases, snapshots, cursors) |
Rooms are just everyone who connects to the signaling server with the same 6-digit code — there's no dedicated game server holding state. Each peer:
28 commits
Rust
100.0%