Add dashboard font selection - #487
Conversation
Implementation PlanProblem analysisThe dashboard already routes its main typography through The CSS cascade needs deliberate handling. Theme rules set One existing typography escape is directly relevant: Resolved product and technical choices
Deliverables1. Font preference lifecycle
2. First-paint restoration
3. Settings control and previews
4. Typography cascade and loading behavior
5. DocumentationDocument the three-option font behavior, per-browser persistence, clean Theme-default semantics, theme independence, preview behavior, and existing remote/self-hosted loading model consistently across all public surfaces:
Files to modify
No new files, font binaries, packages, protocol fields, or server modules are planned. Acceptance criteria
Testing approachUnit and jsdom coverage —
|
Progress UpdateImplemented browser-local dashboard font selection across state, first-paint bootstrap, UI, CSS, tests, and documentation.
Verification: Biome clean · build passes · 377 focused dashboard tests pass · full monorepo suite passes (5,969 tests) · pre-commit suite passes (5,891 tests, 717 skipped) · workspace links valid · manual Playwright verification passed at desktop and narrow viewports against the built dashboard. Commit: Progress tracked by mach6 |
|
would be cool to also include a bundled Dyslexia-friendly font! |
Implementation Plan Addendum — Bundled OpenDyslexicSuggested additionAdd OpenDyslexic as a fourth font-picker option after JetBrains Mono. It is the clearest match for the maintainer request: the family is explicitly designed around common dyslexia symptoms, is available under SIL OFL 1.1, and ships regular, bold, italic, and bold-italic WOFF2 faces. Use the unmodified upstream WOFF2 files from the official Documentation should describe OpenDyslexic as designed for readers with dyslexia, not claim guaranteed medical or readability outcomes. Deliverables1. Catalog and first-paint support
2. Bundled font facesAdd four unmodified, pinned upstream assets under
Declare matching
Do not preload the family. Vite should fingerprint and emit the four WOFF2 files only through the CSS references, and browsers should request them only after OpenDyslexic becomes active. 3. License, provenance, and publication
4. UI and documentation
Files to add
Files to modify
No server, RPC, TUI, settings-file, dependency, or theme-default changes are needed. Acceptance criteria
Testing approach
Risks and mitigations
Plan addendum created for the maintainer-requested bundled dyslexia-friendly font |
Unverified Review Candidates — Pending AssessmentReview round: 1
Scope note: the authoritative scope includes the original issue plus the maintainer-approved addendum (m-aebrer comment 2026-08-25T17:15:33Z + mach6-plan addendum 2026-08-26T13:33:24Z). The reviewed commit predates both; the addendum is not implemented. Critical1. Approved OpenDyslexic scope expansion is entirely unimplemented (confidence 99)
Important2. Theme-default font matrix lacks computed-font assertions for consumers beyond Suggestions3. The 4. Color-mode select has no accessible label; the new font row shows the correct pattern right below it (confidence 90) 5. 6. Google-hosted IBM Plex Mono stylesheet is render-blocking; unreachable CDN stalls first paint (confidence 90) 7. "Explicit font on a pristine install must not activate color-scheme" is pinned by no test (confidence 80) 8. Bootstrap script recomputes the same 9. JetBrains-woff2 request-capture boilerplate is copy-pasted three times (confidence 85) 10. Cross-tab storage guard grows a negation clause per dimension (confidence 80) Strengths
Agents run: code-reviewer, error-auditor, test-reviewer, completeness-checker, simplifier Reviewed by mach6 |
Review AssessmentIndependent verification at HEAD d4437c5 (clean tree, working tree == reviewed commit): the reviewed commit is dated 2026-08-25T14:45:24Z and strictly predates the maintainer's OpenDyslexic request (17:15:33Z) and the mach6-plan addendum (2026-08-26T13:33:24Z); the branch has no later commit, and a repo-wide grep for Classifications
Action Plan
Everything else in the PR — the complete 3-font implementation (all ten original acceptance criteria re-verified at HEAD) — is shippable once the blocker above lands. Assessment by mach6 |
Progress Update — finding 1 (approved OpenDyslexic addendum) implementedThe round-1 merge blocker is now resolved at the new head: bundled OpenDyslexic is implemented as the fourth dashboard font option, per the maintainer-approved scope expansion and the mach6-plan addendum. What landed
Glyph ground truth (not assumed): fontTools cmap analysis of the exact shipped files shows OpenDyslexic covers ● ○, all coding punctuation, and the typographic characters; ◆ ✕ ↻ are absent and fall back within the stack. That fallback path is identical to the one today's IBM themes already use, since the Google-served IBM Plex Mono slices lack those shapes too — documented in the provenance. Verification: Biome clean · Second commit (unrelated test hygiene): the pre-existing The other round-1 findings are unchanged: items 2, 6, 7 remain useful deferred follow-ups; the rest were nitpicks. Commits: Progress tracked by mach6 |
Unverified Review Candidates — Pending AssessmentReview round: 2
Scope note: authoritative scope is issue #486 + the original mach6-plan (3-font scope, 10 acceptance criteria) + the maintainer request ("would be cool to also include a bundled Dyslexia-friendly font!") + the approved mach6-plan addendum (OpenDyslexic as fourth option, 9 acceptance criteria). Round 1 reviewed CriticalNone. Important1. 2. The OpenDyslexic glyph-availability assertion is near-tautological and host-dependent (confidence 84) 3. The tui hermeticity fix has no meta-guard against future guard variables (confidence 84) Suggestions4. Font-request-capture boilerplate now ×4 (capture block in 6 places) plus a near-verbatim preview-card test clone (confidence 88) 5. Theme-default font matrix still asserts computed family only for 6. Render-blocking Google Fonts stylesheet remains (confidence 90) 7. Bootstrap allowlist checks are evaluated twice (confidence 95) 8. Cross-tab storage guard grows a negated conjunct per dimension (confidence 90) 9. 10. Color-mode select has no accessible label (confidence 90) 11. Duplicated probe-element lists and layout-force loops in the browser suite (confidence 82) Strengths
Agents run: code-reviewer, error-auditor, test-reviewer, completeness-checker, simplifier Reviewed by mach6 |
Review AssessmentIndependent verification at HEAD Classifications
Prior-round verification
Action PlanNo merge blockers. Every candidate fails at least one gate (none is both required-by-scope and materially harmful to ship), and the sole prior merge blocker is fully resolved and independently verified at HEAD. The PR is ready to merge. Deferred follow-ups (outside this PR's scope, optional): 1 (assert computed stack head), 2 (stronger glyph attribution + ◆ wording fix), 3 ( Assessment by mach6 |
Implementation Plan Addendum — Three Additional Bundled Font FamiliesRescope requested by the maintainer in this thread (2026-08-28): add Fira Code, Iosevka, and Atkinson Hyperlegible to the font picker alongside the existing four options (Theme default, IBM Plex Mono, JetBrains Mono, OpenDyslexic). The font pipeline is catalog-driven — persistence, validation, bootstrap, cross-tab sync, preview scoping, and request isolation all generalize automatically — so each family is mechanical: catalog entry, bootstrap id, Resolved product and technical choices
Acceptance criteria
Verification performedBiome clean · Plan addendum created for the maintainer-requested font rescoping |
…shboard font options
Progress Update — maintainer-requested rescope: three additional bundled fontsPer the maintainer's rescoping decision in the PR thread, Fira Code, Iosevka, and Atkinson Hyperlegible are now implemented as the 5th/6th/7th font-picker options (full plan addendum posted above). What landed
Verification: Biome clean · build emits all 11 faces into dist · focused suites green (39 unit + 245 component + 105 real-browser) · full monorepo suite green (5,902 passed, pre-commit) · workspace links valid · fontTools verification of shipped binaries (weight classes, italic flags, GSUB features, cmap coverage vs the documented claims). Commit: Progress tracked by mach6 |
Unverified Review Candidates — Pending AssessmentReview round: 3
Round-3 scope note: review was restricted to commit CriticalNone. Important1. Explicit bundled selections still contact the Google Fonts CDN in production (confidence 95) 2. Iosevka provenance claims a 3. Two public documentation surfaces omit the required hosting distinction (confidence 98) 4. New glyph-coverage assertion cannot prove glyph presence in a bundled face (confidence 100) 5. Face-state checks trust CSS descriptors rather than binary weight/style metadata (confidence 98) 6. Fira Code's required default-on ligatures are not tested (confidence 99) 7. Lazy-loading coverage permits production preloads and cross-family overfetch (confidence 97) 8. Published-package contents have no automated contract (confidence 99) Suggestions9. “Across themes” cascade behavior is sampled only on Gruvbox (confidence 90) Strengths
Agents run: code-reviewer, error-auditor, test-reviewer, completeness-checker Reviewed by mach6 |
Review AssessmentAssessed at exact HEAD Round-3 counter-pressure produced disagreement on findings 1 and 2. Under the round-3 rule, a candidate blocks only when both the independent assessor and developer's advocate find material practical impact. They agreed only on finding 3. Classifications
Prior-round verification
Action Plan
Everything else remains outside the merge-blocker action plan. Assessment by mach6 |
Progress Update — finding 3 resolvedUpdated both remaining public documentation surfaces so the seven-option font picker now clearly distinguishes Google-hosted IBM Plex Mono from the five bundled self-hosted families: JetBrains Mono, Fira Code, Iosevka, OpenDyslexic, and Atkinson Hyperlegible. Files:
Verification: full build passed · all workspace links valid · diff check clean · pre-commit suite passed (5,903 tests, 0 failures) Commit: Progress tracked by mach6 |
Unverified Review Candidates — Pending AssessmentReview round: 4
Prior-blocker verification: round-3 finding 3 is fixed. CriticalNone. Important1. Explicit bundled selections still contact Google Fonts in the production page (confidence 99) 2. The Fira Code SemiBold input SHA-256 is malformed (confidence 99) 3. Iosevka provenance claims a Suggestions4. Storage reads duplicate the same guarded validation pipeline three times (confidence 83) 5. The 6. The storage-event guard should use an owned-key allowlist (confidence 80) 7. Bootstrap theme/mode validity checks are evaluated twice (confidence 82) Strengths
Agents run: code-reviewer, error-auditor, test-reviewer, completeness-checker, simplifier Reviewed by mach6 |
Review AssessmentAssessed at exact clean HEAD Under the round-4 rule, a finding can block only when both the independent assessor and developer's advocate find material practical impact. They agreed on no candidate. Findings 2 and 3 are factual, in-scope provenance inaccuracies, but the developer's advocate found no material user, runtime, security, or release-integrity impact sufficient to block; the parent agrees after concrete trigger-and-outcome adjudication below. Classifications
Prior-round verification
Action PlanNo merge blockers. Findings 2 and 3 are worthwhile provenance corrections but fail the round-4 practical-impact consensus required for the merge-blocker action plan. Finding 1 remains a separate deferred privacy/offline improvement. Findings 4–7 are nitpicks. Assessment by mach6 |
Progress Update — font provenance correctionsResolved review findings 2 and 3:
Verification: pinned archive checksum and input digest verified · shipped Iosevka GSUB features inspected · diff check clean · full build passed · full test suite passed · workspace links valid · pre-commit suite passed (5,902 tests, 0 failures) Commit: Progress tracked by mach6 |
Closes #486
Add browser-local dashboard font selection while preserving existing theme-default typography and color-mode behavior.
Implementation plan posted as a comment below.