Homepage Service Entry Manager
Add services running on Proxmox to the Homepage dashboard (LXC 103).
Arguments
Expects: <CTID> <service-name>
Example: /homepage-add 117 CommaFeed
If no arguments provided, ask the user for the container ID and service name.
Discovery Commands
Get Container IP
ssh proxmox "pct exec <CTID> -- ip -4 addr show eth0" 2>/dev/null | grep inet | awk '{print $2}' | cut -d/ -f1
Get Listening Ports
# Find non-system ports (excludes 22, 25, 111, etc) ssh proxmox "pct exec <CTID> -- ss -tlnp" 2>/dev/null
Look for ports that are likely the service (typically 8000-9999 range, or well-known app ports).
Verify Service is Running
ssh proxmox "pct exec <CTID> -- systemctl list-units --type=service --state=running" 2>/dev/null | grep -v systemd
Homepage Config Location
Homepage runs on LXC 103. Config file:
/opt/homepage/config/services.yaml
Entry Format
Add entries under the appropriate section (Infrastructure, Documents & Books, Utilities, Media).
Basic entry (no widget):
- ServiceName:
icon: service-name.png
href: http://<IP>:<PORT>
description: Short description
proxmoxNode: pve
proxmoxType: lxc
proxmoxVMID: <CTID>
Icon Names
Homepage uses Dashboard Icons. Common patterns:
- •Use lowercase with hyphens:
service-name.png - •Check https://github.com/walkxcode/dashboard-icons for available icons
- •Common icons:
jellyfin.png,radarr.png,sonarr.png,adguard-home.png
Workflow
- •Get CTID and service name from arguments or ask user
- •Discover IP:
ssh proxmox "pct exec <CTID> -- ip -4 addr show eth0"and extract IP - •Discover port:
ssh proxmox "pct exec <CTID> -- ss -tlnp"and identify service port - •If multiple non-system ports, ask user which one
- •Read current config:
ssh proxmox "pct exec 103 -- cat /opt/homepage/config/services.yaml" - •Ask user which section to add to (Utilities is default for most services)
- •Add the entry to the config (see Card Ordering section for placement)
- •Write back: pipe content to
ssh proxmox "pct exec 103 -- tee /opt/homepage/config/services.yaml > /dev/null" - •Verify:
ssh proxmox "pct exec 103 -- grep -A6 <ServiceName> /opt/homepage/config/services.yaml" - •Tell user to refresh Homepage
Existing Sections
From the current config (ordered by card height):
- •Infrastructure (Proxmox, Unifi, Synology)
- •Documents & Books (Paperless, Calibre-web | BookLore, Calibre, Brother) - 2 columns
- •Utilities (Syncthing, AdGuard, Caddy, UptimeKuma, Home Assistant, FreshRSS | Tailscale, N8N)
- •Media (JellySeerr, Radarr, Sonarr, Prowlarr, SABnzbd, Jellyfin)
The | indicates where widget cards end and no-widget cards begin.
Card Ordering (Minimize Whitespace)
Cards with widgets are taller than cards without. Homepage uses row-based layout, so mixing heights creates whitespace gaps.
Rule: Group cards by height within each section.
- •Cards WITH widgets go first (tall cards together)
- •Cards WITHOUT widgets go at the end (short cards together)
Example for Utilities (8 items, 3 columns):
- •Row 1: Syncthing, AdGuard, Caddy (all have widgets)
- •Row 2: UptimeKuma, Home Assistant, FreshRSS (all have widgets)
- •Row 3: Tailscale, N8N (both no widget, same height)
When adding a new service:
- •If it has a widget, insert it after the last widget card (before the no-widget cards)
- •If it has no widget, append it at the end of the section
Notes
- •Homepage auto-reloads config changes (no restart needed)
- •VMs use
proxmoxVMIDwithoutproxmoxType - •LXC containers need both
proxmoxVMIDandproxmoxType: lxc