The Divine app icon: a white letter D cut into geometric pieces, on black.

Divine

Client:
Self-initiated
Year:
/ 2023 to now
Services:
Product, Design, Engineering
Status:
In development
Product site

Divine 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.

Author 1

YouMouse, trackpad and keyboard, read through AppKit and handed to the SwiftUI editor.

Author 2

The AI agentReads and edits real layers through tools: get_canvas_snapshot, create_elements, update_elements.

Author 3

TeammatesEdits, comments and cursors from other Macs, arriving live through Firebase Realtime Database.

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.

ActionLayout passesFull re-layoutsDatabase writes
Open the file2,00111
Drag a layer, 60 steps60060
Resize a layer, 60 steps422061
Move a layer into another frame441

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.

  1. Sep ’23
  2. 1
  3. 2024
  4. 2
  5. 3
  6. 2025
  7. 4
  8. 2026
  9. 4445
  10. 193
  1. 1Late 2023Canvas, frames, nesting, layers.
  2. 2Summer 2024Text editing, multiplayer, live cursors.
  3. 3November 2024Snapping and alignment guides.
  4. 4Autumn 2025AI editing, undo, Figma import, autolayout, components.
  5. 5Summer 2026Vectors, comments, export, share links, the streaming agent.