Your Books Should Fit on Your Machine
Every finance tool I tried as a solo founder wanted the same trade: hand over your invoices, your clients and your expense history, and in return you get a dashboard. I built KeepTrak on the opposite trade. Your numbers stay in a SQLite file on your own machine. There is no account system to sign up for, no telemetry, and no cloud copy of your books.
The data model is deliberately small. The Prisma schema has four models: a user, invoices with statuses that move from PENDING to PAID or OVERDUE, transactions typed as INCOME or EXPENSE with categories, and contracts that carry a value, a start date and an optional end date. Everything a one-person business actually tracks, and nothing it does not.
Local does not mean primitive
The stack is ordinary and boring on purpose: React 18 and Vite on the front, Express and TypeScript on the back, Prisma over SQLite, React Hook Form with Zod for validation, and date-fns for range reporting. Authentication is JWT with bcrypt hashing, because a local file still deserves a lock. The whole thing starts with one docker-compose up.
What you get in return is a dashboard of income, expenses and net profit, invoice status tracking from draft to paid, a client directory with payment history, and expenses organised by category so tax season is a filter, not an excavation.
Why I keep coming back to this pattern
KeepTrak is the same bet I made with Varsha for family documents: the most private database is the one nobody else operates. I think solo founders overestimate what hosted finance tools give them and underestimate what it costs to have their entire client and revenue history sitting in someone else's analytics pipeline. A SQLite file and a Docker container carry the whole product. That is the point.