Skip to main content

Self-Host Firefly III: Personal Finance Manager 2026

·OSSAlt Team
firefly-iiipersonal-financebudgetingself-hostingdocker2026

TL;DR

Firefly III (AGPL 3.0, ~16K GitHub stars, PHP) is a comprehensive self-hosted personal finance manager using double-entry bookkeeping — the same accounting method used by professional accountants. Track all transactions, set budgets, monitor bills, and generate detailed reports. Mint shut down in 2023; Copilot charges $9.99/month; YNAB charges $14.99/month. Firefly III gives you more detailed financial tracking than any of them, free, on your own server.

Key Takeaways

  • Firefly III: AGPL 3.0, ~16K stars, PHP — double-entry bookkeeping with full transaction history
  • Rules engine: Auto-categorize and tag transactions based on patterns
  • Bills tracking: Track recurring bills and get notified when they're due
  • Budgets: Set spending limits per category per month
  • Reports: Customizable charts — spending over time, categories, account balances
  • Fixer companion: Optional data importer to auto-import from banks (via Nordigen/SimpleFIN)

Firefly III vs Actual Budget

FeatureFirefly IIIActual Budget
Accounting methodDouble-entryEnvelope/zero-based
Best forDetailed tracking, multiple accountsZero-based budgeting, YNAB users
ComplexityMore complex setupSimpler UI
ReportsExtensiveBasic
Bank syncVia companion appSimpleFIN/GoCardless
Mobile appPWA + third-partyPWA
Rules engineAdvancedBasic

Part 1: Docker Setup

# docker-compose.yml
services:
  app:
    image: fireflyiii/core:latest
    container_name: firefly-iii
    restart: unless-stopped
    ports:
      - "8080:8080"
    volumes:
      - firefly_upload:/var/www/html/storage/upload
    environment:
      APP_ENV: production
      APP_KEY: "${APP_KEY}"             # 32-char random key
      APP_URL: "https://money.yourdomain.com"
      DEFAULT_LANGUAGE: "en_US"
      DEFAULT_LOCALE: "equal,en_US"
      TZ: "America/Los_Angeles"
      TRUSTED_PROXIES: "**"
      DB_CONNECTION: pgsql
      DB_HOST: db
      DB_PORT: 5432
      DB_DATABASE: firefly
      DB_USERNAME: firefly
      DB_PASSWORD: "${DB_PASSWORD}"
      MAIL_MAILER: smtp
      MAIL_HOST: mail.yourdomain.com
      MAIL_PORT: 587
      MAIL_FROM: firefly@yourdomain.com
      MAIL_USERNAME: firefly@yourdomain.com
      MAIL_PASSWORD: "${MAIL_PASSWORD}"
      MAIL_ENCRYPTION: tls
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:15-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: firefly
      POSTGRES_USER: firefly
      POSTGRES_PASSWORD: "${DB_PASSWORD}"
    volumes:
      - db_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U firefly"]
      interval: 10s
      start_period: 20s

  # Cron for recurring transactions:
  cron:
    image: alpine:latest
    restart: unless-stopped
    command: sh -c "echo '0 3 * * *  wget -qO- http://app:8080/api/v1/cron/CRON_TOKEN' | crontab - && crond -f -L /dev/stdout"
    depends_on:
      - app

volumes:
  firefly_upload:
  db_data:
# Generate APP_KEY:
docker run --rm fireflyiii/core:latest php artisan key:generate --show
# → base64:xxxx...

docker compose up -d

Part 2: HTTPS with Caddy

money.yourdomain.com {
    reverse_proxy localhost:8080
}

Visit https://money.yourdomain.com → create admin account.


Part 3: Account Setup

Asset accounts

These are your real accounts:

  1. Accounts → + Create new account
  2. Type: Asset account (checking, savings, investment)
  3. Name: Chase Checking, High-Yield Savings
  4. Opening balance + date

Expense accounts

Where money goes:

  1. Type: Expense account
  2. These are created automatically when you add transactions
  3. Examples: Amazon, Whole Foods, Shell, Netflix

Revenue accounts

Where money comes from:

  1. Type: Revenue account
  2. Examples: Employer Inc, Freelance Client, Dividend income

Part 4: Transactions

Add a transaction

  1. Transactions → + Create new transaction
  2. Type: Withdrawal (expense), Deposit (income), or Transfer (between accounts)
  3. From: Chase Checking
  4. To: Whole Foods (auto-creates expense account)
  5. Amount: 87.43
  6. Category: Groceries
  7. Date, description, tags

Transaction types explained

Withdrawal:  Money leaves your asset account
             Chase Checking → Whole Foods (-$87.43)

Deposit:     Money enters your asset account
             Employer Inc → Chase Checking (+$5,000)

Transfer:    Between your own accounts
             Chase Checking → High-Yield Savings (-$500)
             (No net change to your total)

Part 5: Rules Engine

Auto-categorize transactions based on patterns:

  1. Rules → + Create rule
  2. Trigger: Transaction is created
  3. Conditions:
    • Description contains: NETFLIX
    • OR description contains: SPOTIFY
  4. Actions:
    • Set category: Subscriptions
    • Set budget: Entertainment
    • Add tag: auto-categorized
# Example rules:
Rule: "Grocery stores"
Conditions:
  - description contains: TRADER JOE
  - OR description contains: WHOLE FOODS
  - OR description contains: KROGER
Actions:
  - category: Groceries
  - budget: Food

Rule: "Utilities"
Conditions:
  - description contains: PACIFIC GAS
  - OR description contains: ELECTRIC
Actions:
  - category: Utilities
  - budget: Housing

Part 6: Import Transactions

CSV import (manual)

  1. Export transactions from your bank (CSV/OFX)
  2. Import → CSV file
  3. Map columns: Date, Description, Amount, Account
  4. Rules auto-apply during import

Firefly III Importer (companion app)

# Add to docker-compose.yml:
services:
  importer:
    image: fireflyiii/data-importer:latest
    container_name: firefly-importer
    restart: unless-stopped
    ports:
      - "8081:8080"
    environment:
      FIREFLY_III_URL: "http://app:8080"
      FIREFLY_III_ACCESS_TOKEN: "your-personal-access-token"
      # For Nordigen (European banks):
      NORDIGEN_ID: "your-nordigen-id"
      NORDIGEN_KEY: "your-nordigen-key"
      # For SimpleFIN (US banks):
      SIMPLEFIN_TOKEN: "your-simplefin-token"

Part 7: Budgets and Bills

Budgets

  1. Budgets → + Create budget
  2. Name: Groceries
  3. Monthly amount: $500

Budget progress bar shows: Spent / Budgeted

Bills (recurring expenses)

Track recurring bills and get notified:

  1. Bills → + Create bill
  2. Name: Netflix
  3. Amount: ~$15.49
  4. Repeat period: Monthly
  5. Expected date: Day 5 of month
  6. Associated accounts: Credit Card

Firefly III matches transactions to bills automatically and shows upcoming bills in the dashboard.


Part 8: Reports

Budget report

Shows spending vs budget per category, per month.

Expense report

Categories breakdown:
- Groceries: $487 (97% of budget)
- Entertainment: $234 (117% of budget — over!)
- Transportation: $312 (104% of budget — slightly over)
- Utilities: $148 (99% of budget)

Net worth over time

Charts your total assets minus liabilities over months/years.

Category report

Drill down into any category — see every transaction in Groceries for the past 3 months.


Maintenance

# Update:
docker compose pull
docker compose up -d

# Database backup:
docker exec firefly-iii-db-1 pg_dump -U firefly firefly \
  | gzip > firefly-db-$(date +%Y%m%d).sql.gz

# File upload backup:
tar -czf firefly-uploads-$(date +%Y%m%d).tar.gz \
  $(docker volume inspect firefly-iii_firefly_upload --format '{{.Mountpoint}}')

# Logs:
docker compose logs -f app

See also: Actual Budget — simpler zero-based budgeting alternative

See all open source finance tools at OSSAlt.com/categories/finance.

Comments