Files
homepage/services.json
T
senior d84002da33 Replace project sections with live Services list
- Add services.json: hand-maintained source of truth with 20 public
  homelab services across 7 categories (edge, observability, media,
  downloads, ethereum, ai, dev), each with name/url/desc/icon.
- Rewrite index.html: Services section rendered client-side from
  services.json with a tiny up/down status probe (green dot = up,
  grey = down/unreachable; graceful fallback on CORS/offline).
  Keep a small Projects section linking the GitHub orgs so the old
  content is not lost.
- Add services grid + status dot styles to styles.css.
- Dockerfile: COPY services.json into the nginx html root.
2026-07-28 18:58:26 +00:00

73 lines
3.7 KiB
JSON

{
"categories": [
{
"name": "edge",
"label": "Edge & proxy",
"icon": "🌐",
"services": [
{ "name": "Traefik", "url": "https://ffaerber.duckdns.org/dashboard/", "desc": "Reverse proxy and edge router for the whole homelab.", "icon": "🛡️" }
]
},
{
"name": "observability",
"label": "Observability",
"icon": "📊",
"services": [
{ "name": "Grafana", "url": "https://grafana.ffaerber.duckdns.org", "desc": "Dashboards for metrics, logs and system health.", "icon": "📈" },
{ "name": "Prometheus", "url": "https://prometheus.ffaerber.duckdns.org", "desc": "Metrics collection and alerting.", "icon": "🔥" }
]
},
{
"name": "media",
"label": "Media",
"icon": "🎬",
"services": [
{ "name": "Jellyfin", "url": "https://jellyfin.ffaerber.duckdns.org", "desc": "Self-hosted movies, shows and music.", "icon": "🎞️" },
{ "name": "Immich", "url": "https://immich.ffaerber.duckdns.org", "desc": "Self-hosted photo and video library.", "icon": "📸" },
{ "name": "ComfyUI", "url": "https://comfyui.ffaerber.duckdns.org", "desc": "Node-based image generation UI on the GPU.", "icon": "🎨" }
]
},
{
"name": "downloads",
"label": "Downloads & files",
"icon": "💾",
"services": [
{ "name": "qBittorrent", "url": "https://bittorrent.ffaerber.duckdns.org", "desc": "Torrent downloads over VPN.", "icon": "🧲" },
{ "name": "Filebrowser", "url": "https://files.ffaerber.duckdns.org", "desc": "Web file browser for the homelab storage.", "icon": "📁" }
]
},
{
"name": "ethereum",
"label": "Ethereum",
"icon": " Ξ",
"services": [
{ "name": "Mainnet Geth", "url": "https://mainnet.ffaerber.duckdns.org", "desc": "Ethereum mainnet execution client (RPC).", "icon": "⛓️" },
{ "name": "Mainnet Beacon", "url": "https://beacon.ffaerber.duckdns.org", "desc": "Lighthouse consensus / beacon node.", "icon": "🗼" },
{ "name": "Staking Tracker", "url": "https://staking.ffaerber.duckdns.org", "desc": "Daily validator rewards and tax reports.", "icon": "💰" },
{ "name": "Gnosis Nethermind", "url": "https://gnosis.ffaerber.duckdns.org", "desc": "Gnosis Chain execution client (RPC).", "icon": "⛓️" },
{ "name": "Bee", "url": "https://bee.ffaerber.duckdns.org", "desc": "Ethereum Swarm node — decentralized storage API.", "icon": "🐝" },
{ "name": "Bee Dashboard", "url": "https://bee-dashboard.ffaerber.duckdns.org", "desc": "Web UI for the Swarm Bee node.", "icon": "🎛️" },
{ "name": "t4t Provider", "url": "https://t4t-provider.ffaerber.duckdns.org", "desc": "Truth-for-Truth data provider node.", "icon": "🔍" }
]
},
{
"name": "ai",
"label": "AI & speech",
"icon": "🤖",
"services": [
{ "name": "Whisper", "url": "https://whisper.ffaerber.duckdns.org", "desc": "Self-hosted speech-to-text on the GPU.", "icon": "👂" },
{ "name": "Kokoro", "url": "https://kokoro.ffaerber.duckdns.org", "desc": "Self-hosted text-to-speech, 49 voices.", "icon": "🗣️" },
{ "name": "Ollama", "url": "https://ollama.ffaerber.duckdns.org", "desc": "Local LLM serving on the GPU.", "icon": "🦙" },
{ "name": "Open WebUI", "url": "https://chat.ffaerber.duckdns.org", "desc": "Chat UI for Ollama models.", "icon": "💬" }
]
},
{
"name": "dev",
"label": "Dev platform",
"icon": "🛠️",
"services": [
{ "name": "Gitea", "url": "https://git.ffaerber.duckdns.org", "desc": "Self-hosted Git and CI for all ffaerber repos.", "icon": "🔧" }
]
}
]
}