5 Apps You Should Self-Host Right Now (And How)

5 Apps You Should Self-Host Right Now (And How)

The five best apps to self-host in 2026 for privacy, savings, and independence. Includes step-by-step deployment instructions for each one.

Not every app is worth self-hosting. Some are genuinely painful to run. Some offer almost no advantage over their cloud cousins. Some are just masturbation dressed up as infrastructure.

But these five? These are the ones that actually click. They’re surprisingly easy to deploy, immediately useful, and they save you real money or give you real privacy. Each one replaces a paid service you’re probably throwing money at right now.

Let’s go.


1. Vaultwarden — Your Password Manager

Replaces: Bitwarden ($10/year), 1Password ($36/year), LastPass ($36/year) RAM usage: ~50 MB Difficulty: ⭐ Easy

Here’s the thing: your passwords are literally the keys to your life. If you’re still storing them on someone else’s server, I don’t know what to tell you.

Self-host your password manager. Make it the first thing you deploy. Full stop.

Vaultwarden is a lightweight Rust-based Bitwarden server. Same API, same compatibility with all the Bitwarden apps (desktop, mobile, browser extensions), but running on your hardware. It uses almost nothing in terms of resources.

Why This Actually Matters

I get it—password managers are already encrypted, so what’s the big deal? Here’s the thing though:

  • Your vault data stays on your server. A breach at their datacenter? Doesn’t touch you.
  • No subscription. Forever. Not $10/year, not $36/year—zero.
  • You control your own backups and encryption strategy. You’re not praying some SaaS company knows what they’re doing.
  • Works with every official Bitwarden client seamlessly. No compromises on the UX side.

I migrated mine about 18 months ago and honestly forgot I even owned it. That’s how much it just works.

Deploy Vaultwarden

# docker-compose.yml
services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    volumes:
      - ./data:/data
    environment:
      - DOMAIN=https://vault.yourdomain.com
      - SIGNUPS_ALLOWED=true  # Set to false after creating your account!
      - WEBSOCKET_ENABLED=true
    ports:
      - "8080:80"

If you’re behind a reverse proxy like Traefik or Coolify, use their labels and drop the ports section.

Post-Deploy Setup

  1. Open https://vault.yourdomain.com and make an account
  2. Go back to your compose file and set SIGNUPS_ALLOWED=false. Don’t skip this step. Seriously.
  3. Redeploy: docker compose up -d
  4. On your phone/desktop, open Bitwarden, go to Settings → Self-hosted → Server URL, point it at your domain
  5. Import your existing passwords from wherever they live now
  6. Set up regular backups of that ./data folder

Backup note: It’s all SQLite. A simple cp -r ./data ./data.backup once a week is a complete backup. I automate this with a cron job.


2. Immich — Your Photo Library

Replaces: Google Photos ($30/year for 100GB), iCloud ($12/year for 50GB), Amazon Photos RAM usage: ~500 MB (with ML), ~200 MB (without) Difficulty: ⭐⭐ Moderate

Immich is probably the most impressive piece of self-hosted software I’ve seen. Google Photos replacement that’s so good you actually want to leave Google. The mobile app is gorgeous. Uploads are fast. The AI search? Genuinely works.

Why Self-Host Your Photos?

Look. Google doesn’t just keep your photos. They scan them. For “features” supposedly, but really for training their ad machine. You’re locked into their ecosystem. Storage costs pile up. And if your account gets flagged for some reason, your entire photo history vanishes.

I had a friend get locked out of their Google account. It took three weeks to get it back. Three weeks without access to 20 years of photos.

With Immich, that’s physically impossible. Your photos are on your server.

Deploy Immich

Immich is a bit more complex—it’s got several services working together. Grab their official compose file:

mkdir -p ~/apps/immich && cd ~/apps/immich

# Get the official compose and env files
wget https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env

Edit .env:

# .env
UPLOAD_LOCATION=./library
DB_PASSWORD=your-secure-password-here
IMMICH_VERSION=release
docker compose up -d

Post-Deploy Setup

  1. Hit http://your-server:2283
  2. Create an account
  3. Install the Immich app on your phone
  4. Turn on automatic backup from your camera roll
  5. Dump your existing photos in via the web UI or their CLI tool if you’ve got thousands

A Real Talk About Storage

Photos take up space. Plan for it:

  • Casual user taking 30-40 photos a month? ~50 GB a year
  • Every photo you take plus your partner’s? ~150-200 GB a year
  • You’ve got a DSLR habit? Expect 500+ GB a year

Solution: Use a VPS with attached block storage, or mount an NFS share from your home. I went the NFS route and haven’t looked back.

Neat trick: Immich can point at existing photo folders without copying them. If you’ve already got a massive photo library sitting on a drive somewhere, just point Immich at it.


3. Uptime Kuma — Your Monitoring Dashboard

Replaces: UptimeRobot (free tier sucks, Pro $7/month), Pingdom ($15/month), Better Stack RAM usage: ~100 MB Difficulty: ⭐ Easy

Here’s a dark truth: when you self-host, you’re the sysadmin now. If Vaultwarden goes down at 2 AM on a Tuesday, nobody’s waking up to fix it but you.

Uptime Kuma is a sleek self-hosted monitor that watches your services and screams at you when something’s down. Beautiful charts, multiple alert channels, and it’s stupid simple to set up.

I deployed this three years ago and found out within five minutes that my old media server was actually offline and had been for weeks. Nobody had noticed. That’s the value right there.

What It Actually Does

  • Monitors HTTP, TCP, DNS, Docker containers, keyword matches, basically everything
  • Sends alerts via email, Discord, Telegram, Slack, and 90+ other services
  • Public status pages you can share with users
  • Tracks response time history so you can spot slowdowns before they become problems

Deploy Uptime Kuma

# docker-compose.yml
services:
  uptime-kuma:
    image: louislam/uptime-kuma:1
    container_name: uptime-kuma
    restart: unless-stopped
    volumes:
      - ./data:/app/data
    ports:
      - "3001:3001"
docker compose up -d

Post-Deploy Setup

  1. Open http://your-server:3001
  2. Make an account
  3. Add monitors for each of your self-hosted apps (HTTP checks are easiest)
  4. Set up notifications—Discord webhooks take 30 seconds
  5. Create a public status page at status.yourdomain.com

What Should You Monitor?

At a minimum:

  • Each self-hosted app (HTTP ping)
  • Your VPS itself (ICMP ping)
  • SSL certificate expiry—this is the one that bites you at 3 AM
  • DNS resolution (DNS type check)
  • Disk space running low (Docker integration)

4. Plausible Analytics — Your Website Analytics

Replaces: Google Analytics (free but a privacy nightmare), Fathom ($14/month), Simple Analytics ($9/month) RAM usage: ~200 MB Difficulty: ⭐⭐ Moderate

Google Analytics is the default for websites. Also the default for invasive data collection that requires cookie banners.

Plausible is a lightweight alternative. The tracking script is under 1KB. Google’s is 45KB+. Plausible doesn’t use cookies. Plausible is GDPR-compliant by design, so no legal gray zone. And honestly? You get all the numbers that actually matter for a website. Everything else is just noise.

Why Self-Host Analytics?

  • No cookie banner nonsense—you’re not tracking individual users
  • Privacy first—you’re not siphoning visitor data off to Google
  • Lightweight—1KB vs 45KB means your site stays fast
  • Data lives with you—not sold to advertisers by some SaaS company
  • The dashboard is clean and simple—you see what matters at a glance

I switched a year ago and haven’t missed Google Analytics for a second. Actually, I like looking at it now.

Deploy Plausible

Plausible maintains an official self-hosting setup. Basic deploy:

mkdir -p ~/apps/plausible && cd ~/apps/plausible

# Clone their self-hosting repo
git clone -b v2.1.4 --single-branch https://github.com/plausible/community-edition plausible-ce
cd plausible-ce

Set up the environment:

# Generate a secret key
openssl rand -base64 48

# Edit plausible-conf.env
BASE_URL=https://analytics.yourdomain.com
SECRET_KEY_BASE=your-generated-key
TOTP_VAULT_KEY=another-generated-key
docker compose up -d

Post-Deploy Setup

  1. Go to https://analytics.yourdomain.com
  2. Make an account and add your site
  3. Add this to your website (in the <head>):
<script defer data-domain="yourdomain.com" src="https://analytics.yourdomain.com/js/script.js"></script>
  1. Set up email reports and custom goals
  2. If you’re coming from Google Analytics, Plausible can import your historical data

5. Gitea/Forgejo — Your Code Hosting

Replaces: GitHub (free tier has limitations, Team $4/user/month), GitLab SaaS, Bitbucket RAM usage: ~150 MB Difficulty: ⭐ Easy

GitHub is great. But does Microsoft really need to host your private code? Gitea (or better yet, Forgejo, the community fork) is a full Git hosting platform that looks and feels exactly like GitHub. On your own server.

Why Self-Host Your Code?

  • Private repos without artificial limits—GitHub’s free tier throttles CI minutes
  • No vendor lock-in—your code, your server
  • Built-in CI/CD—Gitea Actions are GitHub Actions-compatible
  • Package registry—host your own npm/Docker/Maven packages
  • Issue tracking and project boards native to the platform

Deploy Forgejo

I recommend Forgejo over Gitea because it’s more aggressively committed to staying open-source:

# docker-compose.yml
services:
  forgejo:
    image: codeberg/forgejo:10
    container_name: forgejo
    restart: unless-stopped
    volumes:
      - ./data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    environment:
      - USER_UID=1000
      - USER_GID=1000
    ports:
      - "3000:3000"
      - "2222:22"  # SSH for git operations
docker compose up -d

Post-Deploy Setup

  1. Open http://your-server:3000—the installer walks you through everything
  2. Create your admin account
  3. Set up SSH keys so you can git push without typing passwords
  4. Migrate your GitHub repos (Forgejo has a built-in importer that handles everything)
  5. Set up Forgejo Actions if you want CI/CD (totally optional)

Migrating from GitHub

The migration tool pulls:

  • Full repo history
  • Issues and pull requests
  • Labels, milestones, releases
  • Wiki pages

Go to “New Migration” in the web UI, paste your GitHub repo URL, and it handles the rest.


Bonus: The Complete Stack

Here’s your self-hosted empire with all five running:

AppDomainPortPurpose
Vaultwardenvault.yourdomain.com8080Passwords
Immichphotos.yourdomain.com2283Photos
Uptime Kumastatus.yourdomain.com3001Monitoring
Plausibleanalytics.yourdomain.com8000Web analytics
Forgejogit.yourdomain.com3000Code hosting

Total RAM: ~1 GB. Fits comfortably on a $6/month 4GB VPS with room to spare.

Monthly cost: $6 VPS + $1 domain = $7/month

Services you’re replacing: $100+ a month in SaaS

That’s a 93% savings, plus you get privacy, control, and actual independence.


Getting Started

New to self-hosting? Start with our How to Self-Host Everything: A 2026 Beginner’s Guide for the full VPS and Docker walkthrough.

Also check out our Coolify vs CapRover vs Dokku comparison—these deployment platforms can make spinning up all five apps a one-click operation.

Pick one from this list. Deploy it this weekend. Once you see how stupid-easy it is, you’ll be hooked.

💡 One more thing: If you’re hitting these services remotely, use a VPN. NordVPN with Meshnet lets you reach your self-hosted apps from anywhere without exposing ports to the internet. Check out our Best VPN for Self-Hosters guide for a full breakdown.

Welcome to the self-hosted life. 🏠

Stay in the loop 📬

Get self-hosting tutorials, tool reviews, and infrastructure tips delivered to your inbox. No spam, unsubscribe anytime.

Join 0 self-hosters. Free forever.