The file is the truth
One canonical text format. Printing a parsed document returns the bytes you started with, so diffs are real diffs and two replicas at the same version agree exactly.
Agent-native graphics
A node-graph design tool with one command bus, a text format that round-trips exactly, and an agent that has no powers you don't.
The studio
Canvas, layers, graph and code are four projections of the same typed node graph. Select in one and it lights up in all of them — people, agents and plugins edit the exact same thing.
1lumina 1.0
2doc @d_root01 {
3 tokens @tk_brand {
4 accent: p3(0.88 0.32 0.18)
5 ink: #1a1a1e
6 space: scale(4 8 16 24 40 64)
7 }
8 artboard "Hero" @ab_hero w:1440
9 frame "Content" layout:(mode:flex
10 gap:24 padding:[64]) {
11 text "Headline" @tx_head
12 weight:700 size:64 fill:$ink
13 shape.rect "Rule" fill:$accent
14 fx:[fx.shadow blur:12]
15 image "Product shot"
16 fx:[ai.remove_bg]
17 }
18 }
19}
Built on engines you already trust
Create
Start from one of 900+ templates, backgrounds and graphics — or describe what you need and let the agent compose it. Every layer, effect and word stays editable.








.lum file you can edit.Foundations
One canonical text format. Printing a parsed document returns the bytes you started with, so diffs are real diffs and two replicas at the same version agree exactly.
Every mutation crosses the same bus: validated, capability-checked, invariant-checked. There is no side door for the UI, for plugins, or for the agent.
Tools are thin veneers over that bus. An agent gets the scopes a human ticked on a consent screen, and pixels only when someone grants them.
Four projections
Start in a canvas that feels like the tools you know. The graph builds itself underneath — open it when you want the power, read it as code when you want the precision.
artboard "Hero" @ab_hero w:1280 h:720 fill:$paper {
frame "Content" layout:(mode:flex gap:24 padding:[96]) {
text "Headline" @tx_head weight:700 size:72
fill:$ink "Design at the speed of thought"
shape.rect "Rule" w:220 h:6 fill:$accent
text "Sub" size:20 fill:$muted "The node-graph editor…"
frame "Actions" layout:(mode:flex direction:row gap:16) {
component.instance of:@btn_primary
}
}
}
Agents
The agent is a peer on the command bus — the same tools, the same rules, every edit attributed and undoable. You decide how far it reaches.
agent/tighten-hero → main · 4 commands · 18 s
frame "Content" layout:(mode:flex
- gap:18 padding:[57 64]) {
+ gap:24 padding:[64]) {
- text "Headline" size:66 fill:#1b1a1f
+ text "Headline" size:64 letterSpacing:-0.02 fill:$ink
- shape.rect "Rule" w:220 h:6 fill:#e2542f
+ shape.rect "Rule" w:220 h:6 fill:$accent
text "Sub" size:20 fill:$muted
Describe it in a sentence. The agent writes the design itself, then checks its own work.
.lum — not a template re-skin.@agent in a comment and it answers in the thread.Four real branches, each rendered headlessly and scored on lint, composition and brand fit.
The platform
Everything is a node — so everything is editable, diffable, undoable and scriptable.
Remove backgrounds, segment, upscale and estimate depth on your own GPU — as re-runnable nodes, not destructive filters — with every model licence-audited for commercial use. Rather not download one? Signed in, background removal and picture reading can run in our cloud instead (processed, not kept). Set “This device only” and no picture ever leaves yours.
A CRDT document that works offline and merges cleanly. Presence, comments anchored to nodes, follow mode — and tag @agent in a comment to hand it a task.
Every finding carries its own fix as an executable command patch. “Fix all” converges.
Colour, type and spacing tokens that every layer references — and every linter, agent and pipeline respects.
Flex and grid on a real layout engine, expression constraints, and breakpoints that are sizes of one design — Mobile, Tablet, Desktop — each remembering its own tweaks.
Keyframe any number or colour, scrub it on the canvas, export GIF or MP4.
Figma components become definitions and styles become tokens; PSD layers, masks and blend modes come across as nodes. Export every page as one PDF, or a zip of PNGs or SVGs.
Filter history by actor — “everything the agent did yesterday” is one click.
15 official plugins — QR codes, charts, schedules, tickets, scripture, photo grids, magic resize, bulk create and more — plus 5 built-in skills. Record a macro once and your agent can run it as a skill. Plugins are sandboxed, with declared capabilities.
Developers
The same engine runs in a browser tab and in Node. Point any MCP client at the bridge and your agent reads, edits, lints, renders and exports documents — under the scopes a person approved.
lumina.* console is the client the agent uses. Save a script as a skill.$ claude mcp add --transport http lumina https://<your-bridge>/mcp
✓ Connected · 45 tools
› tighten the hero and fix what the linter finds
pair_start → approve KXWD-7Q3M in the studio
✓ granted doc.read doc.edit lint.run (branch.merge withheld)
• doc.read outline · 14 nodes
• lint.run 5 findings
• edit.dsl @tx_head letterSpacing:-0.02
• doc.apply 4 commands on agent/tighten-hero
✓ lint.run 0 findings · design PR ready for review
lumina 1.0
doc "Launch" @d_launch {
tokens @tk_brand {
accent: #b8380c
ink: #16161a
type: scale(14 16 20 28 40 72)
}
page "Site" {
artboard "Hero" w:1280 h:720 fill:$paper {
text "Headline" weight:700 size:72 fill:$ink
"Design at the speed of thought"
}
}
}
// The console is the same client the agent uses.
const heads = lumina.query("text[name~=Headline]")
await lumina.transact(
heads.map((id) => ({ op: "node.set", id, props: { weight: 700 } })),
"bolder headlines",
)
const findings = await lumina.lint()
return findings.map((f) => f.rule)
name: Design CI
on:
pull_request:
paths: ["**/*.lum"]
jobs:
design:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: pnpm install --frozen-lockfile
- run: pnpm --filter @lumina/design-ci build
# canonical diff · lint delta · brand verdict · renders
- run: node tools/design-ci/dist/main.mjs
--base origin/main --out design-ci-out
Design CI
The linter's findings carry their own fixes as executable command patches. Run them in the editor, or run them in a pipeline against a pull request — same bus, same result.
.lum in the pull requestEngine
Skia in a render worker, a tiled compositor, and one contract: interaction never waits for evaluation.
Enterprise
The same policy gate runs in the studio, headless, and in CI. Identity follows your directory, every action is attributable, and your model traffic can run on your own keys.
Architecture
A DOM-free core with dependencies that only point down — enforced in CI. The same engine renders in a browser worker, in Node for your pipelines, and in the MCP bridge for your agents.
Pricing
The editor and every on-device model run on your hardware, so they are free forever. Pay for the cloud, the agent and the governance.
For individuals and local work
$0forever
Open the studioFor designers who work with agents
$16per month
Start with ProFor design teams and their agents
$28per seat / month
Start with TeamFor organisations with policy to enforce
Customannual
Talk to usUpgrade from inside the studio — pay by card or PayPal, or with mobile money (MTN MoMo, Orange Money). Agent credits renew every month.
FAQ
Yes. The full editor, unlimited local documents and every on-device model are free forever — they run on your machine, so they cost us nothing to give you. Paid plans add more agent credits, unlimited shared documents and team governance.
Flyers, posters, social posts, banners, lower thirds, A4 prints, UI mock-ups and web pages. Start from 900+ templates, backgrounds and graphics, or from a blank page in the size you choose — flyer, social, screen or paper, in pixels, millimetres or inches — and let the agent compose it from a brief if you like.
Not by default. Documents live in your browser's private storage and sync only when you share them. The agent's model receives the document's structural text, not pixels, unless you switch on “Let the model see the canvas”. Image AI runs on your device when it has the model; if you are signed in and have not downloaded it, Automatic mode runs background removal and picture reading on our servers — processed, not kept. Choose “This device only” and no picture is ever sent anywhere.
.lum file?The canonical text form of a Lumina document. Printing a parsed file returns exactly the bytes you started with, so version control, code review and diffs work the way they do for code — and node types a reader does not know round-trip untouched.
Through a device code that a person approves in the studio. Approval can narrow the scopes an agent asked for, never widen them, and sensitive scopes such as merging or pixel access start unticked.
Background removal (ormbg), segmentation (SlimSAM), upscaling (Swin2SR), depth estimation (Depth-Anything-V2-Small) and picture reading (Florence-2), through Transformers.js on WebGPU with a WebAssembly fallback. Each is a one-time download of 40–340 MB, and only after you say yes. Every on-device model is audited for commercial use — MIT, Apache-2.0 or BSD only.
Yes, in your phone's browser. The studio shows one panel at a time with a bottom bar — Canvas, Layers, Agent, Design, Graphics, More — and signed in, image AI can run in the cloud so there is no model to download over mobile data.
Yes. Figma files import over the REST API with components as definitions and styles as tokens; PSD files bring layers, groups, masks and blend modes across as nodes. Export to PNG, SVG, PDF, animated GIF or MP4.
The core runs as static files. The optional services — sync relay, accounts, AI proxy, marketplace and the MCP bridge — are Workers and a Node container you can deploy in your own cloud account.
Runs in the browser with no server. Opens in a terminal over MCP. Same document, same rules, either way.