Unified design foundation · kit canonical

MystFlo design foundations — one core, per-surface dialects

The single design-system file. Tabs below are variations of this one language — not separate documents. Core 1–7 stay the locked token/type/row language. Core 0 + Mark / Website / Email / Social / Motion are the Brand V3 design-system contract (2026-08-18) — agents designing now must use this kit. Production pixels roll out platform-first (shell + Pulse, then Playbook), website and email later. Per-page build mockups stay in Design HQ — those are contracts, not the system. Rules: kit design-canon.md U12/U13 · tokens: mystflo-playbook.md §3 · agent brief: design-foundations-agent-brief.md.

black & white luxurywhite/gray glows onlystatus + lantern = needs youflat hairline rowssingle-theme dark V3 design-system contract — see § Core 0
Layout tiers (BINDING, 2026-07-22): every mockup depicts mobile 375px first, then tablet ~768px (added 2026-07-22), then desktop. A surface that passes desktop but fails a smaller tier is a FAIL — there is no desktop-only pass. These three are samples of a continuum, not the only three states that exist — § Core 7 is the fluid/ stepwise contract for everything in between (U8).
§ Core — shared by every surface
Tokens, opacity ladder, type ramp, row anatomy, badges, buttons, icons, motion discipline. Identical on platform, website, and everything after. A surface that invents a color, a glow, or an alpha outside this ladder has left the language. § Core 0 is the V3 design-system contract (2026-08-18). Production apply is sequenced — do not invent a second kit. Surface visuals are the Mark / Website / Email / Social / Motion tabs in this file.
Peyton: good for now (2026-08-18). Tokens live in playbook §3; this tab is the drawing. Core 1–7 remain the locked type/row language. Email and Social tabs use these devices, they do not invent new ones. Production UI still rolls out platform-first.
The mark — this is the icon
One plant. Dotted leaf behind (your double), solid leaf in front (you), joined by the stem and the graft ring. That link is the story — do not crop it off. The same drawing is the favicon, the header icon, the app icon, and the charge inside the Seal. A single leaf is only the Thread outcome, never the logo. Always one ink, always drawn — never filled, never metallic.
MystFlo
Wordmark lockup: the Mark to the left of italic Myst + roman Flo, Georgia. Same plant at 16px as at 96px. Ink only — never lantern, never orange.
Size ladder — the same plant at every size
96 · brand
40 · header
24 · favicon
16 · local icon
The kit — every device, one family
A printer’s case, not an icon set. If a surface needs a new shape, it is wrong — reuse one of these.
Mark — the icon
The whole plant. Favicon, header, app icon, empty states. Never crop the stem.
Leaf
Outcome only — the end of the Thread. Not the logo.
Not yet
Halfway
Done
Seal — one circle, three statuses
Same ring. Empty = not started. Half-arc = running. The Mark pressed inside = done. The stem stays — that is the join.
Stem
Vertical vein. Timeline, story spine, section rule.
Node · you
Filled. Founder is present, decided, or acting.
Node · graft
Open ring. The hand-off. Not lesser — the join.
Node · double
Dotted ring. Assistant present. Same size as you.
Node · lantern
Gold fill. Needs you — one per view, never on AI.
Edge · you
Solid 2px left rule. Founder-owned ledger rows.
Edge · double
Dotted 2px left rule. Assistant-authored rows.
Thinking
Three nodes on the thread. Double is drafting.
Thread — the Continuation
Solid (you) → graft node → dotted (double) → outcome leaf. Replaces every plain divider on website, email, and social.
Thread as progress — the Seal is the head
The line fills. The circle rides it: idle at 0, half-arc at the live point, pressed at 100. Not a second progress bar. Not a lantern dot.
Where each device lives
DevicePlatformWebsiteEmailSocial
MarkHeader · favicon · app icon · emptyNav lockupMasthead + sign-offCorner crop
ThreadUnder every top-level titleUnder the hero · section rule (replaces the old curve)Rule under the headerRule under the eyebrow
SealRun status + progress head · confirm = pressedHow-it-works + footer (pressed)Colophon = pressedDone frame = pressed
NodesPulse feed · thinking · “Your call”How-it-works stepsFolio plate dotYou / hand-off / double row
StemRun detail onlyStory timeline
EdgeActive rail · playbook rowsLedger you vs double
LeafThread outcome onlyThread end onlyThread end onlyDone frame only
The Double Law
Solid = the founder
  • Anything the founder did, decided, or is doing now
  • Filled node = a human is present
  • The primary leaf, the first arch of the M, the hours they work
Dotted = their double
  • Same shape, dash 1.5 / 4.5, ~70% opacity — never a second color
  • Assistant-authored rows, auto-sent messages, overnight follow-ups
  • A dotted ring is their double — same size as a filled dot, not lesser
Lantern gold — the one product color, semantic “needs you”
Distinct from --amber (status / pending). Gold is an address, not a status. One gold moment per view. Never on AI output, never on the logo.
Aa
--lantern
#D4AF6D
on black · ~11:1 · primary action, “Your call”
Aa
--lantern-ink
#8A6B33
on white (email) · 4.6:1
--lantern-faint / --lantern-dim
12% wash · 55% caption
held-for-approval row wash
Mist Law + motion is earned
Structure is always drawn complete; mist (opacity) decides how much you see; working nodes always burn through. Hover/focus clears the veil. Decoration never moves — work does (Seal spinner, Thread progress, thinking nodes, one-shot stamp). prefers-reduced-motion holds a static fallback.
Sign-off gate: the kit above as the only drawn family · the Mark (whole plant) as the icon and favicon · Double Law as binding rule · Lantern as the product's third color (“needs you” only) · Mist Law as rendering rule · signal orange #FF4A2D stays marketing-only. Until signed, do not ship these tokens into designSystem.ts or the playbook.
Ground + text opacity ladder
Pure black ground, white text. Five opacity steps — never an arbitrary alpha outside this ladder.
Aa
--bg / --fg
#000 / #fff
page ground · primary text
Aa
--fg-70
rgba(255,255,255,.70)
secondary label, row value
Aa
--fg-55
rgba(255,255,255,.55)
action link, statusline
Aa
--fg-40
rgba(255,255,255,.40)
caption, eyebrow, muted
Aa
--fg-30
rgba(255,255,255,.30)
inline meta, footnote, sidebar eyebrow
Hairlines (borders)
--hairline-subtle
rgba(255,255,255,.06)
row dividers, list borders
--hairline
rgba(255,255,255,.10)
default border, panel/frame edge
--hairline-strong
rgba(255,255,255,.15)
hover edge, emphasis divider
Surfaces
--surface
rgba(255,255,255,.04)
base panel / .glass-surface
--surface-el
rgba(255,255,255,.06)
elevated / active nav tint
--hover
rgba(255,255,255,.08)
hover state
glow.white
rgba(255,255,255,.20–.25)
hover aura — WHITE ONLY, never colored
Status — success / warning / error vocabulary (C12, 2026-07-20)
Emerald is the platform's positive/success signal (credits, confirmation ticks, connected/healthy) — not money-only. Neutral money stays monochrome. Amber carries status + pending; red is errors only.
+$50
--emerald
#34c07c
success signal — credits, ticks, connected/healthy
--amber
#d9a23b
status dot (wallet low, pending)
--amber-badge
#eab308
PREVIEW badge, warning badge
--red
#e5484d
errors only
Status — production badge palette (designSystem.ts / index.css)
The broader badge-label system used across the platform (Pulse status, Connects health). Different hex from the C12 amber/emerald pair above — both are real, scoped to different surfaces.
colors.success
#22c55e
badge-label--active/success/connected
colors.warning
#eab308
badge-label--paused/warning/reconnect
colors.destructive
#ef4444
badge-label--error
colors.info
#3b82f6
rare — informational only, not a status
Proposed — Lantern (not a status; see § Core 0)
Awaiting sign-off. If adopted, this is the only non-status color in the product. It does not replace --amber.
--lantern
#D4AF6D
“needs you” — one moment per view
--lantern-ink
#8A6B33
same meaning, on white
Rule: every value above is a token. Two status palettes coexist by design — the C12 amber/emerald/red trio is scoped to money + success signals, the green/amber/red/blue set is the general badge-label system used everywhere else. Never introduce a third palette. Lantern, if signed off, is not a fourth status palette — it is an address.
Sans is Geist, mono is Geist Mono in-app — system fonts stand in here.
Marketing tier — platform in-app hero surfaces (designSystem.ts)
Platform values (src/styles/designSystem.ts → text-hero / text-display-xl). The WEBSITE's shipped hero is deliberately smaller — .text-hero clamp(22–48px) · lh 1.06 (one-line rule, Peyton 2026-06-17) — specified in § Website dialect below, never by this row.
Assistants that do the work
hero (platform)
clamp(40–80px) · 600
-0.035em · lh 0.98
A Brain that makes them yours
displayXL (platform)
clamp(36–72px) · 600
-0.03em · lh 1.04
Page structure
Section display
display
clamp(32–48px) · 600
-0.02em
Explore
page title (standalone page)
clamp(24–28px) · 600
-0.015em
Recent activity
subheading
clamp(18–24px) · 500
-0.01em
On-Brand Support
card title
clamp(16–18px) · 500
-0.01em
Niseko winter bookings
assistant name (summary cards, pre + post)
15px · 400
-0.025em · NOT fluid
Dense in-shell heads (billing / usage / settings)
Billing
page title (tabbed compact head)
17px · 400
Billing setup
eyebrow (global)
13px · 500 · 0.14em
Wallet balance
eyebrow (dense section head)
10.5px · 500 · 0.13em
Billing Usage
tab (active = lit 2px underline)
13px · 400/500
Body / UI
Assistants that do the work. A Brain that makes them yours.
body
16px · 400 · lh 1.6
Faithful chrome this round.
small
14px · 400
On-Brand Support run
row label
13px · 300–400
Warn me below
label
13px · 500
Explore
nav
13–14px · 300 · tracking-wide
Add funds
button
14px · 500
Never expires · refundable anytime
caption
12px · fg-40
Jul 18
meta (inline, same line as label)
11.5px · fg-30
price_per_run
code
13px · mono · 400
Money / KPI (T1124 tier lock)
The 200-weight thin focal is reserved for THE single wallet-balance number — never reused for a KPI. Usage numbers stay weight 500.
$41.20
money focal
40–44px · 200
-0.02em · tabular-nums
588 ↑ 18%
usage KPI
26px · 500 — NEVER 200
tabular-nums
Two eyebrows exist on purpose: the global 13px eyebrow (playbook / most sections) and the 10.5px dense-head eyebrow used only inside billing/usage-style tabbed pages where vertical space is tight. Same role, different scale for a denser context — don't merge them.
Live example
Top-up Jul 18+$50.00
On-Brand Support run Jul 18−$0.08
Visa ···· 4242 defaultRemove
Auto-reload offTurn on →
Measurements
List border
border-top: 1px hairline-subtle — no boxed/glass card around the group
Row padding
11px 2px
Row divider
border-bottom: 1px hairline-subtle
Row gap
gap: 12px (label ↔ value)
Label
13px · 400 · fg-70
Inline meta
11.5px · fg-30 — same line as label, never a second stacked line
Value (right)
fg-55 · tabular-nums
Action link
12.5px · fg-55 → fg emphasis — text link, not a button
Chip
10.5px · fg-40 · pill 999px · border hairline-subtle
Credit color
emerald — success signal (C12)
No per-row leading icons. Rows carry label + inline meta + right-aligned value only. If a row needs a leading icon to be understood, the row needs better copy, not an icon.
Platform badges (header)
Member Preview
Two different axes, two different colors — Member (white) is the founder's status, Preview (amber) is the platform's status. Never conflate.
Status badges (badge-label system)
● Active ● Paused ● Error
A single colored dot/tint carries severity — never a loud filled block competing with the row's real content.
Wallet pill
$41.20
border hairline · radius 999px · padding 5px 14px · 12.5px fg-70 · tabular-nums.
Chips
default off proposed
10.5px fg-40, hairline-subtle border, 999px pill — the quietest supplementary marker in the system.
Card tags (list/card supplementary row — one geometry, tonal variants only)
Cohort Booking AI Coming soon Active
height 20px · padding 0 8px · radius 6px · 10px/500 — every tag on a card shares this geometry; variants change color only, never size.
One signal, one home: a founder-status badge, a platform-status badge, a severity badge, and a supplementary tag never overlap in meaning on the same surface.
Primary button (white fill)
Add fundsdefault
Add fundshover — white aura + translateY(-1px)
Add fundsfocus — 2px ring rgba(255,255,255,.40)
Default control height is h-9 (36px) / px-3.5 — the oversized default was retired 2026-06-20. Radius 0.75rem in-app, black text on white, 13.5–14px/500. (The website dialect rounds its buttons to full pills — see § Website.)
Text action link
Removedefault — fg-55
Removehover — fg
Turn on →emphasized (next-state) variant
Row actions are always text links, never boxed buttons — a boxed button on every row reads noisy against a flat list.
Select
$10 ▾default
$10 ▾hover — hairline-strong border
$10 ▾focus — 2px ring
Checkbox
Off unchecked — hairline border box
Email checked — white fill, black check
One primary action per surface. If two buttons compete for equal visual weight, the design isn't done — everything else recedes to a text link, a select, or a chip.
CSS-glyph icon style — 15px, stroke-based, monochrome
square glyph (.ic)
round glyph (.ic-round)
panel glyph (sidebar toggle)
muted state — fg-40
active state — fg, opacity 1
Real production glyphs (lucide-react in code) render as thin 1.5px strokes at 15–16px, currentColor only — these CSS boxes stand in for that shape without an external icon font. No fills, no multi-color icon sets.
Motion discipline (shell-language #6 — one entrance)
Each surface gets ONE shared entrance stagger — tier-ordered rise (translateY 8→0, ≤240ms per element, ~80ms apart), GPU-only transforms, no ad-hoc motion. Every animation is prefers-reduced-motion guarded — the reduced-motion path kills all of it. Hover motion is limited to translateY(-1px/-2px) + aura; nothing loops decoratively.
Proposed — Mist Law + motion is earned (§ Core 0)
The structure is always drawn complete; opacity veils it at rest; hover/focus clears the veil. Working nodes stay lit. The Seal, Thread, and nodes animate only while the system is working (spinner, progress, thinking, one-shot stamp) — decoration never loops.
 
Do
  • Monochrome stroke icons, currentColor, 15–16px, 1.5px stroke
  • White/gray glows only, on hover, earned (not decorative default)
  • Emerald = success signal (C12): credits, confirmation ticks, connected/healthy
  • Flat hairline rows, border-top on the list, border-bottom per row
  • Two connection verbs only: Connect/Connected/Reconnect/Pending
  • Quiet active nav state — tint + lit 2px left-edge thread
  • Mockups at 375px + ~768px + desktop, every state drawn
Never
  • Emoji as UI icons, anywhere
  • Colored glows (blue, purple, green auras etc.)
  • Green/red used as generic "good/bad" outside status signals
  • Boxed/glass card wrapping a group of flat rows
  • Per-row leading icons in a flat list
  • Solid-white active nav pill (retired 2026-07-20)
  • "Verify / Recheck / Manage / Validate" as a button verb
  • A desktop-only pass — smaller tier fails = FAIL
Monochrome money: the only color that touches a dollar amount is emerald, and only for money coming IN (a top-up, a refund credit — a success signal per C12). Every outgoing amount, every debit, and every neutral balance figure stays monochrome — never red. Red is reserved for actual errors (a failed charge), not for "money left the wallet."
One axis, two behaviours
Content — continuous
3757681440
every width in between is deliberate — nothing snaps
Structure — only at named breakpoints
sm 640
grid/form cols
md 768
rail ↔ drawer
lg 1024
rail expands · split · col 3
same axis as the track above — 375 · 768 · 1440
Fluid ladder — clamp(floor, container-relative, ceiling)
U8 changes exactly ONE term. Floors and ceilings are the already-approved values — type from § Core 2's ramp, spacing and radius from playbook §3 — and are never re-declared here; if a number below disagrees with Core 2, Core 2 wins. What's new is the middle term: a container-relative unit (cqi, off a container-type: inline-size ancestor), never viewport vw, so a panel sizes from the space it's given rather than from the screen.
Name the reference container — the coefficient is meaningless without it
Every row reads ONE named container. Page rhythm (the focal, content padding, gaps) reads the page content column — ~343px on a 375 phone, ~1000–1140px on desktop inside the rail. Component-internal sizing reads the component's own box. Mixing them is the failure mode: a 340px card on a 1440 desktop and a 343px phone viewport are the same width and want different padding, so anything that must differ between those two cases reads the page column, never the box.
Display type — page column
clamp(32px, 5cqi, 48px) — tops out at a 960px column, so every desktop keeps today's 48px focal
Content / card padding — page column
clamp(16px, 2.5cqi, 24px)p-4p-6 read continuously, ceiling at ~960px
Grid / flex gap — page column
clamp(12px, 2.2cqi, 24px)gap-3gap-6, ceiling at the ~1100px column a real desktop actually has
Catalog grid min track — grid container
clamp(260px, 26cqi, 320px) — the grid's MINIMUM track, not the card's final width; cards still fill 1fr
Every other type row
§ Core 2 — each row already carries its floor/ceiling pair; convert in place, coefficient = 100 × ceiling ÷ the column width where it should top out
Radius — NOT fluid
0.5 / 0.75 / 1 / 1.25rem — stays the token step. Corner geometry is a brand constant like the 1px hairline and the 9999px pill; a nested sheet whose corner differs from its parent's reads sloppy, not deliberate
Do
  • Let the container's clamp() do the sizing between 375, 768, and desktop
  • Size a component from its own container (container-type: inline-size), not the viewport
  • Reserve breakpoints for real structure changes — rail↔drawer, row↔stack, a dropped grid column
Never
  • Hand-author a third fixed width for tablet instead of letting the container scale
  • Reflow or restructure at an untested width the mockup didn't draw
  • Use viewport vw for a component that lives inside a sheet, card, or split panel
  • Write a cqi coefficient without naming which container it reads
  • Scale a radius, a hairline, or a pill — corner and line geometry are constants
Unaffected: locked-scale marketing visuals (§ Website dialect) keep their own rule — one composition scales as a single frozen unit via a shared --u multiplier. U8 governs ordinary content layout, not composed graphics or diagrams.
§ Platform dialect — dark glass app
The app-only chrome: rail/shell specifics and sheet chrome. Everything else the platform does is § Core. Proposed below: the micrographic kit on Pulse (the main page), the playbook, and a few shared components. Locked 1:1 build mockups stay in Design HQ — these crops show placement, not a rebuild.
MystFlo Platform
Member Preview $41.20
Workspace
Explore
Pulse
Brain
Account
Billing
Explore
Content column — single readable column (max 660px) for money/settings surfaces; catalogs may grid.
Sidebar variant B (LOCKED 2026-07-20): grouped rail eyebrows (9.5px caps 0.16em fg-30) · active item = white text + faint .06 tint + 2px lit left-edge gradient thread. The old solid-white active pill is RETIRED. Header: 72px, far-left collapse-toggle slot, serif-italic wordmark over the tracked PLATFORM suffix, Member + Preview badges, wallet pill right, hairline-subtle bottom border. Collapsed rail icons show a hover tooltip badge (nobody guesses icons).
MystFlo
Page content stays visible behind the dim — the masthead is never covered (amendment C1).
Add funds
Never expires · refundable anytime
"Do something" → bottom sheet. Glass rgba(12,12,12,.94) + blur, 18px top radius, drag handle, one scroll surface (C11).
MystFlo
← Billing · Wallet activity
"Go somewhere" → LEFT slide-over as the real page. #0a0a0a panel, masthead stripped, its own URL + back arrow.
Tap to return
Tap-intent rule (LOCKED): do something (complete-and-dismiss task) → bottom SHEET over the dimmed content region — the header stays fully visible. Go somewhere (destination with its own URL) → LEFT slide-over as the real page with a 64px "tap to return" peek edge. Short confirm (1 message + 1–2 buttons) → small centered dialog. Mobile: everything full-width, sheets stay sheets. The sheet band is the platform-wide standard: full-width sticky glass band, full-width hairline, 44×44 ✕ at the real gutter corner, title 14px mobile / 16px desktop semibold + optional one-line subtitle. Spec: playbook §3 Modal Patterns.
MystFlo Platform
$41.20
Left 40% · page pane
Your playbook
The section in context — siblings around it, the current one lit. The surface you're already on, live and never covered.
Right 60% · work pane
Customer questions & policies
The destination content — a detail sheet, an ask-sheet, or a report. Prose measure lands natively at 60% of 1180px (≈708px), no re-cap needed.
Detail-sheet-as-split (LOCKED 2026-07-26): a detail/edit sheet renders as this 40/60 split at ≥1024px instead of a floating dialog — same geometry as every "go somewhere" destination. LEFT 40% is always the page pane (--split-page, the surface you're already on) — RIGHT 60% is always the work pane (--split-work, the destination / active content) — one axis, never mirrored per-surface. Seam: one --split-seam hairline on the page pane's right edge, --split-shadow cast rightward onto the work pane. Both panes are opaque, self-defining colors (page is the darker of the pair) — never an additive wash, which is how two different hosts once rendered the same declaration as two different greys and inverted which pane read as nearer. Chrome: no grab handle (a split can't be dragged down), panes rise flush with no radius and no reveal gap (a docked workspace, not a floating card). Below 1024px: full-screen stacked, no split.
Your assistants
Two running. One is waiting on you.
WhatsApp Support
Answers customer questions on WhatsApp, day and night.
Active
142 runs
Invoice Chaser
Drafted 3 firm-but-kind reminders. Won't send without you.
Your call
3 drafts held
Booking Concierge
Takes bookings from Instagram DMs straight into your calendar.
Active
61 runs
Proposed: no gray glass cards. Hairline-divided list on black. The Seal’s half-arc means a double is running. Lantern still means needs you. Green on the word “Active” stays — the circle is how far, not a second status color.
Every page — the Mark in the header (the whole plant). Nothing else at rest. Pulse (home) — Thread under the title · nodes on the feed · lantern on the one thing that needs you · thinking while a double drafts. Playbook — Thread as the zone rule · Edge you/double on sections · Seal when confirmed · lantern on “confirm this draft”. Empty — the full Mark, once. Done — the Seal, once.
The mark is not a watermark. If a screen is working, you see Thread, nodes, Edge — not a leaf in the corner of every card.
Home after sign-in. Feed of you vs your doubles. One gold row.
MystFlo
$41.20
This morning
Pulse
Two doubles running. One is waiting on you.
You approved a booking reply
09:12
Your double sent 14 follow-ups
09:40
Invoice Chaser — 3 drafts held. Your call.
WhatsApp Support answered 6 guests
10:02
Booking Concierge is halfway…
Same page, first-run empty. This is the only time the full Mark appears on Pulse.
MystFlo
Nothing running yet.
Hire your first double. You teach it once — it keeps the line moving.
Pulse placement: the Mark in the masthead (every page) — the whole plant, stem included. Thread under the page title — not a hairline. Feed rows use Node · you / Node · double. One lantern node, one gold wash. Thinking sits on the thread while a double drafts. Empty Pulse gets the Mark once, then never again. Green status stays on the word “Active,” not on a second colored dot.
The founder’s book. Edge tells you who wrote the row. Seal means you confirmed it.
MystFlo
Brain
Your playbook
You confirmed the voice. Your double drafted the rest.
What your assistants say for you
Voice
Sounds like you
detail →
Offers
Retreat + 1:1
detail →
FAQ
3 drafts held
confirm →
What only you see
Prices
You typed these
detail →
Competitors
Researched overnight
detail →
Opened section — 40/60 idea, kit on both panes. Left is the book. Right is the draft to confirm.
MystFlo
FAQ · draft
“Do you take last-minute bookings?”
Your double wrote this from your site. Confirm and it becomes the voice they send.

Yes — if the date is still open. I’ll send what’s left and hold it for 24 hours. After that it goes back on the list.

After confirm, this row earns the Seal.
Playbook placement: the Mark in the masthead — same plant as Pulse, stem included. Thread under the title, same as Pulse — one language. Zone labels stay eyebrows, not cards. Solid Edge + Seal = you confirmed. Dotted Edge = the double drafted. Lantern only on the confirm action. This is how the book gets beautiful without becoming a second brand.
Header lockup — every page
MystFlo
Replaces the bare wordmark. The whole Mark — stem and graft — at every size.
Active rail — Edge, not a pill
Pulse
Brain
The 2px left thread already locked on the rail IS Edge · you. Do not add a leaf per item.
Page title + Thread
Connects
Every top-level page. Replaces the hairline under H1.
Loader — Thinking
Assistant drafting. Not a spinner unless a run is live — then Seal (Motion tab).
Seal — not yet · halfway · done
Queued
Running
Done
Same circle on the assistant list and on the run Thread. Pressed once at the end. Does not loop.
Empty — Mark, once
First-run Pulse, first-run Playbook, no assistants. After that, the Mark leaves the page.
Stem — activity spine
You wrote it
Hand-off
Double sent it
Done
Assistant-run detail, not the home feed. Home uses nodes in a list.
Your call — lantern node
3 drafts held
One gold moment per view. Never on a running double. Never on the logo.
What we will not do: leaf icons on every nav item, a Thread under every row, a Seal on every success toast, gold on the wordmark, or a second illustration language inside a sheet. The kit is small on purpose. Design HQ stays the 1:1 contract — this tab is the placement map for when Peyton signs the kit off.
§ Website dialect — marketing, kit applied
Same kit as Mark, Pulse, Email, Social. Nav gets the Mark (the whole plant). The hero sits on the Thread, not the old wavy line-accent. How-it-works uses the nodes. Footer presses the Seal with the Mark inside. Type ramp, grain, and pill CTAs stay — those are the dialect, not a second drawing language.
MystFlo
Assistants Pricing Join the waitlist
On-demand business assistants
Assistants that do the work.A Brain that makes them yours.
People already book and pay you — it just lives in your head and a messy inbox. Hand the work off, job by job.
See the assistants How it works
No signup — click through it live.
Same page at 375. Mark in the nav. Thread before the CTA. No second illustration.
MystFlo
On-demand business assistants
Assistants that do the work.
Hand the work off, job by job.
See the assistants
What stays: gradient-mesh + grain, pill CTA, clamped hero type. What changes: the Mark in the nav (whole plant), Thread under the claim instead of a hairline or the old curve. Material recipe is still verbatim from globals.css — the kit sits on top of it, it does not replace it.
Skip the hiring. Get the team.
.text-hero
clamp(22–48px) · 600
-0.035em · lh 1.06
Display tier
.text-display
clamp(36–64px) · 600
-0.03em · lh 1.05
Headline tier
.text-headline
clamp(28–44px) · 600
-0.025em · lh 1.1
Section title
.text-section-title
clamp(20–32px) · 500
-0.02em · lh 1.2
Eyebrow kicker
.text-eyebrow
13px · 500 · 0.14em · white/40
Body-large runs light — weight 300, muted, lh 1.6.
.text-body-lg
clamp(16–20px) · 300 · lh 1.6
$0.08 / run
.text-mono-lg (Geist Mono)
clamp(24–40px) · 500 · tabular-nums
Dialect difference: marketing display sizes are viewport-clamped and the body register drops to weight 300 — lighter and airier than the app's 400. The type DISCIPLINE (one focal owns the display scale, siblings step down, sentence case) is § Core and unchanged.
Fine-line surfaces (restraint pass — the website's own hairline values)
The website runs FINER hairlines than the app: --hairline rgba(255,255,255,.07) (app: .10), --hairline-strong .12 (app: .15), over near-transparent fills --surface-faint .02 → hover .04. Editorial structure, not glass blocks.
.surface-hairline
bg .02 · border .07 · radius 1rem
hover
bg .04 · border .12
The Thread — replaces the old line-accent curve
Same Continuation as Pulse and email: solid (you) → graft → dotted (your double) → outcome leaf. The old sweeping curve (.line-accent) is retired — it was a second drawing language. Place the Thread under the hero and at section breaks only, never between every block.
How it works — nodes for who, Seal for how far
You teach it once
Hand-off
Your double keeps the line moving
Not yet → halfway → pressed. Same circle as Pulse. Do not invent a new loop graphic.
Footer colophon
MystFlo
Mark + wordmark on the left. Seal on the right — the same plant, pressed. Not a second logo.
Catalog badges (.badge-type — one matched geometry)
AI Auto Beta Soon WhatsApp
9px/600 caps, 3px 8px, pill — AI is the lit one (white .15 fill + 8px white glow), everything else steps down in the same geometry. App chips (.card-tag) are ported verbatim from the platform so the "apps used" row reads as the same system.
Section rhythm + motion
Rhythm: sections breathe at 72px mobile → --space-4xl 72px / --space-5xl 96px desktop; the hero owns tighter padding so eyebrow → headline → subline → CTA land inside the first viewport. Motion: hero-fade-up (0.6s, translateY 16→0) and the flow-rise entrance stagger (240ms per element, ~80ms apart, tier-ordered eyebrow → headline → subline → CTA) — the website's implementation of shell-language #6. All of it killed under prefers-reduced-motion.
Locked-scale marketing visuals (BINDING): hi-fi product mockups and infographic diagrams (.mk-* mockups, the .ce-* connect loop) are ONE locked composition that scales as a whole via container-query units — never per-element responsive reflow. Full mechanism + rationale: playbook §3 "Marketing Visuals — Locked-Scale". This is why the website never drops wires/animation on mobile — the composition carries them at every size, just smaller.
§ Social & Marketing dialect — proposed, kit applied
Same devices as the Mark tab, cropped for a thumbnail. One focal line. Black ground. The kit is the graphic — no extra illustration, no orange, no second style.
MystFlo
Hired a VA once. They ghosted.
Built MystFlo instead.
You · your double
You close at 6. Your double doesn’t.
Same voice. Overnight.
Done. Overnight.
The invoice went out while you slept.
How it actually runs
You write the reply once
Hand-off
Your double sends the next forty
Done
Carries from the core
  • The kit — Mark, Leaf, Thread, Seal, Stem, Nodes. Nothing else.
  • Black-and-white luxury — mono card, pure black ground
  • Type discipline — ONE focal per asset, sentence case
  • Voice: playbook §2 "Social" tone row — real, relatable
  • One composition, scaled whole (locked-scale)
Changes at feed scale
  • Heavier focal contrast — the thumbnail must survive a busy timeline
  • Tighter crop — less air than the site's editorial breath
  • Focal type sits LARGER relative to the frame than any app/site tier
  • Hairline detail simplifies — .06 hairlines vanish at thumbnail size
  • Never a new icon, emoji, gradient, or Title Case to “read at 1x”
Boundary: feed scale may crop and enlarge. It may not invent. Signal orange stays marketing-only and is not on these frames. When a real grid ships, these four compositions are the starting templates — not a new style.
§ Email — proposed shell, kit applied
White, quiet. The same kit as Mark, in ink. Mark lockup (the whole plant), Thread under the header, Edge on the ledger (solid = you · dotted = your double), Mark sign-off. One bronze action. Not a per-template mockup — the shell every Resend template would inherit.
On white: Lantern deepens to --lantern-ink #8A6B33 (4.6:1). The mark, Thread, Edge, and Seal stay ink — never gold. Production Resend cannot ship inline SVG (Outlook); this page is the look. Live chrome uses a hosted leaf PNG + an #e8e8e8 hairline stand-in for the Thread, and CSS left-rules for Edge.
§ Motion — proposed, earned only
Decoration never moves. Work does. The Seal is the status circle — empty, half, pressed — and the head of the progress Thread. Nodes still say who. Lantern still means needs you, never “halfway.”
Seal statuses
Not yet
Halfway · running
Done · pressed
Thread as progress — the Seal rides the line
0 — not started
Halfway — the double is on it
Done — the join, pressed. The fill is complete. No loop.
ST-01 Running
Half-arc on the same ring. The live state — not a second spinner.
ST-02 Progress
Thread fills. Seal is the head. Never a lantern dot.
ST-03 Thinking
Three nodes on the line — drafting, before a run has a percent.
ST-04 Done
Pressed once. No loop.
Law: nodes = who. Seal = how far. Lantern = needs you. Do not paint the halfway arc gold. prefers-reduced-motion holds the static frame of whatever state the run is in — never an empty spinner.