Home Server Chronicles: My Docker-Powered Ecosystem — Part 5
The productivity layer: Nextcloud for cloud storage, Immich for photos, Paperless-NGX for documents, Vaultwarden for passwords, and the tools that replaced every SaaS subscription.
In Part 4, I covered the media stack — Jellyfin, Sonarr, Radarr, Lidarr. That layer gives me entertainment. This part covers the layer I actually live in every day: productivity tools that replaced my Google Drive, 1Password, Notion, and a half-dozen other SaaS subscriptions.
The services in this layer:
Nextcloud — Personal cloud storage and office suite
Immich — Self-hosted Google Photos alternative (~401GB of photos)
Paperless-NGX — Document management with OCR and smart tagging
Trilium Notes — Hierarchical knowledge base and daily notes
Linkwarden — Bookmark manager with full-page archival and Meilisearch
BookStack — Wiki for structured documentation
Home Assistant — Home automation hub
Why Self-Host Productivity Tools?
Before I get into configs, the obvious question: why bother?
Here's my honest answer — it's not about saving money (though I do). It's about:
Data sovereignty: My documents, passwords, and notes don't leave my network
No subscription creep: One server bill instead of seven app subscriptions
Tailscale integration: All of these work from anywhere through my VPN — no public exposure needed
Reliability on my terms: I control the update schedule, not the vendor
The tradeoff is real: I own the maintenance burden. But the Batcave runs restart: unless-stopped on everything, and Watchtower handles routine updates. Most weeks I spend zero time on these services.
Nextcloud: The Personal Cloud That Actually Works
Why Nextcloud over alternatives?
I tried Seafile, Syncthing, and a raw rclone setup before landing on Nextcloud. The others are great for sync — but Nextcloud does sync plus calendar, contacts, collaborative docs, and mobile apps.
Nextcloud shares the MariaDB instance from core.yml rather than running a dedicated database. It also mounts both storage drives directly for external storage access.
What I actually use it for
File sync: My Documents, Downloads, and active project folders sync automatically via the Nextcloud desktop client
Photos: Photo management is now handled by Immich (see below) — Nextcloud focuses on file sync
Calendar + Contacts: CalDAV and CardDAV sync to all my devices — phone, laptop, and browser
Collaborative docs: Nextcloud Office (Collabora Online) handles .docx and .xlsx files without leaving the browser
Performance tuning that made a real difference
Nextcloud out-of-the-box is slow. These two changes fixed it:
# Run inside the nextcloud container
php occ maintenance:mode --on
php occ db:add-missing-indices
php occ db:convert-filecache-bigint
php occ maintenance:mode --off
And in config.php, enabling APCu for local caching:
After this, file browser response went from ~2s to ~300ms.
Vaultwarden: Passwords Without the Subscription
The case for self-hosted passwords
Bitwarden is excellent. Vaultwarden is Bitwarden — same clients, same browser extensions, same mobile apps — but the server runs on my hardware, not theirs.
The entire service uses under 10MB of RAM and stores data in a single SQLite file. It's the lightest service in my stack by far.
SIGNUPS_ALLOWED=false is critical — this is a private instance, not a public one. New accounts are created through the admin panel only.
Backup is non-negotiable
The /data directory contains the SQLite database and all attachments. I back this up nightly:
#!/bin/bash
# Vaultwarden backup — runs via cron at 2 AM
DATE=$(date +%Y%m%d)
docker exec vaultwarden sqlite3 /data/db.sqlite3 ".backup '/data/db-backup-$DATE.sqlite3'"
rsync -a ./vaultwarden/data/db-backup-*.sqlite3 /mnt/backup/vaultwarden/
find /mnt/backup/vaultwarden/ -name "*.sqlite3" -mtime +14 -delete
Losing your password manager is a catastrophic failure mode. Two weeks of daily backups, off-server.
Immich: Self-Hosted Google Photos
The Google Photos replacement
Immich is a self-hosted photo and video management platform with ML-powered features. It's one of the most impressive self-hosted projects I've come across — the mobile app feels as polished as Google Photos.
~401GB of photos and videos stored on the 3.6TB internal SSD
ML-powered face recognition and object detection via the dedicated machine learning container
Mobile app: Auto-backup from iOS and Android — seamless
Dedicated PostgreSQL with vector extensions for ML-powered search
External library import: Imported my entire Google Takeout archive
Monitoring
I also run Immich Power Tools for advanced statistics and JellyStat for media analytics across the stack.
Paperless-NGX: The End of Paper Chaos
Problem it solves
I had years of scanned documents (bills, tax forms, insurance papers) sitting in a flat folder structure with inconsistent names. Searching for anything required opening files one by one.
Paperless-NGX ingests documents, runs OCR via Tesseract, extracts dates and content, and makes everything full-text searchable. It also auto-tags based on rules I define.
The /consume folder is the magic: anything dropped there gets processed automatically. I have the Nextcloud desktop client sync a local Scan to Paperless folder to this location. Scan from my phone → document appears in Paperless with OCR within minutes.
Trilium Notes: A Knowledge Base That Grows With You
Why not Obsidian?
Obsidian is great. But Obsidian with sync costs $10/month, and its native sync is Obsidian-to-Obsidian only. Trilium runs entirely in the browser, syncs across all my devices through Tailscale, and has a hierarchical structure that suits how I actually think about notes.
The daily notes template creates a new page each morning with sections for tasks, links, and notes. It's replaced my use of Google Keep, sticky notes, and random text files entirely.
Linkwarden: Bookmarks That Don't Die
The problem with regular bookmarks
Browser bookmarks are local, unsearchable at scale, and the pages they point to can disappear. I've lost valuable articles to link rot more times than I can count.
Linkwarden archives the full page content at save time, making every bookmark permanently readable and full-text searchable.
Linkwarden uses Meilisearch for fast full-text search across all archived bookmarks.
I use the browser extension for quick saves and tag everything on save. My collections: AI/ML, DevOps, Career, Tools, Reading, Reference. Browsing back through them is genuinely useful — the archived content means I can re-read an article even after the original site goes down.
BookStack: Documentation That Lasts
Where Trilium ends, BookStack begins
Trilium is for personal notes — fast, hierarchical, and private. BookStack is for structured documentation I might share or reference formally.
The BookStack runbook has saved me multiple times. When a container behaves unexpectedly at 2 AM, I don't try to remember port numbers — I open the runbook.
How These Services Connect
The productivity layer isn't seven isolated tools — it's a workflow:
Phone scan → Nextcloud sync → Paperless consume → OCR'd, tagged, searchable
↓
BookStack: important docs get pages
↓
Trilium: notes and context links back
Interesting article → Linkwarden (browser ext) → archived + tagged
↓
Trilium note links to archived URL
Any service issue → Netdata + Telegram bot alert → Trilium incident log
↓
BookStack runbook: resolution steps
The Tailscale VPN ties it all together — I access every service on *.jay739.dev from any device, any location, without any of it being publicly exposed.
Resource Usage Reality Check
A common concern: "won't all these services crush a mini PC?"
Here's the actual memory footprint on the Beelink SER8 (12GB RAM):
Total: ~1.6GB for the productivity layer. On a 12GB machine running 56 containers total, memory management matters — but with careful tuning, everything runs comfortably with ~4GB available.
What This Layer Replaced
When I tallied up what I was paying before self-hosting this:
Google One (2TB storage) + Google Photos: $10/month
1Password family: $5/month
Notion team: $8/month
iCloud+ for photos backup: $3/month
That's $26/month — $312/year — for services that are now running on hardware I already own, under my control, with no per-seat limits. The Beelink itself paid for itself within the first year from subscription savings alone.
What's Next
This layer, combined with Immich's 401GB photo library and the media stack from Part 4, means the Batcave handles nearly every aspect of my digital life — all self-hosted, all under my control.