WORK INDEX
EMAIL ME
OWN PRODUCT  ·  IN PRODUCTION  ·  2026

A finance app thatlooks ahead.

A clear view of what is left to spend, how budgets are pacing, and where the month is heading.

FOR PEOPLE PLANNING THEIR MONTHLY FINANCES

An independent product. My role: design, development and deployment.

View the mvp / product build package · from $7,500 →
PRODUCT
Monark
ROLE
Design, build & launch
STACK
Next.js · TS
DATA
Postgres · Prisma
HOST
Vercel
Monark dashboard
01  THE PROBLEM

See where this month's spending is heading.

I wanted to understand what my current spending meant for the rest of the month. A transaction history was useful, but I also needed a clear view of my net position and how each budget was pacing.

So Monark's dashboard does not open with a chart. It opens with a sentence: your net position and where the month is pacing to. The visualisation is secondary to the statement.

The design constraint I set: if the headline needs a legend to be understood, it is wrong.
02  ARCHITECTURE

Deliberately small.

One Next.js app, one Postgres database and Prisma between them. Keeping the deployment small makes the data flow easier to follow. The application derives its totals from the stored transactions, so the dashboard and underlying records use the same source.

FIG. 02.1 / SYSTEM
CLIENT
next.js
SERVER ACTIONS
user-scoped
PRISMA
typed
POSTGRES
source of truth
EVERY TOTAL IS DERIVED ON READ, NOTHING IS CACHED OR ROLLED UP
NO QUEUE, NO CRON, NO SECOND COPY OF A NUMBER
03  DATA MODEL

Constraints in the schema, not in the app.

The schema records the rules that should hold across writes, such as one budget per user, category and month. Application logic handles the workflow around those constraints.

transactions
Amounts in minor units as bigint, with an income or expense type rather than a sign. Category is a foreign key, never a string.
budgets
Unique on user, category and month, so two budgets cannot fight over the same month and the database is what says so.
recurring_transactions
A template plus the last month it was advanced past, so confirming or skipping a month is idempotent and a missed run cannot double-post.
goals
Target plus optional deadline. Progress is summed from contributions, never stored, because stored progress goes stale silently.
04  STACK MANIFEST
CLIENT
Next.js · React · TypeScript · Tailwind
SERVER
Node · Server Actions · NextAuth · bcrypt
DATA
Postgres · Prisma · pg
SERVICES
Vercel · Resend · Gemini
Have a product idea ready to build?