Replaces the previous theme attempt, which was built on a misread: the ask was to use Arbo as an IMAGE-GEN ENGINE for the background, with the operator's Australis Skyfall design system supplying the palette. theme/ holds the source — colors/layout/typography vendored verbatim from the Skyfall handoff bundle, Supreme 400/500/700 woff2, the Homepage bindings in skyfall.css.in, and build.py which inlines fonts + tokens into conf/custom.css. custom.css is GENERATED; edit the .in file and rebuild. The build exists because Homepage serves only custom.css and custom.js out of its config dir, so a @font-face pointing at a vendored woff2 would 404 — the face has to arrive as a data: URI. The background image takes the other route: /app/public/images is a real static route, so compose.yaml now mounts images/ there read-only and settings.yaml points at /images/. Bindings map Skyfall's semantic layer onto Homepage's DOM: Sea surfaces, the depth recipe (hairline AND two-layer shadow, never one alone), uppercase eyebrow group headers, the sanctioned accent-rail on the active tab rather than a glow, and semantic status colour so a green pill means the service is actually serving. Background generated by Arbo (irv-ml1:8201) workflow t2i-ui-background, job 13f0891f4e42, seed 26, flux2-klein-9b, 2048x1152 — abstract, no subject, cool-temperature aurora. 1.6 MB PNG -> 22 KB WebP. Two deviations are documented rather than hidden: Skyfall forbids imagery behind body text (held at opacity 30 as mitigation), and service icons stay full-colour vendor logos. NOT DEPLOYED — live still runs the old theme. Prototype on :5199.
209 lines
7.0 KiB
YAML
209 lines
7.0 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 Skyfall 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
|
|
|
|
# Background — generated locally, not stock art. Arbo (irv-ml1:8201) rendered
|
|
# it from the `t2i-ui-background` workflow: abstract full-bleed, no subject,
|
|
# aurora blue->cyan->green on near-black, which is the one decorative motif
|
|
# Australis Skyfall permits and its "cool temperature always" imagery rule.
|
|
# Job 13f0891f4e42, seed 26, flux2-klein-9b, 2048x1152.
|
|
#
|
|
# Served from /app/public/images via the read-only mount in compose.yaml —
|
|
# NOT from the config dir, which Homepage will not serve static files out of.
|
|
#
|
|
# ⚠️ opacity is the load-bearing number, not decoration. Skyfall's rule is that
|
|
# the aurora motif never sits behind body text; this dashboard breaks that on
|
|
# purpose, so the image has to stay far enough back that card contrast never
|
|
# suffers. The render is considerably brighter than the "mostly empty" brief,
|
|
# which is exactly what this dials out. Raise it and the cards start fighting
|
|
# the ribbon.
|
|
background:
|
|
image: /images/skyfall-aurora.webp
|
|
blur: sm
|
|
saturate: 90
|
|
brightness: 90
|
|
opacity: 30
|
|
headerStyle: boxedWidgets
|
|
|
|
providers:
|
|
openweathermap: openweathermapapikey
|
|
weatherapi: weatherapiapikey
|
|
|
|
quicklaunch:
|
|
searchDescriptions: true
|
|
hideInternetSearch: true
|
|
showSearchSuggestions: true
|
|
hideVisitURL: true
|
|
|
|
showStats: false
|
|
statusStyle: ""
|
|
|
|
# Force all cards in a row to match the tallest card's height. Without
|
|
# this, widget-bearing cards (Plex stats, Traefik metrics) stand taller
|
|
# than plain link cards and the grid looks ragged.
|
|
useEqualHeights: true
|
|
|
|
# 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
|