U4 / 12 guides
Apps under test
Password managers, photo libraries, media servers, document scanners, Git forges, mail and local AI. Installed from the upstream compose file, pinned to a version, and measured at idle and under a stated workload.

- 2026-11-011.37.4Vaultwarden behind Caddy: RAM, sync times and hardeningVaultwarden 1.37.4 plus Caddy used 19.4 MiB idle and 52.0 MiB after 2,000 items were added, with a sampled peak of 117 MiB under load. A full sync of 2,000 items took a median of 102 ms on loopback (68 to 118 ms over 3 runs; an earlier run of the same script gave 70 ms). With
SIGNUPS_ALLOWED=false(the compose default here) a new signup was refused with HTTP 400, with noADMIN_TOKENthe admin page was disabled, and an argon2-hashedADMIN_TOKENworked through Compose when every$was written as$$. - 2026-11-0133.0.10Nextcloud vs Seafile: upload, download, RAM and diskOn this test box Seafile CE 14.0.9 was faster with many small files (median 77.5 s up and 12.8 s down for 1,000 files, against 113.0 s and 53.8 s for Nextcloud 33.0.10), while Nextcloud had the lower median for one 512 MiB upload (2.0 s against 3.5 s, but the ranges overlap: 1.8 to 4.1 s against 3.5 to 4.1 s) and idled in about half the RAM (282 MiB against 554 MiB). Disk growth was within 1 % between them.
- 2026-11-013.3.5Immich on 6 GB RAM: import 500 photos with ML on and offOn a 4 vCPU, 6 GB VM, Immich 3.3.5 cleared every job queue for 500 generated photos in 321 s with machine learning enabled and 95 s with it disabled (one run each; an earlier run of the same script gave 349 s and 101 s). The four containers peaked at 3,855 MiB with ML and 2,760 MiB without, so the 6 GB minimum in the docs was enough for this run; the images were abstract shapes, so real photos may cost more.
- 2026-11-0112.4.0.0Jellyfin CPU transcoding on 4 vCPU: how many streams?On 4 vCPU of a shared AMD Ryzen 5 PRO 3600 host, Jellyfin 12.4 software-transcoded 1080p H.264 to 720p H.264 with up to 13 streams at once before the slowest fell below real time (0.93x at 14), and 10 streams from a 1080p HEVC file. Direct play of the same files used under 1 % of one vCPU. The host was busy (load average 8.6 at the start), so the ceilings could move by about a stream. This says nothing about Quick Sync or any GPU.
- 2026-11-013.4.1Paperless-ngx OCR speed: 100 scanned pages on 4 vCPUOn 4 vCPU Paperless-ngx 3.4.1 consumed 100 image-only pages (10 documents) in 272 s, about 2.7 s per page, with all containers peaking at 1,022 MiB. Against the text drawn on the pages the OCR had a median word error rate of 0.08 %, and 10 of 10 exact-phrase searches found the right document, but the pages were clean, generated renderings and real scans will do worse.
- 2026-11-012.5.9Uptime Kuma vs Gatus vs Beszel on 10 checksFor plain HTTP checks, Gatus was the lightest here (8.6 MiB with 10 checks at 60 s) and Uptime Kuma the heaviest (204.0 MiB), but it adds and edits checks in a browser and shows a per-monitor history. Beszel 0.21.1 can also run HTTP checks from its agent, but it is mainly a host-metrics tool and used 19.7 MiB for hub plus agent. All three reported a killed target within 73 s.
- 2026-11-023.15.1Prometheus + Grafana vs Netdata: RAM, disk, setupNetdata is the faster way to see a host: one command and a live dashboard in 7.3 s on this test box, against five actions and 34.9 s (scripted) for Prometheus + Grafana + node_exporter. RAM was close after 50 minutes: Netdata 331.6 MiB and the other stack 360.3 MiB, with Netdata collecting 4,103 dimensions against 568 Prometheus series, so the two are not a like-for-like cost.
- 2026-11-0228.3.0Gitea vs Forgejo vs GitLab: RAM and git speedFor a small self-hosted forge, Gitea (94.5 MiB) and Forgejo (105.6 MiB) cost about the same and pushed the same repo in the same time. GitLab CE needed an 8 GB VM, used 4,217.3 MiB before any repository existed and 172 s to become ready; its push (median 2.50 s) matched the other two, its clone was slower (0.59 s against 0.40 and 0.36), and four of its five API reads were slower than both light forges (project info 100.6 ms against 24.7 and 4.5), with the commit list the only tie.
- 2026-11-021.0.1Self-hosted email: RAM of Stalwart and docker-mailserverOn this test box the mail server itself is cheap: with two mailboxes and no mail yet, Stalwart 1.0.1 used 103.9 MiB, and docker-mailserver 16.0.1 used 37.4 MiB with all spam filtering off and 273.1 MiB with Rspamd plus its legacy filters on. After ten small messages the range was 52.7 to 352.8 MiB for docker-mailserver and 115.4 MiB for Stalwart. Both created mailboxes, accepted local mail over SMTP and served it over IMAP. Whether Gmail or Outlook will accept your mail was not tested and cannot be tested from this lab.
- 2026-11-021.30.4FreshRSS vs Miniflux with 50 feeds and 1,000 entriesBoth readers imported the same 50-feed OPML and reached 1,000 entries per user. Miniflux refreshed everything in a median 1.18 s and used 72.2 MiB including PostgreSQL; FreshRSS took a median 13.50 s but idled at 17.3 MiB in a single container. Both refused to fetch from a private-network feed server until told to allow it.
- 2026-11-0226.09.2BookStack vs Wiki.js: 200 pages, search and backupsBookStack created 200 pages through its API in 57.98 s and found words inside page bodies; Wiki.js took 375.52 s and its default database search matched only titles, descriptions and paths, so a body-only word returned 0 hits. Wiki.js answered searches in about 3 ms against BookStack's roughly 240 ms, but it was searching far less.
- 2026-11-020.40.13Ollama on CPU only: tokens per second on 4 coresWith 4 vCPU and no GPU, Ollama 0.40.13 generated 26 to 28 tokens per second with qwen3:1.7b 13.1 to 13.8 with gemma3:4b and 12.7 to 13.4 with qwen3:4b. qwen3:8b (5.2 GB download) failed in a 6 GB VM: the kernel's out-of-memory killer terminated the model process.