invox: invoicing that lives in a container

A personal invoice generator backed by a SQLite file, with PDF export. My banking details live in the database instead of the code, so the code can be public.

published

length1 min read

I needed to send invoices, and I didn't love either of the usual options. A spreadsheet makes ugly PDFs and doesn't keep any history. An invoicing service wanted a monthly fee to manage way more than I needed. I just wanted a small app that makes an invoice, remembers it, and exports a PDF that looks right.

So I built invox. You fill out the invoice in the browser, it gets saved to a SQLite file, and the PDF you download looks exactly like what's on screen. The frontend is React and TypeScript, the API is Hono, and pdf-lib generates the PDF.

Keeping my bank details out of git

The stuff that identifies me on an invoice, my ACH payment details, and the footer text are all set on a Settings page and stored in the database. None of it is in the repo. That way I can share the code and anyone can run it, and nobody's bank details end up in git history.

Running it

CI builds a new image on every push to main, tagged with latest and the commit hash. All the data is in one SQLite file, so backing up means copying that file, and rolling back means pinning an older tag. For something that deals with money, I wanted both of those to be as boring as possible.