For one business, Xero's core is a double-entry ledger with invoices, bills, a bank-reconciliation screen and a few standard reports. An agent can build that over a weekend on SQLite, using CSV and OFX imports in place of bank feeds. What takes the time is the accounting detail: sales tax, locked periods, credit notes and reports an accountant will accept without argument. Live bank feeds, payroll and an accountant who logs in beside you are the parts you cannot copy, and a mistake in the books costs more than the subscription.
Before you buildXero has no free plan. If you invoice a few clients, Wave's free Starter plan may cover you without building anything.
Build me a small-business bookkeeping workspace to replace Xero. Requirements:
- Python 3.12 with FastAPI, Jinja2 templates and a little HTMX. `uv run uvicorn app:app`
serves http://localhost:4710.
- Storage: SQLite through SQLAlchemy 2.0 in ./data/books.db. Real double entry: every journal's
lines sum to zero, amounts are integer cents. Seed a US small-business chart of accounts
that I can edit.
- Contacts, sales invoices and bills with line items, a tax rate per line and due dates.
Statuses draft, approved, paid; approving posts the journal. Quotes convert to invoices;
repeating invoices run weekly or monthly.
- PDF invoices with WeasyPrint, sent by smtplib with SMTP settings in .env.
- Bank import: CSV (save the column map per account) and OFX/QFX (`ofxparse`). Skip duplicates
by a hash of date, amount and description.
- Reconcile screen: each statement line shows suggested matches (an open invoice or bill with
the same amount within 7 days) or a bank rule ("description contains STRIPE -> Sales").
A reconciled line is locked.
- Reports for any date range as CSV and printable HTML: profit and loss, balance sheet, trial
balance, aged receivables and payables, sales tax summary.
- A lock date: nothing dated before it can be posted or edited until I move it.
- Single user. No accounts, no telemetry, local-first. The only outbound calls are SMTP.
- Out of scope: live bank feeds, payroll, multi-currency, 1099 filing, inventory, accountant roles.
- README: setup, how to back up the .db file, and a plain note that this is not tax advice and
an accountant should look at the first year-end.Opens your agent with the prompt filled in, you press enter. Or copy it and paste it into an empty folder.
The first prompt builds the core. Run these one at a time in the same folder to grow it into your own Xero.
Extend the bookkeeping app in this folder. Requirements: - Bank rules with conditions on description (contains, starts with, regex), amount range and money in or out, applied in a set order on import and on demand for unreconciled lines. - A rule can code to one account or split by percentages across several accounts. - A dry-run page lists which lines each rule would change before it runs, and a rule can be undone for the lines it touched. - Never apply a rule to a reconciled line. - Update the README.
Add payment chasing to the bookkeeping app in this folder. Requirements: - A monthly customer statement as PDF (WeasyPrint) listing open invoices, credits and the balance, emailed through the existing SMTP settings. - Reminder emails 3 days before and 7 and 14 days after the due date, each with its own editable template and a limit of one reminder per invoice per week. - Log every email sent on the invoice page. - Update the README.
Add a sales tax report to the bookkeeping app in this folder. Requirements: - Tax rates grouped into jurisdictions (state, county, city) that I define in a settings page. - A report for any date range: taxable sales, exempt sales and tax collected per jurisdiction, with the invoices behind every number, plus tax paid on bills. - Export the report as CSV. - State plainly in the README that rates and filing rules are mine to check.
Add a year-end export to the bookkeeping app in this folder. Requirements: - One button builds a ZIP for a chosen financial year: trial balance, general ledger, profit and loss, balance sheet, aged receivables and payables, all as CSV, plus the invoice and bill PDFs. - Include a README.txt inside the ZIP with the lock date and the report run time. - Refuse to build while any bank account has unreconciled lines in the year, unless I tick an override box. - Update the app README.
Accountants and bookkeepers already work in it, banks plug into it and the books are a record you have to be able to defend. People pay for the bank feed and for never explaining their own spreadsheet to a tax office.
Estimate · Runs on your laptop or a $5 VPS; SMTP at this volume fits a free tier. The build is token usage on your agent plan, and an accountant's review hour is extra.
| Plan | Monthly | Annual, per month | What you get |
|---|---|---|---|
| Early | $27 | — | Quotes and 20 invoices, 5 bills, bank reconciliation, Smart Document Capture, real-time reports, W-9 and 1099 management, sales tax, 30-day cash flow forecast. |
| Growing | $59 | — | Unlimited invoices and quotes, automated bill entry, auto-reconcile, budgeting, customizable dashboards, 60-day forecast. |
| Established | $97 | — | Everything in Growing plus multiple currencies, project time and cost tracking, employee expense and mileage claims, KPI analysis, 180-day forecast, international bill payments. |
No free plan. New US customers get a promotional price for the first six months and a one-month-free button.
Kinda. The core is a weekend build with the prompt on this page, but real gaps remain: Live bank feeds that bring in transactions every day, Accountant and bookkeeper access, and the app marketplace around it.
About $27 a month on the Early plan, $324 a year (checked 2026-10-19).
Live bank feeds that bring in transactions every day; Accountant and bookkeeper access, and the app marketplace around it; Payroll through Gusto and the 1099 and sales tax filing helpers; Online invoice payments and bill payments from inside the app; The mobile app and automatic receipt capture. If any of those matter to you, keep paying.
Yes: Bigcapital (open source), Akaunting (free), ERPNext (open source).