Replicant v0.6.0 — the Factory web UI
A visual identity release. Nothing in the emitted telemetry moves: no new techniques, no CEF changes, no CLI changes. Upgrading matters only if you use the web UI.
The web UI is the Factory system, and dark-only
The UI now follows a "terminal war room at midnight" design system, implemented from three approved mocks that went through a builder/three-critic loop. The design contract is docs/webui-factory-design.md.
- Fonts: Geist 400/500 and JetBrains Mono 400, both OFL 1.1, self-hosted with license texts beside the woff2 files (they ship inside the wheel). The mocks specified Switzer, but the ITF Free Font License v2.0 prohibits distributing the font through a repository or publicly accessible server, which is exactly what this repo and its releases are, so it was replaced before anything was committed.
- Palette: #101010 canvas, warm graphite surfaces, hairline borders, and exactly two chromatic colors reserved for live data: signal orange and metric green. Weight 400 everywhere. No gradients, shadows, or glows. A test asserts every documented palette token encodes exactly the hex named beside it.
- Light mode is removed. The Factory system is dark-only; the toggle, stored preference, and pre-paint script go with it.
- The run panel is a war-room frame: metric tiles derived from the run's own counters, an instrumented sparkline with a labeled scale, dotted mean, and time axis, and a progress track. The mock's bytes tile deliberately does not ship: the stream carries no byte counter, and a readout that cannot be measured must not render. Labels say emitted, never sent or delivered, where only rendering is measured.
- Honesty carried into color: "sent, unconfirmed" renders neutral rather than colored, active filter chips recess instead of taking the signal color, and emphasis inside log lines is brightness only.
- A generated near-black circuit backdrop (18 KB WebP, provenance in NOTICE) sits behind the canvas under a flat scrim; cards are opaque, so text contrast is unchanged.
Fixed
- Stock tailwind-merge classified the type-scale rungs as text color classes and silently deleted the font size whenever a real color followed in the same
cn()call; elements then inherited their parent's size (the vendor segmented control rendered 16px against a class list saying 12px).cn()now registers the rungs, and a test pins every rung the config declares. - The Logs tab's info level styled itself with a token that does not exist, so its color was inherited by accident.
Verified
952 Python + 142 frontend tests, black/ruff/mypy/tsc clean, a contrast-and-size audit on the rendered page (zero AA failures across 277 text elements), no horizontal overflow at 1280 or 375, and a live run watched end to end through the new frame. The wheel attached here was built from a clean checkout of this tag and smoke-tested outside the repository.