In-session collaborative whiteboard
Operator and field user draw on the same canvas in real time — measurements, arrows, "where is the dent" annotations. Every snap captures both the rendered PNG and the Excalidraw scene JSON, hashed together. Tamper with either side after the fact and the audit chain catches it.
What gets captured
What everyone saw
The pixel-exact image rendered at snap time. Survives the case file viewer for years without needing Excalidraw to be loadable — drop the PNG into a court bundle and it speaks for itself.
The shapes that made it
Canonical-JSON dump of the scene elements: every stroke, every arrow, every label. Re-render the JSON later and you get a byte-identical PNG — the cryptographic proof that the rendered image wasn't doctored after capture.
Combined SHA-256 anchors PNG + canonical JSON together. Change one byte in either and the chain breaks.
Why both sides
A rendered PNG alone is convincing but theoretically forgeable — any image editor produces a pixel-correct fake. A scene JSON alone is unreadable to a court — strokes and coordinates in a viewer the judge doesn't have. Together: the JSON proves the image is the deterministic render of these shapes; the image proves what the participants actually saw on screen. Tamper with the image without touching the JSON and the re-render check fires; tamper with the JSON and the hash doesn't match.
Live collaboration model
Strokes propagate over the LiveKit data channel with conflict-free element IDs — both sides can draw at once without locking. The operator can lock a tile to themselves (one-way annotation, common in claims walkthroughs) or open it up (true co-edit, common in remote training).
| Mode | Who can draw |
|---|---|
| Operator-locked | Only the operator. Field user watches the annotations land — common in inspection-by-the-book flows. |
| Open canvas | Both sides. Field user can circle "this is what I meant" without taking a turn. |
| Snap-and-keep | "Snap the current state and open the collab annotator on it" — captures a still and reopens it for asynchronous annotation later. |
Reading it back from the API
Whiteboards land as Evidence rows with kind=whiteboard. List them via GET /api/v1/public/sessions/{id}/whiteboards, request a signed download URL via GET /api/v1/public/evidence/{id}/download. Both the rendered PNG and a verify endpoint for the scene JSON are documented in the Whiteboards API reference.
Try the live canvas
The demo session ships with the operator + field side already paired. Open it in two browsers, draw on both — the strokes propagate; the snap captures both layers; the audit chain anchors both.