All work

Kasbon

Cloud-based POS for Indonesian UMKM — profit tracking, debt (hutang) management, multi-device sync via Supabase.

FlutterRiverpodSupabaseEdge FunctionClaude CodeCloudflare Pages
Kasbon interface
Kasbon was designed around three real personas: a warung owner who has never used a POS and just needs simple, reliable sales tracking; a clothing-shop owner juggling stock across a physical stall and online marketplaces who keeps losing track of cost price and profit; and a café owner who needs a fast checkout and real sales analytics. The product is built around profit tracking — not just revenue — and built-in debt (hutang) management, since informal credit to regular customers is a normal part of how these businesses actually operate, a feature most POS apps ignore entirely. The original plan was an offline-first app with a local SQLite database syncing to a backend, prioritizing reliability on unreliable connections. Partway through, I re-architected the whole app onto a Supabase-only cloud model with Row Level Security — a deliberate trade of "always works with no signal" for "your data follows you across every device," after concluding that was the more valuable guarantee for how owners actually use the app: phone at the counter, tablet for end-of-day reports.
Solo developer — product definition, Flutter app (clean architecture, feature-based modules), Supabase schema & RLS policies, deployment
Live in production

Re-architected from offline-first SQLite to Supabase-only cloud, mid-project

A deliberate trade of "always works with no signal" for "your data follows you across every device" — the more valuable guarantee given how owners actually work: phone at the counter, tablet for end-of-day reports. It touched almost every layer, and doing it deliberately rather than patching around the original design is why the app is materially simpler and more reliable today.

Rejected: Keeping the offline-first design and accumulating workarounds around it

Postgres Row Level Security as the actual enforcement layer

Multi-tenant isolation is enforced in the database rather than by a client-side check that a bug could bypass.

Rejected: Trusting the client to filter by shop

Built around profit and hutang rather than revenue

Cost price and profit, not just sales totals — and built-in debt management, because informal credit to regular customers is a normal part of how these businesses operate. Most POS apps ignore it entirely.

Rejected: Revenue-only tracking, as most POS apps offer

My Role & Impact

I built this from a full business brief — personas, a tiered freemium pricing model, and a multi-month roadmap — down to a working POS a shop owner can use to close a sale in seconds and print or share a receipt over WhatsApp. The mid-project migration from offline-first SQLite to cloud-only Supabase touched almost every layer of the app, and doing it deliberately rather than patching around the original design is the decision I'm most glad I made — the app is materially simpler and more reliable for it today.

What I Learned

  • Recognizing when an early architectural bet (offline-first) no longer serves the product, and having the discipline to migrate cleanly instead of accumulating workarounds around it.
  • Postgres Row Level Security as the actual enforcement layer for multi-tenant data, not just a client-side check that a bug could bypass.
  • Designing for a genuinely low-tech-literacy user — comfortable with WhatsApp, never used a POS — where simplicity is the feature, not a compromise.

Showcase

Kasbon — every sale, and what it actually earned
Kasbon — every sale, and what it actually earned
Debt (hutang) tracking — customer credit as a first-class record, with balances, part payments and history per buyer
Debt (hutang) tracking — customer credit as a first-class record, with balances, part payments and history per buyer
Profit reporting — sales, margin and best-selling stock over any range, so the owner sees what was earned rather than what came in
Profit reporting — sales, margin and best-selling stock over any range, so the owner sees what was earned rather than what came in

Screenshots

The app across desktop and mobile, running on demo shop data.

Owner dashboard — sales trend, profit, payment mix, and best-selling stock
Owner dashboard — sales trend, profit, payment mix, and best-selling stock
Desktop POS — search, category filters, and a running cart
Desktop POS — search, category filters, and a running cart
Checkout — cash, QRIS, or hutang, with an optional proof-of-payment photo
Checkout — cash, QRIS, or hutang, with an optional proof-of-payment photo
Hutang — outstanding balance, part payments, and history per buyer
Hutang — outstanding balance, part payments, and history per buyer
Transaction history with full receipt detail and re-share
Transaction history with full receipt detail and re-share
Advanced analytics — period comparison, category split, and an hourly heatmap
Advanced analytics — period comparison, category split, and an hourly heatmap
Mobile POS — a product grid sized for one-handed use at the counter
Mobile POS — a product grid sized for one-handed use at the counter
Mobile analytics — category distribution, payment methods, and busy-hour patterns
Mobile analytics — category distribution, payment methods, and busy-hour patterns