Divine
Product siteDivine is a native Mac design tool I've been designing and building on my own since 2023: an infinite canvas, live multiplayer, and an AI agent that designs on the canvas with you. It's in development and hasn't been released. This is the work so far, and the decisions behind it.
01 / Why
Why build a design tool
I've worked in Figma every day for years, and I kept a list of everything that slowed me down. By 2024 I was turning that list into to-dos for a tool of my own.
To check it wasn't just me, I read through the complaints on Figma's community forum, where people post when they're frustrated, and I interviewed other designers. The same thing kept coming up: the canvas lags on large, deeply nested files. People weren't asking for more features. They wanted the ones they already had to feel instant.
So the research mostly told me what not to build.
02 / Native
Native, and Mac only
Divine is written in Swift. The interface is SwiftUI, and I drop down to AppKit wherever SwiftUI isn't precise enough: mouse tracking, two-finger trackpad panning, hit-testing.
The cost is reach. A web tool runs everywhere and mine runs on a Mac. I looked at a web build and at Swift on Windows, and set both aside. The whole bet is speed, and speed is easier to keep when nothing sits between the app and the machine.
03 / Model
One document, three kinds of author
Every design is a tree: frames inside frames, holding text, images and vectors, each positioned relative to its parent. Everything that changes a design goes through that one tree, whether it's my hands, a teammate on another Mac, or the AI agent.
It's why undo, export and the share link behave the same no matter who made the change.
Diagram, drawn from the source code
Every change, from a person or the AI, lands in the same tree.
The document
One element treeFrames, text, images and vectors. Positions are relative to the parent, so a frame moves with everything inside it. The canvas, the layers panel, undo, export and the browser share link all read from here.04 / Multiplayer
Multiplayer that met real cursors
The first version of live cursors wrote every mouse movement to the database. It used up the day's free quota of 20,000 writes within minutes. I moved cursors to a realtime database that same day.
Since then, how often the app writes is something I count. A recent fix was a drag that saved each position twice.
05 / AI
AI on the canvas, not beside it
I didn't want AI as a side feature that hands you a picture. In Divine the agent edits the same layers I do. It reads the canvas, works out which layer "that button" means, and builds with the same frames and autolayout a person would use.
The design streams onto the canvas layer by layer while the model is still writing, so you watch it being built. You can undo a whole run, and the agent can't add to a layer you've locked. It runs on Claude or GPT.
06 / Speed
Speed is a test, not a feeling
Timings are noisy, so I count instead. A fixed set of actions runs against a heavy test file and records exactly how much work the app did. The numbers live in the repository. If a change makes a drag cost one more database write or one more full layout, it shows up as a changed number, not as a hunch three weeks later.
Current baseline, from the repository
What each action is allowed to cost.
| Action | Layout passes | Full re-layouts | Database writes |
|---|---|---|---|
| Open the file | 2,001 | 1 | 1 |
| Drag a layer, 60 steps | 60 | 0 | 60 |
| Resize a layer, 60 steps | 422 | 0 | 61 |
| Move a layer into another frame | 4 | 4 | 1 |
Counts, not milliseconds: the same file and the same code always give the same number, so any change is a real one.
07 / Process
How I build it
I design every interaction and decide what gets built. Since mid-2026 most of the code is written by AI coding agents that I direct, several at once, each on its own branch, under one rule: the main branch always builds and passes its tests. The judgment stays with me: what to build, how it should feel, and whether it's right.
08 / Today
Where it stands
Divine is in development and hasn't been released. Built so far: the canvas, nested frames, autolayout, components and instances, pen and vector tools, rich text, comments, paste from Figma, export to PNG, JPG, WebP, SVG and PDF, and a share link that shows a design live in the browser. There are about 1,300 automated tests behind it.
It took 868 commits over three years, in bursts, with a year away in the middle. What it doesn't have yet is users. That's the next thing to earn.
Commits per month, September 2023 to August 2026
Three years, in bursts.
- Sep ’23
- 1
- 2024
- 2
- 3
- 2025
- 4
- 2026
- 4445
- 193
- 1Late 2023Canvas, frames, nesting, layers.
- 2Summer 2024Text editing, multiplayer, live cursors.
- 3November 2024Snapping and alignment guides.
- 4Autumn 2025AI editing, undo, Figma import, autolayout, components.
- 5Summer 2026Vectors, comments, export, share links, the streaming agent.