This file tracks ideas explicitly rated good or better that are still active, plus a short record of ideas that have already landed so the backlog stays current.
implemented (was really good)- Public Exposure Control Plane (Blog + Temporary Shares)
- Delivered as
apps/exposure-control+infrastructure/public-edge. controlpanel.khzaw.devnow handles temporary public shares, expiry, Access-by-default, audit history, disable-all, and the permanent-public blog path.
implemented (was really good)- Capacity-Aware Resource Advisor v2
- Delivered and surpassed as the current phased resource-advisor flow.
- Node-fit simulation, advisory posture, live preflight, weekly apply PRs, and cockpit integration are already in place.
implemented in lean form (was good)- Self-Service Ops Portal / Lean Ops Command Center
controlpanel.khzaw.devis now the combined operator cockpit for exposure control, Transmission routing, travel readiness, image/chart updates, and tuning.- Remaining gap: generic restart/reconcile/runbook actions are still backlog rather than done.
implemented (was good)- Prometheus Persistent Storage
- Prometheus now persists TSDB on
local-pathwithretention: 14d,retentionSize: 8GB, andwalCompression: true.
really good- Jellyfin-Aware Load Shedding
- This replaces the older, vaguer
Media-Aware Dynamic Throttlingidea with one concrete plan. - Goal: detect real Jellyfin playback/transcode pressure, temporarily shed lower-priority primary-node work, and restore automatically once playback is back to idle.
- Reuse what already exists:
apps/exposure-controlalready owns runtime write actions, audit logging, and the operator UI.apps/transmission/transmission-vpn-control.yamlalready shows the right GitOps-safe pattern for runtime-owned overlays.- Glance already uses Jellyfin's
SessionsAPI, so session-based detection fits the current repo. - Prometheus already has primary-node pressure signals through
homelab:node_host_cpu_utilization:ratioandhomelab:node_host_memory_utilization:ratio.
- Implementation plan:
- Define the policy surface first.
- Add a dedicated config file under
apps/exposure-control/for thresholds, cooldowns, priorities, and per-service actions. - Start with only workloads that materially affect the primary node:
transmission,sabnzbd, andbazarr. - Keep Pi-hosted apps out of phase 1 unless they are shown to create meaningful downstream churn on the primary node.
- Treat
sonarrandradarras hard-tier optional targets, not first-pass ones.
- Add runtime-safe control surfaces for the target services.
- Mirror the existing Transmission control model: Git-managed control ConfigMap plus runtime-owned state ConfigMap, consumed by optional
valuesFromoverlays in each target HelmRelease. - Keep the control loop out of direct
kubectl scalepatches on Flux-managed workloads so GitOps does not fight the runtime controller. - Use the overlays only for reversible actions such as
replicas: 0or other chart-native pause/downscale toggles.
- Detect real media pressure instead of guessing.
- Poll Jellyfin's cluster-local
Sessionsendpoint with a dedicated API key and classify:- active streams,
- active transcodes,
- paused vs playing sessions.
- Query Prometheus for primary-node host CPU and memory utilization so one light session does not trigger unnecessary shedding.
- Compute four states with hysteresis:
idle,observe,soft-shed, andhard-shed. - Enter shed only after sustained pressure; restore only after sustained idle/low-pressure cooldown.
- Actuate in small, policy-driven steps.
soft-shed: pause or scale downtransmissionandsabnzbd.hard-shed: additionally pause or scale downbazarr, then optionallysonarrandradarrif the soft tier is insufficient.- Avoid actions that restart Jellyfin itself or churn stateful infrastructure.
- Add manual override states in the cockpit such as
auto,forced-off, andhold-currentto avoid surprise behavior during debugging.
- Make the control loop observable.
- Extend the cockpit with a load-shedding panel that shows current mode, why it entered that mode, which workloads are currently shed, and when restore is expected.
- Append every transition to the existing audit log.
- Export Prometheus metrics for active streams, active transcodes, current shed level, action counts, and last transition time.
- Add focused alerts only after the loop is stable, for example "stuck in hard-shed too long" or "detection failing while Jellyfin is active".
- Roll it out in phases instead of flipping straight to automation.
- Phase 0: advisory-only mode in the cockpit with no write actions.
- Phase 1: enable only the
soft-shedtier fortransmissionandsabnzbd. - Phase 2: add
bazarrif the first tier materially improves Jellyfin headroom. - Phase 3: decide whether
sonarr/radarrare worth touching based on real operating data rather than intuition.
- Expected implementation touch points:
apps/exposure-control/server.jsapps/exposure-control/app.jsapps/exposure-control/index.htmlapps/exposure-control/helmrelease.yamlapps/exposure-control/rbac.yaml- new service control ConfigMaps plus
valuesFromruntime overlays in the target app HelmReleases - monitoring objects for metrics and alerts once the loop is real
really good- Away Mode / Quiet Hours Control Plane
- Travel Center already exists, but there is still no expiring "away" or "quiet hours" posture change.
- Build on the current control panel actions: disable all temporary public shares, switch Transmission to a safer default mode, and optionally pause selected background workloads with auto-restore.
good- Operator Cockpit Safe Actions Expansion
- The operator cockpit foundation already exists.
- Remaining scope: safe restart, Flux reconcile, and guided diagnostics actions with audit trail and tight RBAC.
good- BookOrbit Library Import Hardening
- After the BookOrbit replacement settles, audit scan behavior, metadata extraction, OPDS use, and first-user setup.
- Keep BookOrbit pointed read-only at the shared Calibre library without duplicating book files or adding avoidable database overhead.
good- ARM Node Utilization (Remaining Headroom Work)
- This is no longer a greenfield idea:
autobrr,prowlarr,jackett,flaresolverr,profilarr,glance, anduptime-kumaare already on the utility node. - Remaining candidates worth auditing for the Pi are
bazarr,sabnzbd, and possiblytransmissiononce image, storage, and throughput tradeoffs are verified.
good- Monitoring Completion: Remaining Rules + Notification Delivery
- Some alerting has landed already, especially around DNS reliability and exposure-control.
- Remaining work is to finish the missing PrometheusRules for homelab-specific failure modes and wire a real delivery path.
- Current blocker:
alertmanageris still disabled, so existing alerts are mostly dashboard-visible rather than operator-delivered.
good- Public Edge IaC / Smoke-Check Polish
- Exposure control, blog public routing, metrics, and basic monitoring are in place.
- Remaining gaps:
- move more of the Cloudflare Access/WAF/cache policy into reproducible IaC,
- add scheduled smoke checks for the share-toggle flow and the permanent-public blog path.
really good- Unified Static Sites Origin (Multi-Host, One Runtime)
- Consolidate
blog+mmcal(and future static sites) onto a single lightweightstatic-sitesapp behind the existing Cloudflare Tunnel route model. - Serve multiple hostnames from one runtime using host-based vhosts/docroots (
/srv/sites/<hostname>), while keeping existingpublic-edgeCNAME + tunnel patterns. - Avoid "all sites roll together" risk by adding per-site release tooling:
- each site builds/publishes its own static artifact (OCI/image),
- GitOps stores one pinned version per site,
- a fetch/reload component updates only the changed site content and hot-reloads the static server.
- Result: lower baseline resource usage and faster onboarding of new static sites, without sacrificing independent site rollback/deploy control.
- Items marked as not needed or not for now are intentionally excluded from this list.