DEV Community

Eastkap
Eastkap

Posted on

Why I Deliberately Made My Budget App Worse (And Users Love It For It)

Tags: javascript, webdev, architecture, productivity


Most developers optimize for features. I deliberately removed them.

Monee is a personal budget tracker that does less than every other budget tracker out there. No bank sync. No mobile app. No cloud storage. No accounts. No subscription. No data export. No graphs that look like a Bloomberg terminal.

Just this: paste your bank CSV, see where your money went.

It sounds like laziness. It wasn't. Here's the architecture decision behind it — and why making it "worse" made it better.

The Feature That Started It All: No Backend

The first architectural decision was the most radical: no server-side data storage at all.

Every personal finance app I'd ever used stored my data on their servers. This isn't technically necessary — it's a business decision. Cloud storage = user retention = recurring revenue = VC metrics. The architecture follows the business model.

But if you remove the business model, you can remove the architecture.

All transaction data in Monee lives in localStorage. That's it. No API calls. No database writes. No auth tokens bouncing across the wire.

// The entire "save" operation
const saveTransactions = (data: Transaction[]) => {
  localStorage.setItem('monee_transactions', JSON.stringify(data));
};

// The entire "load" operation  
const loadTransactions = (): Transaction[] => {
  const raw = localStorage.getItem('monee_transactions');
  return raw ? JSON.parse(raw) : [];
};
Enter fullscreen mode Exit fullscreen mode

This single decision cascades into everything:

  • No GDPR compliance needed — the data never leaves the device
  • No server costs — zero infra bill (beyond Vercel's free tier)
  • No breach risk — you can't leak data you don't have
  • No auth — if the data is local, who would you authenticate?
  • Works offline — no network dependency whatsoever

The tradeoff: your data doesn't sync across devices. You can't access it from your phone if you entered it on your laptop.

For a "10 minutes at the end of the month" tool, that's the right call.

The Second Removal: Real-Time Sync

YNAB has live bank sync. Copilot has it. Mint had it. Every modern budgeting app fetches your transactions automatically.

I removed this entirely.

Not because it's hard to implement (Plaid makes it almost trivially easy). Because the act of manual entry is where the value is.

There's a reason people track calories manually even when wearables can estimate them automatically. The friction of manual entry creates awareness. You notice the $47 DoorDash charge when you have to type it in. Auto-sync turns spending into a passive observation activity. Manual entry makes it active.

Also: Plaid has had data incidents. I'm not going to ask anyone to hand over their banking credentials to a startup they just discovered.

The Third Removal: Graphs

I removed the graphs. Well — I removed the complicated graphs.

Most budgeting apps give you line charts, trend lines, month-over-month comparisons, spending heatmaps by day of week, predictive spending models. It looks impressive. Users barely look at it after the first week.

Monee has one visualization: a horizontal progress bar per category.

// The entire "visualization" component
<div className="flex items-center gap-3">
  <div className="flex-1 bg-gray-800 rounded-full h-2">
    <div
      className="h-2 rounded-full transition-all"
      style={{
        width: `${Math.min(percentage, 100)}%`,
        backgroundColor: percentage > 100 ? '#ef4444' : 
                         percentage > 80  ? '#f59e0b' : '#8b5cf6'
      }}
    />
  </div>
  <span>{formatCurrency(spent)} / {formatCurrency(budget)}</span>
</div>
Enter fullscreen mode Exit fullscreen mode

Three colors. One bar. That's it.

The color tells you everything: purple = fine, amber = watch it, red = you went over. You absorb it in a second. You don't need to study it.

The removal made the visualization more powerful, not less.

What Deliberate Removal Taught Me About Product

Every feature you add has a cost beyond the development time: cognitive load, maintenance burden, surface area for bugs, and user confusion.

Budget apps try to be everything. They add AI categorization, bill negotiation, credit score tracking, investment insights. Each feature is individually defensible. Collectively, they make the core job harder: knowing where your money went.

Monee does one job. It does it in 30 seconds. It asks nothing in return.

That's not a lack of ambition. It's a deliberate product decision: optimize for the job to be done, not for the feature list.

The users who find it don't want 47 features. They want to know if they're spending too much on food this month. They want to answer that in under a minute and close the tab.

When you build for that specific person, removing features isn't laziness. It's precision.

The Stack

For completeness: Next.js 15, Tailwind v4, TypeScript, shadcn/ui, Vercel. The whole thing is open source.

If you want to build something similar — a tool that does one job for one person — start by listing the features you're not going to build. That list is your product strategy.

Try Monee →

What's a feature you removed that made your product better? I'm curious.

Top comments (0)