← Sketches · the native app program

The design loop for native screens

c1322026-11-10

Brief, mock, experiment, refine, push, with the media that can carry each step now that there is no DOM.

Source: c132 plan.md §Candidate media, Deliverables 1–3, D1–D5, clarifying question 1 (answered 2026-11-09: both Mark and agents mock); c130 research/README.md surprises 6 and 8 (the kit's wasm build is showcase-only on nightly; Native Shell's desktop features live on main) and gpui-kit.md (134 theme roles); c131 R6 and D14; c137's inbox page (/pages/phase4/messaging-inbox) as the precedent for A.

1Brief

the page, its states and the world it runs on; the kit's design guides as the brief every mock is held to

2Mock

the screen drawn in a medium: A by a person, B by an agent

3Experiment

states and worlds: empty, minimal, typical, overflow, error

4Refine

the review stop with Mark; Illustrator from a capture if hand work is wanted (D5)

5Push

the port into c131, the story as the page's test, the record in the cycle

What carries each step for a native screen
1 · Markdown and the kit's guides

the brief in the cycle; the kit's design-guides skill installed in .claude/skills (exists)

2 · A for a person, B for an agent

A: a Vue page in a native skin on the design site, no toolchain; B: a Rust story in ../qnative/stories, one per page state

3 · The lab's worlds, or stories as tests

A: the lab's visit states and worlds; B: each state a headless test (c131 R6)

4 · Captures into one atlas

A: capture.mts against the lab URL, unchanged; B: the stories' screenshots collected into the same manifest, surface: native (D3). The native mode is planned

5 · The port and PATTERNS.md

A is transcribed into a story; B is already the page's test; the pattern recorded for the engineers (c131 D11)

The five candidate media against what matters
MediumThe real thing?Reviewable in a browser?Needs a Rust toolchain?Captures into the atlas?Verdict from the primer (2026-11-09)
A · Vue mocks in a native skina design-site theme that mirrors the kit's tokens and chromeNo: a second drawing of what the kit can draw; it can driftYes, like every lab pageNoYes, capture.mts unchangedIn, as the person's medium. c137's inbox page is the precedent: a web rendering standing in for the native app
B · A stories crate in ../qnativeone Rust story per page state, run as a headless testYes: the kit draws itNo: a CI artifact or a screenshotYes (Rust 1.95 or later; a three-minute clean build)Yes, once the native capture mode collects the screenshots (D3)In, as the agent's medium; the stories double as the tests (c131 R6). The spike could not screenshot without Screen Recording
C · The kit's wasm build in the labthe real UI in a canvas on a design-site pageYes, if it renders our screensYes, in a canvasNightly, to build itYes, unchangedWeak: “Showcase only” on nightly (surprise 6); fidelity of text input, tables and fonts unknown
D · Figma with a kit-shaped librarythe designers' tool, through the Figma MCPNoYesNoAs an input onlyAn input, not the medium: no Figma library for GPUI Kit is known and Figma → Rust has no skill (Q2)
E · Native Shell's playground / TSXTSX over a Rust core, targeting GPUI among othersNo: a second framework's renderingYes, a browser playgroundNoNoWeak: the GPUI target and the desktop features live on main only, four breaking minors in 18 days (surprise 8)
The token bridge: one source for two component systems
▤brand/design_tokens.md

the source, unchanged (D2); the layer's Tailwind tokens already come from it

a script generates
▤The Qpoint kit theme

light and dark, the kit's 134 roles from one accent, Grape; font.family “Inter Variable” and Geist Mono, bundled (c131 D14)

read by both
▭A's native skin

the same values as CSS on the design site, so the mock and the app cannot drift on colour or type

⬚B's theme file

loaded with Theme::update in ../qnative; the app and its stories share it

ours to build in c132exists today, or a criterion meta cost or a gapweak or an input only (the primer's verdict)the seam between the two component systemsplanned
The problem
The loop's tools assume a DOM: Vue to draw, Tailwind classes to transcribe, capture.mts against a URL. GPUI draws its own pixels, so native screens would be built blind in Rust or reviewed from someone else's screenshots. And one medium cannot serve: both Mark and agents will mock, at different times (ruled 2026-11-09).
The core idea
The five steps stay. The medium splits by who mocks: A for a person without a toolchain, B for an agent with one; the wasm build that would have joined them is showcase-only. Both end as a captured, reviewable artifact per page state in the same atlas, and the token bridge keeps the two drawings one brand.
What is open
Mark's pick, formally Phase 2 after the bake-off of A and B on Inventory; how B's screenshots are taken (the spike could not, without Screen Recording); the native capture mode's shape (D3); whether a kit-shaped Figma library is worth building (Q2); how the brand's one accent maps onto the kit's shadcn-shaped roles (primer Q14).

Qpoint Brand Style Guide