Canvas
Scheduled Oct 8, 2026An infinite whiteboard whose state lives in your account.
Replaces
- Miro · Miro (RealtimeBoard Inc.) — $20 per seat per month (Business (billed yearly)), about $96,000/yr at 400 seats
- FigJam (Figma) · Figma, Inc. — $12 per seat per month (Professional (per editor, paid annually)), about $57,600/yr at 400 seats
Rented, per year
$96,000
Miro list price at 400 seats.
Owned, per year
$9,840
AWS infrastructure only. Azure is $11,760.
Build
12 weeks
2 engineers. To parity on the ten core features, including the CRDT sync layer, the canvas renderer, the relay and its drain behaviour, and an importer for existing Miro boards covering stickies, shapes, connectors, frames and images.
Difficulty
4/5
Substantial. Compliance or realtime depth involved.
Reference organisation: 400 seats, ~3,000 boards, 60 GB of board snapshots and images, peak 120 concurrent editors spread across 25 live boards, daily snapshots retained 12 months, single region, prod + non-prod. 3-year Compute Savings Plan on Fargate / 3-year reservation on Container Apps. Relay sized for 3x the stated peak concurrency to absorb an all-hands workshop. Aurora minimum 0.5 ACU. Azure figure includes the workload-profiles baseline described above. Excludes CDN egress above 1 TB/month. These figures are infrastructure only and exclude the build. For comparison, 400 seats on Miro Business at the listed $20 per member per month billed yearly is $96,000 a year.
What it is
Canvas is a collaborative infinite whiteboard: sticky notes, shapes, connectors, freehand ink, frames, images, embeds and templates, with real-time multiplayer editing, cursors, comments and voting. Board state is a CRDT document persisted in your own storage, so a board is a file you can back up, export and read without the vendor. It is aimed at organisations where whiteboarding became infrastructure — every design review, every retro, every incident timeline — and where a per-member licence now stands between people and a shared drawing surface.
Why this one stops making sense
- Miro Business is $20 per member per month billed yearly. At 400 members that is $96,000 a year for a shared drawing surface, and the number grows every time someone new needs to join a workshop.
- Per-member pricing is exactly wrong for whiteboards, because the value of a board is proportional to how many people are on it. Every occasional participant you leave out to save a licence makes the tool worse.
- Boards accumulate into an unmanaged corpus of architecture diagrams, incident timelines and roadmaps. That is real institutional knowledge sitting in a proprietary format with an export that flattens it to an image.
- Workshop content is frequently sensitive — reorganisations, acquisitions, incident post-mortems — and it goes onto a third-party service by default, usually without anyone deciding that it should.
- The hard part of a whiteboard is a solved problem now. CRDTs, WebSocket fan-out and canvas rendering are all well-understood engineering with mature open-source foundations.
What ships
- Infinite canvas with GPU-accelerated rendering, viewport culling and level-of-detail at low zoom
- Sticky notes, shapes, text, connectors that reroute, freehand ink, images, frames and embeds
- Real-time multiplayer through a CRDT document, with live cursors, selections and presence
- Offline edits that merge cleanly on reconnect, because the CRDT does not need a server to resolve conflicts
- Comments threaded on objects and on regions, with mentions that notify through your existing channels
- Voting, timers, and facilitation tools for retros and workshops
- Templates as versioned files, including your own house templates for architecture and post-mortems
- Frames as presentation slides, with a follow-the-presenter mode
- Export to SVG, PDF and a documented JSON board format that round-trips
- Board-level permissions through your IdP, plus time-boxed guest links for external workshops
Data model
Stack
- frontend
- Next.js 15 shell with a canvas renderer on WebGL and a Canvas2D fallback; Yjs as the CRDT
- backend
- A Go WebSocket relay for the hot path, NestJS on Node 22 for boards, permissions and comments
- database
- PostgreSQL 16 for board metadata, permissions, comments and audit; board state itself is not relational
- cache
- Redis 7 for presence, awareness state, board-to-node assignment and the recent update tail
- queue
- BullMQ for snapshot compaction, thumbnail rendering, export generation and notifications
- auth
- OIDC against the customer IdP; guest links are signed, time-boxed and scoped to one board
- search
- PostgreSQL tsvector over sticky and text object content, extracted from snapshots on compaction
- ai
- Optional: cluster stickies by theme and draft a workshop summary through a pluggable LLM gateway, on explicit request rather than automatically
Parity, honestly
What we match, and what we do not.
The rows marked No are the important ones. If one of them is the reason you bought Miro, keep buying it — and we will tell you that on the first call rather than the fifth month.
| Capability | Miro | Ours | Note |
|---|---|---|---|
| Infinite canvas with the standard object set | Yes | Yes | — |
| Real-time multiplayer with cursors and presence | Yes | Yes | — |
| Offline editing with clean merge on reconnect | Partial | Yes | A property of the CRDT rather than a feature we bolted on. |
| Comments, mentions and voting | Yes | Yes | — |
| Templates | Yes | Partial | We ship around forty and a template authoring path. Miro's library runs to thousands, many community-contributed. |
| Presentation mode from frames | Yes | Yes | — |
| Free unlimited participants | No | Yes | The whole point. Everyone in the company can be on the board. |
| Open, documented board file format | No | Yes | A board exports as JSON that re-imports losslessly. Neither vendor offers this. |
| In-board voice and video calls | Yes | No | Miro runs voice, video and screen sharing inside the board. Canvas does not, and building it means either an SFU you now operate or embedding a third-party meeting service. In practice teams run Canvas next to the meeting tool they already have, which works but is not the same experience. |
| App and integration marketplace | Yes | No | Miro's marketplace covers Jira sync, diagram importers, AI clustering, dozens of embeds. Canvas has an embed API and a plugin surface. We build the integrations you name; we do not populate a marketplace. |
| Adjacency to Figma design files | Yes | No | FigJam's real advantage is that it sits beside your Figma design files with shared components and one account. If your design team lives in Figma, replacing FigJam specifically removes that adjacency and gains you very little. Canvas replaces Miro convincingly; against FigJam the honest recommendation is often to keep it. |
| Native desktop and mobile apps | Yes | Partial | Canvas ships an installable PWA that handles pen and touch input. Store-listed native apps are a separate engagement. |
| Very large boards (50,000+ objects) staying responsive | Partial | Partial | Both degrade. Canvas culls and simplifies aggressively and holds up to roughly 30,000 objects on a mid-range laptop, which covers almost every real board. Beyond that, both products want you to split the board. |
| Vendor-run infrastructure during a workshop with 200 participants | Yes | Partial | Canvas scales, but the capacity planning is now yours. We size for your largest expected session and hand over the load test. |
Reference architecture
Built twice, on purpose.
Every application in Techtons ships with a production architecture for AWS and one for Azure, using the same diagram grammar so you can read them side by side. Your cloud, your account, your bill.
Amazon Web Services
- Compute
- ECS Fargate: a Go relay service for WebSockets, an API service, and workers for compaction and export
- Data
- Aurora Serverless v2 PostgreSQL for metadata; ElastiCache Redis for awareness and routing
- Storage and edge
- S3 for board snapshots, update log segments, images and exports; CloudFront for assets
- Identity
- Cognito federated to the customer IdP; guest tokens signed with a KMS asymmetric key
- Observability
- OpenTelemetry to CloudWatch; per-board message rate and relay connection count as first-class metrics
- Infrastructure as code
- Terraform, with the relay service deployed on its own target group and deregistration delay tuned for drain
Services
The decision worth arguing about
Two decisions define this deployment, and both come from the same arithmetic. A board with a dozen active participants generates cursor and awareness updates at roughly thirty a second per person; each one must reach the other eleven. That is a few hundred inbound messages a second becoming a few thousand outbound, sustained for the length of a workshop — which is why API Gateway WebSockets, billed per message and per connection-minute, is not a candidate at any price, and why the relay is a Fargate service holding sockets directly. The genuinely non-obvious decision is the second one: how clients of the same board find the same relay node. The default answer is to let the load balancer distribute connections however it likes and have nodes exchange updates through Redis pub/sub. That works, and it quietly multiplies your internal message volume by the number of relay nodes — every one of those few thousand messages a second gets published once and delivered to all eight relays, whether or not they hold a participant on that board, so the Redis node becomes the bottleneck long before the relays do and you end up paying for a large cache instance to shuttle messages between processes that did not need to talk. Canvas instead keeps a board-to-node assignment in Redis, and a small router service tells a joining client which relay hostname to connect to, so every participant on a board lands on one process and cross-node traffic is zero. The trade-off is a real one and it shows up during deployments: if a relay node dies or is replaced, every board it held has to be reassigned and every client reconnects, which is a two-to-three-second interruption where the pub/sub design would have degraded more gracefully. We mitigate it with long deregistration delays and by draining boards to a new node between updates rather than at connection close, and we accept the blip because a whiteboard that hiccups for two seconds during a deploy is better than one that needs a $400-a-month cache to talk to itself. The third thing worth naming is CRDT growth: a Yjs document accumulates its full edit history, so a board worked on for a year is several megabytes of update log and slow to load. A compaction worker periodically writes a merged snapshot to S3 and prunes the log behind it, which costs us fine-grained time travel beyond the snapshot horizon — you can restore to any of the retained daily snapshots, not to any individual keystroke from eight months ago.
Microsoft Azure
- Compute
- Azure Container Apps for API and workers; the relay on a workload-profiles environment
- Data
- PostgreSQL Flexible Server for metadata; Azure Cache for Redis for awareness and routing
- Storage and edge
- Blob Storage for snapshots, update segments, images and exports; Front Door for assets
- Identity
- Microsoft Entra ID; guest links signed with a Key Vault key
- Observability
- Azure Monitor and Application Insights, with a custom metric for relay connection count
- Infrastructure as code
- Bicep, with the KEDA scaler definition for the relay held alongside the app
Services
The decision worth arguing about
Azure offers a managed answer to the fan-out problem — Azure Web PubSub — and the reason we do not use it is worth spelling out, because it looks like the obvious choice. Web PubSub is billed in units, and each unit carries both a concurrent-connection allowance and a daily message allowance. A whiteboard's load is wildly asymmetric between those two: a hundred and twenty concurrent editors is a trivial connection count, but the cursor and awareness traffic they generate burns through message quota at a rate that forces you to buy units purely for messages, most of whose connection capacity you will never touch. You end up scaling a managed service on the axis it prices worst. Running the relay ourselves on Container Apps costs compute we can size to the actual socket count. That choice creates the Azure-specific problem, and it is a real one: Container Apps' default HTTP scale rule counts concurrent requests, and a WebSocket held open for a three-hour workshop is exactly one concurrent request. Left on defaults, a relay node holding two thousand sockets looks idle to the autoscaler while a node holding twenty looks the same, and scale-in will happily terminate a revision full of live boards. So the relay runs on a workload-profiles environment with a custom KEDA scaler reading a Redis-held active-connection gauge that the relay publishes itself, and with a long termination grace period plus an explicit drain endpoint that migrates board assignments before the process exits. The cost of that is the workload-profiles baseline, which is why the Azure figure below sits above the AWS one; the benefit is that scale-in stops being an outage. Snapshot and update-segment storage behaves as it does on AWS, with the one caveat covered in Watchtower's notes: Blob's cool-tier early-deletion penalties make aggressive lifecycle rules a false economy on data the compactor rewrites, so snapshots stay in Hot until they are outside the compaction window.
Sources
Every price on this page, with the page we read it from and the date we read it.
| Product | Plan | List price | Checked | Source |
|---|---|---|---|---|
| Miro | Business (billed yearly) | $20 / seat/month | 2026-09-05 | miro.com/pricing/ Miro lists Starter at $8 per member per month and Business at $20 per member per month, both billed yearly. Enterprise is custom pricing and starts at 30 members. Miro states annual billing saves 20% over monthly. |
| FigJam (Figma) | Professional (per editor, paid annually) | $12 / seat/month | 2026-09-05 | www.figma.com/pricing/ Figma's public pricing page lists Professional at $12 per editor per month paid annually and Organization at $45, and no longer breaks out a FigJam-only seat on that page. We cite the editor seat price because that is the number Figma publishes; if your organisation holds a FigJam-only arrangement, use your own contract figure instead. |
Should you still be paying for Miro?
Two weeks, fixed price. We audit what you actually use, map it against Canvas, cost the replacement on your own AWS or Azure account, and give you a delivery plan. If the honest answer is to keep the licence, that is what the report will say.