All work

Rinciku

AI-powered finance companion for mixed IDR/USD income — chat & photo expense logging, real-time purchase advice grounded in your budget.

TypeScriptReact.jsReact NativeExpoNode.jsSupabaseEdge FunctionReact-RouterOpenrouterGeminiClaude Code
Rinciku interface
Most budgeting apps assume a single currency, a stable paycheck, and that the user will diligently categorize every transaction. Real life for a young Indonesian earning across a local job and USD freelance income is messier: income arrives in two currencies, expenses swing month to month, and the question that actually matters — "can I afford this right now?" — usually gets answered after the money is already spent, if at all. Rinciku's core idea is to make both sides of that problem frictionless. An essentials planner establishes a monthly baseline of non-negotiable costs, expenses get logged through natural-language chat ("spent 45k on lunch") or a photo of a receipt read by a vision model, and an AI purchase-consultation feature answers "can I buy this?" grounded in the user's actual income, essentials baseline, spending so far, and days left in the month — not generic financial advice.
Solo developer — product definition, database schema, shared TypeScript domain layer, the web app, the mobile app, and the AI integration
Live in production — shipped on the App Store, web app live, Android in progress

One shared TypeScript domain layer across web and native

A pnpm/Turborepo monorepo where the Vite web app and the Expo native app import the same domain logic, Zod schemas, formatting and i18n through dependency-injected Supabase client factories. The same query and mutation code runs on both platforms instead of being written twice and drifting apart.

Rejected: Separate per-platform data layers, copy-pasted and kept in step by hand

Grounded the AI in structured budget state rather than chat context

Purchase advice is answered against real income, the essentials baseline, spend-to-date and days left in the month. That is the difference between advice that is trustworthy with money and advice that merely sounds confident — and it is what lets the answer show the numbers it used.

Rejected: A general-purpose chat assistant reasoning over conversation history

Calibrated the vision model for Indonesian financial documents specifically

Dot-separator IDR notation, local bank transfer layouts and e-wallet screenshots each needed real prompt work. An AI feature still needs domain-specific engineering; it is not just an API call.

Rejected: A generic receipt-OCR call, post-processing whatever came back

My Role & Impact

I own the entire stack end to end. The architecture is a pnpm/Turborepo monorepo where a Vite web app and an Expo native app share one portable "brain" — domain logic, Zod schemas, formatting, and i18n — through dependency-injected Supabase client factories, so the same query and mutation code runs on both platforms instead of being duplicated. Building this as a real, shipped product rather than a demo forced product decisions a tutorial never asks for: what data model lets one query answer "can I afford this" without the user doing mental math, and how much of the AI's reasoning needs to be visible so the user trusts a financial answer from a chatbot.

The app is in active use today, starting with myself as the first user, and is published on the App Store under my own account.

What I Learned

  • Grounding an AI feature in real, structured state (income, essentials, spend-to-date, days remaining) rather than free-floating chat context — the difference between advice that's actually trustworthy with money and advice that merely sounds confident.
  • Building a domain layer that is genuinely shared, not copy-pasted, between a web SPA and a native mobile app.
  • Calibrating a vision model's prompt specifically for Indonesian financial documents — dot-separator IDR notation, local bank transfer layouts, e-wallet screenshots — a reminder that AI features still need real domain-specific engineering, not just an API call.

Showcase

Rinciku — your money, more intentional
Rinciku — your money, more intentional
AI purchase consultation — the model answers against your real remaining budget, essentials still due, and days left in the cycle
AI purchase consultation — the model answers against your real remaining budget, essentials still due, and days left in the cycle
Essentials baseline — fixed bills and recurring costs define the monthly floor every other number is measured against
Essentials baseline — fixed bills and recurring costs define the monthly floor every other number is measured against

Screenshots

Web app

Dashboard — income, spend, net, and the spending trend over any range
Dashboard — income, spend, net, and the spending trend over any range
Expenses — a searchable ledger with receipt scan, import, and export
Expenses — a searchable ledger with receipt scan, import, and export
Essentials planner — the monthly non-negotiables the AI reasons against
Essentials planner — the monthly non-negotiables the AI reasons against
Categories — spending organised into Utama / Belanja / Hiburan tiers
Categories — spending organised into Utama / Belanja / Hiburan tiers
AI chat — a purchase question answered against real budget state, with the numbers shown
AI chat — a purchase question answered against real budget state, with the numbers shown

Mobile app (iOS)

Dashboard — safe-to-spend, this month's totals, and top categories
Dashboard — safe-to-spend, this month's totals, and top categories
Expenses by period, with recent activity
Expenses by period, with recent activity
Incomes — multi-source, including USD freelance payouts
Incomes — multi-source, including USD freelance payouts
Add expense — amount, category, date, and an optional receipt
Add expense — amount, category, date, and an optional receipt
Essentials — non-negotiables and the monthly floor they add up to
Essentials — non-negotiables and the monthly floor they add up to
Budgets — monthly targets per category and tier
Budgets — monthly targets per category and tier
Ask Rinciku — the consultation entry point, with suggested questions
Ask Rinciku — the consultation entry point, with suggested questions
A grounded answer — yes, and here is exactly what it leaves you with
A grounded answer — yes, and here is exactly what it leaves you with
Chat-based logging — "spent 45k on lunch" parsed into a reviewable draft
Chat-based logging — "spent 45k on lunch" parsed into a reviewable draft