A whiteboard for one person is a mostly solved problem: wrap the MIT-licensed Excalidraw component in a boards list, autosave, frames, sticky notes and export, and an agent gets you there in a weekend. The hard parts are the reason Miro is a team product: many people editing the same board live, workshop tools like voting and timers, templates, guests, and ticket sync with Jira. Build a solo canvas if you mainly sketch alone; stay if your meetings live on boards.
Before you buildMiro Free keeps 3 editable boards for unlimited members. If you rarely need a fourth live board, you may not need to pay or build anything.
Build me a personal whiteboard app to replace Miro for solo use. Requirements: - Node.js 22 + TypeScript: a Fastify API and a React front end built with Vite, using the MIT-licensed `@excalidraw/excalidraw` component as the canvas. `npm start` serves http://localhost:4700. - Storage: better-sqlite3 in ./data/boards.db. A board row holds its title, folder, scene JSON and a thumbnail PNG. Images dropped on a board are saved once to ./data/files/ under their content hash. - Boards page: thumbnail grid, create, rename, duplicate, search by title, one level of folders, and a trash that keeps deleted boards for 30 days. - Editor: infinite canvas with shapes, arrows that stay attached, text, freehand, images and frames. Autosave one second after the last change, and undo history that survives a reload. - Sticky notes: a toolbar button adds a coloured square note with centred text; select several and "Arrange in grid" snaps them into rows ordered by position. - Version history: a snapshot after every 10 minutes of editing and on demand; list and restore them. - Present mode: step through the frames in order, full screen, with the arrow keys. - Export: a frame or the whole board as PNG, SVG and PDF (one frame per page), and one zip with a JSON file per board as a full backup. Re-importing that zip must restore every board. - Single user. No accounts, no telemetry, local-first; bind to 127.0.0.1 unless HOST is set in .env. - Out of scope: real-time co-editing, comments, voting and timers, templates, integrations, mobile apps. - README: setup, where the data lives, how to back it up, and a plain note that a shared live board needs a different design.
Opens your agent with the prompt filled in, you press enter. Or copy it and paste it into an empty folder.
The first prompt builds the core. Run these one at a time in the same folder to grow it into your own Miro.
Add a CSV importer to the whiteboard app in this folder. Requirements: - Accept a CSV exported from Miro, where the first column holds the text of each sticky note, card or text box, followed by description or link and tags columns. - Create a new board with one sticky note per row, laid out in a grid of 6 columns, with tags shown as a small label under the text. - Show a preview with the row count first; skip empty rows and report how many were skipped. - Update the README.
Add read-only sharing to the whiteboard app in this folder. Requirements: - A Share button per board creates a random token and a URL at /view/<token>; revoking deletes the token. - The view page loads the Excalidraw component with viewModeEnabled and no sidebar. - Only /view/* and the files it needs are reachable when SHARE_PORT is set in .env; serve them on that port bound to 0.0.0.0 while the editor stays on 127.0.0.1. - Rate-limit the view routes per IP. - Update the README with how to put the share port behind a tunnel.
Extend the whiteboard app in this folder. Requirements: - Let me reorder frames in a side list and show the order in Present mode. - Add an export that renders each frame at 1920x1080 and writes a PDF with one frame per page in that order, plus a folder of PNGs. - Add speaker notes per frame, stored with the board and shown in Present mode with the S key. - Update the README.
Miro earns its seats in meetings: a board everyone can open without friction, a facilitator's timer and votes, ready-made workshop formats, and tickets from Jira showing up on the canvas. The drawing surface is the cheap part; getting a team or a client onto the same board is what the subscription buys.
Estimate · Runs on your machine at no cost. A small VPS adds a few dollars a month if you want to reach it from other devices. The build is token usage on your agent plan.
| Plan | Monthly | Annual, per month | What you get |
|---|---|---|---|
| Free | $0 | $0 | 3 editable boards, 7,000+ templates, 250+ integrations, 100 MCP calls a day, a limited trial of the AI tools. |
| Starter | $10 | $8 | Unlimited and private boards, visitor editing, high-resolution export, timer and voting, 25 AI credits per member a month, 500 MCP calls a day. |
| Business | $25 | $20 | Adds guests, SSO, data tables, interactive prototypes, Engage activities (up to 50 participants), two-way Jira, Asana and Linear sync, 50 AI credits per member, 2,000 MCP calls a day. |
| Enterprise | custom | — | SCIM, audit logs, data residency in the EU, US, Australia and Japan, 10,000 MCP calls a day. |
Free allows up to 3 editable boards for unlimited team members, plus 10 AI credits a month to try the AI tools.
Kinda. The core is a weekend build with the prompt on this page, but real gaps remain: Live co-editing with cursors, comments and mentions for a whole team, Templates (the pricing page counts 7,000+), voting, timers and other facilitation tools.
About $10 a month on the Starter plan per seat, $120 a year (checked 2026-10-14).
Live co-editing with cursors, comments and mentions for a whole team; Templates (the pricing page counts 7,000+), voting, timers and other facilitation tools; Two-way sync with Jira, Asana and Linear, and the 250+ integrations; Guests, SSO, sharing permissions and board version history across a team; Miro's AI tools for clustering notes and generating diagrams, and its MCP connection to coding agents. If any of those matter to you, keep paying.
Yes: Excalidraw (open source), AFFiNE (open source), WBO (open source).