Agent-native, plain-text, double-entry accounting for small businesses.
Self-hosted alternative to paid bookkeeping SaaS (Wave Pro, QuickBooks, etc.):
| Piece | Role |
|---|---|
| Beancount 3 | Ledger engine + validation (bean-check) |
| Fava | Web UI: P&L, balance sheet, journal, queries |
| SimpleFIN Bridge | Bank + credit card feeds (~$15/yr, all institutions) |
| Square API | Daily sales, fees, payouts (optional) |
| Rules + agent CLI | Auto-categorize obvious txns; leave ambiguous ones for review |
Your entire ledger is human-readable text in git. That is the most agent-friendly
accounting format there is: agents read/write/grep the ledger, and bean-check
guarantees the books always balance.
This public repo is a clean template with a fictional Demo Cafe ledger. Do not put real business transactions, bank exports, or API secrets here.
git clone https://github.com/Jpalmer95/Account-It.git
cd Account-It
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
bean-check main.beancount # validate demo books
fava main.beancount # web UI on http://127.0.0.1:5000
python scripts/categorize.py --list
python scripts/bank_report.py --year 2025 --asof 2025-01-31main.beancount entry point (options + includes)
accounts.beancount chart of accounts (starter template)
ledger/<year>.beancount transactions, one file per year
importers/
wave_convert.py one-time Wave history migration
square_import.py Square sales/fees/payouts -> ledger
simplefin_import.py bank/CC feeds -> pending '!' entries
simplefin_accounts.yaml SimpleFIN account mapping (edit me)
scripts/
categorize.py agent helpers: --list / --rules / --apply
rules.yaml deterministic payee regex rules
bank_report.py P&L + balance sheet HTML
daily_sync.sh cron-friendly import + rules + commit
examples/ account_map + secrets templates
docs/ chart design + agent workflow notes
Dockerfile Fava container (put behind auth!)
- Fork or clone into a private repo for real books (recommended).
- Edit
option "title"inmain.beancountand rename accounts inaccounts.beancountto match your banks/cards. - Replace or empty
ledger/and start fresh, or migrate from Wave:python importers/wave_convert.py /path/to/accounting.csv \ --map examples/account_map.example.yaml --out ledger/
- Wire bank feeds:
mkdir -p .secrets && chmod 700 .secrets python importers/simplefin_import.py --claim '<SETUP_TOKEN>' # edit importers/simplefin_accounts.yaml with your ACT- ids
- Optional Square sales:
echo 'SQUARE_ACCESS_TOKEN=...' > .secrets/env echo 'SQUARE_TAX_RATE=0.0825' >> .secrets/env # if applicable python importers/square_import.py --since 2025-01-01 --tax-rate 0.0825
- Daily automation: install
scripts/daily_sync.shas a cron job. - Deploy Fava with the Dockerfile behind auth or Tailscale only.
python scripts/categorize.py --rules # deterministic payee rules
python scripts/categorize.py --list # JSON queue of remaining '!' entries
python scripts/categorize.py --apply demo-pending-001 Expenses:Supplies
bean-check main.beancountSee docs/AGENT.md for a full human+LLM review pattern.
Keep private (never commit to a public fork):
- Real ledger history and Wave/CSV exports
.secrets/(SimpleFIN access URL, Square tokens, Fava passwords)importers/.simplefin_seen.json- Bank account numbers, owner names, customer/vendor PII
This template deliberately ships only fictional Demo Cafe amounts.
- Beancount
- Fava
- SimpleFIN Bridge
- Hermes Agent — optional agent layer