A local-first accounting web app for a small LLC. It runs on your machine with SQLite and includes:
- Client management
- Invoice creation with line items
- Expense tracking with categories/accounts
- Automatic journal entries (double-entry style)
- Reports (P&L and accounts receivable aging)
- Visual charts for monthly trend and expense mix
- PDF downloads for invoices and reports
- CSV exports (invoices, expenses, journal)
- Recurring invoices and expenses
- Monthly close checklist tracking
- One-click DB backup/restore
- Edit/delete support for clients, invoices, and expenses
- Insights tab (local analytics or OpenAI-compatible API mode)
- Python 3.10+
- Flask
- ReportLab (PDF generation)
- SQLite (single local file:
accounting.db)
Your data is persistent. The app stores everything in the local file accounting.db.
- Closing the app does not remove data.
- Restarting the app reuses the same DB file.
- Data is only lost if
accounting.dbis deleted or replaced.
- Company name defaults to
"My Company LLC"and can be overridden with theCOMPANY_NAMEenvironment variable. - Logo file is loaded from
static/logo.pngin the web UI and PDF exports.
- Create and activate a virtual environment.
- Install dependencies.
- Run the app.
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install -r requirements.txt
./scripts/run_local.shYour browser opens automatically. By default it uses http://127.0.0.1:5000 and falls back to the next free local port if needed.
For direct Flask development with hot reload, use:
FLASK_DEBUG=1 python3 app.py- Add clients at
/clients. - Create invoices at
/invoices/new. - Mark invoices as paid from the invoice detail page.
- Add expenses at
/expenses. - Manage recurring schedules at
/recurringand run due items. - Complete month-end close checklist at
/close. - Review reports at
/reports. - Review AI/local insights at
/insights. - Download invoice PDFs at
/invoices/<id>/pdf. - Download report PDFs at
/reports/pdf?start=YYYY-MM-DD&end=YYYY-MM-DD. - Review journal entries at
/journal. - Create/restore backups from
/data.
- Creating an invoice posts:
- Debit
1100 Accounts Receivable - Credit
4000 Sales Revenue
- Debit
- Marking an invoice paid posts:
- Debit
1000 Cash - Credit
1100 Accounts Receivable
- Debit
- Adding an expense posts:
- Debit selected expense account (e.g.
5200 Software Expense) - Credit
1000 Cash
- Debit selected expense account (e.g.
Use the export buttons from Invoices, Expenses, Reports, or Journal pages.
CSV endpoints:
/exports/invoices.csv/exports/expenses.csv/exports/journal.csv
- One-click backup creates timestamped
.dbsnapshots inbackups/. - One-click restore can restore from any listed local backup.
- A safety snapshot is created automatically before each restore.
- In packaged mode, backups live under
~/.local-llc-accounting/backups(orACCOUNTING_APP_HOME/backups).
- Local mode: analyzes the SQLite DB directly and produces actionable markdown insights.
- API mode: sends DB context (and optional markdown notes) to an OpenAI-compatible
/v1/chat/completionsendpoint. - Optional notes path defaults to
insight_notes/and supports.mdfile or folder input. insight_notes/Dynamic Insights.mdis append-only from the UI (add/read enabled, no delete action).- In packaged mode, notes default to
~/.local-llc-accounting/insight_notes.
- This is for internal bookkeeping and is not tax advice.
- Before filing taxes, have your CPA review account mappings and entries.
Build a standalone local app bundle (no separate app.py terminal process required):
source .venv/bin/activate
python3 -m pip install -r requirements-dev.txt
./scripts/package_app.shAfter building, run:
./dist/LocalLLCAccounting/LocalLLCAccountingPackaged mode keeps data local-first in ~/.local-llc-accounting by default.
Set ACCOUNTING_APP_HOME to store the database/backups/insight notes in a different local folder.