Self-Hosted App Architecture: How Immich, Jellyfin & Vaultwarden Work Inside

Self-hosted apps have an unusual constraint: they have to run well on a Raspberry Pi, a NAS and a rented VPS, installed by someone who is not the developer, usually with one docker compose file. That constraint shapes the architecture more than any feature list does.

The pages below analyze the real codebases behind the homelab staples, from photo libraries and media servers to password managers and uptime monitors. Module maps, execution flows and diagrams come straight from the source, so you can see how each one handles jobs, storage and upgrades.

Self-Hosted Apps: full architecture breakdowns

Patterns across self-hosted apps

Background workers for the heavy lifting

Thumbnails, transcoding, machine-learning tagging and scheduled checks do not run in the request path. Each app pushes that work to a queue or a worker process so the web UI stays responsive on modest hardware.

Storage you can reason about

Self-hosters back up their data themselves, so these apps keep the storage layout legible: a database for metadata plus plain files on disk, often with SQLite as the zero-configuration default and Postgres as the upgrade.

Compatibility as a feature

Vaultwarden implements the Bitwarden client API, and Jellyfin speaks to a whole ecosystem of existing clients. Reimplementing someone else's protocol means the API layer is the product, and it is usually the most carefully structured part of the code.

Frequently asked questions

What makes self-hosted software architecture different?

It has to run unattended on hardware the developer never sees, be upgraded by non-experts, and keep user data safe across those upgrades. That pushes these apps toward single-container deployment, conservative database migrations and background workers that degrade gracefully on slow machines.

How does Vaultwarden stay compatible with Bitwarden clients?

Vaultwarden is an independent server written in Rust that implements the API the official Bitwarden clients expect. The clients cannot tell the difference, which is why its API and data-model modules are the core of the codebase.

Why do self-hosted apps use SQLite?

SQLite needs no separate server, stores everything in one file that is easy to back up, and is fast enough for a single household. Apps that expect heavier use usually support Postgres as well.

Can I get this analysis for my own codebase?

Yes. These pages are generated by Revibe's codebase analysis. Import a repository from GitHub or upload a zip and you get the same architecture diagrams, module maps and execution flows for your own project.

Explore every analysis in the Revibe Codes gallery, or analyze your own codebase to get the same architecture diagrams, module maps, and execution flows.