Skip to main content

How to Self-Host Maybe Finance: Open Source Personal Finance 2026

·OSSAlt Team
personal-financebudgetingself-hostingdockerfinance

How to Self-Host Maybe Finance: Open Source Personal Finance in 2026

TL;DR

Mint shut down in 2023. Personal Capital (now Empower) pivoted to wealth management sales. YNAB charges $109/year. Maybe Finance is the open source alternative — a full personal finance platform for tracking accounts, budgets, investments, and net worth. It was originally a commercial product ($249/year) that went open source in early 2024 when the company couldn't raise funding. The codebase is mature (built with Ruby on Rails + React), actively maintained by the community, and self-hostable via Docker. Bank account connections use Plaid or Synth (a European Plaid alternative). If you want a polished Mint replacement that runs on your own server, Maybe Finance is the strongest option in 2026.

Key Takeaways

  • Mint replacement: full personal finance — accounts, transactions, budgets, net worth, investments
  • Went open source in 2024: formerly a $249/year commercial product, now MIT-licensed
  • Bank connections: Plaid (US/Canada) or Synth (Europe) for automatic transaction sync
  • Investment portfolio: track stocks, ETFs, crypto, real estate alongside bank accounts
  • Net worth dashboard: historical net worth chart with all accounts aggregated
  • GitHub stars: 37,000+ (one of the most-starred personal finance projects)
  • License: MIT (open source) — no paid tiers on self-hosted

Why Maybe Finance Over Firefly III or Actual Budget?

FeatureMaybe FinanceFirefly IIIActual Budget
Tech stackRails + ReactPHP + LaravelElectron/Node
UI qualityExcellentGoodGood
Bank sync (auto)✅ (Plaid/Synth)Manual import✅ (SimpleFin)
Investment tracking
Net worth chart
Budgeting✅ (zero-based)
Multi-currency
GitHub stars37K+16K+17K+
Best forMint/Empower replacementManual bookkeepingZero-based budgeting

Maybe Finance wins on UI polish and investment tracking — it looks and feels like a commercial product. Firefly III wins for users who want strict manual control over every transaction. Actual Budget wins for zero-based budgeting discipline (YNAB-style). If you're replacing Mint and want automatic bank sync + investment tracking, Maybe Finance is the clearest choice.


Self-Hosting with Docker Compose

Prerequisites

  • Docker and Docker Compose
  • 2GB RAM minimum
  • Domain with HTTPS (required for Plaid bank connections)

docker-compose.yml

version: "3.8"

services:
  maybe:
    image: ghcr.io/maybe-finance/maybe:stable
    container_name: maybe-finance
    restart: unless-stopped
    ports:
      - "3000:3000"
    env_file: .env
    volumes:
      - maybe_storage:/rails/storage
    depends_on:
      postgres:
        condition: service_healthy

  postgres:
    image: postgres:16-alpine
    container_name: maybe-postgres
    restart: unless-stopped
    environment:
      POSTGRES_DB: maybe_finance_production
      POSTGRES_USER: maybe_finance
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U maybe_finance"]
      interval: 5s
      timeout: 5s
      retries: 5

volumes:
  postgres_data:
  maybe_storage:

.env Configuration

# .env — Required configuration
SECRET_KEY_BASE=your-64-char-secret-key-here
DB_HOST=postgres
DB_PORT=5432
DB_NAME=maybe_finance_production
DB_USERNAME=maybe_finance
DB_PASSWORD=change-this-strong-password

# Application URL (required for session cookies and links)
APP_DOMAIN=finance.yourdomain.com
RAILS_FORCE_SSL=true

# Mailer (for password reset, notifications)
SMTP_ADDRESS=smtp.youremail.com
SMTP_PORT=587
SMTP_USERNAME=finance@yourdomain.com
SMTP_PASSWORD=your-smtp-password
SMTP_DOMAIN=yourdomain.com
MAILER_FROM=finance@yourdomain.com

# Bank data provider (choose one)
# Option A: Plaid (US, Canada, UK — best coverage)
PLAID_CLIENT_ID=your-plaid-client-id
PLAID_SECRET=your-plaid-secret
PLAID_ENV=production   # or 'sandbox' for testing

# Option B: Synth (European banks)
# SYNTH_API_KEY=your-synth-api-key

# Self-hosting mode (disables cloud registration)
SELF_HOSTED=true

Generate the secret key:

openssl rand -hex 64

Start Maybe Finance

docker compose up -d

# Check logs
docker compose logs -f maybe

# Access at http://localhost:3000 (or your domain)
# Create your account on first visit

Maybe Finance runs database migrations automatically on startup. The first user to register becomes the admin.


Setting Up Bank Connections with Plaid

Plaid connects to 12,000+ financial institutions in the US, Canada, and UK. Setting it up:

Get Plaid Credentials

  1. Sign up at dashboard.plaid.com
  2. Create a new application
  3. Copy the client_id and secret (use Production for real accounts, Sandbox for testing)
  4. Plaid's free tier covers up to 100 Items (connected accounts) — sufficient for personal use

Connect Your Bank in Maybe Finance

Accounts → Add Account → Connect via Plaid
→ Search for your bank (Chase, Bank of America, Wells Fargo, etc.)
→ Enter your bank username and password (sent directly to Plaid, never stored by Maybe)
→ Select which accounts to import: Checking, Savings, Credit Cards
→ Transactions sync automatically going forward
→ Historical transactions imported (typically 90 days)

After connection, transactions appear in your Maybe dashboard within minutes. Plaid syncs new transactions nightly.

Manual Account Import (No Plaid)

If you don't want to use Plaid (or you're in a country without Plaid coverage), Maybe Finance supports manual CSV import:

Accounts → Add Account → Manual Account
→ Account type: Checking / Credit Card / Investment / Property / Loan
→ Current balance: $5,234.50
→ Import transactions: Upload CSV (QFX, OFX, or generic CSV format)

Most banks let you export transactions as CSV or OFX. Schedule a monthly import to keep data current.


Tracking Investments and Portfolio Performance

Maybe Finance treats investment accounts like any other account — but adds portfolio tracking:

Accounts → Add Investment Account
→ Choose: Brokerage, IRA, 401k, Crypto
→ Connect via Plaid (pulls holdings from Fidelity, Vanguard, Schwab, etc.)
  OR
→ Manual: Add holdings (AAPL: 50 shares @ $190 avg cost)

Once connected, Maybe Finance:

  • Shows current portfolio value with daily price updates
  • Calculates unrealized gains/losses per position
  • Shows allocation by asset type (stocks, bonds, cash)
  • Tracks portfolio performance vs S&P 500 benchmark
  • Displays total return since you started tracking

For real estate, you can add a property as a manual account with an estimated value. Update periodically with Zillow estimates.


Net Worth Dashboard

The net worth view aggregates all accounts:

Assets:
  Checking accounts: $8,450
  Savings accounts: $45,200
  Investment portfolio: $187,350
  Real estate (estimated): $650,000
  Total assets: $891,000

Liabilities:
  Credit cards: -$2,100
  Auto loan: -$12,400
  Mortgage: -$385,000
  Total liabilities: -$399,500

Net worth: $491,500

The historical net worth chart shows month-by-month trends. Connect all your accounts to get an accurate picture — the value of Maybe Finance compounds as more accounts are connected.


Budgeting

Maybe Finance includes a budgeting module for setting and tracking monthly spending limits:

Budgets → Create Budget → Month: March 2026

Category budgets:
  Groceries: $600
  Dining out: $300
  Transportation: $200
  Entertainment: $150
  Subscriptions: $100
  Utilities: $200

Actual spending is pulled from connected bank transactions.
Categories are auto-tagged based on merchant data from Plaid.

You can edit auto-assigned categories — Maybe Finance learns your corrections over time. Create custom categories for unusual spending (home improvement, medical, etc.).


Transaction Management and Rules

Maybe Finance auto-categorizes transactions from Plaid, but you can fine-tune and automate:

Manual Categorization

Transactions → Select transaction
Category: Groceries → click → change to "Health & Wellness"
Notes: "Doctor copay — not groceries"

Your corrections train the categorization. The same merchant will be correctly categorized in future transactions.

Transaction Tagging

Tags let you track spending across categories — useful for project costs, tax deductions, or tracking spending on a specific goal:

Transaction: AWS bill → $127.30
Tags: #business, #tax-deductible

At year end, filter transactions by #tax-deductible to get your deduction list.

Bulk Import from CSV

For accounts not covered by Plaid (smaller banks, international accounts, crypto exchanges):

Accounts → [Account] → Import → Upload CSV
Column mapping:
  Date: "Transaction Date"
  Amount: "Amount"
  Description: "Description"
  Category: "Category" (optional — Maybe will auto-assign)

Maybe Finance accepts generic CSV, OFX, and QFX export formats from most financial institutions.


Reporting and Data Export

Net Worth Reports

Reports → Net Worth → Select date range
→ Shows monthly net worth snapshots
→ Export as CSV for Excel analysis
→ Shows top accounts by value and growth rate

Spending Reports

Reports → Spending → March 2026
→ Breakdown by category: Groceries 28%, Dining 15%, Transport 12%...
→ Month-over-month comparison
→ Highest-spend merchants this period

Tax Reports

Filter transactions for the tax year and export:

Transactions → Filter: Date range (Jan 1 – Dec 31, 2025)
Filter: Tags includes #tax-deductible
Export → CSV
→ Send to your accountant

Nginx Reverse Proxy with TLS

server {
    listen 443 ssl http2;
    server_name finance.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/finance.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/finance.yourdomain.com/privkey.pem;

    # Restrict to your IPs — this is sensitive financial data!
    allow 192.168.1.0/24;    # Your home network
    allow YOUR_VPN_IP;        # Your VPN exit IP
    deny all;

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Security note: Since Maybe Finance contains your complete financial picture, IP-restricting access is strongly recommended. Use a VPN to access it from anywhere.

certbot --nginx -d finance.yourdomain.com

Security Hardening

Financial data deserves extra security care:

Environment Variable Security

# Never commit .env to version control
echo ".env" >> .gitignore

# Set strict file permissions
chmod 600 .env

# Rotate SECRET_KEY_BASE annually
# When rotated, all sessions are invalidated (users must log in again)
openssl rand -hex 64   # Generate new key
# Update .env, then: docker compose restart maybe

Database Encryption at Rest

# Enable PostgreSQL storage encryption at the volume level
# Using LUKS on Linux:
cryptsetup luksFormat /dev/sdb
cryptsetup open /dev/sdb postgres-encrypted
mkfs.ext4 /dev/mapper/postgres-encrypted
# Mount at the postgres_data volume path

Plaid Credential Security

Plaid tokens are stored in your Maybe Finance database. They're OAuth tokens (not your actual bank passwords). Still, protect your database:

  • Encrypt database backups before uploading to cloud storage
  • Use strong database passwords
  • Keep your server OS patched

Backup and Restore

#!/bin/bash
# backup-maybe.sh
DATE=$(date +%Y%m%d_%H%M)
BACKUP_DIR=/backups/maybe/$DATE
mkdir -p $BACKUP_DIR

# Database backup (contains all transactions, accounts, budgets)
docker compose exec -T postgres pg_dump \
  -U maybe_finance maybe_finance_production \
  | gzip > $BACKUP_DIR/maybe_db.sql.gz

# File storage (uploaded files, exports)
tar -czf $BACKUP_DIR/maybe_storage.tar.gz \
  -C /var/lib/docker/volumes maybe-finance_maybe_storage

# Encrypt before uploading (financial data!)
gpg --symmetric --batch --yes \
  --passphrase "$BACKUP_PASSPHRASE" \
  $BACKUP_DIR/maybe_db.sql.gz

# Upload encrypted backup to B2
rclone copy $BACKUP_DIR b2:my-backups/maybe/

# Keep 30 days locally
find /backups/maybe -type d -mtime +30 -exec rm -rf {} +

echo "Maybe Finance backup complete: $DATE"

Restore

# Decrypt backup
gpg --decrypt maybe_db.sql.gz.gpg | gunzip | \
  docker compose exec -T postgres psql \
  -U maybe_finance maybe_finance_production

Upgrading Maybe Finance

cd /opt/maybe

# Pull latest stable image
docker compose pull maybe

# Restart (migrations run automatically)
docker compose up -d maybe

# Monitor startup
docker compose logs -f maybe | head -30

Maybe Finance uses Rails ActiveRecord migrations — they run on container startup. The stable tag tracks the latest stable release. To pin to a specific version, use the version tag (e.g., ghcr.io/maybe-finance/maybe:0.4.0).


Methodology

  • GitHub data from github.com/maybe-finance/maybe, March 2026
  • Pricing comparisons from YNAB, Personal Capital (Empower) pricing pages, March 2026
  • Setup guide based on Maybe Finance official Docker documentation
  • Version: Maybe Finance latest stable (check GitHub releases for current version)
  • Plaid pricing and coverage from plaid.com/pricing, March 2026

Compare open source Mint alternatives on OSSAlt — bank sync support, budgeting features, and self-hosting difficulty.

Related: How to Self-Host Firefly III: Personal Finance Manager 2026 · Best Open Source Alternatives to YNAB and Mint 2026 · Actual Budget vs YNAB vs Maybe Finance: Personal Finance Tools 2026

Comments