{{template "icon_sprite"}}

Felhom Hub

Configuration

{{if eq .Flash "assets_refreshed"}}
Assets refreshed successfully from image seed.
{{end}} {{if eq .Flash "assets_error"}}
Asset refresh failed. Check server logs for details.
{{end}} {{if eq .Flash "assets_not_configured"}}
Asset manager is not configured.
{{end}} {{if eq .Flash "floor_set"}}
Controller-version floor saved.
{{end}} {{if eq .Flash "floor_invalid"}}
Invalid version — use X.Y.Z (or blank to clear).
{{end}} {{if eq .Flash "artifacts_set"}}
Artifact manifest saved.
{{end}} {{if eq .Flash "artifact_ver_invalid"}}
Invalid artifact version — use X.Y.Z (or blank to clear).
{{end}} {{if eq .Flash "artifact_sha_invalid"}}
Couldn't set the checksum — the Gitea sha lookup failed (version missing / Gitea unreachable) or the manually-entered sha is invalid. Manifest unchanged.
{{end}} {{if eq .Flash "pw_changed"}}
Login password changed. It is already in effect — use it next time you sign in. Existing sessions stay logged in.
{{end}} {{if eq .Flash "pw_current_wrong"}}
Current password is incorrect — password unchanged.
{{end}} {{if eq .Flash "pw_too_short"}}
New password is too short (minimum 8 characters) — password unchanged.
{{end}} {{if eq .Flash "pw_too_long"}}
New password is too long (maximum 72 characters) — password unchanged.
{{end}} {{if eq .Flash "pw_mismatch"}}
New password and confirmation don't match — password unchanged.
{{end}} {{if eq .Flash "pw_unchanged"}}
New password is the same as the current one — nothing changed.
{{end}}

Managed updates — global floor

The minimum controller version every box auto-updates to (unless a per-customer override is set). Saving takes effect immediately — boxes below the floor update on their next report, no customer action. Blank = no global floor. This setting is independent of the Day-0 artifact manifest below.

Effective floor: {{if .FloorRes.Effective}}v{{.FloorRes.Effective}}{{else}}none{{end}} {{if eq .FloorRes.Source "db"}} — source: DB (hub_settings){{if .FloorRes.EnvValue}}; env fallback would be v{{.FloorRes.EnvValue}}{{end}} {{else if eq .FloorRes.Source "env"}} — source: env fallback (DEFAULT_MIN_CONTROLLER_VERSION); no DB override set {{else}} — no floor from either source {{end}}

{{.CSRFField}} DB override: {{if .FloorRes.DBValue}}v{{.FloorRes.DBValue}}{{else}}none{{end}}

Day-0 artifacts — agent & golden

The current agent binary + golden archive the host-bootstrap script fetches from Gitea and verifies (sha256) before installing. The hub vouches for these checksums (a different trust root than Gitea). Pick a version — the sha256 is read from Gitea automatically (no manual copy). Choose — none — to clear an artifact.

{{.CSRFField}} {{if .AgentChoices}} {{else}} {{end}} {{if .GoldenChoices}} {{else}} {{end}} The golden's controller CHANGELOG MinAgent:. The hub HOLDS the floor for any box whose agent is below this — blank = uncoupled release, no gating. sha256 of configs/felhom-pbs-apply (R-50b). Unlike the agent and golden this root-owned wrapper is installed from raw/branch/main — unversioned and unpinned. Recording it here does not fix the channel; it makes host drift visible: agents report the installed file's hash and a mismatch is surfaced on the host page.

Login password

The password for signing in to this hub UI. Changing it takes effect immediately for the next sign-in — your current session stays logged in. Enter your current password to confirm. If you ever lose it, the deployment ConfigMap (auth.password_hash) remains the reset path.

{{.CSRFField}}

Assets

App logos and screenshots served to controllers. Assets are seeded from the Docker image and synced to controllers daily via the asset manifest API.

Files in manifest {{.AssetCount}}
Manifest generated {{if .AssetLastSync}}{{.AssetLastSync}}{{else}}—{{end}}

Re-reads the baked-in asset seed directory and updates changed files. Controllers will pick up changes on their next daily sync or manual trigger.