A free, MIT-licensed billing & accounting app built for Indian small businesses and solo freelancers — print shops, stationery counters, designers, tutors, tailors, consultants, repair workshops. UPI QR payments, GST-friendly invoices, rupee amounts in words, and per-period statements — all running on the machine sitting under your desk.
$git clone https://github.com/dineshmiriyala/bill-generator-oss && cd bill-generator-oss && pip install -r requirements.txt && python app.py
The whole flow is intentionally short. Pick someone you already know, type or pick the items, hit print. Drafts, duplicates, and the “bill with dues” picker for repeat customers all live in the same screen.
Search by phone, name, or company. Duplicate detection catches when the same person walks in under two spellings.
Type-ahead from inventory, or one-off entries for service work. Per-row tax, discounts, and notes. Save as a draft if the client is still deciding.
Browser-native print to paper or to PDF — no headless Chrome, no extra runtime. A UPI QR can be embedded so clients can pay before they leave the chat.
Customers, inventory, accounting, analytics, statements, backups, QR payments, optional cloud mirror. Every feature is opt-in and scoped to the one machine it runs on.
Soft-delete with a recovery centre, duplicate detection on phone + company, and inline edit from anywhere. Nothing disappears the first time you click delete.
/view_customers · /view_inventory · /recoverRecord payments and expenses, see per-customer dues at a glance, and print accounting statements for any date range — month, quarter, or financial year.
TXN-280526-000001 · per-period statementsSales by day, month, year. Top customers. Weekday breakdowns. Self-hosted — no Google, no Mixpanel.
Chart.js · local events only
UPI QR codes via segno, GST-friendly invoices,
and amounts spelled out in Indian-numbering rupee words —
“Four Thousand Three Hundred and Seven Only”.
No add-ons, no setup.
Timestamped SQLite snapshots in db/backups/, ten kept, older pruned. Optional mirror to any folder inside your home directory.
Bring your own project to mirror data off-machine. HTTPS-only, RFC1918 blocked, disabled until you configure it.
supabase_upload.py
A single build_exe.bat emits
BillGenerator_V4.5.1.exe for Windows. The same code
runs as a normal Flask app anywhere Python does.
BG_APP_NAME, BG_INVOICE_PREFIX,
BG_TXN_PREFIX env vars rebrand the window title,
invoice IDs, and packaging metadata.
Most billing tools either ship your customer list to a vendor's cloud or charge per seat. This one runs entirely on the machine under the desk and only talks to the network when you configure it to.
That, in full, is the pricing page.
There is no paid tier in development. No "Pro" features held behind a paywall. No SaaS version waiting in the wings to swallow the local one once enough shops come to depend on it. No telemetry being collected to monetise later. No investors to answer to.
The repository is MIT-licensed, the SQLite file is the export, and the binaries come from a build script you can read in an afternoon. The intent is simple: invoicing is plumbing, and Indian small businesses and freelancers deserve plumbing that doesn't extract ₹999 a month per seat. So here's some.
If it's useful to you, the only ask is that you tell another shop owner or freelancer about it. If you can ship a patch — even better.
Nothing exotic — Flask, SQLAlchemy, SQLite, Jinja, Bootstrap, waitress, pywebview. The kind of stack you can still maintain a decade from now, with a tree shallow enough to read in an afternoon.
Flask 3.x + SQLAlchemy 2.x + Flask-Migrate, served by waitress.SQLite — single file in db/app.db, or the OS data dir in desktop mode.Alembic scripts under migrations/versions/, run on startup.Chart.js for analytics. No bundler, no Node.segno generates UPI QR codes as base64 SVG.openpyxl + reportlab for spreadsheet & PDF exports.pywebview renders the local Flask app in a native window.PyInstaller · one-step Windows build via build_exe.bat.pytest, runs against a temp data dir — never touches your real info.json.. ├── app.py # Flask routes, branding, backups, sync ├── api.py # JSON / UPI-QR endpoints ├── analytics.py # Sales / customer aggregations ├── analytics_tracking.py # Front-end event logging (local) ├── supabase_upload.py # Optional cloud mirror ├── migration.py # Startup schema migration ├── desktop_launcher.py # pywebview entrypoint ├── build_exe.bat # Windows one-step packaging ├── db/ │ ├── models.py # SQLAlchemy models │ ├── db_events.py # ORM event hooks │ └── info.example.json # Settings template ├── migrations/ # Alembic versions ├── templates/ # Jinja (Bootstrap-based) ├── static/ # CSS / JS / SVG / fonts └── tests/ # pytest suite
Branding and networking switches are prefixed BG_.
Per-install business settings live in info.json and are
editable in-app — no restart needed.
| Variable | Default | What it does |
|---|---|---|
BG_APP_NAME |
Bill-Generator |
Window title, logs, packaging metadata. Set this to white-label. |
BG_INVOICE_PREFIX |
INV |
Invoice ID prefix — e.g. INV-280526-00042. |
BG_TXN_PREFIX |
TXN |
Accounting transaction ID prefix. |
BG_BIND_HOST |
127.0.0.1 |
Set 0.0.0.0 to expose on the LAN — read the security note first. |
BG_DESKTOP |
unset | Set to 1 for the OS-specific data directory (set automatically by the desktop launcher). |
BG_APP_VERSION |
baked in | Override the version string at runtime. |
SECRET_KEY |
auto-generated | Flask session key. A random 32-byte key is generated and persisted on first launch if unset. |
Run as a normal Flask app anywhere Python runs, or grab the
packaged .exe for Windows machines that have never
seen a terminal.
# 1 — Clone & enter git clone https://github.com/dineshmiriyala/bill-generator-oss cd bill-generator-oss # 2 — Create & activate venv python -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate # 3 — Install & run pip install -r requirements.txt python app.py # Opens at http://127.0.0.1:42069 # First launch boots the onboarding wizard. # To skip while exploring: cp db/info.example.json db/info.json
# From the repo root, on a Windows box # with Python 3.11+ on PATH: build_exe.bat # Result: dist\BillGenerator_V4.5.1.exe # The script: # · creates a cached .build-venv # · installs deps + PyInstaller # · emits a single-file .exe # · re-runs reuse the venv # Double-click the .exe — it opens # inside a pywebview window, bound # to 127.0.0.1 only.
All endpoints serve 127.0.0.1 by default with no
authentication — the threat model assumes a single user on a single
machine. See the security note below before changing the bind host.
upi_id (required), am, pn, cu.
The app ships with no authentication, partial CSRF protection
(bill forms only), and no encryption at rest. Defaults bind to
loopback so only your machine can reach it. If you change the
bind host, you're stepping outside the supported threat model
— read SECURITY.md first and consider a fork with
Flask-Login + global CSRF on top.
Areas where help is especially appreciated. See
CONTRIBUTING.md for setup, test, and style guidelines —
the test suite runs against a temp data dir, so you can hack
without fear.
Clone the repo, run one command, print a GST-friendly invoice in the next ten minutes. Free forever, fork at will, client list never leaves your machine.