From e2eb20b3d08a56e614fa97367da76a63569f57d0 Mon Sep 17 00:00:00 2001 From: Felix Faerber Date: Wed, 28 Oct 2026 09:14:12 +0200 Subject: [PATCH] Show only an about-me page, no homelab services Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_015XiQYLY5JBuwam5nuVnBfz --- Dockerfile | 2 +- README.md | 2 +- index.html | 109 +++++--------------------------------------------- services.json | 74 ---------------------------------- styles.css | 87 ---------------------------------------- 5 files changed, 12 insertions(+), 262 deletions(-) delete mode 100644 services.json diff --git a/Dockerfile b/Dockerfile index 9ebc30a..05081c7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,7 @@ FROM nginx:1.27-alpine LABEL org.opencontainers.image.title="ffaerber/homepage" \ org.opencontainers.image.source="https://git.ffaerber.duckdns.org/ffaerber/homepage" -COPY index.html styles.css services.json /usr/share/nginx/html/ +COPY index.html styles.css /usr/share/nginx/html/ EXPOSE 80 diff --git a/README.md b/README.md index d20abc1..0c04cd8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # homepage -Public homepage — Docker image deployed to homepage.ffaerber.duckdns.org +Public homepage (about me) — Docker image deployed to ffaerber.com and homepage.ffaerber.duckdns.org How it ships itself — issue → agent team → PR → QA → autopilot merge → image → swarm deploy — is documented in [PIPELINE.md](PIPELINE.md). diff --git a/index.html b/index.html index 13dbdec..7ac6e38 100644 --- a/index.html +++ b/index.html @@ -3,36 +3,32 @@ - - ffaerber — services + + Felix Faerber
- -
+
-

Services

-

All public-facing services from the homelab, grouped by what they do. A green dot means the service answered just now; grey means it is down or unreachable from your browser.

-
-
-

Loading services…

+

About me

+

I build decentralised apps and the infrastructure under them: Ethereum and + Gnosis nodes, staking and Swarm storage. I also work on self-hosted AI: GPU speech services + and an AI companion platform.

-

Projects

-

The code behind the services lives across a few GitHub orgs.

  • github.com/ffaerber ↗ — dapps, Ethereum infra, GPU speech services
  • @@ -48,92 +44,7 @@ github.com/ffaerber ↗ github.com/cipherdolls ↗ - - - - \ No newline at end of file + diff --git a/services.json b/services.json deleted file mode 100644 index 64e890d..0000000 --- a/services.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "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": "🔧" } - ] - } - ] -} \ No newline at end of file diff --git a/styles.css b/styles.css index a00e96a..59fe370 100644 --- a/styles.css +++ b/styles.css @@ -134,93 +134,6 @@ body { color: var(--border); } -/* Services — grouped grid of homelab services */ -.services-root { margin-top: 0.5rem; } -.services-loading, .services-error { - color: var(--muted); - font-style: italic; -} -.service-group { margin: 0 0 2rem; } -.group-title { - font-size: 1.05rem; - font-weight: 700; - margin: 0 0 0.75rem; - letter-spacing: -0.01em; - border-bottom: 1px solid var(--border); - padding-bottom: 0.35rem; -} -.group-icon { margin-right: 0.4rem; } -.service-list { - list-style: none; - margin: 0; - padding: 0; - display: grid; - grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr)); - gap: 0.75rem; -} -.service { - border: 1px solid var(--border); - border-radius: 8px; - background: transparent; - transition: border-color 0.15s ease, background 0.15s ease; -} -.service:hover { border-color: var(--accent); } -.service-link { - display: flex; - align-items: center; - gap: 0.6rem; - padding: 0.7rem 0.85rem; - text-decoration: none; - color: var(--fg); - height: 100%; -} -.service-icon { - font-size: 1.4rem; - line-height: 1; - flex-shrink: 0; - width: 1.6rem; - text-align: center; -} -.service-body { - display: flex; - flex-direction: column; - flex: 1 1 auto; - min-width: 0; -} -.service-name { - font-weight: 700; - font-size: 0.98rem; - letter-spacing: -0.01em; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} -.service-desc { - font-size: 0.82rem; - color: var(--muted); - line-height: 1.4; - margin-top: 0.1rem; -} - -/* Status dot — green up, grey down/pending */ -.status-dot { - width: 0.6rem; - height: 0.6rem; - border-radius: 50%; - flex-shrink: 0; - border: 1px solid var(--border); - background: var(--muted); - opacity: 0.5; - transition: background 0.3s ease, opacity 0.3s ease, border-color 0.3s ease; -} -.status-pending { background: var(--muted); opacity: 0.4; } -.status-up { - background: #2ea043; - border-color: #2ea043; - opacity: 1; -} -.status-down { background: #d73a49; border-color: #d73a49; opacity: 0.85; } - /* Orgs list (Projects section) */ .orgs { list-style: none; -- 2.54.0