# Felhom Hub — Changelog ## v0.30.1 — status badge no-wrap (2026-07-02) Found in the authenticated D4 validation pass: multi-word status tags (PENDING in a narrow dashboard column, NO REPORT on hosts) wrapped between the CSS dot and the label. One line: `white-space: nowrap` on `.status-badge`. ## v0.30.0 — TASK-D4: design system v2 re-skin (appearance only) (2026-07-02) Last surface of the design sprint (controller D0/D1, website D3). The hub leaves its Tailwind-slate theme for the canonical navy v2 language. **API surface untouched** (`/api/*` ingestion, artifact manifest, config generation, DR/escrow — `git diff` clean under internal/api + internal/store). - **Fonts (`internal/web/static/fonts/`, embed.go, server.go):** the 4 vendored woff2 (byte-copied from felhom-controller; latin-ext for Hungarian customer names in an English UI), embedded and served at `/static/fonts/` (font/woff2, immutable), mirroring the chart.min.js pattern. No CDN before or after. - **`statusColor` semantic remap (server.go):** returns `nominal/warn/crit/neutral` class tokens instead of raw hex colors — ok→nominal, warn+stale→warn, down+fail→crit, pending+disabled→neutral (a not-yet-provisioned or deliberately paused customer is a normal fleet state), blocked→warn (intentional operator cut-off: attention-worthy, not an outage). The inline `style="color: {{statusColor}}"` pattern is dead (dashboard + customer_unified use class-based `.status-dot-`); `statusIcon` ("●") retired. Truth-table test red-proven vs the old implementation; new template-parse test (neither existed for the hub). - **style.css v2:** navy tokens + @font-face; 2px radius; hairline `--line-soft` table rows (fleet-NOC density kept); `.status-badge` re-expressed as an outline tag + CSS dot per the design-system addendum (ok=blue, warn/blocked/stale=amber+dim, down/fail=red+dim, pending/disabled=quiet neutral with hollow dot); severity badges stay filled amber/red (exceptions stay loud); config badges = filled informational chips in v2; row tint only for warn/down. Two-tone brand H1 (`Felhom Hub`) on all pages; 12-symbol Lucide sprite partial included per page. - **Charts (app_detail):** avg memory `#2EA8F5`, peak `#8E7CE8` (secondary DATA series — not status red), catalog-limit line `#E0A93E` (threshold marker); legend/tick/grid → v2 literals. - customer_unified JS status-message colors → blue-bright/crit; login page inline HTML retinted. - Grep gate: all slate hexes (`#0f172a #1e293b #334155 #60a5fa #4ade80 #facc15 #f87171 #94a3b8 #64748b #475569 #e2e8f0`) at zero across internal/web (non-test). ## v0.29.0 — Day-0 artifact manifest: version dropdowns + auto-derived sha (2026-07-01) Removes the hand-copied sha256 from the Day-0 artifact manifest. The operator now **picks a version** from a dropdown of what's actually in Gitea (olders get pruned), and the hub **reads that version's sha256 from Gitea itself** — no transcription, no stale checksums. Keeps the human-in-the-loop trust gate (the operator still deliberately chooses the version; "latest" is never auto-promoted) while the hub stays the checksum trust root. - **`internal/gitea`** (new): a minimal read-only Gitea packages client — `ListVersions` (generic package versions, newest-semver first) + `FileSHA256` (a version's file sha256 via the files-metadata API, **without downloading** the artifact — important for the ~GB golden). Basic-auth with the registry creds the hub already holds. Unit-tested against an httptest server (filter+sort, preferred file match + fallback, non-200 → error). - **Configuration → Day-0 artifacts:** the two version text inputs are now `