Quick answer

The best homelab apps for 2026 are Immich, Nextcloud AIO, Vaultwarden, Paperless-ngx, Jellyfin, AdGuard Home, Tailscale, Home Assistant OS, AudioBookshelf, n8n, BookStack and Uptime Kuma. They replace Google Photos, Drive, 1Password, Plex, Zapier, Notion and UptimeRobot. Ten run in Docker, Home Assistant OS runs as a VM, and one 32 GB mini PC holds all twelve.

A home self-hosting shelf built into a kitchen cabinet: a tower server above, an uninterruptible power supply and a small router below
Photo: Tomskyhaha, Wikimedia Commons (CC BY-SA 4.0)
Contents

By LK Wood IV · Published 2026-05-01 · Corrected 2026-10-07 · Updated 2026-10-10 · 15 min read · St. Louis County, MO

The twelve homelab apps I would run in 2026 are Immich for photos, Nextcloud AIO for files, Vaultwarden for passwords, Paperless-ngx for paper, Jellyfin for media, AdGuard Home for DNS, Tailscale for remote access, Home Assistant OS for the smart home, AudioBookshelf for audiobooks, n8n for automation, BookStack for a wiki and Uptime Kuma for monitoring. Each one replaces a subscription. Ten run as Docker containers, Home Assistant OS wants a VM, Tailscale installs on the host, and all twelve fit on one 32 GB mini PC.

Cancel the subscription. Keep the software.
The SaaS you stop paying for → the self-hosted app that replaces it, and the RAM to plan for it.
Google Photos→Immich6 GB
Google Drive / Dropbox→Nextcloud AIO4 GB
1Password / LastPass→Vaultwarden256 MB
Evernote / Dropbox Scan→Paperless-ngx2 GB
Plex Pass / Netflix→Jellyfin4 GB
Pi-hole / NextDNS→AdGuard Home256 MB
Paid VPN / ZeroTier→Tailscale~0
Apple / Google Home→Home Assistant OS2 GB
Audible→AudioBookshelf1 GB
Zapier / Make→n8n1 GB
Notion / Confluence→BookStack1 GB
UptimeRobot→Uptime Kuma256 MB
The tradeMonthly bills → one 32 GB mini PC. All 12 fit in ~24 GB of RAM.
techfuelhq.com · RAM to plan per app; Immich and Home Assistant at their documented minimums

TL;DR · The 12-app stack at a glance

  • Photos: Immich (replaces Google Photos)
  • Files / sync: Nextcloud AIO (replaces Dropbox + Google Drive + Office)
  • Passwords: Vaultwarden (replaces 1Password / LastPass)
  • Documents: Paperless-ngx (replaces filing cabinet + scanner cloud)
  • Media: Jellyfin (replaces Netflix-style streaming)
  • DNS / ad blocking: AdGuard Home
  • Remote access: Tailscale (free Personal plan: 6 users, unlimited user devices)
  • Smart home: Home Assistant OS
  • Audiobooks: AudioBookshelf
  • Workflow automation: n8n (replaces Zapier)
  • Notes / wiki: BookStack (replaces Notion / Confluence)
  • Monitoring: Uptime Kuma

Full stack runs on a 32 GB mini PC + 1 TB NVMe. RAM is the bottleneck — Immich + Nextcloud + HA in a VM eats 12–14 GB before any user load.

Correction, September 8: the Immich v3.1.0 setup now uses /data and matching auxiliary files. Tailscale can use encrypted relays. Existing installations should check their mounts before importing more photos.

The scannable table — 12 apps, what they replace, what they need

#AppReplacesDifficulty (1–5)Plan forKiller featureVerdict
1ImmichGoogle Photos / iCloud Photos36 GB RAM, 2 cores, DockerML face + object search that genuinely beats Google’s UIShip it. v3.2.0 to v3.2.2 listed no breaking changes.
2Nextcloud AIOGoogle Drive / Dropbox / Workspace34 GB RAM, 2 cores, 40 GB diskOne container manages the whole stack including backupsUse AIO. Skip the manual compose.
3VaultwardenBitwarden cloud / 1Password1256 MB RAMBitwarden-compatible, runs on a potato, end-to-end encryptedEasiest win on the list.
4Paperless-ngxEvernote / Dropbox Scan / paper32 GB RAM, OCR is CPU-hungryTika + OCR + tagging makes paper actually searchableReplace your filing cabinet.
5JellyfinPlex / Netflix / Disney+24 GB RAM, Intel N100 or 11th-gen+ iGPU for transcodeNo subscriptions, no phoning home, hardware transcoding worksStill the Plex-killer. AMD GPUs remain weak for transcode.
6AdGuard HomePi-hole / NextDNS1256 MB RAMDNS-over-HTTPS upstream + per-client rules in a clean UIPicked over Pi-hole for the better UI.
7Tailscale (or Headscale)ZeroTier, paid remote-access VPN1 (Tailscale) / 4 (Headscale)NegligibleWireGuard mesh that punches NAT and “just works”Tailscale free tier is enough for most. Headscale if you want to host the control plane.
8Home Assistant OSApple Home / Google Home / SmartThings42 GB RAM, 2 vCPUs, 32 GB diskLocal control, no cloud dependency, every protocolRun it as a VM, not a container.
9AudioBookshelfAudible / Libby21 GB RAMTracks progress per-user across devices, podcast support includedDrop-in for an Audible library you already own.
10n8nZapier / Make / IFTTT31 GB RAM500+ integrations, queue mode for real workloadsBeats Zapier for anything serious. Fair-code, not open source; you maintain it.
11BookStackNotion / Confluence (read-mostly)21 GB RAMBooks → Chapters → Pages structure that doesn’t fight youPicked over Outline for simpler hosting.
12Uptime KumaUptimeRobot / Better Stack1256 MB RAMSelf-hostable status page for friends and familyThe first thing every homelab should add after DNS.

What got cut and why

  • Plex — not a SaaS replacement; it is the SaaS. Jellyfin replaces Plex.
  • Pi-hole — voted out for AdGuard Home. The DNS-over-HTTPS upstream and per-client rules in AdGuard’s UI are meaningfully better, and the Docker deploy is identical in difficulty. Pi-hole still works fine if you already run it. One deliberate disagreement inside this site: the self-hosting starter order still opens on Pi-hole, because for someone’s first container the smaller footprint and the mountain of beginner documentation matter more than DoH. Both guides are pointing at the same job. This is a preference, not a correctness call.
  • Seafile — solid block-sync, but Nextcloud AIO has closed the gap and the ecosystem (calendar, contacts, office) is broader.
  • Plausible CE / Umami / Mealie / FreshRSS / Linkding — all good, all on the bench. They didn’t beat the 12 above on either daily use or obvious SaaS replacement. If a self-hosted bookmark manager is specifically what you’re after, Linkding is fine but the two strongest options get their own head-to-head in Karakeep vs Linkwarden.
  • Mail-in-a-Box / Mailcow — explicitly cut. Self-hosted outbound email in 2026 still gets your IP scored as suspicious by Microsoft and Google more often than not, and inbound MX is fine until your dynamic IP changes or your ISP blocks port 25. Use a paid relay (Fastmail, Migadu, Proton) and move on.
  • Matrix / Mattermost / Rocket.Chat — a self-hosted chat server is its own category, not a general SaaS swap, so it sits outside this list. There is also no drop-in clone of Discord’s text-plus-voice bundle in 2026, and the voice/video story is the part most roundups skip. If replacing a Discord community or a team chat is what you actually want, the self-hosted Discord alternatives comparison breaks down which tool fits and the voice/video reality. Worth knowing before you pick: Mattermost gates production SSO behind paid plans, and Rocket.Chat, which moved its advanced identity sync to paid tiers in 2021, now says LDAP and SAML will need a Premium module from version 9.0.0; the newest release on September 23, 2026 was 8.8.1, so 9.0.0 had not shipped. The self-hosted SSO tax tracker documents both with verified receipts and free-SSO alternatives.

A difficulty score of 1 is “single container, defaults work, ten-minute deploy.” A 5 is “you’ll read documentation for a weekend and read it again at the next major upgrade.” Most of the 12 land at 1–3. The apps that survive in homelabs are the ones where the 80% case is boring.

Where to start

Do not stand up Immich and Home Assistant on day one. Deploy the ten-minute wins first, then climb in this order.

The build order — don’t deploy all 12 at once
Climb the effort curve. Each phase earns you the confidence for the next.
Phase 1 · Day one
Ten-minute wins. Single container, defaults work.
Vaultwarden AdGuard Home Uptime Kuma Tailscale
Passwords, network-wide ad blocking, monitoring, remote access. Under 1 GB combined. Back up the password vault and keep a way to restore DNS and remote access.
Phase 2 · First weekend
Your media and library. An afternoon each.
Jellyfin Immich AudioBookshelf BookStack
The apps you’ll actually open daily. Immich’s first library import pins a couple of cores for hours — start it before bed.
Phase 3 · Once you’re hooked
The heavy hitters. Read the docs; plan a weekend.
Nextcloud AIO Paperless-ngx n8n Home Assistant
Real commitments with real upside. Home Assistant is a hobby more than a deploy; run it as a VM.
techfuelhq.com · ordering by setup difficulty (see the table above)

The top 5 — full setups

1. Immich — the Google Photos replacement that finally works

The mobile app uploads from iOS and Android in the background, the ML stack identifies faces and objects locally, and the timeline UI beats Google Photos for most operations. The catch is RAM. Immich’s requirements page sets a 6 GB minimum and recommends 8 GB, and the first library import pins a couple of cores for hours. Moving an existing library over is its own job; the Google Photos to Immich migration guide covers Takeout and immich-go, and Immich vs PhotoPrism vs Ente covers the case for end-to-end encryption instead.

v3.2.2 was the newest release on September 23, 2026. This setup uses the v3.2.2 Compose file. Keep its files together; mixing releases can break the setup. For an upgrade, follow the Immich installation guide and the target release’s instructions.

Save the YAML below as docker-compose.yml in a dedicated directory. Download v3.2.2 example.env into that directory and rename it to .env. Also save v3.2.2 hwaccel.transcoding.yml under that exact filename. The extends block reads it even when you select cpu.

Edit .env before starting:

  • Set UPLOAD_LOCATION to your media directory (./library in the example). It mounts at /data inside the server.
  • Set DB_DATA_LOCATION to local database storage (./postgres in the example). The database does not support network shares.
  • Replace DB_PASSWORD=postgres with a random password using only A-Za-z0-9, as the release’s example instructs.
  • Keep DB_USERNAME=postgres and DB_DATABASE_NAME=immich. Set IMMICH_VERSION=v3.2.2 to match the explicit image pins below.
  • Optionally set TZ to your timezone.

The example selects cpu for software transcoding. On an Intel iGPU host with /dev/dri available, change it to quicksync; both services exist in the linked file. That selects device access for the container; configure hardware transcoding in Immich using its transcoding guide.

Critical detail: Immich is not a backup. The database can corrupt. Use Immich’s official backup guide and keep originals on a separate disk from the Immich Postgres.

# docker-compose.yml - Immich v3.2.2
name: immich

services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:v3.2.2
    extends:
      file: hwaccel.transcoding.yml
      service: cpu # use quicksync for a compatible Intel iGPU host
    volumes:
      # Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file
      - ${UPLOAD_LOCATION}:/data
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    ports:
      - '2283:2283'
    depends_on:
      - redis
      - database
    restart: always
    healthcheck:
      disable: false

  immich-machine-learning:
    container_name: immich_machine_learning
    # For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag.
    # Example tag: v3.2.2-cuda
    image: ghcr.io/immich-app/immich-machine-learning:v3.2.2
    # extends: # uncomment this section for hardware acceleration - see https://docs.immich.app/features/ml-hardware-acceleration
    #   file: hwaccel.ml.yml
    #   service: cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference - use the `-wsl` version for WSL2 where applicable
    volumes:
      - model-cache:/cache
    env_file:
      - .env
    restart: always
    healthcheck:
      disable: false

  redis:
    container_name: immich_redis
    image: docker.io/valkey/valkey:9@sha256:70739f85ad2ee01a726a965584a0f94895f01b0c60b3cc8b0aeef11eaa6888cf
    healthcheck:
      test: redis-cli ping | grep -q PONG || exit 1
    restart: always

  database:
    container_name: immich_postgres
    image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE_NAME}
      POSTGRES_INITDB_ARGS: '--data-checksums'
      # Uncomment the DB_STORAGE_TYPE: 'HDD' var if your database isn't stored on SSDs
      # DB_STORAGE_TYPE: 'HDD'
    volumes:
      # Do not edit the next line. If you want to change the database storage location on your system, edit the value of DB_DATA_LOCATION in the .env file
      - ${DB_DATA_LOCATION}:/var/lib/postgresql/data
    shm_size: 128mb
    restart: always
    healthcheck:
      disable: false

volumes:
  model-cache:

From this directory, run docker compose config to check interpolation, then docker compose up -d. Before importing your library, upload a disposable photo, recreate the containers, and confirm it remains available. Keep backups of both the media directory and database; container recreation is only a persistence check.

2. Nextcloud AIO — file sync, calendar, contacts, managed by one container

The official Nextcloud All-in-One project ships everything — Apache, PHP, the database, Redis, the office stack, Talk, the backup container — managed by a single mastercontainer that you talk to over a web UI on port 8080. It is the right answer for new self-hosters and for experienced ones who got tired of debugging PHP-FPM at 1 a.m.

# One-liner from the official AIO README
sudo docker run \
  --init \
  --sig-proxy=false \
  --name nextcloud-aio-mastercontainer \
  --restart always \
  --publish 80:80 \
  --publish 8080:8080 \
  --publish 8443:8443 \
  --volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \
  --volume /var/run/docker.sock:/var/run/docker.sock:ro \
  ghcr.io/nextcloud-releases/all-in-one:latest

The latest tag here is the AIO mastercontainer, which the project explicitly maintains as the supported entry point — the actual Nextcloud server image underneath gets pinned by AIO to a tested release. That’s the one place I make an exception to the “no :latest” rule. If you want full version control, watch the Nextcloud AIO releases page and use a digest pin instead.

A new AIO v14.1.1 instance (September 11, 2026) installs the Calendar and Contacts apps and switches on Talk, Imaginary, Whiteboard plus an office suite, which is now Euro-Office rather than Collabora. Collabora is still a card you can pick instead. Once any optional container is on, the AIO interface asks for at least 2 GB of RAM, a dual-core CPU and 40 GB of storage.

For the complete setup — NPM reverse proxy config, Office activation, CalDAV/CardDAV client setup, and AIO backup — see the Nextcloud AIO Docker setup guide.

3. Vaultwarden — Bitwarden, on a potato

Vaultwarden is a Rust reimplementation of the Bitwarden server API by dani-garcia. The newest release on September 23, 2026 was 1.37.3 (September 13), per the Vaultwarden releases; it adds rate limiting on the prelogin and auth-request endpoints and revokes 2FA remember tokens when credentials or 2FA change.

Do not deploy 1.36.x. 1.37.0 shipped fixes for ten GitHub security advisories (eight listed issues). They include two SSRF issues on the icon endpoint, cross-organization cipher access, and an organization-policy bypass on directory import. The maintainers state it “is required for support with clients with version 2026.7.0+.” Take the newest 1.37.x patch rather than 1.37.0. 1.37.1 repaired organization invites that 1.37.0 broke. The maintainers say 1.37.2 “is required for support with clients with version 2026.8.0+.” It is fully compatible with the official Bitwarden apps, browser extensions and desktop clients, which is the whole point — your phone doesn’t know it’s not talking to Bitwarden’s cloud.

# docker-compose.yml — Vaultwarden, version-pinned
services:
  vaultwarden:
    image: vaultwarden/server:1.37.3-alpine
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      DOMAIN: "https://vault.example.lan"
      SIGNUPS_ALLOWED: "false"      # flip to true for first user, then back
      # The admin page stays off until ADMIN_TOKEN is set. To turn it on, run
      #   docker run --rm -it vaultwarden/server:1.37.3-alpine /vaultwarden hash
      # then uncomment the next line, paste the PHC string it prints, and
      # write every $ as $$ so Compose does not treat it as a variable.
      # ADMIN_TOKEN: "$$argon2id$$v=19$$m=65540,t=3,p=4$$..."
    volumes:
      - ./vw-data:/data
    ports:
      - 8222:80

WebSocket notifications run on the main port since 1.29.0, so the old WEBSOCKET_ENABLED variable is ignored and not in the file above. Two things people miss. Vaultwarden needs HTTPS, because browsers only expose the web vault’s crypto APIs over HTTPS; put it behind Caddy or Traefik with Let’s Encrypt, or use Tailscale Funnel for a zero-config TLS path. And back up ./vw-data somewhere off the host — a vault you can’t restore is a vault you don’t have. The Vaultwarden on Proxmox setup guide covers Caddy reverse proxy, the Tailscale-only setup path, and an automated SQLite backup script with online backup API support.

4. Jellyfin — Plex without the company

Jellyfin is the mature fork of Emby. It does what Plex does — library scanning, transcoding, apps for phones and TVs — without phoning home, without watching your viewing history, and without a “Pass” subscription gating hardware acceleration. The feature-by-feature case is in Jellyfin vs Plex.

Jellyfin 12.1 shipped September 15, 2026, a week after 12.0; the last 10.11 release was 10.11.11 in June. LinuxServer publishes no bare 12.1 tag. The file pins the full build tag.

# docker-compose.yml — Jellyfin with Intel Quick Sync transcoding
services:
  jellyfin:
    image: lscr.io/linuxserver/jellyfin:12.1ubu2604-ls50
    container_name: jellyfin
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/Chicago
      - JELLYFIN_PublishedServerUrl=http://192.168.1.50:8096
    devices:
      - /dev/dri:/dev/dri   # Intel iGPU passthrough for QSV
    volumes:
      - ./config:/config
      - /srv/media:/data/media:ro
    ports:
      - 8096:8096
    restart: unless-stopped

Intel Quick Sync is what makes Jellyfin viable on a budget mini PC. Jellyfin’s hardware selection guide names the Core i5-11400, Pentium Gold G7400 and N100 as integrated-graphics picks, and warns that Intel 10th-gen and older iGPUs are losing QSV support on Linux.

AMD GPUs remain the weakest transcode option in 2026. Jellyfin’s own hardware selection guide calls AMD “the least preferred choice” for its sub-par H.264 encoders before RDNA 4 (RX 9000). It says the poor encoder quality and driver support apply “even on Linux”. If your homelab is AMD-only, plan for direct-play clients (NVIDIA Shield, Apple TV, a recent smart TV). The Jellyfin team also keeps a clear hardware acceleration matrix; read it before you buy a box.

5. Home Assistant OS — local-first smart home

Home Assistant replaces Apple Home, Google Home, and SmartThings at once, and the cloud-dependency stories from those vendors keep getting worse. It is not easy; deep automation takes real time.

The recommended path in 2026 is still Home Assistant OS running as a VM rather than the Docker container. The Container install “does not have access to apps”, which is what Home Assistant has called add-ons since the 2026.2 release, and those apps (Mosquitto, Zigbee2MQTT, ESPHome, the official Z-Wave stack) are most of what makes HA worth running. Supervised installs lost support with 2025.12.

For a Proxmox host, the community-maintained Home Assistant OS VM script (the successor to tteck’s helper scripts) creates the VM with 2 vCPUs, 4 GB of RAM and a 32 GB disk. The VM then boots an installer image that you finish from its console. Home Assistant’s own minimum is 2 GB of RAM and 2 vCPUs. Pass through a USB Zigbee/Z-Wave coordinator if you have one. See the Proxmox vs TrueNAS vs Unraid comparison for which hypervisor fits your situation.

The Home Assistant 2026.3 release notes confirmed the move to zstd-compressed container images. The notes put the floor at Docker 23.0.0 / containerd 1.5.0. A Docker host that has not been updated past those versions will fail to pull the image, while any modern Docker is fine. Read release notes before every monthly upgrade. HA breaks integrations a few times a year. Upgrades are not background tasks.

The other 7 — short notes

AdGuard Home (replaces Pi-hole, NextDNS, your router’s bad ad blocker)

Pin adguard/adguardhome:v0.107.79, the newest release on September 23, 2026 (August 18); the Docker tag keeps the v, and there is no floating v0.107 tag. Point your router’s DHCP DNS at the AdGuard container IP and every device on your network — phones, smart TVs, the IoT garbage — gets DNS-level filtering with zero per-device setup. The DoH/DoT upstream config is in the UI; switch it to Quad9 or Cloudflare 1.1.1.1 and you’ve also leaked less DNS to your ISP than you did last week.

The AdGuard Home + Local DNS on Proxmox tutorial covers the LXC setup from scratch: port 53 in an unprivileged container, the OISD plus Steven Black blocklists, local A records for pve.lan / nas.lan, and an optional Unbound recursive resolver that cuts upstream providers out entirely.

Tailscale (replaces ZeroTier and a paid remote-access VPN)

Yes, Tailscale is technically a SaaS for the coordinator. The free Personal plan on the pricing page (September 23, 2026) covers 6 users, unlimited user devices and 50 tagged resources, and exit nodes count as tagged resources. That is enough for almost every homelab. Direct connections are preferred. When a direct path fails, DERP servers or peer relays can carry the traffic; all three paths remain end-to-end encrypted with WireGuard. See Tailscale connection types.

If you are choosing between Tailscale and ZeroTier, see ZeroTier vs Tailscale. If you genuinely refuse the coordinator, Headscale is the open-source alternative — but plan for a difficulty score of 4 rather than 1. And if the real question is how to reach these services from outside your LAN at all, Tailscale vs Cloudflare Tunnel covers the private-network-versus-public-tunnel split and the current free-tier limits.

AudioBookshelf (replaces Audible)

If you already own audiobooks (legitimately, ideally), AudioBookshelf gives you per-user progress sync, mobile apps, and podcast support in a single container with no companion services. The official apps are free and both still labelled beta: Android is on Google Play, but iOS is a TestFlight beta that was full on September 23, 2026, so an iPhone household may be waiting for a seat.

Podcast RSS auto-download is built in. Pin ghcr.io/advplyr/audiobookshelf:2.36.1 (September 16, 2026, per the releases) rather than :latest, per the no-:latest rule above. Full setup with library directory structure, mobile app config, metadata matching, and Tailscale remote access is in the AudioBookshelf Docker guide.

n8n (replaces Zapier, Make, IFTTT)

Over 500 integrations by n8n’s own count, a queue mode for production workloads that the free Community edition includes, and the ability to drop into JavaScript when the visual builder won’t do what you need. It is not open source. n8n ships under its Sustainable Use License, which allows use “only for your own internal business purposes or for non-commercial or personal use”. SSO, environments or log streaming need one of the paid plans.

Pin a release tag of n8nio/n8n; the stable channel was 2.40.5 on September 23, 2026. The 2.0 release (December 8, 2025) removed the Start node, dropped MySQL and MariaDB as databases and renamed the release channels from latest/next to stable/beta, which is the kind of change a floating tag delivers without warning.

BookStack (replaces Notion as a wiki / docs site)

For pure note-taking, Obsidian beats every self-hosted option. For a team or family wiki — recipes, runbooks, “how the network is set up” — BookStack is the right answer. Outline is also good but the hosting story is harder. The stack is two containers, BookStack plus MySQL 8.0+ or MariaDB 10.6+.

Pin lscr.io/linuxserver/bookstack:26.05.5 rather than :latest, per the no-:latest rule above. 26.05.5 (September 14, 2026) and 26.05.4 before it were both security releases. Do not stop at an older 26.05 tag. Configure LDAP if you’re already running Authentik or Keycloak for unified auth.

Uptime Kuma (replaces UptimeRobot, Better Stack)

Once you have 12 services running, you need to know which one died at 2 a.m. before your family tells you the internet is “broken.” Use louislam/uptime-kuma:2, which pointed at 2.5.5 (September 16, 2026) on September 23. Not :latest: the project’s Docker Hub page marks that tag deprecated, and it still points at the 1.x image. The Uptime Kuma Docker guide covers where to run it so it survives the outage it is meant to report, and the self-hosting essentials guide puts it in the first-week stack.

Paperless-ngx (replaces Evernote scan, Dropbox Scan, paper)

Drop a PDF in the consume folder, OCR runs, the document is tagged, you can full-text-search five years of mail in seconds. Pin ghcr.io/paperless-ngx/paperless-ngx:3.2.1, the newest release on September 23, 2026 (September 20). The project publishes no bare :3 tag; use a full release tag or a floating minor such as :3.2.

Run PostgreSQL next to it. The docs recommend it for multi-user or higher-throughput setups over the default SQLite, and v3 requires PAPERLESS_DBENGINE to be set for PostgreSQL or MariaDB, because v2 inferred the engine from PAPERLESS_DBHOST and v3 no longer does. Word or Excel documents and email files need Tika and Gotenberg containers alongside; the configuration docs require both servers for them. The full compose stack with correspondent auto-tagging, subdirectory tag mapping, and NPM HTTPS is in the Paperless-ngx setup guide.

Best self-hosted services beyond the twelve

The list above covers the apps with the clearest SaaS swap. Two more jobs come up often: automation and blogging. Both have a short, sourced answer. Before you move any service home, read the port-publishing note at the end of this section.

Best self-hosted automation: n8n or Home Assistant

Two entries on the list automate things, and they cover different ground. n8n moves data between web services and APIs, the way Zapier does. Home Assistant automates devices in your home. Home Assistant’s automation guide splits every automation into a trigger, an optional condition and an action, and builds them in the visual editor under Settings, then Automations & scenes. Choose n8n when the trigger is a web event or a schedule across services. Choose Home Assistant when the trigger is a sensor, a person arriving or a device changing state.

If you pick n8n, its self-hosting overview says that without a license key it runs as the free Community edition, and it names Docker Compose as the best fit for production deployments with databases and additional services. n8n’s Docker Compose guide serves the editor on port 5678. It also covers three limits that matter:

  • The default SQLite database sits inside the container unless you mount a volume for it.
  • For a production instance, n8n says to use PostgreSQL instead.
  • The guide asks for at least 4 GB of RAM and 2 vCPUs, because its stack includes a Docker-in-Docker sandbox for n8n Assistant. The 1 GB figure in the table above does not cover that stack.

Self-hosted blog platforms: Ghost and WordPress

A blog is a different kind of replacement from the twelve apps. It swaps a hosted publishing service for a web server you maintain, so the requirements decide the choice.

Ghost is built around a narrow stack. Ghost’s hosting docs list the officially supported setup as Ubuntu 22.04, 24.04 or 26.04 LTS with Node.js 22 LTS and MySQL 8.0 or 8.4, served by NGINX under systemd. The server needs at least 1 GB of memory and a non-root user for running the ghost commands. Other operating systems, databases or web servers can work, but Ghost says they are not officially supported. Self-hosters also pay separately for email newsletter delivery, plus analytics and a CDN. The Docker Compose install is labelled a preview, and it is the route Ghost points to for self-hosting its social web and web analytics features.

WordPress accepts more. WordPress.org recommends a host with PHP 8.3 or greater, MariaDB 10.11 or greater or MySQL 8.0 or greater, and HTTPS. Apache or Nginx is recommended, but any server that supports PHP and MySQL will do. Older PHP 7.4 and MySQL 5.5.5 still run it, though both have reached end of life.

Pick Ghost if you want a publishing tool on its tested stack. Pick WordPress if you need the wider hosting choice. As with the apps above, plan backups and put a reverse proxy in front of either one.

Check what Docker publishes before you move a service home

The compose files on this page publish ports such as 2283 (Immich), 8222 (Vaultwarden) and 8096 (Jellyfin) without a host address. Docker’s port-publishing page calls publishing insecure by default, because the port becomes available to the outside world as well as the Docker host. Adding 127.0.0.1 to the publish flag, as in -p 127.0.0.1:8080:80, limits the port to the host itself. Docker’s firewall page adds that published container ports are diverted before ufw sees them, so a ufw rule does not protect them. If a service should only be reachable through a reverse proxy or Tailscale, bind it to localhost.

What hardware runs all 12

The table’s RAM figures add up to about 22 GB with all twelve running at once. Budget 24 GB, which means a 32 GB box. CPU is less of a problem than people think. Immich’s machine learning is the spike, and the rest idle hard.

Best Mini PCs for a Homelab in 2026 picks the Minisforum MS-01 for a host you plan to grow and a used OptiPlex 7060 Micro or ThinkCentre M720q to start cheap, with 32 GB as the practical minimum. The used 8th-gen boxes run the stack, but if Jellyfin will transcode, buy an N100 or an 11th-gen-or-newer chip, for the QSV reason above. Boot from NVMe and keep media on a separate disk. The Proxmox vs TrueNAS vs Unraid comparison covers the OS choice, and the Proxmox mini PC setup walkthrough takes a new box from USB stick to first VM.

An old gaming PC in a closet skips the purchase; the repurpose-as-server guide covers it, and the PC Builder checks socket/RAM/PSU/GPU-clearance compatibility if you build a tower instead. If the stack outgrows a single 2.5GbE link, the 10GbE homelab networking guide covers the cheap switch options.

Does it save money?

Four of the subscriptions this stack replaces, at the vendors’ monthly-billed list prices on September 23, 2026, come to $54.96 a month. Google’s 2 TB plan, now sold as Google AI Plus, is $9.99. 1Password Families is $7.99, Plex Pass $6.99 and Zapier Professional starts at $29.99. Annual billing lowers 1Password to $5.99 and Zapier to $19.99 a month.

The Self-Hosting Break-Even Calculator takes your own subscriptions, hardware price and electricity rate and returns the month the box pays for itself.

Sources

Each version and tag below was checked against the project’s releases on September 23, 2026, each requirement against its docs and each price against the vendor’s page.

Email corrections to contact@techfuelhq.com.

Frequently asked questions

What are the best self hosted apps in 2026?
Immich (photos), Nextcloud AIO (files), Vaultwarden (passwords), Paperless-ngx (documents), Jellyfin (media), AdGuard Home (DNS), Tailscale (remote access), Home Assistant OS (smart home), AudioBookshelf (audiobooks), n8n (automation), BookStack (wiki) and Uptime Kuma (monitoring). Each has mature documentation and a clear SaaS counterpart.
Can a single mini PC run all twelve?
Yes, with 32GB of RAM and a 1TB NVMe, which leaves headroom for a couple of VMs. RAM is the bottleneck, since Immich plus Nextcloud plus Home Assistant in a VM take 12–14GB before users touch anything. If Jellyfin will transcode, pick an Intel N100 or 11th-gen-or-newer chip, because Jellyfin warns that 10th-gen and older iGPUs are losing QSV support on Linux.
Is Jellyfin really better than Plex in 2026?
For most homelab setups, yes. No subscription, no remote-access gatekeeping, hardware transcoding works on Intel Quick Sync without paywalls, and the apps on Apple TV, Android TV, and Roku have reached parity with Plex's basics. Plex still wins on "relatives can install one app."
Should I self-host email?
No. Outbound deliverability to Gmail and Microsoft 365 is consistently bad from residential IPs in 2026, and inbound on a dynamic IP breaks at the worst times. Use a paid relay (Fastmail, Migadu, Proton) and self-host everything else.
How do I back up these self-hosted services?
Treat the data volumes as the backup target, not the containers. A weekly restic or borg job to a second disk plus an offsite copy (a small VPS, encrypted Backblaze B2, or a friend's homelab over Tailscale) covers realistic failure modes.
Is Tailscale really self-hosted?
The coordinator is SaaS. Tailscale prefers direct connections, but DERP servers or peer relays can carry traffic when direct paths fail. Traffic remains end-to-end encrypted with WireGuard on all three paths. Headscale is an alternative for a self-hosted control plane.

Sources and corrections

Last updated
Methodology
See our methodology for research and review standards. It draws on 52 cited sources, listed below, each checked against the original page on the date shown beside it.
Sources
Update log

13 dated updates are retained in the full log.

Read the full update log (13 entries)
  • 2026-10-10 — Added a section on self-hosted automation (n8n against Home Assistant), a section on self-hosted blog platforms (Ghost and WordPress requirements from their own docs), and a short check on Docker port publishing before you move a SaaS service home. Retitled the page so the title tag and heading name self-hosted services as well as apps. All sources were read on 2026-10-10. No version pin, price or table figure elsewhere on the page changed.
  • 2026-09-23 — I edited this page for its top clicked July 2026 query, ‘homelab apps 2026’. I added an answer capsule, and the first paragraph now names the twelve apps. I re-checked versions against each project’s releases on 2026-09-23: Immich v3.1.0 to v3.2.2 (the v3.2.2 compose changed the valkey digest and the redis healthcheck), Vaultwarden 1.37.2 to 1.37.3 (WEBSOCKET_ENABLED removed, ignored since 1.29.0; ADMIN_TOKEN documented as an Argon2 PHC string from vaultwarden hash, left commented so the admin page stays off until it is set), Jellyfin 10.11.11 to 12.1 (linuxserver 12.1ubu2604-ls50; no bare 12.1 tag), Paperless-ngx 3.0.5 to 3.2.1, AudioBookshelf 2.36.0 to 2.36.1, BookStack 26.05.3 to 26.05.5, Uptime Kuma 2.5.3 to 2.5.5, and AdGuard Home v0.107.x (not a real tag) to v0.107.79. I corrected these points: AIO’s default office suite is Euro-Office, not Collabora; the AudioBookshelf iOS app is a TestFlight beta; n8n is fair-code under its Sustainable Use License and counts 500+ integrations; Home Assistant add-ons have been apps since 2026.2, and the HAOS VM script lives at community-scripts.org; the mini PC guide’s picks were misquoted. I replaced the unsourced $30-50/mo and $170 figures with four vendor list prices dated 2026-09-23. I removed a duplicate TL;DR section, references to five guides that do not exist, unsourced idle-RAM and user-count figures, and process disclaimers. The 2026-09-08 Immich and Tailscale relay corrections are unchanged.
  • 2026-09-14 — Rocket.Chat’s plan matrix now says LDAP and SAML require a plan with the matching Premium module from version 9.0.0, a release that had not shipped on this date (latest release 8.8.1). The team-chat note named only the 2021 identity-sync change, so it now names the announced 9.0.0 change too, matching the re-verified entry on the self-hosted SSO tax tracker. The inline Article JSON-LD dateModified had drifted to 2026-09-08 against a 2026-09-12 lastmod and matches the front matter again.
  • 2026-09-08 — Corrected the Immich v3.1.0 storage target and matched its setup files and Compose values. Corrected Tailscale relay routing in prose and both FAQ representations. No deployment test or general version refresh was performed.
  • 2026-08-23 — A site audit on 2026-08-23 found a cross-page inconsistency. This page votes Pi-hole out for AdGuard Home, while /articles/self-hosting-essentials/ heads its first section “Pi-hole - Deploy This First, Period”, with no cross-reference either way. Both pages now say the disagreement exists, say why each pick wins its own question, and link to each other. I did not reverse either recommendation.
  • 2026-08-23 — A site audit on 2026-08-23 found that the hand-maintained inline Article JSON-LD carried dateModified 2026-08-19T03:50 while the front-matter lastmod read 2026-08-22T16:19. The page markup and sitemap now carry the same stamp.
  • 2026-08-22 — The Uptime Kuma line still told readers to pin louislam/uptime-kuma:1.23.x while this site’s Uptime Kuma guide and Docker starter stack both pin :2, and 2.5.3 is the current release per the GitHub releases API (published 2026-08-22). I corrected it to :2.
  • 2026-08-22 — I moved the Paperless-ngx pin to the current major: :2 -> :3 (v3.0.0 released 2026-07-22), with the v3 requirement to set PAPERLESS_DBENGINE explicitly (paperless-ngx docs/migration-v3.md). The linked setup guide carries the full compose.
  • 2026-08-24 — Correction to the 2026-08-22 entry above: that pin was wrong. paperless-ngx publishes no bare major tag; GHCR manifest queries return 404 for both :3 and :2, and 200 for :3.0, :3.0.5 and :latest. The compose block here and the two in the linked setup guide would have failed to pull with ‘manifest unknown’. All three now pin :3.0.5 (GitHub releases/latest = v3.0.5, published 2026-08-01T21:59:04Z). I re-checked the v3.0.0 date and the PAPERLESS_DBENGINE requirement above, and both stand.
  • 2026-08-22 — I re-fetched every external citation on 2026-08-22 and checked the claims against them. (1) Immich currency: the page said the current stable is v3.0.3; the GitHub releases API shows v3.1.0 published 2026-07-29 as the newest non-prerelease, so the currency line and both compose pins moved to v3.1.0 (ghcr manifests for immich-server and immich-machine-learning v3.1.0 returned 200). (2) Vaultwarden: the 1.37.0 release notes carry no count; they list eight issues under ten distinct GHSA ids, so ’nine security advisories’ became ’ten GitHub security advisories (eight listed issues)’; 1.37.2 shipped 2026-08-22 and its notes say it is required for 2026.8.0+ clients, so the currency line and the compose pin moved to 1.37.2 (Docker Hub tag 1.37.2-alpine pushed 2026-08-22T12:21Z). (3) The Home Assistant 2026.3 notes say the zstd image change needs Docker 23.0.0 / containerd 1.5.0 and do not mention Synology; the Synology clause stated an inference the source does not make and now states the source’s own version floor. (4) The Jellyfin hardware-acceleration matrix does not call AMD weaker; Jellyfin’s hardware-selection guide does (’the least preferred choice’, ’even on Linux’), so the AMD sentence now cites that page and quotes it. (5) Tailscale’s live pricing page shows the Personal plan at up to 6 users and unlimited user devices, the same numbers this page states, so the clause claiming the limits had moved past them was removed.
  • 2026-08-14 — (1) The Vaultwarden section asserted ’the current stable line is 1.36.x as of early 2026’ and its compose block pinned vaultwarden/server:1.36.0-alpine. I checked the GitHub releases API (retrieved 2026-08-14): 1.37.0 shipped 2026-07-24 with fixes for nine security advisories (two SSRF on the icon endpoint, cross-organization cipher access, organization-policy bypass on directory import, Send access-count bypass, unauthenticated WebSocket flooding, cross-organization secret sharing, organization import authorization, Manager-role data enumeration) and its notes state it ‘is required for support with clients with version 2026.7.0+’; 1.37.1 followed 2026-07-29 fixing organization invites that 1.37.0 broke. The copy-paste compose file pinned to 1.36.0 also contradicted my own Vaultwarden vs Bitwarden page, which already carried 1.37.1. I moved the currency claim and the compose pin to 1.37.1. (2) This page declares a “no ‘:latest’” rule and names Nextcloud AIO as its single exception, then told readers to ‘Pin ghcr.io/advplyr/audiobookshelf:latest’ and ‘Pin lscr.io/linuxserver/bookstack:latest’. Those are two further ‘:latest’ uses beyond the stated exception, described with the word ‘Pin’, which is the opposite of what ‘:latest’ does. Both now name a real release tag (audiobookshelf 2.36.0, 2026-07-27; BookStack 26.05.3, 2026-07-29, both per the GitHub releases API retrieved 2026-08-14).
  • 2026-05-06 — Removed two unfinished photo callouts from the published page while keeping the app list, setup examples and hardware-sizing guidance in place.
  • 2026-05-06 — Content update: Sources lifted into evidence ledger; inline duplicate Sources / Methodology blocks removed.
Corrections
Spotted an error or a stale number? Email contact@techfuelhq.com. Confirmed corrections are recorded here with the date and change.

About the author

Written by Lowell K. Wood IV, who builds and runs TechFuelHQ from St. Louis, Missouri.