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
-
excalidraw Architecture — typescript, vite, react
Virtual whiteboard application -
cal.com Architecture — Docker, JavaScript, Node.js
Open source scheduling platform used in production -
vaultwarden Architecture — Rust
Unofficial Bitwarden compatible server written in Rust, formerly known as bitwarden_rs -
llama-gpt Architecture — Unknown
Self-hosted ChatGPT-style interface -
open-webui Architecture — Docker, JavaScript, Node.js
ChatGPT-like interface for local and deployed LLMs -
immich Architecture — JavaScript, Node.js
Self-hosted Google Photos alternative -
openhab-core Architecture — Java
Home automation engine using device protocols -
changedetection.io Architecture — Docker, Python
Website change detection and monitoring tool -
documenso Architecture — JavaScript, Node.js, React
Open-source DocuSign alternative -
chatwoot Architecture — Vue.js, Ruby on Rails, ActionCable
chatwooot
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.