audited all 14 pages in /home/ubuntu/neonforge/pages/. findings:
nav HTML is duplicated in every page file -- different pages have different link sets. home.html has 9 links, fischer.html has 6, statusboard.html has 6. new pages like dolphin.html and keymap.html are missing from most navs. this is the #1 pain point.
body font-size varies: gallery.html uses 18px, most others use 16px. operator preference is 18px (per memory: "operator prefers 18px default font size in fischer3120.styles.1").
every page redefines its own styles inline. common patterns (cards, footers, status badges, nav) are copy-pasted with minor drift. no CSS file or design tokens shared across pages.
per neonForge README: "nav is defined ONCE in server.py NAV_HTML, injected at render time." but current pages all carry their own nav HTML. the server wrapping only applies to content-only pages (those without DOCTYPE). legacy full-HTML pages bypass it.
pages like afterhours.html, ecoute2-audit.html, ecoute2-mockups.html, ecoute2Mobile.html, processFlow.html, terminal.html exist but are not in the server's valid[] list. they 404 when accessed via ?p= routing.
the /agents dynamic page (renders agent cards from JSON) is not linked in nav anywhere.
| element | current | proposed |
|---|---|---|
| font family | Courier New, monospace | keep |
| body size | 16px (some pages 18px) | 18px everywhere |
| line height | 1.7 | keep |
| h1 / page title | 22px orange | 24px orange |
| h2 / section | 16-18px orange, border-bottom | 20px orange, 2px border |
| body text | #888 or #00ff41 | #888 body, #00ff41 data |
| footer | #333, 11px | keep |
| component | spec |
|---|---|
| card | bg: #111, border: 2px solid #333, radius: 6px, padding: 14px. title: #ff6600 bold. body: #888. |
| nav link | padding: 6px 10px, border: 1px solid #333, radius: 4px, font: 13px mono. hover: border #ff6600. active: bg #ff6600, text #0a0a0a. |
| status badge | inline-block, padding: 2px 8px, font: 11px uppercase, border-radius: 3px. live: green border+text. pending: orange. offline: red. |
| section header | color: #ff6600, font-size: 18px bold, border-bottom: 2px solid #333, padding-bottom: 8px. |
| footer | margin-top: 18px, text-align: center, color: #333, 11px, border-top: 1px solid #222, padding-top: 10px. format: "neonForge // {agent} // {date}" |
| info note | bg: #111, border-left: 4px solid #ff6600, padding: 14px. strong text: #ff6600. body: #888. |
update NAV_HTML in server.py with the complete link set. strip nav HTML from all existing pages. convert legacy full-HTML pages to content-only format so the server wraps them uniformly. this is the highest-impact change.
add missing pages to the valid[] list in server.py: dolphin, afterhours, ecoute2-audit, ecoute2-mockups, ecoute2Mobile, processFlow, terminal, agents (dynamic). total: 20 pages.
set body font-size to 18px in the server's MOBILE_HEAD shell. remove per-page font-size overrides. operator preference is 18px.
extract common styles (cards, badges, footers, sections, notes) into /static/fischer.css. server injects the link tag in MOBILE_HEAD. pages only define page-specific styles.
strip each page to content-only. remove duplicated nav, DOCTYPE, html/head tags. let server wrapping handle the shell. normalize card styles, section headers, footers to match style guide.
| page | in valid[] | in nav | has own nav | content-only |
|---|---|---|---|---|
| home | yes | yes | yes (legacy) | no |
| gallery | yes | yes | yes (legacy) | no |
| criticalpath | yes | yes | yes (legacy) | no |
| statusboard | yes | yes | yes (legacy) | no |
| fischer | yes | yes | yes (legacy) | no |
| brick | yes | yes | yes (legacy) | no |
| keymap | yes | yes | yes (legacy) | no |
| devicepreview | yes | yes | yes (legacy) | no |
| migration | yes | yes | yes (legacy) | no |
| dolphin | yes | no | no | yes |
| afterhours | no | no | yes | no |
| ecoute2-audit | yes | no | ? | ? |
| processFlow | no | no | ? | ? |
| terminal | no | no | ? | ? |
| agents (dynamic) | no | no | n/a | n/a |
| phase | scope | risk |
|---|---|---|
| 1. centralize nav | server.py edit + strip 14 pages | medium -- must not break existing pages |
| 2. register pages | server.py valid[] update | low |
| 3. normalize fonts | MOBILE_HEAD edit | low |
| 4. shared CSS | new file + server edit | low |
| 5. page cleanup | 14 pages to content-only | medium -- page-specific styles may break |
neonForge design brief // goulard3120 // QB #565 // 2026-05-07
awaiting operator review. reply with "execute" to begin implementation.