Persistence
Brainstorm is local-first: every board lives in your browser’s IndexedDB and is restored when you reload — no account required. Each board is a CRDT document, and every change is written as it happens — there’s no manual save button and nothing to lose when you close the tab.
What’s saved
Everything that makes up a board:
- Chat bubbles (text, role, reply/branch links, positions).
- Image bubbles, code cells (source + position + parent links + last output), and drawings.
- Rich-text documents and spreadsheets.
The viewport (pan and zoom) is saved too, but per device — it isn’t part of the shared board, so two people (or two of your devices) can each look at a different part of the same board.
Cloud sync
Signed out, a board never leaves your device. When you’re signed in, each board is also synced to the cloud so it converges across your devices and — with Plus — with collaborators, editing live and merging offline changes on reconnect. See Collaboration. The same CRDT model powers both the local copy and the synced one, so there’s no separate “save to cloud” step.
How images are stored
Image bytes are stored as native Blobs in a separate object store, keyed by a
stable id; the board’s JSON only references that id. This sidesteps the ~5 MB
localStorage cap and base64 inflation — IndexedDB’s quota is a large fraction
of free disk. The app also asks the browser to persist storage so it isn’t
evicted under disk pressure.
What isn’t re-run
Restoring rebuilds the static state — it does not re-run the LLM or re-execute code. Saved answers and cell source are kept as-is. A code cell’s rendered output (text, tables, images, plots) is saved and restored, so a reloaded cell shows its last result without re-running — the exception is live ipywidgets, which need a running kernel and reappear only after you re-run the cell. When you’re signed in, saved output is also shared with collaborators.
Settings vs. board data
- Board data lives in IndexedDB (one database per board, plus a shared store for image blobs).
- Settings — your model choices, base URLs, and API keys — are tiny and kept
separately in
localStorage, never synced.
Resetting
From the browser console, whiteboard.reset() clears the current board and
reloads (every edit is already saved as it happens, so there’s no manual save). To
create, switch, delete, or export boards from the UI, see
Boards.