Files
senior 19bc3cf991 Address @qa review on PR #12 (issue #11)
- index.html: replace Image() probe with fetch(no-cors) + AbortController
  timeout. fetch resolves for any network response (incl. 4xx/5xx) so
  resolve -> 'up', reject/timeout -> 'down'. Fixes the bug where 401/404
  services were marked green.
- services.json: add Homepage service under 'dev' (was missing; the
  homepage is one of the public homelab services). Now 21 services.
- services.json: fix ethereum category icon (' Ξ' -> 'Ξ') leading space.
- .gitignore (new): ignore /.playwright-mcp/ and services-page.png.
- git rm --cached the three stray dev artifacts so they leave the repo.
2026-07-28 19:06:57 +00:00

74 lines
3.9 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": "Homepage", "url": "https://homepage.ffaerber.duckdns.org", "desc": "This page — the homelab services index you are looking at.", "icon": "🏠" },
{ "name": "Gitea", "url": "https://git.ffaerber.duckdns.org", "desc": "Self-hosted Git and CI for all ffaerber repos.", "icon": "🔧" }
]
}
]
}