Multiplayer mood board
Pin it once.Everyone sees it.
References, screenshots and scribbles on one canvas, with everybody’s cursor in the room. qqdraw is a mood board that people use at the same time, not a folder they take turns in.
- snapshot flush
- 1.5s
- accounts to join a public board
- 0
Form follows quiet function.
Keep borders at 1px. Let alignment carry the board.
Ada · 2 min agoForm follows quiet function.
01 — Collaboration
presence / per connection
Cursors carry a name and a colour.
Presence is keyed by connection, not by account, so two tabs are two cursors and a closed tab disappears without taking the person with it.
Each colour is derived from the person’s id, so it is the same on every machine. The tool they have selected rides along with the pointer: you can tell a note from a pan before anything is drawn.
02 — Persistence
last write wins / tombstones
The board is the file.
There is no save button. Elements merge into the room and flush to the cloud on a short debounce, so a reload rebuilds the scene exactly as it was left.
Conflicts resolve by version and nonce, and deletions stay as tombstones. A client holding a stale copy converges with the room instead of resurrecting what someone removed.
- 19:41:02elementsrect · x 412 → 796+2
- 19:41:03elementstext · v4 → v5+1
- 19:41:06presenceAda · 318, 204ptr
- 19:41:07filesimage/png · 184 KB+1
- 19:41:09elementsframe · deleted · v7−1
- 19:41:11flushcloud · 6 elements1.5s
03 — The fork
excalidraw / vendored
Built on Excalidraw, then bent.
qqdraw is a fork, not a wrapper. Upstream’s toolset and scene model stay as they are; the parts a mood board needs are replaced. The fork is vendored in this repository and built with its own toolchain, so upstream can still be merged in.
Kept from upstream
Toolset
Rectangles, freehand, text, arrows, frames and images.
Scene model
Elements, versions and fractional indices, unchanged.
Merge rule
Last write wins by version, then by nonce.
Changed for qqdraw
Chrome and icons
Our own toolbar, inspector and presence chips.
Minimap and follow
See the whole board, or ride someone’s viewport.
Canvas backgrounds
Plain, dots, or ruled, remembered per board.
Watch build
The fork compiles into this app while you edit it.
04 — Opening a board
link / invite
Send a link. You choose who draws.
A public board is the invitation. Guests open the link, get a name and a colour, and draw immediately: no account, no email, no waiting for someone to accept.
Switch a board to private and the link stops being enough: only you and the people you invite can open it, and the board answers “not found” to everyone else.
- Public
- anyone with the link
- Private
- owner and invited members
- Guests
- no account on public boards
05 — Questions
answers
The things people ask before they open a board.
Short answers, because the product is small: a board, the people on it, and no save button.
- Does everyone see what I draw?
- Yes. Elements merge into the shared room as you draw them. Each person's cursor carries their name and a colour, and presence is keyed by connection — two tabs are two cursors, and a closed tab disappears without taking the person with it.
- Do I have to save?
- No. There is no save button. Changes flush to the cloud on a short debounce, so a reload rebuilds the scene exactly as it was left.
- Who can open my board?
- A public board opens for anyone holding the link. A private one opens for you and the members you invite, by email address — the invitee doesn't need an account yet; the link creates one at sign-in.
- Do I need an account?
- To own a board, yes — sign in with Google. A public board can be drawn on without one.
Start with an empty board.
It opens in the browser. Everything you draw is saved as you go, and anyone you send the link to draws in the same room.