Household finance planning for couples, on equal terms.
PariPari is a self-hosted, open-source app for couples who share expenses. Define your incomes and recurring costs, choose a split method (50/50 or income-weighted), and watch the app calculate everything forward: who contributes what, how much you're saving, when you'll hit goals, and what changes if you adjust any variable.
This is not a transaction tracker—no bank imports, no receipt scanning, no purchase categorization. Think of it as a flight simulator for household finances: change a parameter, see the ripple across monthly cash flow, contribution splits, and net worth trajectory instantly.
- Financial planning and projection for two-partner households
- Configurable expense splits (50/50 or income-weighted, changeable at any time)
- Monthly contribution breakdown: exactly what each partner transfers to shared accounts
- Goals and timelines: when will you reach your targets at the current saving rate?
- What-if scenarios: stack parameter changes (salary raises, expense cuts, new costs) and see the cascade effect
- Multi-currency support with live exchange rates (CHF, EUR, TRY, USD, GBP, more)
- Gold tracking: auto-valued with live spot prices, purity-aware
- Net worth overview: liquid + alternative assets + real estate, in any currency
- Trip budgeting: itemize costs, see impact on goal timelines, decide if it's worth it
- PWA: installable on mobile, works offline for viewing data
- A transaction tracker (no bank imports, no receipt scanning)
- A budgeting app (no category-per-purchase tracking)
- A tax tool
- US-centric (supports multiple currencies and locales from the start)
- Split methods: 50/50 or income-weighted (with optional variable income inclusion)
- Transfer instructions: monthly table showing exactly what each partner should transfer
- Savings projection: compound-growth modeling, goal timelines
- Scenario engine: create named what-if configurations, compare side-by-side
- Multi-currency: view everything in CHF, EUR, TRY, USD, GBP, etc.
- Gold inventory: weight, purity, quantity, auto-valued with live prices
- Net worth tracking: liquid, alternative (gold), real estate, total
- Trip planning: itemized budget, impact analysis
- Full transparency: both partners see and edit everything, no admin/viewer roles
docker compose up -dVisit http://localhost:8080, sign up with any email, and note the invite code shown in settings. Share that code with your partner so they can sign up and join the household.
Set these in your .env file or pass to Docker:
| Variable | Default | Notes |
|---|---|---|
PORT |
8080 |
HTTP port |
DATA_DIR |
./data |
Directory for SQLite database and WAL file |
BASE_URL |
http://localhost:8080 |
Public URL of the app (used for OG meta tags, redirects) |
SECURE_COOKIES |
0 |
Set to 1 when behind TLS (required for production) |
DEV |
0 |
Set to 1 to reload templates from disk (development only) |
- Open the app in your browser
- Sign up: pick any email and password
- You're now in your household; check Settings for the invite code
- Share the code with your partner
- Your partner signs up with the same code to join your household
All settings are configured via the first-run signup flow and the app UI. No config files needed.
- Split method: Choose 50/50 or income-weighted under Household Settings
- Display currency: Switch between CHF, EUR, TRY, USD, GBP from any page
- Exchange rates: Fetched automatically once per day (manual refresh in Settings)
- Gold prices: Auto-updated daily; set a manual override in Settings if needed
- Go 1.20+ (see
app/go.modfor the exact version) - Make
# Download tools and dependencies
make tools
make vendor
# Build CSS (needs make tools)
make css
# Run locally with hot reload (requires air installed)
make dev
# Run tests
make test
# Build a static binary
make build
# Seed demo data (test database only)
make seed
# Build Docker image locally
make docker-buildSee make help for all targets.
Tag and publish a release:
make release name=v0.1The target refuses to run on a dirty tree, with unpushed commits, or on a tag
that already exists; it runs the tests, then tags, pushes, and creates the
GitHub release. Publishing the release triggers the workflow that builds the
Docker image and pushes ghcr.io/mattmezza/paripari:v0.1 and :latest.
CI runs on pull requests only. Nothing is built or published on a plain commit
or a push to main — the release workflow re-runs vet and tests before it
builds, so a tag cut from a broken tree never reaches the registry.
Both workflows run on a self-hosted runner; make sure it is active before opening a PR or releasing.
- Backend: Go, SQLite (pure Go driver, no CGO needed)
- Frontend: htmx, Alpine.js, Tailwind CSS v4, Chart.js
- Deployment: Docker, single container with embedded assets
- PWA: manifest.json, service worker, offline-capable
MIT. See LICENSE file. Copyright 2026 Matteo Merola.
Open an issue or pull request. Larger changes: open an issue first to discuss.
For detailed deployment, architecture, and self-hosting information, see the docs/ directory.
One instance can hold many households and the code keeps them apart, but the operational work for hosting other people (rate limiting, signup policy, resource limits) is not done. If that is your plan, start with docs/multi-tenancy.md.