Back to Journal
ProductionHalfsie

Halfsie: Making Finance Apps Feel Human

Why I built an expense-splitting app that prioritizes feeling over function, and what 'delight has a budget' means in practice.

January 30, 20266 min read

The trip is over, everyone's back home, and now comes the dreaded group chat: "So... who owes what?"

What follows is usually a mess of Venmo requests, spreadsheet screenshots, and the slow death of someone's patience as they try to reconcile who paid for gas in Flagstaff versus who covered the Airbnb deposit.

I've used the existing expense-splitting apps. They work. But they feel like tax software for your friendships. Utilitarian, cold, and about as delightful as filling out a 1099.

I kept thinking: why does managing money with friends have to feel like... managing money?

Three Principles

Every decision in Halfsie comes back to three words:

Fast. Adding an expense should take under 5 seconds. If I'm standing at a restaurant with my card out, I shouldn't need to navigate three screens and fill out four fields.

Clear. Your balance should be obvious at a glance. Not a spreadsheet, not a ledger. Just "you owe $47" or "you're all square."

Warm. This is where most finance apps fail completely. Money topics create anxiety. The interface should reduce that anxiety, not amplify it. Warm colors, generous whitespace, friendly copy. "You're all square!" hits different than "Balance: $0.00."

The Character System

One of the riskiest decisions I made was building a custom character system instead of using photos or initials.

Photo avatars have problems: they require permissions, some people don't want their photo everywhere, and the quality is inconsistent. But initials in circles? That's what Splitwise does. It's boring. There's no personality.

I wanted something in between. Abstract and warm, personal without being literal. The result is a modular character system with over 10,000 combinations. Different shapes, colors, eyes, and accessories. Each person gets a unique character that represents them.

It sounds whimsical, but there's a practical benefit: instant visual recognition. When you're scanning a list of expenses, you don't read names. You recognize colors and shapes. It's faster than parsing text.

And yes, when everyone settles up, the characters celebrate. Because that moment deserves to feel like a moment.

Delight Has a Budget

Early in development, I over-indexed on delight. Animations everywhere. Playful copy in every corner. The app felt like it was trying too hard.

The breakthrough came when I realized delight has a budget. You can't spend it everywhere. The moments that matter (creating your character, settling a debt, seeing "all square") deserve maximum delight. But adding an expense? That's a transaction. Get out of the way.

I call this the "destination vs. transaction" principle. Transactions should be invisible. Destinations should be memorable. The settlement celebration gets confetti and haptics. The expense entry form gets speed and efficiency.

Undo as Anxiety Reduction

One architectural decision I'm proud of: the undo system. Destructive actions aren't immediate. Delete an expense and you get 5 seconds to undo.

It seems small, but it removes a whole category of anxiety. No more "are you sure?" dialogs that train users to click through confirmations without reading them. Just do the thing, and if you didn't mean to, take it back. The same way real life should work but doesn't.

The Bigger Picture

I'm not trying to compete with Splitwise on features. They have years of head start and millions of users.

I'm trying to prove that utility apps don't have to feel utilitarian. That you can take a "boring" category and make it feel human. That the details matter: the copy, the colors, the timing of a haptic tap.

If Halfsie works, it won't be because it has more features. It'll be because it feels better. In a category where every app does the same math, feeling better might be the only differentiation that matters.

// The design principle in code
enum Interaction {
    case transaction  // Fast, invisible, get out of the way
    case destination  // Memorable, delightful, worth celebrating
}
 
// Adding an expense: transaction (< 5 seconds, minimal UI)
// Settling up: destination (confetti, haptics, character celebration)
// The budget is finite. Spend it where it counts.