Last year my 1Password bill came due at $99. I use maybe 15% of the features — passwords, a few secure notes, and the browser extension. Meanwhile Vaultwarden, the community Rust reimplementation of Bitwarden's server, runs on a Raspberry Pi. So I moved.
Eight months later: same autofill, same sync across devices, same TOTP codes — and my credentials never leave my own hardware. Total cost: $0.
What I Actually Gave Up
Being honest here, because most "I self-hosted my password manager" posts skip this part:
| Feature | 1Password ($99/yr) | Vaultwarden ($0) |
|---|---|---|
| Autofill (browser + mobile) | ✅ | ✅ (Bitwarden apps) |
| TOTP codes | ✅ | ✅ |
| Cross-device sync | ✅ | ✅ (instant via WebSocket) |
| Emergency access | ✅ | ❌ (workaround: encrypted export to a trusted person) |
| Watchtower breach alerts | ✅ | ⚠️ Partial (Bitwarden app reports work against your vault) |
| Travel mode | ✅ | ❌ (never used it) |
| Support when it breaks | ✅ | ❌ (you are the support) |
The two real losses are emergency access and support. I solved the first with a quarterly encrypted export stored with family. The second I accepted — eight months in, nothing has broken.
The Setup (20 Minutes)
Oracle Cloud's Always Free tier gives you a 4-core ARM VM with 24GB RAM. That is absurdly oversized for Vaultwarden, which idles at ~15MB RSS:
docker run -d --name vaultwarden \
-p 8080:80 \
-v ~/vw-data:/data \
-e WEBSOCKET_ENABLED=true \
-e SIGNUPS_ALLOWED=false \
--restart unless-stopped \
vaultwarden/server:latest
Add Caddy in front for TLS (one line: pw.mydomain.com { reverse_proxy localhost:8080 }), point the official Bitwarden apps at your domain, done.
The Part Nobody Mentions
The backup story is better than 1Password's. My vault is a single SQLite file. A cron job rsyncs it to a second machine every night:
0 3 * * * sqlite3 ~/vw-data/db.sqlite3 ".backup '/backup/vw-$(date +\%F).db'" && rsync -a /backup/ user@otherhost:/backups/
With 1Password, "backup" means trusting their incident response. With Vaultwarden, I can sqlite3 db.sqlite3 .dump and read every credential in plaintext JSON in 4 seconds. Try that with a hosted service.
Would I Go Back?
No. But I'll say the quiet part: if you can't recover a Linux box from a bad Docker upgrade at 2am, pay the $99. The $0 price tag assumes you are the on-call engineer. For most devs reading this, that's fine. For my parents, it isn't.
I sketched the migration checklist and the Caddy config with MonkeyCode (free AI coding tool): https://ly.cyberserval.tech/iIETXiF
What's your line for self-hosting vs paying? For me it's passwords: yes. Email: absolutely not. Where's yours?
Top comments (0)