Whiteboard

A local canvas for architecture diagrams, flows and sketches — several boards per install, image export and a fullscreen presentation mode.

Boards

Entry point: the “Whiteboard” nav item (/whiteboard); the editor lives at /whiteboard/:id.

List cards show a vector thumbnail of each board that refreshes as you draw; empty boards show a placeholder. Create, rename and delete are all on the list page.

ActionWhat it does
CreateName a board and land straight in the editor
Rename / deleteHover actions on each card; delete is a soft delete and cannot be undone
AutosaveWrites back about a second after you stop drawing; the toolbar shows Saved / Saving / Unsaved

Drawing tools

ToolKeyHow it works
SelectVClick to select, drag to move, drag the edge/corner handles to resize, drag on empty space to marquee-select
PanH or hold SpaceDrag the canvas to move the view
RectangleRDrag out a rectangle node
EllipseODrag out an ellipse node
DiamondDDrag out a diamond (decision / branch)
TextTClick to place text and type immediately; double-click any element to edit its label
PenPFreehand polyline for annotations and sketches
ConnectorLDrag from one element to another: endpoints snap even when you miss the shape (about 28px of tolerance towards the other end), land on the border on the side where you let go, and the target shape highlights while you drag. Elbow routing is on by default (outgoing stub → turn → incoming stub); switch to straight lines in the toolbar. Double-click to add a label
EraserEClick an element to remove it

The toolbar also carries stroke colour, fill colour, stroke width and font size: with nothing selected they apply to new elements, with a selection they restyle it in place.

Editing

ActionShortcut
Multi-selectShift + click, or marquee on empty space
Delete selectionDelete / Backspace
Duplicate selectionCtrl + D
NudgeArrow keys (Shift + arrows for a bigger step)
Z-orderCtrl + ] bring to front / Ctrl + [ send to back
Undo / redoCtrl + Z / Ctrl + Shift + Z
Select allCtrl + A

Text inside shapes wraps and centres automatically, and connectors follow their endpoints when you move the shapes — no need to redraw the arrows. Select a connector to get a round handle on each end: drag a handle onto a shape to re-attach it, or into empty space to make that end free again.

Elbow routing

In elbow mode a connector leaves its border perpendicular, turns, and enters the other border perpendicular, so it never cuts diagonally across shapes. Several connectors in the same direction fan out along the midline instead of stacking on top of each other. Switch to “Straight” for direct lines. The endpoint position comes from where you let go, and it stays on that side of the border while the shapes move.

View and export

ActionWhat it does
ZoomWheel zooms towards the pointer; the toolbar shows the ratio and offers reset / fit
Horizontal scrollShift + wheel
Grid snappingToolbar toggle: new and moved elements align to a 20px grid (freehand pen never snaps, so it stays under your cursor)
Export PNG2x bitmap, ready to paste into docs or chat
Export SVGVector output you can edit further

Presentation

Hit “Present” for a fullscreen read-only view: the board is fitted to the screen, ← → move between boards and Esc exits. Wheel zoom and Shift + wheel pan still work, but nothing can be changed.

Auto layout

The toolbar’s “Auto layout” rearranges shapes by their connections: pick a direction (horizontal LR / vertical TB) and press the button. Freehand annotations stay where they are, connector endpoints follow along, and undo brings your manual arrangement back. The button is disabled when the board has no connections.

Data and API

Each board is one row; the scene (elements plus viewport) is stored as JSON. Endpoints follow the shared response and paging conventions:

MethodPathNotes
GET/api/whiteboards?page=1&pageSize=20Board list (newest first, without the scene payload)
GET/api/whiteboards/{id}Board detail including the scene JSON
POST/api/whiteboardsCreate a board; an empty scene falls back to a blank one
PUT/api/whiteboards/{id}Update the name and / or the scene (partial fields)
DELETE/api/whiteboards/{id}Soft delete

The scene is validated on write: it must be a valid JSON object under 4 MB and the name at most 100 characters. Invalid requests fail with a business error and never corrupt an existing board.