DominionDesk Core
AI-Powered Personal Finance Dashboard
Sole developer — design, build, and deployment
↗ View liveThe problem
Most personal finance tools either track spending after the fact or plan budgets in the abstract, and few answer the question that actually matters month to month: after every fixed obligation and debit order has gone off, how much is genuinely left to spend?
Capturing expenses is also the point where these tools fail in practice — typing in each receipt is friction enough that people stop doing it within a month.
What I built
Free cash flow and burn rate
The dashboard leads with money actually available after obligations and expenses, alongside a burn-rate view of total monthly fixed costs, budget alerts as limits approach, and a cashflow timeline of upcoming payments and due dates.
AI receipt scanning
Photograph a receipt and the Claude API extracts store name, date and total, then suggests a category — removing the manual entry step that normally kills adoption. Personalised insights surface observations about spending patterns on top of the same data.
Obligations and debt
Recurring debit orders are tracked with provider, due date and payment history including adjustments, while debt balances and interest rates feed payoff progress visualisations and projections.
Income and multi-user
Multiple income sources — salary, freelance, side hustle, rental — with recurring flags for accurate projections and ad-hoc extra income logging. Each user's financial data is private to them, with per-person budget limits for family members.
Architecture
Next.js 16 with the App Router and TypeScript, PostgreSQL accessed through Prisma, and NextAuth.js for authentication.
Built mobile-first and installable as a Progressive Web App, since the receipt-capture flow is only useful if it works on the phone that has the camera.
Impact
- ▸Live and in daily personal use at core.dominiondesk.com.
- ▸Receipt capture reduced to photographing a receipt, which is the difference between a tool that gets used and one that gets abandoned.