Milo BRAND + INTERFACE SYSTEM V1.0
23Interface system

Patterns

Components are parts. A pattern is what they do together when something happens. Ten flows, each running live on the real components, with the language from 21 and the motion from 10.

10 FLOWS · LIVECOMPONENTS: 09LANGUAGE: 21 · MOTION: 10
Index23.00

What happens, in order.

Every flow reads the same way: the trigger, what moves, how long, what Milo says. Press Play to watch it at real speed; open Spec for the step table.

  1. 01Empty → first item
  2. 02Task → Run → Artifact
  3. 03Ask → Allow → Running
  4. 04Error → Recover
  5. 05Undo
  6. 06Pause / Resume
  7. 07Voice ↔ Quick Entry
  8. 08Summarized → tucked → revealed → expanded
  9. 09Vermilion entering Moss
  10. 10Theme + reduced motion
Flow 0123.01

Empty → first item

An empty surface is calm, not apologetic. Quick Entry is the shortest route in; the first row arrives with emerge.

idle
Today · empty

Nothing here. Suspiciously peaceful.

Spec
TriggerWhat movesDuration · easingCopyComponents
Surface loads with no tasksNothing. The statement holds the space.Nothing here. Suspiciously peaceful..empty (display serif)
⌘KQuick Entry appears at Level 3fast · enterWhat do you intend?.quick-entry
Quick Entry dismisses; row emerges from where it will livefast · exit → slow · enterOn it. “…” is now a task..rows .row · .toast.by-milo
Row landsState glyph settles to queuedbase · standardQueued.state-queued
Flow 0223.02

Task → Run → Artifact

The row is the origin. A run drops out of it, steps complete in place, the artifact emerges, and the row folds back with a result.

idle
Tasks · one row
Recut the Day 4 opener to the founder track◇ Daily Breadest. 3 min
Queued
  1. Load founder track
  2. Align title cards
  3. Render 1080p proof

local · James MacBook Pro

Spec
TriggerWhat movesDuration · easingCopyComponents
StartRow state queued → running; glyph pulsesbase · standardOn it..state-active
Run opensRun detail expands from the row (height + opacity)base · standard (expand).disclosure[open] .run-detail
Each stepGlyph ○ → ● → ✓; the left rule lights on the active stepbase · standardstep names, durations in mono.steps li.on / .done
Last step doneArtifact emerges below the stepsslow · enter (emerge)filename + path.artifact
CompleteRow folds back; state done; toastfast · exit (collapse)Done. Three files changed..state-done · .toast
Flow 0323.03

Ask → Allow → Running

Milo asks before spend, before writing outside the project, before anything destructive. The ask is Level 3, one line long, and names the cost.

idle
Milo · conversation
YOU

Do the same for Days 5 to 12.

Spec
TriggerWhat movesDuration · easingCopyComponents
Milo reaches a gated actionMilo turn appearsslow · enterThis needs your approval..turn.milo
AskPermission surface rises at Level 3, vermilion left edge; focus moves to itfast · enterRun ffmpeg on 8 files? Where · Executor · Cost.permission (level 3)
Allow onceAsk dismisses; row appears runningfast · exit → base · standardAllowed once. Running locally..row.is-active · .toast
DenyAsk dismisses; nothing else changesfast · exitLeft as it was.

Spend authorisation and destructive actions use .confirmation at Level 4 with a scrim; the flow is the same with one more step of friction.

Flow 0423.04

Error → Recover

An error says what stayed unchanged. Recovery is one control, in place. Nothing turns red except the state.

idle
Tasks · one row
  • Publish FAM print proof◇ FAM⌁ Cloudflare
    Running
Spec
TriggerWhat movesDuration · easingCopyComponents
Executor failsState running → failed (✕ + label); Retry appears in the trailbase · standardThat didn't work. Here's what stayed unchanged: nothing was published..state-error · .btn-s
RetryState → running; message clearsbase · standardTrying again..state-active
SuccessState → donebase · standardDone. Proof is live..state-done

Colour is never the only signal: the glyph changes (● → ✕ → ✓) and the label changes with it.

Flow 0523.05

Undo

Completing or deferring never confirms first. It happens, a toast offers Undo for five seconds, and undo puts the row back exactly where it was.

idle
Tasks · two rows
  • Reply to the FAM print proof◇ FAM15 min
    Queued
  • Approve Euangelion render batch 7◇ Euangelion
    Needs you
Spec
TriggerWhat movesDuration · easingCopyComponents
Not now / completeRow collapses out of the listfast · exit (collapse).row
ImmediatelyToast rises with Undo; five-second windowfast · enterMoved to tomorrow. / Done..toast + Undo
UndoRow emerges in its original position; toast dismissesslow · enter (emerge)Back where it was..row.emerge-in
Window endsToast dismisses; history keeps the actionfast · exitActivity
Flow 0623.06

Pause / Resume

Pausing loses nothing. The state says Paused with its own glyph, the control flips to Resume, and progress holds where it stopped.

idle
Tasks · running row
  • Render Euangelion batch 8◇ Euangelion3 of 12 · 2m 14s
    Running
Spec
TriggerWhat movesDuration · easingCopyComponents
PauseState ● Running → ‖ Paused; progress bar holds; button reads Resumebase · standardPaused. Nothing lost..state-paused · .progress
ResumeState → Running; bar continues from the same pointbase · standardResumed..state-active

Implemented by [data-pause-task] in site.js: it toggles classes and copy; production wires the same contract to the run engine.

Flow 0723.07

Voice ↔ Quick Entry

Same intent, two doors. Voice is the pill at the top; Quick Entry is ⌘K. Both end in the same row, with the same words.

idle
Two entrances

Voice

⌥ Space

Keyboard

⌘K

Spec
TriggerWhat movesDuration · easingCopyComponents
⌥ SpacePill appears top-centre (scale 0.96 → 1)fast · enter (voice-appear)Listening.voice-pill[data-state=listening]
Speech endsRing dashes and rotates; then dot pulsesbase · standard (voice-resolve)Understanding → Working[data-state=understanding|working]
DoneCheck; holds 900ms; dismissesfast · exit (voice-dismiss)Done.[data-state=done]
⌘KQuick Entry rises at Level 3; ↩ creates; esc closesfast · enter / exitOn it. “…” is now a task..quick-entry
EitherSame row emerges in Todayslow · enter (emerge)identical row text.row
Flow 0823.08

Summarized → tucked → revealed → expanded

Today shows one statement and two rows. "3 more" is tucked. Reveal it; then expand one row into its run. Four levels, one surface, nothing hidden for good.

idle
Today · the ladder

What matters now

Cut the Daily Bread Day 4 opener.

  • Reply to the FAM print proof◇ FAM
    Queued
  • Approve Euangelion render batch 7◇ Euangelion
    Needs you
3 more today
tucked
  • Order archival cream stock◇ FAM
    Idle
  • Render Euangelion batch 8run 2 · step 1 of 3
    Running
    1. Load plates4s
    2. Render 12 frames2m 14s
    3. Assemble proof
  • Write the Thursday note◇ Personal
    Idle
Spec
LevelWhat is visibleTriggerDuration · easingComponents
SummarizedOne statement, the primary action, two rowssurface loads.today-statement · .row
Tucked"3 more today" with the word tucked.disclosure > summary
RevealedThe three rows, in place, below the twoclick / ↩ on the summarybase · standard (expand).disclosure[open]
ExpandedOne row's run: steps, executor, artifactsclick / ↩ on the rowbase · standard (expand).run-detail .steps

The same ladder structures this documentation: each section is a statement, a summary line, and a tucked spec. Information appears because it is relevant, not because it exists.

Flow 0923.09

Vermilion entering Moss

Offline is healthy on its own, in Moss. When Milo starts acting inside it, Vermilion enters the field: a presence line, a ◉ beside the machine, a running state. When Milo stops, the Moss remains.

idle
Fleet · the relationship
James MacBook Pro
M4 Pro · 48 GB · local
Connectedidle
iMac Pro
Xeon W · 64 GB
Connectedidle
wkgd-macbook
Omarchy · T2
Unreachable
Spec
TriggerWhat movesDuration · easingCopyComponents
Milo starts a run on a machinePresence line emerges inside the Moss field with a vermilion left edge; the machine's glyph gains ◉slow · enter (emerge)◉ Milo is rendering … on ….offline-field .milo-presence · .machine.has-milo
WorkingCount advances; load reads in monobase · standard3 of 12.mono-micro
Milo finishesPresence collapses; ◉ leaves; the field stays Mossfast · exit (collapse)Done. Finished in 2m 14s..toast.by-milo

Vermilion is never used to mean "healthy" and Moss is never used to mean "Milo". Each colour keeps its owner; the flow is the two meeting.

Flow 1023.10

Theme + reduced motion

Dark is a second token set, not an inversion: colours crossfade, imagery remaps to Nous, Vermilion lifts for contrast. Under reduced motion the same surface changes without moving.

idle
One surface · two themes
  • Reprint the series art◇ Euangelion
    Running
Earthrise: National Park recipe in light, Nous in dark

This browser: checking…

Spec
TriggerWhat movesDuration · easingCopyComponents
DarkSemantic tokens switch on [data-theme=dark]; background and text crossfade; image swaps to the Nous derivativeslow · standard (theme-switch)tokens/milo.css · .theme-scope
LightReverse; image returns to National Parkslow · standard
Reduced motionAll --dur-* collapse to ≤120ms; ambient off; dither draws its final frame; state pulses stop@media (prefers-reduced-motion) in tokens/milo.css

The site-wide toggle in the top bar stores one choice (light / dark / system) that every page and every screen follows; this stage is scoped so the page around it does not change.