Images & drawing
Image bubbles
Right-click → Image → Load image picks a local file and drops it as a draggable sprite, opening straight into the built-in image editor. A small toolbar adds:
- ⭳ Export — download the current image.
- ✓ Done — close the editor, keeping your edits. The current canvas (all edits applied) is persisted and collapses back to a sprite — no separate Save step and no “discard changes?” prompt.
Double-click a sprite to re-open it in the editor. A bottom-right corner grip resizes an idle sprite to any size (free aspect); the chosen size persists and survives edits.
Generating images
Right-click → Image → Generate image pops a prompt at the click point. On commit it runs text-to-image against a configurable image-generation API and embeds the result exactly like a loaded image (editable in the same editor). A dashed “Generating…” placeholder tracks the spot until it lands; errors show inline.
Configure it in the Account tab’s Image generation section — the same BYOK-or-hosted choice as chat, made independently: bring your own key and base URL (free, runs from your browser via the dev proxy) or pick a hosted model paid from your balance. See Accounts & billing.
Transforming images (image-to-image)
Every image — loaded or generated — carries an orange + on its bottom edge, just like chat bubbles and code cells. Click it to open the Transform image dialog: write a prompt, pick size / quality / count (and, in hosted mode, a different model per result), and submit to run image-to-image.
The result is a small lineage laid out beneath the source and joined by Bézier connectors:
source image → prompt bubble → row of N variations
- The prompt bubble is display-only; the variations are full image bubbles you can edit, resize, or transform again — so transforms chain into a tree of variations.
- The whole lineage is persisted and synced and survives disk export/import.
- The same curved connectors apply: they reshape as you drag either end, and a hover-to-remove × sits at each connector’s midpoint.
Transforms run against your configured image-generation provider (an edit-capable model), using the same Account tab settings as generation.
Tip: an image’s + also drags — dropping it onto a code cell links the image in as data instead of transforming it. See linked images.
The drawing tool
Right-click → Draw opens a top-center toolbar and arms freehand painting on the grid:
- Tools: freehand pen, straight line, arrow (click for the tail, drag, release for the head — the barbed head scales with the stroke width), rectangle, ellipse, fill (bucket any enclosed region with the current color), erase (drag to remove strokes under the cursor), and select (marquee-select strokes, then drag them).
- A native color picker for any stroke color and a few stroke widths.
- Done closes the tool.
Select & move: with the select tool armed, drag out a frame on empty board — every stroke it touches is selected (a blue outline marks the group). Then press inside the selection and drag to move it all at once; pressing outside starts a fresh frame.
Fill is a true flood fill: it handles regions bounded by any combination of strokes (a triangle drawn as three separate lines, or one lune of overlapping circles) — click the enclosed area you want and only that region fills, with the boundary landing on the strokes. Clicking open space or an un-closed shape fills nothing; clicking inside an existing fill recolors it.
Strokes are vectors stored in world coordinates, so they pan and zoom with the board and their widths scale like the connectors. The eraser removes whole strokes it touches. Every edit — including moves — commits through the board’s model, so it’s persisted, synced, and shared with collaborators.