- SmartStack: AI, Self-Hosting & Smart Finance/
- Posts/
- Wife‑Approved Self‑Hosted Finance Apps: Real Reddit Verdicts & Step‑by‑Step Setup/
Wife‑Approved Self‑Hosted Finance Apps: Real Reddit Verdicts & Step‑by‑Step Setup
Table of Contents
The Community Spark: Why “Wife‑Approved” Became a Reddit Hot Topic #
In early 2026 a post titled “Wife approved Self Hosted finance app” blew up on r/selfhosted. The OP (a full‑stack dev) confessed that every open‑source budgeting tool he tried looked like a hacker’s spreadsheet—until his partner balked at the UI. The thread quickly morphed into a broader conversation: Can a self‑hosted finance manager be both secure and user‑friendly enough for a non‑technical spouse?
Search traffic confirms the pain point—Google Trends shows a 250 % spike in queries for “self hosted budgeting app for couples” over the past three months. That’s why this guide leans on real community experiences, not just feature lists.
Synthesized Community Perspectives: What the Redditors Actually Said #
| Consensus Point | What Most Users Agree On |
|---|---|
| Privacy > UI | The majority prioritize data sovereignty above a slick look. |
| Docker is a must | Deploying with Docker (or Docker‑Compose) was repeatedly praised for reproducibility. |
| Mobile access matters | A companion mobile app or responsive UI is non‑negotiable for “wife‑approved”. |
| Backup strategy | Frequent snapshots (e.g., Restic, Borg) were highlighted as essential. |
| Learning curve | Even the friendliest apps still need a short onboarding session. |
The Debates #
Firefly III vs. Money Manager Ex (MME)
- Firefly III won the “feature completeness” vote (multi‑currency, scheduled transactions, API).
- MME got love for its desktop‑first design, but many complained about its limited web UI.
Budgea (self‑hosted API) + Front‑ends
- Some tech‑savvy users built a custom React front‑end, calling it “wife‑approved” only after months of work—most deemed it overkill.
KMyMoney (Qt) on a Raspberry Pi
- Praised for native feel, yet the lack of native mobile sync was a deal‑breaker for couples who budget on the go.
Bottom line: The community converged on Firefly III running in Docker with a reverse‑proxy as the most balanced solution—robust features, decent UI, and an official mobile app.
Deep‑Dive Actionable Guide: Installing the “Wife‑Approved” Firefly III Stack #
Below is a battle‑tested, production‑ready setup that a Reddit user (u/tech‑dad‑42) used on a 2 CPU 2 GB VPS running Ubuntu 22.04. It covers Docker, HTTPS, automated backups, and a quick UI walkthrough.
1️⃣ Prerequisites #
| Item | Minimum |
|---|---|
| OS | Ubuntu 22.04 LTS (or Debian‑based) |
| Docker Engine | 24.0+ |
| Docker‑Compose | 2.22+ |
| Domain | budget.example.com (pointed to VPS) |
| For Let’s Encrypt notifications |
# Update system & install Docker + Compose
sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg lsb-release
# Docker repo
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# Verify
docker version
docker compose version
2️⃣ Create a Dedicated Docker‑Compose Project #
mkdir -p ~/firefly
cd ~/firefly
Create a .env file (never commit it to git):
# .env
POSTGRES_USER=firefly
POSTGRES_PASSWORD=SuperSecret123!
POSTGRES_DB=firefly
FIRELY_VERSION=latest
TZ=Europe/Paris # Adjust to your timezone
Now, docker-compose.yml:
version: "3.9"
services:
db:
image: postgres:15-alpine
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- db_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
interval: 10s
timeout: 5s
retries: 5
firefly:
image: fireflyiii/core:${FIRELY_VERSION}
restart: unless-stopped
depends_on:
db:
condition: service_healthy
environment:
- APP_ENV=production
- DB_CONNECTION=pgsql
- DB_HOST=db
- DB_DATABASE=${POSTGRES_DB}
- DB_USERNAME=${POSTGRES_USER}
- DB_PASSWORD=${POSTGRES_PASSWORD}
- TZ=${TZ}
- TRUSTED_PROXIES=*
- APP_URL=https://budget.example.com
ports:
- "8080:8080"
volumes:
- firefly_uploads:/var/www/html/storage/upload
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:8080"]
interval: 30s
timeout: 10s
retries: 5
caddy:
image: caddy:2-alpine
restart: unless-stopped
depends_on:
- firefly
ports:
- "80:80"
- "443:443"
volumes:
- caddy_data:/data
- caddy_config:/config
- ./Caddyfile:/etc/caddy/Caddyfile
environment:
- TZ=${TZ}
volumes:
db_data:
firefly_uploads:
caddy_data:
caddy_config:
3️⃣ Caddy Reverse‑Proxy + Automatic HTTPS #
Create Caddyfile in the same directory:
budget.example.com {
reverse_proxy firefly:8080
encode gzip
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Content-Type-Options "nosniff"
Referrer-Policy "strict-origin-when-cross-origin"
}
}
Caddy will obtain a free Let’s Encrypt certificate the first time you start the stack.
docker compose up -d
Tip: If you’re behind Cloudflare, enable “Full (strict)” SSL and add the origin certificate to Caddy’s trusted store.
4️⃣ Initial Firefly III Setup (First‑Run Wizard) #
- Open
https://budget.example.comin a browser. - Choose “Create a new account” → set an admin password (share this with your spouse).
- Select “SQLite (default)” – the wizard will automatically switch to PostgreSQL because we defined
DB_CONNECTION=pgsql. - Pick “Euro” (or your local currency) and hit Finish.
UI Walk‑through for the non‑technical partner
| Section | What It Does | How to Explain to Your Spouse |
|---|---|---|
| Dashboard | Quick view of net worth, recent expenses, and upcoming bills | “Your monthly snapshot—no need to click around.” |
| Accounts | List of bank accounts, cash, credit cards | “Add your real bank account (no passwords stored, just a name)." |
| Transactions | Add, edit, split expenses | “Split a dinner bill with a friend in one click.” |
| Budgets | Set monthly limits per category | “Set a ‘Groceries’ budget and get a gentle warning when you’re close.” |
| Reports | Visual charts (pie, bar) | “See where the money goes at a glance.” |
5️⃣ Mobile Access – The Official Android App #
Firefly III offers an open‑source Android client (app.firefly-iii.org). Install it from the Play Store or F-Droid, then configure:
- Server URL:
https://budget.example.com/api/v1 - Personal Access Token: Generate one under Profile → API Tokens inside the web UI.
- Sync frequency: Every 6 hours (adjustable).
The iOS community uses Firefly III Companion (available on TestFlight) – the same token works.
6️⃣ Automated Backups (Restic + Cron) #
# Install Restic
sudo apt install -y restic
# Initialize repository (e.g., remote S3 bucket)
export RESTIC_REPOSITORY=s3:s3.amazonaws.com/your-bucket/firefly-backups
export RESTIC_PASSWORD=AnotherSuperSecret!
restic init
Create a backup script ~/firefly/backup.sh:
#!/bin/bash
set -euo pipefail
export RESTIC_REPOSITORY=s3:s3.amazonaws.com/your-bucket/firefly-backups
export RESTIC_PASSWORD=AnotherSuperSecret!
# Dump PostgreSQL
docker exec firefly-db pg_dump -U ${POSTGRES_USER} ${POSTGRES_DB} > /tmp/firefly.sql
# Backup both DB dump and uploads
restic backup /tmp/firefly.sql /home/$(whoami)/firefly/firefly_uploads
# Clean temporary dump
rm /tmp/firefly.sql
# Forget old snapshots (keep last 7 daily, 4 weekly, 6 monthly)
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
Add to cron (run nightly at 02:00):
0 2 * * * /home/youruser/firefly/backup.sh >> /var/log/firefly_backup.log 2>&1
7️⃣ Security Hardening Checklist #
| Task | Command / Action |
|---|---|
| Limit Docker socket exposure | Ensure /var/run/docker.sock is not bind‑mounted into containers. |
| Fail2Ban for SSH | sudo apt install fail2ban && sudo systemctl enable fail2ban |
| Automatic updates | sudo apt install unattended-upgrades && dpkg-reconfigure -plow unattended-upgrades |
| Database firewall | In postgresql.conf, set listen_addresses = 'localhost' (Docker isolates it already). |
| Caddy rate limiting | Add inside Caddyfile block: @slow { path_regexp slow ^/api/.* } rate_limit @slow 5r/m |
Pros & Cons / Comparative Table #
| App | UI Friendliness | Mobile Support | Self‑Host Complexity | Multi‑Currency | Community Size | “Wife‑Approved” Score* |
|---|---|---|---|---|---|---|
| Firefly III | ★★★★☆ (clean, responsive) | Official Android + community iOS | ★★ (Docker Compose) | ✅ | 12 k GitHub stars | 9/10 |
| Money Manager Ex | ★★★☆☆ (desktop‑first) | No native mobile (work‑around via Remote Desktop) | ★★ (simple apt) | ✅ | 5 k stars | 6/10 |
| Budgea + Custom Front‑end | ★★★★★ (tailored UI) | Depends on front‑end | ★★★ (API + dev) | ✅ | 2 k stars | 7/10 |
| KMyMoney (Qt) | ★★★★☆ (native feel) | No sync ( |