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

What is real, and what is not yet.

Comlumen is a designer that works and a publishing pipeline that does not exist. Everywhere else on this site, unbuilt work is named rather than described — this is the page that says exactly where the line is, feature by feature.

10 shipping 3 partly built 7 planned 20 tracked items in total
Shipping
10

Work in the app today. Open it and use it.

Partly built
3

Real in the tab, not yet real on a server.

Planned
7

Decided and designed. No code written.

Known gaps
4

Problems, listed as problems, before you find them.

The designer

The half of the product that exists. Open /designer and every one of these responds.

Shipping

Two modes over one document

The canvas and the code pane are two views of one reducer. Dragging a box and typing left: 40px reach the same action, so neither view is an export of the other. Markup commits on Apply — half-typed markup is invalid markup, and parsing per keystroke would churn the tree through garbage states and destroy the selection on every character. The stylesheet applies live, because a browser simply ignores a bad declaration.

Read more
Shipping

The section spine

A page is an ordered stack of sections. Vertical is flow: insert one and everything below moves down. Within a section, children are placed to the pixel. A section top is derived from the heights above it and never stored, which is why reordering cannot leave a gap.

Read more
Shipping

Direct manipulation

Eight resize handles, an 8px snap, and pointer capture so a drag that leaves the window keeps tracking. Every session computes from the total delta rather than accumulating per-move deltas, which is what stops the box drifting away from the cursor when snapping is on.

Shipping

Flow containers

A container whose resolved display is flex or grid lays out its own children — they render in flow, with no absolute coordinates and no handles that would write numbers nothing reads. This is what makes a preset survive a change of breakpoint instead of sprawling outside the section it belongs to.

Shipping

Four breakpoints, cascading down

Desktop 1200 is the base; Laptop, Tablet and Phone are layers that apply at their own width and below. Layers store only the fields you changed, so a later desktop edit still reaches every width that has not pinned that specific field. Overridden fields are marked in the inspector, so the blast radius is visible before the edit.

Read more
Shipping

Classes and one stylesheet

Every element carries a class list, and the stylesheet that gives those classes meaning is one panel away. It is per project rather than per page, because a class that exists on one page is an inline style with extra steps. The Theme panel lists any class used in the document that has no rule yet.

Shipping

Seven presets

Navbar, two heroes, feature grid, call to action, pricing and footer, each carrying its own namespaced CSS. Copied by value on insert, so editing one you placed changes only yours and a future release cannot alter a page you already built.

Shipping

Baselumen components, live

The suite component library renders into a panel and imports into the document. Previews are iframed so a component stylesheet written for a whole page cannot leak into the editor chrome, and imported nodes stay in flow rather than being assigned coordinates their own CSS never asked for.

Read more
Shipping

Keyboard and clipboard

One declarative table drives both the handler and the shortcuts sheet, so a binding cannot exist undocumented. Copy writes to memory and to the system clipboard as tagged JSON, so a section can be pasted into a second tab; pasted trees are re-keyed, so pasting into the document it came from adds a copy rather than overwriting the original.

Shipping

Preview

The document opens as a real page in a real tab — real viewport, real media queries, no editor chrome. The artboard width is dropped and the breakpoint layers are emitted as the media queries they represent, which is also the honest test of whether the responsive model is right.

Read more

Partly built

Real in the tab, not yet real on a server. Each line says which half is missing.

In progress

The block library

Saving a section to a library and placing it on another page works, and placement goes through the same path as a paste. The store is a module-level array, so blocks last as long as the tab. public.blocks and public.block_placements exist and are not wired; when the loader lands, only blockstore.ts changes.

In progress

Assets

Dropping an image works, it is placed at its true aspect ratio, and it can be picked again from the inspector. Values are data URIs rather than object URLs, because these get written into the document and serialised — an object URL would produce markup carrying a reference that is already dead. No storage bucket is connected, so a 4MB hero is 4MB of document.

In progress

Document persistence

The designer edits an in-memory document and the schema it would be written to is complete — projects, pages, sections, revisions, with sections as rows and their contents as JSONB shaped to match the editor model. There is no project loader, so work does not survive closing the tab. This is the single biggest gap and the next thing to be built.

Next

Decided and designed. No code yet — these are named here rather than described in the present tense anywhere else.

Planned

Publishing

Snapshot-to-CDN for custom domains, with previews rendered live from the database. A deployment stores an immutable copy of what shipped, because "what does the live site look like" cannot be answered by whatever the pages happen to say now — that changes the moment somebody opens the designer.

Read more
Planned

Branch previews

Every branch gets a hostname before it merges, so a client can be sent a link to the change rather than a description of it.

Read more
Planned

Custom domains

Point DNS, wait for the certificate, promote to primary. The domains table and its verification states exist in migration 0004.

Read more
Planned

Members and roles

The tenant is a workspace rather than a person — every durable object already hangs off workspace_id, and the members table and RLS helpers are in migration 0001. What is missing is the invitation flow and the permission checks in front of it.

Planned

Agent access

A programmatic surface onto the same reducer the canvas and the code pane use. Because every gesture is already one action through one dispatcher, this is a wiring job rather than a second product — which is precisely why the reducer was built that way first.

Read more
Planned

An MCP server

The workspace exposed as tools to an external client: list projects, read a page, place a section, apply a stylesheet, open a preview. Every edit arrives as an ordinary action, so it lands in undo history beside the ones a person made and can be reverted the same way.

Read more
Planned

Billing

There is no checkout and no plan grants anything. The pricing page carries a banner saying so, and it comes down on the same commit that makes it untrue.

Read more
01Known gaps

Four things that will bother you.

Written down before they are found. A problem you discover on your own reads as a defect; the same problem disclosed in advance reads as a boundary.

01

The document stylesheet is not scoped

A project’s CSS is injected as authored — not prefixed, not rewritten — because the user is writing the stylesheet their site will ship and rewriting their selectors would mean what they see is not what they get. The cost is real: a bare `p { color: red }` also reaches the editor’s own chrome. Every element of the shell carries a `.cml-*` class to limit the blast radius. The real fix is to move the artboard into an iframe, which also buys a correct viewport for breakpoints.

02

The designer refuses to run under 1100px

Rather than reflowing into a layout where a drag lands on the wrong element. A design tool that is subtly inaccurate about where you clicked is worse than one that says it needs more room.

03

The support form is not connected

It says so on the form. Email reaches the same place in the meantime.

04

Link previews have no image

The only brand art in the repo is SVG, and several link unfurlers silently drop an SVG og:image and render the card with no art. Emitting a tag that is ignored is worse than emitting none, so the tag is absent until a raster card is drawn.

02Not up for revision

The parts that will not move.

A roadmap only means something read against the things that are fixed. These four constrain every feature above.

01

Neither editor is a preview

The moment the canvas becomes authoritative and the code is generated out of it, the code pane is an export pretending to be an editor. Every feature has to work through the one reducer or it does not ship.

02

The model owns layout; CSS owns paint

Anything deciding where a child sits lives in the node’s own style, because the canvas asks the model whether a container lays out its own children. Stylesheets keep colour, type, borders and radii. This was learned by shipping it the other way round.

03

Copied by value, never live-bound

Presets and blocks are copied on placement. A live binding means editing a library block silently changes every site that placed it, including a client’s published homepage. Placements are recorded so the product can offer an explicit re-sync, which is the safe version of the same power.

04

Nothing invented is displayed unmarked

The dashboard renders its real empty state rather than sample rows, and the pricing page says its numbers are placeholders. A screen that shows convincing fiction is worse than one that shows nothing.

The designer is the part that works.

Everything above is about the half that is not finished. The half that is takes no account and no card — open it and move something.

Deployed with Astro and Comlumen