Replace Next.js 16 + React 19 with Astro 5. Same visual design, same deploy pipeline, zero client-side framework. - All components rewritten as .astro files - Dark mode via inline scripts (no React context) - Timeline animation via IntersectionObserver script - Nav active state computed at build time - Self-hosted Source Code Pro woff2 fonts - Drop Font Awesome (icons were never loaded) - Drop unused headshot PNG (1MB, unreferenced) - Fix pfSense hardware refs (Netgate 1100, not N100) - Output: 212KB static HTML vs 2.6MB before - JS shipped: ~700 bytes inline vs ~130KB React runtime
This commit is contained in:
+37
-38
@@ -2,56 +2,55 @@ export type Service = {
|
||||
name: string;
|
||||
description: string;
|
||||
category: "infrastructure" | "security" | "monitoring" | "productivity" | "media";
|
||||
icon: string; // Font Awesome class
|
||||
};
|
||||
|
||||
export const services: Service[] = [
|
||||
// Infrastructure
|
||||
{ name: "pfSense", description: "Firewall, DHCP, routing gateway on N100", category: "infrastructure", icon: "fas fa-shield-halved" },
|
||||
{ name: "Caddy", description: "Reverse proxy with automatic wildcard TLS via Cloudflare DNS-01", category: "infrastructure", icon: "fas fa-globe" },
|
||||
{ name: "Pi-hole", description: "Network-wide DNS + ad blocking", category: "infrastructure", icon: "fas fa-filter" },
|
||||
{ name: "WireGuard", description: "VPN — full LAN access for remote clients", category: "infrastructure", icon: "fas fa-lock" },
|
||||
{ name: "mail relay", description: "Outbound SMTP relay for self-hosted service notifications", category: "infrastructure", icon: "fas fa-envelope" },
|
||||
{ name: "gluetun", description: "VPN container routing download client traffic", category: "infrastructure", icon: "fas fa-shield" },
|
||||
{ name: "Home Assistant", description: "Smart home automation and device management", category: "infrastructure", icon: "fas fa-house" },
|
||||
{ name: "pfSense", description: "Firewall, DHCP, routing gateway on Netgate 1100", category: "infrastructure" },
|
||||
{ name: "Caddy", description: "Reverse proxy with automatic wildcard TLS via Cloudflare DNS-01", category: "infrastructure" },
|
||||
{ name: "Pi-hole", description: "Network-wide DNS + ad blocking", category: "infrastructure" },
|
||||
{ name: "WireGuard", description: "VPN — full LAN access for remote clients", category: "infrastructure" },
|
||||
{ name: "mail relay", description: "Outbound SMTP relay for self-hosted service notifications", category: "infrastructure" },
|
||||
{ name: "gluetun", description: "VPN container routing download client traffic", category: "infrastructure" },
|
||||
{ name: "Home Assistant", description: "Smart home automation and device management", category: "infrastructure" },
|
||||
|
||||
// Security / Auth
|
||||
{ name: "Authentik", description: "SSO provider — OIDC + forward auth across all services", category: "security", icon: "fas fa-id-badge" },
|
||||
{ name: "Vaultwarden", description: "Self-hosted password manager, isolated in its own LXC", category: "security", icon: "fas fa-vault" },
|
||||
{ name: "Authentik", description: "SSO provider — OIDC + forward auth across all services", category: "security" },
|
||||
{ name: "Vaultwarden", description: "Self-hosted password manager, isolated in its own LXC", category: "security" },
|
||||
|
||||
// Monitoring
|
||||
{ name: "Victoria Metrics", description: "Long-term metrics storage and querying", category: "monitoring", icon: "fas fa-chart-line" },
|
||||
{ name: "Grafana", description: "Dashboards and alerting across all hosts and services", category: "monitoring", icon: "fas fa-chart-bar" },
|
||||
{ name: "Beszel", description: "Lightweight container and host monitoring", category: "monitoring", icon: "fas fa-server" },
|
||||
{ name: "ntfy", description: "Self-hosted push notifications", category: "monitoring", icon: "fas fa-bell" },
|
||||
{ name: "Victoria Metrics", description: "Long-term metrics storage and querying", category: "monitoring" },
|
||||
{ name: "Grafana", description: "Dashboards and alerting across all hosts and services", category: "monitoring" },
|
||||
{ name: "Beszel", description: "Lightweight container and host monitoring", category: "monitoring" },
|
||||
{ name: "ntfy", description: "Self-hosted push notifications", category: "monitoring" },
|
||||
|
||||
// Productivity
|
||||
{ name: "Gitea", description: "Personal Git server", category: "productivity", icon: "fas fa-code-branch" },
|
||||
{ name: "Outline", description: "Team wiki and knowledge base", category: "productivity", icon: "fas fa-book" },
|
||||
{ name: "Vikunja", description: "Task management", category: "productivity", icon: "fas fa-list-check" },
|
||||
{ name: "Actual Budget", description: "Personal budgeting", category: "productivity", icon: "fas fa-wallet" },
|
||||
{ name: "Ghostfolio", description: "Investment portfolio tracking", category: "productivity", icon: "fas fa-coins" },
|
||||
{ name: "Hoarder", description: "Bookmark manager with tagging", category: "productivity", icon: "fas fa-bookmark" },
|
||||
{ name: "FreshRSS", description: "RSS reader", category: "productivity", icon: "fas fa-rss" },
|
||||
{ name: "Memos", description: "Quick notes and journal", category: "productivity", icon: "fas fa-note-sticky" },
|
||||
{ name: "Traggo", description: "Time tracking", category: "productivity", icon: "fas fa-clock" },
|
||||
{ name: "Baikal", description: "CalDAV / CardDAV server", category: "productivity", icon: "fas fa-calendar" },
|
||||
{ name: "Grist", description: "Spreadsheets and structured data", category: "productivity", icon: "fas fa-table" },
|
||||
{ name: "Glance", description: "Self-hosted start page with feeds and service status", category: "productivity", icon: "fas fa-gauge" },
|
||||
{ name: "Filebrowser", description: "Web-based file manager", category: "productivity", icon: "fas fa-folder-open" },
|
||||
{ name: "Gitea", description: "Personal Git server", category: "productivity" },
|
||||
{ name: "Outline", description: "Team wiki and knowledge base", category: "productivity" },
|
||||
{ name: "Vikunja", description: "Task management", category: "productivity" },
|
||||
{ name: "Actual Budget", description: "Personal budgeting", category: "productivity" },
|
||||
{ name: "Ghostfolio", description: "Investment portfolio tracking", category: "productivity" },
|
||||
{ name: "Hoarder", description: "Bookmark manager with tagging", category: "productivity" },
|
||||
{ name: "FreshRSS", description: "RSS reader", category: "productivity" },
|
||||
{ name: "Memos", description: "Quick notes and journal", category: "productivity" },
|
||||
{ name: "Traggo", description: "Time tracking", category: "productivity" },
|
||||
{ name: "Baikal", description: "CalDAV / CardDAV server", category: "productivity" },
|
||||
{ name: "Grist", description: "Spreadsheets and structured data", category: "productivity" },
|
||||
{ name: "Glance", description: "Self-hosted start page with feeds and service status", category: "productivity" },
|
||||
{ name: "Filebrowser", description: "Web-based file manager", category: "productivity" },
|
||||
|
||||
// Media
|
||||
{ name: "Plex", description: "Media streaming — movies, TV, music", category: "media", icon: "fas fa-film" },
|
||||
{ name: "Jellyfin", description: "Open-source media streaming", category: "media", icon: "fas fa-play" },
|
||||
{ name: "Sonarr", description: "Automated TV show management", category: "media", icon: "fas fa-tv" },
|
||||
{ name: "Radarr", description: "Automated movie management", category: "media", icon: "fas fa-video" },
|
||||
{ name: "Lidarr", description: "Automated music management", category: "media", icon: "fas fa-music" },
|
||||
{ name: "Prowlarr", description: "Indexer manager and proxy for the *arr stack", category: "media", icon: "fas fa-magnifying-glass" },
|
||||
{ name: "Bazarr", description: "Automatic subtitle download and management", category: "media", icon: "fas fa-closed-captioning" },
|
||||
{ name: "nzbget", description: "Usenet downloader", category: "media", icon: "fas fa-download" },
|
||||
{ name: "qBittorrent", description: "Torrent client with web UI", category: "media", icon: "fas fa-magnet" },
|
||||
{ name: "Kavita", description: "Self-hosted manga and book reader", category: "media", icon: "fas fa-book-open" },
|
||||
{ name: "Openshelf", description: "Book library with auto-ingest", category: "media", icon: "fas fa-book-open" },
|
||||
{ name: "Plex", description: "Media streaming — movies, TV, music", category: "media" },
|
||||
{ name: "Jellyfin", description: "Open-source media streaming", category: "media" },
|
||||
{ name: "Sonarr", description: "Automated TV show management", category: "media" },
|
||||
{ name: "Radarr", description: "Automated movie management", category: "media" },
|
||||
{ name: "Lidarr", description: "Automated music management", category: "media" },
|
||||
{ name: "Prowlarr", description: "Indexer manager and proxy for the *arr stack", category: "media" },
|
||||
{ name: "Bazarr", description: "Automatic subtitle download and management", category: "media" },
|
||||
{ name: "nzbget", description: "Usenet downloader", category: "media" },
|
||||
{ name: "qBittorrent", description: "Torrent client with web UI", category: "media" },
|
||||
{ name: "Kavita", description: "Self-hosted manga and book reader", category: "media" },
|
||||
{ name: "Openshelf", description: "Book library with auto-ingest", category: "media" },
|
||||
];
|
||||
|
||||
export const categoryOrder: Service["category"][] = [
|
||||
|
||||
Reference in New Issue
Block a user