Skip to content
Alpha The designer is real and runs today. Persistence and publishing are not built yet — read exactly what is missing
Shipping

One of these works today.

Preview is real and you can use it now. Branches, deployments and domains have their tables, their states and their design — and no implementation. Rather than weight all four the same, the page says which is which.

Piece Tables Design Code Where it is
Preview Not needed — built in the browser Settled Runs today Shipping
Branch previews migration 0004 Settled None Planned
Deployments migration 0004 Settled None Planned
Custom domains migration 0004 Settled None Planned

Three columns rather than one word: a table that exists, a design that has been argued through and code that runs are three different distances from done, and "planned" hides all three.

Shipping

Preview

The document opens as a genuine page in a new tab: real viewport, real media queries, real scrolling, no editor chrome. There is no project loader yet, so it is built in the browser and opened as a blob rather than served from a route — which gives a true preview today with no backend behind it.

The artboard's fixed width is dropped on the way out. On the canvas a section is 1200px because it is being drawn at a chosen breakpoint; a real page is as wide as the window, and emitting the artboard width would produce a preview that is 1200px on a phone. Sections become width: 100% and the breakpoint layers are emitted as the media queries they represent.

  • The honest test of the responsive model — if the queries are wrong, it shows at the width it breaks.
  • The same serialisation the publisher will use, minus the editor's own geometry.
What preview emits the artboard width is dropped
section  width: 1200px  →  width: 100%

at.tablet { w: 380 }
  →  @media (max-width: 834px) { … }

at.phone  { x: 24, w: 342 }
  →  @media (max-width: 390px) { … }
The honest test of the responsive model. If a query is wrong, it shows at the width it breaks — in a real tab, not in a simulator.
01Designed, not written

The three that are not built.

The schema for all three landed in the first week, which is why the shapes below are specific. None of it runs.

01 Branch previews Planned

Every branch gets a hostname before it merges, so a change can be sent as a link rather than described in a message. The preview host is null until the first build gives it one — a branch that has never built has no URL to hand out, and inventing a placeholder that 404s is worse than an empty field.

02 Deployments Planned

A deployment stores an immutable copy of what shipped. Without that, "what does the live site look like" is only answerable by whatever the pages happen to say now — which changes the moment somebody opens the designer. A deployment that cannot reproduce itself is not a deployment, it is a timestamp.

The commit reference is nullable, because a deploy can be triggered from the designer with no version control behind it at all. Build duration is generated rather than written by the app: two callers computing "how long did it take" is two chances to disagree.

03 Custom domains Planned

Point DNS, wait for the certificate, promote to primary. Hostnames carry a check that permits only lowercase, so a plain unique index is already case-insensitive in effect — the alternative was a case-insensitive column type that resolves to nothing under the default search path and fails a migration that is otherwise correct.

Adding a domain planned · none of this runs
  1. Point DNS at the deployment

    A record or a CNAME, depending on whether it is an apex. The hostname is stored lowercase — a check permits nothing else, so a plain unique index is already case-insensitive in effect.

  2. Wait for the certificate

    The domain sits in a pending state with its own row rather than a flag, so the failure case has somewhere to record why.

  3. Promote to primary

    One primary per project, everything else redirects to it. Two primaries is two canonical URLs, which is a decision nobody makes on purpose.

The lowercase check replaced a case-insensitive column type that resolves to nothing under the default search path — and fails a migration that is otherwise correct.

Build now. Ship when it ships.

The designer does not wait on any of this, and what you build comes out as markup and a stylesheet you can take anywhere.

Deployed with Astro and Comlumen