Design with your AI, in a real design app
Facet is a design app for the Mac that your AI assistant can work in. Ask Claude, ChatGPT or Cursor for a screen, a component or a change, and watch it appear on the canvas: real layers with auto layout, text styles, color variables and components, that you can keep editing by hand. Every change is one undo step, with the assistant's name on it.
What your assistant writes
Behind every request, your assistant writes a short description in Facet's build language, and Facet turns it into layers, measures them, checks them and says what did not work. You can write it too.
{
"phone": {
"name": "Today",
"children": [
{
"row": [
{
"draw": [
{"path": "M20 2v14", "stroke": "@ink", "weight": 2},
{
"circle": [20, 30, 14],
"fill": {"linear": ["@saffron", "@rose"], "angle": 160}
}
],
"size": [40, 46],
"name": "Mark"
},
{
"column": [
{"title": "Raag"},
{"deva": "आज का रियाज़", "color": "@mute"}
]
},
{"space": "fill"},
{"icon": "lucide:settings-2", "size": 22}
],
"gap": 12,
"align": "center",
"width": "fill"
},
{
"stack": [
{
"draw": [
{
"circle": [150, 150, 144],
"fill": {"radial": ["#FFFFFF00", "@rose/10%"]},
"stroke": "none"
},
{
"circle": [150, 150, 120],
"stroke": "#1A142333",
"dash": [2, 6]
},
{
"arc": [150, 150, 120, 270, 315],
"stroke": {"linear": ["@saffron", "@rose"], "angle": 45},
"weight": 14
}
],
"size": 300
},
{
"ring": [
{
"each": ["रात", "सुबह", "दोपहर", "शाम"],
"do": {"deva": "{.}", "color": "@mute"}
}
],
"r": 86
},
{
"column": [
{"deva-xl": "यमन"},
{"small": "Yaman's hour", "color": "@mute"}
],
"align": "center"
}
],
"width": "fill"
},
{
"type": "paragraph",
"width": "fill",
"runs": [
"It's evening, so Yaman. Every note is shuddha except ",
{"swara": {"note": "तीव्र म", "tone": "@rose"}},
": sing it a touch sharp, and land on ",
{"swara": "नि"},
" and ",
{"swara": "ग"},
" more than on ",
{"swara": {"note": "सा", "tone": "@mute"}},
"."
]
},
{
"row": [
{"sticker": {"label": "12 दिन लगातार", "turn": -4}},
{
"sticker": {
"label": "Tanpura in C♯",
"tone": "#E3E7FA",
"turn": 3
}
},
{"sticker": {"label": "40 min", "tone": "#F9D7DD", "turn": -2}}
],
"gap": 10,
"align": "center"
}
]
}
}

A whole phone screen in one call: a header, a dial drawn from shapes, a sentence with chips in it and tilted stickers. Everything named here (phone, swara, deva, @saffron) comes from a kit sent once per file.
Why it is short
Every key costs a model tokens and every call costs a round trip, so the language removes structure instead of abbreviating words.
source than tree --full- Say it once. Colors, type and reusable parts live in the file's kit and are named everywhere after.
- Intent, not arithmetic. Rows, columns and stacks place things;
atnames a place, an anchor or an angle. See Layout. - Read what you write. [
source](update.md) prints any layer in the language, ready to edit and send back with--sync. - Checked, not hoped for. Every write verifies what it asked for and reports what it could not do, by layer, with the fix. See Checks.