Skip to main content

Homepage

A self-hosted application dashboard with service widgets and cluster metrics.

Homepage is a modern, highly customizable start page that aggregates links and live status widgets from self-hosted services. It can discover Kubernetes ingresses automatically and query service APIs to show counts, queue depths, and usage stats. Self-hosting keeps your dashboard private and accessible only on your internal network.

Alternatives considered

Self Hosted

ToolOpen SourceFull FeaturesNotes
HeimdallYesYesSimple link dashboard, no live widgets
HomarrYesYesWidget-based, active development
DasherrYesYesMinimal start page

Installation

Architecture

  • Deployment: Single homepage deployment in the homepage namespace; NetBird sidecar for VPN connectivity
  • Images: ghcr.io/gethomepage/homepage:v1.12.3, netbirdio/netbird:latest (both digest-pinned)
  • RBAC: ClusterRole granting read access to namespaces, pods, nodes, ingresses, and metrics
  • Config: Multiple ConfigMaps for services.yaml, bookmarks.yaml, kubernetes.yaml, proxmox.yaml
  • Networking: HTTPRoute via internal gateway

Security

  • allowPrivilegeEscalation: false, capabilities dropped on homepage container
  • NetBird sidecar requires NET_ADMIN capability (VPN tunnel)
  • No persistent storage; stateless application

Updates

Managed by Renovate. Both images are digest-pinned.

Data Management

No persistent storage. All configuration is in ConfigMaps (version-controlled in git).

User Management

No OIDC or authentication configured. Access restricted to internal network via HTTPRoute.

Configuration Management

  • Service definitions, bookmarks, and widget config from multiple ConfigMaps
  • API keys for widgets injected as environment variables (HOMEPAGE_VAR_*) from a SOPS-encrypted secret

Administration

Usage

Access the dashboard to view all self-hosted services and their live status widgets. Widget data is pulled from Sonarr, Radarr, Lidarr, Transmission, Audiobookshelf, and Immich APIs. The Kubernetes integration shows cluster node and pod health.

Cluster-specific deviations from the above live in the per-cluster README — see k8s/apps/talos/homepage/README.md.

Cluster Deployment

Depends on

Homepage — Talos cluster

Cluster-specific notes only. General product info, "why we use it", and alternatives live in docusaurus/docs/apps/homepage.mdx.

Deviations from defaults

Defaults live in docusaurus/docs/apps/homepage.mdx — document anything this cluster does differently here, with a one-line reason.

Kubernetes Metadata
  • Image: ghcr.io/gethomepage/homepage:v1.13.2@sha256:a0b71c8e757298d02560186bab9fbe3fc2d375c523a62cc1019177b37e48aa28
  • Image: netbirdio/netbird:0.72.4@sha256:6c6c20baffae4a3ec50f29ec9361608a420625185505e8cd6f0c44d71c5d4798
Rendered manifests (kustomize build)
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kustomize.toolkit.fluxcd.io/force: enabled
labels:
app.kubernetes.io/name: homepage
name: homepage
namespace: homepage
spec:
replicas: 1
revisionHistoryLimit: 3
selector:
matchLabels:
app.kubernetes.io/name: homepage
ingress: internal
strategy:
rollingUpdate: null
type: Recreate
template:
metadata:
labels:
app.kubernetes.io/name: homepage
ingress: internal
spec:
automountServiceAccountToken: true
containers:
- env:
- name: HOMEPAGE_ALLOWED_HOSTS
value: homepage.int.kueber.eu
envFrom:
- secretRef:
name: homepage-variables
image: ghcr.io/gethomepage/homepage:v1.13.2@sha256:a0b71c8e757298d02560186bab9fbe3fc2d375c523a62cc1019177b37e48aa28
imagePullPolicy: Always
name: homepage
ports:
- containerPort: 3000
name: http
protocol: TCP
volumeMounts:
- mountPath: /app/config/
name: homepage-config
- mountPath: /app/config/logs
name: logs
dnsPolicy: ClusterFirst
enableServiceLinks: true
initContainers:
- env:
- name: NB_SETUP_KEY
valueFrom:
secretKeyRef:
key: NB_SETUP_KEY
name: homepage-netbird
image: netbirdio/netbird:0.72.4@sha256:6c6c20baffae4a3ec50f29ec9361608a420625185505e8cd6f0c44d71c5d4798
name: sidecar-netbird
restartPolicy: Always
securityContext:
allowPrivilegeEscalation: false
capabilities:
add:
- NET_ADMIN
drop:
- ALL
startupProbe:
exec:
command:
- sh
- '-c'
- netbird status | grep -q Connected
failureThreshold: 30
periodSeconds: 2
serviceAccountName: homepage
volumes:
- configMap:
name: homepage-config-g67bc874h6
name: homepage-config
- name: homepage-variables
secret:
secretName: homepage-variables
- emptyDir: {}
name: logs