Elhadi.
← All posts
6 min readAI-written · in Suhaib Elhadi's voice

What a public ledger changes about lending money to friends

This update was drafted on a schedule by the AI I build with, from real project notes — part of the vibecoding experiment this blog documents.

So here's the thing nobody says out loud about lending money to a friend: the problem was never the money. It's that the debt only exists in your head. Theirs has a different version of it, or no version at all, and there's no third thing either of you can point at. That's the whole mess. Not greed, not betrayal — just two memories drifting apart with nothing in between them.

A ledger is that third thing. That's the entire idea behind tab., and it took me embarrassingly long to be able to say it that simply.

Think about what actually happens right now. You cover someone's forty dollars. You don't write it down, because writing it down would be weird — it's forty bucks, you're friends. A week passes. Now bringing it up costs you something: you have to be the person who remembered, which reads as the person who was counting. So you wait. Two weeks. Now mentioning it is worse, because the delay itself is a statement — I've been sitting on this. Eventually the cheapest move is to eat it, and you do, and you tell yourself it's fine. It mostly is. But a small thing changed about how you feel when their name shows up on your phone, and neither of you will ever name it.

That's the failure mode. Not a fight. A quiet, permanent, one-degree drift.

What the record actually does

The record doesn't collect the money. Let me be clear about that up front, because it's the thing people expect a debt app to do and it's the thing this isn't. What the record does is take the debt out of your memory and put it somewhere you can both look at.

That sounds small. It changes the social physics of the whole thing.

Once the tab exists as a fact, asking is no longer an accusation — it's a reference. You're not saying "you owe me and I've been keeping track," you're saying "there's a thing open, want to close it?" The record is doing the remembering, so you don't have to be the person who remembered. That's the actual transfer. You hand the awkward job to a piece of software and get to go back to just being their friend.

And it works in the other direction too, which people miss. If you're the one who owes, ambiguity isn't comfortable for you either. You half-remember there's something outstanding. You're not sure of the number. You'd have to ask, and asking means admitting you forgot. So you also do nothing, and the same drift happens from the other side. A number both of you can see solves that with zero conversation. Most debts between friends aren't disputes. They're two people each waiting for the other one to be the one who brings it up.

Then there's the public part

Now the part that makes people pause. In tab., the ledger is public. You search a name, you see the receipts. You can file a tab against anyone, and they get notified.

I know how that lands. It sounds aggressive, and I want to be honest rather than sell it, so: it is a lever, and it's a blunt one.

Here's my reasoning. Private debt between friends is deniable by design, and deniability is exactly what lets it rot. The reason a Venmo request goes ignored is that nothing happens when it's ignored — there's no cost, no record, no next step. It's a message you can leave on read forever. A public ledger changes what ignoring it means. Not because anyone's going to be publicly shamed over forty dollars, but because the thing now exists whether or not you engage with it, and that's a different kind of pressure than a notification you can swipe away.

The internet remembers when your Venmo request didn't. That's the line the whole app is built on, and I stand by it while also admitting it isn't the right tool for every situation.

Because it isn't. If someone's genuinely struggling, a public receipt is a cruel object and I wouldn't use one. If the amount is small enough that you'd never actually ask, don't file it — you're not tracking a debt at that point, you're building a case, and that's a different and worse thing. The lever is for the ordinary case: someone who can pay, who isn't refusing, who just genuinely lost track. That's the overwhelming majority of money owed between friends and it's the case the tool is shaped for.

Forgiving is a real action, not an absence

This is the part I'd defend hardest, and it's the least flashy feature in the app.

A tab can be settled or it can be forgiven. Forgiving is an explicit thing you do, and it closes the record the same way paying does.

I built it that way because the alternative — letting a debt just quietly expire — recreates the exact problem the ledger was supposed to fix. An unsettled tab that everyone silently agreed to ignore is just the group chat again, with extra steps. It sits there. It means something. Nobody says what.

Forgiving makes the generous thing legible. You didn't forget, you didn't give up, you didn't decide it wasn't worth the fight. You chose to clear it, on the record, and both of you know that's what happened. Which, I'd argue, is a nicer thing to be able to do than "never mentioning it again and hoping they understood."

The thing I got wrong at the start

I originally thought of this as a money app. Track balances, settle up, done — a shared spreadsheet with a nicer face.

Building it talked me out of that. Nobody has trouble with the arithmetic. Forty dollars is forty dollars; there is no math problem here. What people have trouble with is the social cost of raising it, and that cost is the entire product surface. Every real decision in tab. came down to one question: does this make the asking cheaper or more expensive? Three steps — pull up a name, file the tab, settle or forgive — because every extra step is another moment to decide it's not worth it. Notification on file, because a record nobody knows about is a diary. Public, because deniable debts are the ones that rot.

Get the ledger right and the money mostly takes care of itself. That's not a claim about repayment rates — I don't have that data and I'm not going to invent it. It's a claim about what the friction actually was.

It's the same instinct I keep running into everywhere else I build: the hard part is almost never the calculation, it's the human moment wrapped around the calculation. The dinner-splitting version of this is the same problem one layer earlier — the awkwardness at the table, before anyone owes anyone anything.

tab. has been on the App Store since June, after a rejection that taught me more than the approval did. Whether the public ledger is the right amount of pressure or slightly too much is genuinely still an open question, and it's one only real users answer. I have a strong opinion. I don't have proof.

What I'm sure about is the smaller claim underneath it: the money between friends goes bad in the silence, not in the asking. Anything that makes asking cost less is worth building. This is my attempt at it.