infra.angel.is

Personal Homelab

Self-hosted infrastructure,
owned end to end.

49 services · 9 categories · NixOS · Tailscale

Browse Services View Architecture
49
Self-hosted services
46
Docker containers
9
Service categories
NixOS
Host operating system

About this lab

This homelab runs on a single AMD server — bare metal NixOS, not a VM. Every service is declared in a git repository: configuration is reproducible, secrets are encrypted with sops-nix, and a rebuild from scratch brings everything back exactly as it was.

The goal is to own my data and avoid vendor lock-in wherever reasonable. Photos, passwords, budgets, and documents stay on hardware I control — accessible over Tailscale from anywhere without exposing ports to the internet.

Remote access works through a self-hosted Headscale control plane on a VPS — no Tailscale cloud dependency. Any device on the mesh can reach homelab services at their LAN IPs without open firewall ports or split-DNS complexity.

Hardware & philosophy

AMD CPUNixOS unstableDocker ComposeTailscale meshCloudflare TLSsops-nix secretsGit as source of truthSelf-hosted HeadscaleNo vendor lock-inBare metal

Services

49
Open WebUI

Local LLM chat interface with Ollama backend.

ai

Chat interface for local LLMs running on Ollama, providing a ChatGPT-like UI backed entirely by locally-running models. No data leaves the server — conversations, documents, and queries stay on hardware I control. Useful for tasks where I don't want to send context to an external AI service.

llm ai
Paperless AI

AI document classifier companion for Paperless-ngx.

ai

AI document classifier companion for Paperless-ngx. After OCR, it uses AI to suggest document types, correspondents, and tags — reducing the manual filing work considerably. The confidence score on each suggestion makes it easy to accept accurate classifications and correct the ones that miss.

documents ai
Vane

AI-powered personal answering engine.

ai

AI-powered personal answering engine that searches through notes, documents, and bookmarks to answer questions with grounding in personal context. A local alternative to asking ChatGPT things that touch personal data — answers are backed by sources I've actually saved and can verify.

ai search
BentoPDF

PDF tools — merge, split, compress, and convert.

documents

Collection of PDF manipulation tools — merge, split, compress, convert, and more — running entirely locally. No uploading documents to third-party services for basic PDF operations. The kind of tool that replaces a dozen sketchy free PDF websites and keeps sensitive documents off external servers.

pdf tools
File Browser

Web file manager for media storage.

documents

Web file manager for browsing and downloading files from the media mount. Useful for quickly grabbing a file from /mnt/media/ without SSH or a Samba share. Also supports uploads, so it doubles as a lightweight way to add files to the server from any browser — handy when the Samba share isn't reachable.

files
Karakeep

Bookmark manager with AI tagging and full-text search.

documents

Bookmark manager with AI-powered auto-tagging and full-text search across saved content. Articles and pages saved through the browser extension get indexed and automatically tagged by the AI classifier. Replaces Pocket, Instapaper, and a tangled mess of browser bookmarks with a single searchable archive that I actually own.

bookmarks ai
Medikeep

Medical records & health document organizer.

documents

Medical records and health document organizer for the whole family. Stores documents, prescriptions, vaccination records, and clinical notes in one searchable place. Useful at a doctor's appointment when asked about past medications or procedures — everything accessible from the phone without digging through paper files.

health documents
Memos

Lightweight privacy-first note-taking app.

documents

Lightweight, privacy-first note-taking app for quick thoughts and fleeting ideas. Think of it as a self-hosted microblog — short-form entries with tags and full-text search, deliberately simple with no nested folders or complex hierarchy. Ideal for capturing thoughts that don't belong in a task manager but shouldn't be lost to a chat app.

notes
Paperless-ngx

Document management with OCR, full-text search, and tags.

documents

Document management with OCR and full-text search. Physical documents get scanned and dropped into an inbox folder — Paperless picks them up, runs OCR via Tika and Gotenberg, tags them automatically, and makes them searchable. The long-term goal is zero physical paper filing: everything scanned, indexed, and findable in seconds.

documents ocr
FlareSolverr

Cloudflare bypass proxy for indexers.

downloading

Cloudflare bypass proxy used by Prowlarr for indexers that require JavaScript challenge solving. Runs headless Chromium to solve Cloudflare challenges and return the resulting cookies to the caller. A necessary piece of plumbing for indexers that block direct HTTP scraping.

proxy arr
Prowlarr

Torrent/Usenet indexer manager for the *arr ecosystem.

downloading

Indexer manager that centralizes all torrent and Usenet indexer configurations in one place and syncs them to downstream clients automatically. Adding or updating an indexer in Prowlarr propagates everywhere without reconfiguring each client. Integrates with FlareSolverr for indexers that require JavaScript challenge solving.

indexer arr
qBittorrent

BitTorrent client, VPN-tunneled via Gluetun for privacy.

downloading

BitTorrent client running inside the Gluetun VPN container on the isolated vpn_net network. The kill switch ensures that if the WireGuard tunnel drops, qBittorrent immediately loses network access rather than leaking the real IP. The web UI is accessible only from the LAN via Godoxy — no external exposure.

torrents vpn
Actual AI

AI transaction classifier companion for Actual Budget.

finance

AI companion for Actual Budget that automatically classifies imported transactions into budget categories. Learns from historical transaction patterns and suggests categories for new ones. Cuts down the manual categorization work significantly — most transactions are classified correctly on the first pass.

finance ai
Actual Budget

Zero-based budgeting & personal finance tracker.

finance

Zero-based budgeting app with a local-first data model — all budget data is stored locally with optional end-to-end encrypted sync. The philosophy of giving every dollar a job makes spending decisions deliberate. No subscription cost, no bank credentials sent to a third party, and the data is mine to export whenever.

budget finance
PriceBuddy

Price tracker — monitor products and get drop alerts.

finance

Price tracker for monitoring products from multiple retailers. Set up a product URL, configure a target price, and get an ntfy notification when the price drops. Useful for patient purchasing rather than impulse buying — the kind of tool that pays for the server costs in a single deal.

shopping prices
AdGuard Home

Network-wide DNS ad & tracker blocking with DNSSEC and optimistic cache.

nixos

Network-wide DNS filtering running directly on the NixOS host — not in Docker — so it starts before any container. Blocks ads and trackers across every device on every subnet without per-device configuration. Uses Cloudflare DoT and Quad9 DoT as encrypted upstreams, with a 4 MB optimistic cache to keep latency low even when upstream resolvers are slow.

dns adblocking nixos
Beszel

Lightweight system metrics & container monitoring dashboard.

infrastructure

Minimal monitoring dashboard that tracks CPU, RAM, disk, and network per container and per host. Lighter than a full Prometheus/Grafana stack while covering the "is this thing healthy?" use case well. The agent runs on each monitored host and reports back over a secure WebSocket channel with historical charts and configurable alerts.

monitoring
Cockpit

Linux server web admin UI.

nixos

Web admin interface for the NixOS server, useful for quick tasks like checking running services or resource usage without SSH. Not heavily used day-to-day since NixOS config handles most setup, but handy for ad-hoc diagnostics, storage management, and the occasional terminal session from a browser on a device where SSH isn't set up.

admin nixos
CrowdSec

Collaborative IDS — blocks malicious IPs at the proxy layer.

infrastructure

Collaborative IDS running alongside Godoxy. It parses proxy logs, detects attack patterns, and shares threat intelligence with the wider CrowdSec community — in return getting a continuously updated blocklist of IPs flagged across thousands of other deployments. The web UI shows what's being blocked in real time.

security ids
Dockge

Docker Compose stack manager UI.

infrastructure

Stack manager UI that makes it easy to start, stop, restart, and update Docker Compose stacks without SSH. All stacks live at /opt/docker/apps/ and are version-controlled in git — Dockge just provides a friendly interface over them. Essential for stack management on a TV or mobile browser when a quick restart is needed away from the desk.

docker management
Dozzle

Real-time Docker container log viewer.

infrastructure

Zero-config log viewer that reads directly from the Docker socket via a socket proxy. No log aggregation or storage — just a fast way to tail any container's logs from a browser without opening a terminal. Invaluable for quickly debugging a misbehaving container without SSH.

logs docker
Godoxy

Reverse proxy with auto TLS via Cloudflare DNS challenge, GeoIP ACL, and OIDC middleware.

infrastructure

The entry point for every service I host. Godoxy auto-discovers containers via Docker labels and issues wildcard TLS certificates through Cloudflare's DNS challenge — no manual cert work ever. The built-in GeoIP ACL restricts access to Canada and my LAN, and CrowdSec handles IP-level threat intelligence in real time. Hot-reloads on config changes without a restart.

reverse-proxy tls docker go source ↗
Headscale

Self-hosted Tailscale control plane for private mesh networking.

vps

Self-hosted Tailscale control plane running on the VPS, keeping mesh VPN coordination off Tailscale's cloud entirely. All Tailscale clients register against this server instead of the commercial endpoint. The VPS only needs port 443 open; the control plane proxied behind VPS Godoxy means it gets OIDC protection and rate-limiting for free.

vpn tailscale vps
ntfy

Self-hosted push notification relay.

infrastructure

Push notification relay that lets any service send an HTTP request and have it appear on my phone instantly. Every homelab alert — Godoxy access denials, backup completions, failed health checks — routes through ntfy topics. The default auth policy is deny-all so only authenticated publishers can send; topics are cheap to create so each service gets its own.

notifications
Pocket ID

Lightweight OIDC provider — SSO for all homelab services.

infrastructure

Lightweight OIDC provider that acts as the single sign-on entry point for every service that supports OAuth. When Godoxy enforces OIDC middleware on a route, this is where credentials are verified. The static API key integration lets automated tools authenticate without a browser flow, and passkey support means no passwords to remember.

oidc sso auth
Scrutiny

HDD/SSD SMART monitoring with InfluxDB history.

infrastructure

SMART monitoring for all physical drives, storing historical health data in InfluxDB so trends are visible over time. Sets up alerts when drive health degrades before failure becomes imminent. The collector runs on a schedule and the dashboard shows temperature trends and attribute history per drive — catching issues weeks before they'd otherwise surface.

storage monitoring
Vaultwarden

Bitwarden-compatible self-hosted password manager.

infrastructure

Bitwarden-compatible server that stores all passwords, TOTP seeds, and secure notes locally. The official Bitwarden browser extensions and mobile apps connect to it directly — the only change from cloud Bitwarden is the server URL. Encrypted sync means offline access works even when the server is unreachable.

passwords security
Audiobookshelf

Audiobook & podcast server with cross-device progress sync.

media

Audiobook and podcast server with cross-device progress sync. Picks up exactly where I left off on any device without any cloud sync service. Also handles podcast RSS subscriptions so every episode is downloaded locally and available offline — no ad tracking, no platform lock-in, and no disappearing back-catalogues.

audiobooks podcasts
AzuraCast

Web radio station broadcaster with live streaming support.

media

Web radio station for streaming music to external listeners on a scheduled or auto-DJ basis. Configured to play from a curated library playlist when no live session is running. More of a fun project than core infrastructure, but it's been running continuously since setup and occasionally gets used for small group listening sessions.

radio streaming
Immich

Self-hosted photo & video backup with ML face recognition.

media

Self-hosted replacement for Google Photos — automatic backup from iPhone, face recognition grouping, and album sharing. The machine-learning container handles face and scene classification locally with no data leaving the server. All original-quality photos and videos stay on hardware I control, with a timeline view that works as well as any cloud app.

photos ai backup
Navidrome

Music streaming server with Subsonic/OpenSubsonic API support.

media

Music streaming server that works with any Subsonic/OpenSubsonic-compatible client. The entire local music library is indexed and accessible from any device with gapless playback and scrobbling to Last.fm. Keeps music organized and available without depending on Spotify or Apple Music — entire library accessible offline via the mobile client.

music streaming
slskd

Soulseek P2P client for music acquisition.

media

Soulseek P2P client for acquiring music from the community. The Soulseek network is particularly good for rare albums, live recordings, and releases not available on streaming services. Runs headless with a web UI, integrated into the music workflow alongside music-grabber and Navidrome for a fully self-hosted music pipeline.

music p2p
AdventureLog

Travel & adventure journal with map visualization.

productivity

Travel and adventure journal with map visualization. Each trip gets a log with photos, routes, and notes plotted on an interactive map. More personal than Instagram, less ephemeral than a notes app, and all the data stays local — no social platform deciding what to surface or delete.

travel maps
Donetick

Task & chore management with recurring schedules.

productivity

Task and chore tracker with support for recurring schedules. Perfect for household tasks that need doing on a regular cadence — if the task isn't logged as done, donetick keeps flagging it as overdue. More flexible than a simple to-do list for maintenance tasks that repeat weekly, monthly, or on custom intervals.

tasks
FreshRSS

Self-hosted RSS aggregator with Fever API compatibility.

productivity

RSS aggregator for following websites and blogs without social media algorithms. Compatible with the Fever API so mobile clients like Reeder or NetNewsWire sync seamlessly. All feed data stays local — no third-party service reading my reading habits or selling them to advertisers.

rss feeds
Mealie

Recipe manager with meal planning and shopping lists.

productivity

Recipe manager with meal planning and automatic shopping list generation. Recipes can be imported by URL from almost any cooking website — the parser strips out the fluff and stores just ingredients, steps, and notes. Meal plans for the week automatically generate a combined shopping list, sorted by category.

recipes food
Monica

Personal CRM — relationships, notes, and reminders.

productivity

Personal CRM for keeping track of relationships — notes from conversations, birthdays, gift ideas, and reminders to stay in touch. Useful for staying connected with people without relying on memory alone. The kind of tool that makes the difference between "I should call them" and actually calling.

crm contacts
NewsBlur

News reader with intelligence filters.

productivity

News reader with intelligence filters that learn which stories are worth reading based on engagement patterns. The self-hosted version supports the official iOS and Android apps with full feature parity. A second reading workflow alongside FreshRSS for publishers that work better with NewsBlur's story-centric model.

rss news
Nightlio

Mood & energy journaling with trend analysis.

productivity

Mood and energy journaling app with trend analysis over time. A quick daily check-in takes under a minute and builds up a picture of patterns over weeks and months. Useful for noticing correlations between sleep, exercise, stress, and mood that aren't obvious in the moment but become clear in the charts.

journal health
Shelfmark

Book tracking — reading list, progress, and reviews.

productivity

Book tracking app for managing a reading list, tracking progress, and writing notes and reviews. A self-hosted replacement for Goodreads without the social tracking, data harvesting, and Amazon ownership. Reading history and notes stay local and aren't used to sell anything.

books reading
SparkyFitness

Family fitness tracker for workouts and goals.

productivity

Family fitness tracker for logging workouts, setting goals, and tracking progress over time. Designed for household use — multiple profiles, shared goals, and activity logging for different types of exercise. A self-hosted alternative to Strava or MyFitnessPal for workouts that don't need to be public.

fitness health
Strava Stats

Personal Strava activity stats dashboard.

productivity

Personal statistics dashboard that pulls activity data from Strava's API and surfaces custom analytics beyond what Strava's own interface shows. Yearly mileage totals, segment trends, gear mileage, and activity type breakdowns — all in one view without the social feed noise.

fitness strava
SearXNG

Privacy-respecting metasearch aggregator.

search

Privacy-respecting metasearch engine that queries multiple search backends and aggregates results without tracking or profiling. All searches stay local — no search history leaks to Google or Bing. The default search engine for all browsers at home, configured to weight results from sources I actually trust.

search privacy
Umami

Privacy-focused web analytics platform.

search

Simple, privacy-focused web analytics for tracking visits to this infra site and other self-hosted web properties. No cookies, no personal data collection, GDPR-compliant by design. Shows page views, referrers, and device stats without the complexity of Google Analytics or the ethical baggage that comes with it.

analytics
Epic Games Claimer

Headless Epic Games free games auto-claimer.

utilities

Headless browser automation that claims the weekly free games on the Epic Games store without any manual interaction. Runs on a schedule and sends an ntfy notification confirming successful claims. A minor quality-of-life automation — the games accumulate in the library whether played or not, and it costs nothing to claim them.

games automation
Excalidraw

Collaborative virtual whiteboard and diagram tool.

utilities

Collaborative virtual whiteboard for hand-drawn style diagrams. The self-hosted version means room data stays local and diagrams don't end up in Excalidraw's cloud. Primarily used for quick architecture sketches and brainstorming that doesn't need the formality of a structured diagramming tool.

drawing collaboration
FilePizza

P2P file sharing — no server upload required.

utilities

P2P file transfer directly from the browser using WebRTC — the file never touches the server, it streams directly between browsers. The server just brokers the WebRTC connection. Useful for quick one-off transfers between devices without configuring a share or uploading to a cloud service.

files p2p
IronCalc

Open-source spreadsheet engine.

utilities

Open-source spreadsheet engine accessible through a browser. A local alternative to Google Sheets for quick spreadsheet work without sending data to Google's servers. Still early-stage software but functional for the basic use cases that don't need the full weight of a desktop application.

spreadsheet
ZeroByte

Backup automation with Restic for reliable data protection.

utilities

Backup automation using Restic to back up critical container data to remote storage. Handles scheduling, retention policies, and monitoring through a web UI. The "set it and forget it" layer that ensures important data has an off-site copy — the thing you only appreciate when you actually need it.

backup

Architecture

How traffic flows from the internet to services, and how Tailscale connects remote clients.

Request Flow

Internet

HTTP/HTTPS traffic

Cloudflare

TLS termination · DDoS protection

Godoxy

Reverse proxy · GeoIP ACL · OIDC · CrowdSec

sharednet

Most services

vpn_net

arr + Gluetun

media

Music stack

Tailscale mesh path

Remote clients

iPhone · MacBook

VPS — connect.angel.is

Headscale control plane · Godoxy

subnet route 10.10.30.0/24

Homelab — 10.10.30.100

NixOS · all services

Security Layers

Cloudflare

All traffic passes through Cloudflare — TLS termination, DDoS protection, and certificate issuance via DNS challenge. The server's real IP is never exposed to the public internet.

🌍

GeoIP ACL

Godoxy uses MaxMind GeoIP to restrict access to Canadian IP ranges and the local LAN. Requests from outside these ranges are dropped at the proxy before reaching any service.

🛡

CrowdSec

Community threat intelligence layer running as a sidecar to Godoxy. Malicious IPs identified by the CrowdSec network are blocked in real time across thousands of deployments.

🔐

Pocket ID (OIDC)

Most services are behind a single sign-on layer using Pocket ID as the OIDC provider. Godoxy enforces OIDC authentication before forwarding requests to the service.

🔒

VPN Tunnel (Gluetun)

The arr downloading stack routes all traffic through a WireGuard VPN tunnel via Gluetun. If the tunnel drops, the kill switch blocks all traffic immediately — no IP leaks.

Docker Networks

sharednet

The default network for most services. Godoxy discovers containers here via Docker labels and auto-proxies them with TLS.

godoxy, immich, mealie, paperless, …

vpn_net

Isolated network for the downloading stack. All traffic exits through Gluetun WireGuard — kill switch blocks on VPN drop.

gluetun, qbittorrent, prowlarr, flaresolverr

media

Dedicated network for the music stack, keeping media services isolated from the main service network.

navidrome, slskd, music-grabber, explo

Network Topology

Network Subnet Purpose
main 10.10.10.0/24 Primary home network — workstations, phones
iot 10.10.20.0/24 IoT devices — isolated from main network
server 10.10.30.0/24 Homelab server (10.10.30.100) + Incus VMs
guest 10.10.40.0/24 Guest WiFi — internet only, no LAN access
tailscale 100.64.0.0/10 Mesh VPN — remote clients + VPS node

DNS

AdGuard Home runs directly on the NixOS host (not in Docker) on port 53, acting as the primary DNS resolver for all network segments. It blocks ads and trackers at the DNS level and forwards clean queries to Cloudflare DoT and Quad9 DoT over encrypted transport.

# DNS resolution chain

Client → AdGuard Home (10.10.30.100:53)

├─ Blocked: OISD Big filter list

├─ Rewrite: *.angel.is → 10.10.30.100 (Godoxy)

├─ Rewrite: connect.angel.is → 23.94.115.144 (VPS)

└─ Upstream: tls://1.0.0.1:853 · tls://dns.quad9.net:853

Tailscale Nodes

Node Tailscale IP Role
nixos-server 100.64.0.1 Homelab — advertises 10.10.30.0/24 route
vps 100.64.0.4 VPS — Headscale + Godoxy host
iphone 100.64.0.3 Mobile client
macbook 100.64.0.5 Laptop client

Stack

The software and configuration choices that keep everything running.

Hardware
AMD CPUBare metal NixOS

The homelab runs on a single bare-metal AMD server — no hypervisor between NixOS and the hardware. Running directly on metal means lower latency for storage-intensive workloads like Immich and Paperless-ngx, and eliminates one layer of potential failure.

Incus handles lightweight VMs for anything that genuinely needs isolation. The media library lives on a dedicated ext4 volume mounted at /mnt/media, keeping it separate from the OS and easy to back up independently.

NixOS

NixOS is the operating system of choice because the entire system state is declared in a git repository. Packages, services, users, firewall rules — everything is reproducible. A nixos-rebuild switch from the flake restores any machine to its exact intended state, including all secrets decrypted and deployed.

The nixos-unstable channel gives access to the latest package versions — important for running cutting-edge services like AdGuard Home without packaging delays. Atomic rollbacks mean a bad config can always be undone from the boot menu without SSHing in blind.

Docker + Dockge

Most services run as Docker Compose stacks, managed through Dockge — a clean UI for starting, stopping, and updating stacks without touching the command line. Each stack lives in its own directory under /opt/docker/apps/ and is version-controlled in git.

Docker is enabled via NixOS's virtualisation.docker module with auto-pruning enabled. Three persistent networks — sharednet, vpn_net, and media — are created at boot by a NixOS systemd unit and persist across container restarts. The Docker socket is exposed only to a socket-proxy sidecar at 127.0.0.1:2375, not mounted directly into containers.

Godoxy

Godoxy is the single entry point for all web traffic. It auto-discovers Docker containers via labels, issues wildcard TLS certificates through Cloudflare's DNS challenge (no port 80 required), and hot-reloads on configuration changes without a restart. New services become accessible externally within seconds of the container starting.

The GeoIP ACL powered by MaxMind restricts access to Canadian IP ranges and the local LAN — anything else is dropped at the proxy before reaching a service. CrowdSec adds community threat intelligence, blocking IPs flagged across thousands of other CrowdSec deployments in real time. Pocket ID provides OIDC SSO for services that need authentication.

sops-nix + Age

Secrets — API keys, passwords, tokens — are encrypted with Age and committed to the git repository inside nixos/secrets/secrets.yaml. The Age private key lives only on the server at ~/.config/sops/age/keys.txt. On nixos-rebuild, sops-nix decrypts them and renders environment files for each Docker stack.

This means the git repository is safe to push publicly — all sensitive values are encrypted blobs. Each stack's .sops.env file is deployed with 0640 angel:docker permissions and referenced by Docker Compose via env_file, never stored in plaintext on disk.

Tailscale + Headscale

Tailscale provides the WireGuard-based mesh VPN that connects remote clients to the homelab without exposing any ports. Headscale is the self-hosted control plane — no Tailscale cloud dependency — running on a VPS at connect.angel.is behind VPS Godoxy.

The NixOS server advertises the 10.10.30.0/24 subnet route, so any Tailscale client can reach homelab services at their LAN IPs as if connected locally. This removes the need for split-DNS complexity or per-service port forwarding, and keeps the threat surface minimal.