Files
esh-pfi-infrastructure/stacks/homepage/conf/settings.yaml
T
vh b271db1f44 feat(homepage): rebuild the theme on canonical Australis tokens
The predecessor theme was ugly for two structural reasons, not one.

It did not use the design system's colours. It built a parallel OKLCH
palette "derived from the Australis philosophy" and swapped the canonical
typeface for Supreme -- a fork, not a theme. Every hex here is now copied
verbatim from ~/.claude/skills/australis-design/colors_and_type.css, and
build.py re-checks all 19 against that file at build time and warns on
drift so it cannot quietly fork again. Type is the canonical stack: Space
Grotesk / Inter / JetBrains Mono, vendored as latin-subset VARIABLE woff2
(one file per family, 102 KB total against 56 KB for three static Supreme
cuts, and no Google Fonts request at page load).

It also carried a generated full-bleed aurora image behind the entire
dashboard. Canon forbids exactly that -- "solid fills only on chrome, no
full-bleed photography, no decorative gradients", and the aurora motif
"never as a background fill behind text". The predecessor knew, said so in
its own header, and dialled the opacity down rather than dropping it. The
image is gone; the aurora survives as a 1px accent edge under the tab bar,
which is where canon sanctions it. The asset stays in images/ in case it
is ever revisited.

Direction is instrument panel. Group headings become the Australis mono
eyebrow with a hairline to the right edge -- canon calls the eyebrow a
system signature, and it turns the groups into register bands instead of
headings floating over a grid. Status stops shouting: the filled emerald
chips read louder than the service names they annotated, so they are now a
semantic dot plus a mono micro-label at tertiary contrast. Cards are
bordered and opaque, per canon's border-over-shadow rule for chrome.

Alignment, per operator feedback that pills and cards did not line up:

- The status cluster is centred on the service name's line rather than
  parked in the card's top-right corner, where Homepage's `absolute top-0`
  left it floating ~7px above the title's optical centre. The offsets
  reconstruct the title line box and are documented as moving together.
- Descriptions get a two-line minimum, so the common one-line/two-line mix
  bottom-aligns across a row. This is what made the grid look ragged.
  useEqualHeights stays false: it inflated short cards to match a widget
  card twice their height, which was the worse failure.
- The status dot is flex-centred rather than nudged with vertical-align,
  so it stays centred if the type scale changes.

Retires the Skyfall sources and the Supreme faces; theme/ now has one
source of truth.
2026-08-19 09:14:13 -07:00

207 lines
7.1 KiB
YAML

---
# https://gethomepage.dev/latest/configs/settings
title: ... all my base ...
theme: dark
# `color:` only accepts Homepage's built-in Tailwind ramps, and none of them is
# the Australis Sea ramp. slate is the nearest cool neutral and acts as the
# base under conf/custom.css, which is where the real palette lives.
color: slate
# NO `background:` BLOCK — DELIBERATE, DO NOT RE-ADD WITHOUT ASKING.
#
# This carried a generated full-bleed aurora image (Arbo job 13f0891f4e42,
# seed 26, flux2-klein-9b) at opacity 30. It went in on an explicit request
# for an Arbo-generated background and came out on 2026-08-19 when the
# operator called the result ugly.
#
# The image was also against canon on its own terms: Australis says "solid
# fills only on chrome — no full-bleed photography, no decorative gradients",
# and permits the aurora motif "never as a background fill behind text". A
# whole dashboard is text. The predecessor knew and dialled the opacity down
# instead of dropping it, which is how you end up with a quiet version of the
# wrong thing. The asset is still in `images/` if this is ever revisited.
#
# The aurora now appears exactly where canon sanctions it: a 1px accent edge
# under the tab bar, in conf/custom.css.
headerStyle: boxedWidgets
providers:
openweathermap: openweathermapapikey
weatherapi: weatherapiapikey
quicklaunch:
searchDescriptions: true
hideInternetSearch: true
showSearchSuggestions: true
hideVisitURL: true
showStats: false
statusStyle: ""
# Cards size to their own content. This was `true` to stop widget-bearing
# cards (Uptime Kuma's stat strip, Paperless's counts) standing taller than
# plain link cards and leaving the grid ragged — but the cure was worse than
# the disease: every short card in the row inflated into a hollow box to match
# the tall one. A ragged bottom edge reads as content; a stretched empty card
# reads as a rendering fault.
useEqualHeights: false
# Function-first layout, four-tab split:
# Main - daily-use apps, media, bookmarks, monitoring
# AI - the inference fleet, grouped by role (see below)
# Infrastructure - hardware, hypervisors, BMCs (per site)
# Toolchain - backend services running but rarely clicked
#
# The AI tab splits the fleet by function so a 20+ service list reads as
# sorted groups instead of one endless column. Group membership is set by
# the homepage.group=AI - <role> label on each service's compose file:
# AI - Inference LLM seats you call (gen, char-rp, char-rp-reasoning, summarizer)
# AI - Eval & Retrieval judges, reward, rerank, embed, image-quality
# AI - Gateways & Chat routing gateway, control plane, chat frontends
# AI - Speech (TTS) text-to-speech engines
# AI - Audio Tools speech-to-text + audio dataset tooling
# AI - Image & Media image/video generation + pipelines
# AI - Dormant stopped stacks (rollback seats, retired auditions)
#
# AI TAB ORDER IS BY CLICKABILITY, NOT BY IMPORTANCE (operator, 2026-08-18).
# Groups render in the order they appear in this block, so the top of the tab
# is prime real estate and it should hold the things you actually open in a
# browser — chat frontends, ComfyUI, the control plane. Most of the model
# seats below them are vLLM API endpoints whose href is a `/docs` page: they
# are worth SEEING (status at a glance) but not worth reaching for, so they
# sink. Order is therefore:
# interactive UIs -> mixed -> API-only seats -> dormant
# If you add an AI group, place it by asking "would I click this?", not by
# how central the service is to the fleet.
#
# COLUMN COUNTS ARE NOT A STYLE CHOICE — they are the member count.
# `columns: N` lays the group out N-per-row and leaves the remainder of the
# last row as dead space. A 1-member group at columns:4 renders one card and
# three empty cells, which is what made this dashboard look ragged before
# 2026-08-18. Rule: set columns to the member count, or to the divisor that
# leaves the smallest remainder. Re-check when a group gains or loses a
# service — `GET /api/services` prints the live per-group counts.
#
# EVERY GROUP NEEDS A `tab:` — including bookmark groups. A group with no tab
# assignment renders on ALL FOUR TABS. That is how UltraSeedbox ended up
# repeated at the bottom of every tab (fixed 2026-08-18); it is Homepage
# behaviour, not a bug, and it will happen again to the next group added
# without a tab.
layout:
Notes:
icon: mdi-note-text-outline
tab: Main
style: row
columns: 1
News:
icon: mdi-rss
tab: Main
style: row
columns: 2
Monitoring:
icon: mdi-chart-line
tab: Main
style: row
columns: 4
Apps:
icon: mdi-apps
tab: Main
style: row
columns: 4
# 2 wide, not 3 — Plex and Jellyfin carry stat-block widgets that get
# squeezed to unreadable at 4-across, and 4 members / 3 columns orphaned
# Jellyfin onto a row of its own.
Media:
icon: mdi-play-box-multiple
tab: Main
style: row
columns: 2
Games:
icon: mdi-gamepad-square
tab: Main
style: row
columns: 1
# Bookmarks. Listed here for the tab pin above all else — without it this
# group appears on every tab. `style: row` also turns the eight entries
# from full-width stacked bars into a compact grid.
UltraSeedbox:
icon: mdi-download-network
tab: Main
style: row
columns: 4
# --- AI tab: ordered interactive -> API-only -> dormant (see note above) ---
# Things you open: chat frontends, the control plane, the LiteLLM UI.
AI - Gateways & Chat:
icon: mdi-router-network
tab: AI
style: row
columns: 4
# ComfyUI is a full node editor and Arbo has a real UI — both get clicked.
AI - Image & Media:
icon: mdi-image-multiple
tab: AI
style: row
columns: 2
# Mixed: YT Voice Clipper has an audition console, Parakeet is an API.
AI - Audio Tools:
icon: mdi-waveform
tab: AI
style: row
columns: 2
# Below here: model seats whose href is a vLLM `/docs` page. Status at a
# glance is the whole value; you consume these through the gateway, not by
# clicking them.
AI - Inference:
icon: mdi-brain
tab: AI
style: row
columns: 4
AI - Eval & Retrieval:
icon: mdi-scale-balance
tab: AI
style: row
columns: 5
AI - Speech (TTS):
icon: mdi-account-voice
tab: AI
style: row
columns: 4
# Stopped stacks kept for rollback / superseded seats / retired auditions.
# They stay 'created' (not running) via `docker compose up --no-start`, so
# they show here as offline cards and revive with `docker compose start`.
AI - Dormant:
icon: mdi-sleep
tab: AI
style: row
columns: 4
Infra - ANA:
icon: si-proxmox
tab: Infrastructure
style: row
columns: 4
Infra - NH3:
icon: si-proxmox
tab: Infrastructure
style: row
columns: 3
Infra - IRV:
icon: mdi-brain
tab: Infrastructure
style: row
columns: 2
Infra - ESH:
icon: si-proxmox
tab: Infrastructure
style: row
columns: 4
Service Networking:
icon: mdi-transit-connection-variant
tab: Toolchain
style: row
columns: 4
Toolchain:
icon: mdi-toolbox
tab: Toolchain
style: row
columns: 4