Vibe code your own Splitwise
Vibe code your own Splitwise as a group ledger and a who-pays-whom list. The card is $3.33 to $4.99 a month, and simplify is the step groups argue about.
You can vibe code your own Splitwise as a group ledger and a who-pays-whom list. Splitwise is that product. The catalog line is “Who owes whom, minus the group-chat forensics.”
The card lists $3.33–$4.99 a month and does not name the plans. The first estimate is 8 hours. The verdict is “Settle it yourself”.
Last time I wrote about vibe coding your own Manychat. That was a regular backlog post. This one is a teardown.
The public sources are the Splitwise API, the help page What is Simplify Debts?, and the 2012 post Debts Made Simple. Where those pages stop, I call it a guess.
Vibe code your own Splitwise as a ledger
The Splitwise page splits the work into three rows.
The first row is 8 hours. Groups, unequal splits, balances, and simplified debts. You add people, you record who paid, and the page says who should pay whom.
The second row is 2 days. Receipt uploads, recurring expenses, comments, and email reminders. A photo of the grocery receipt can wait until the totals already match.
The third row is a month and up. Mobile apps, payment integrations, currencies, and receipt scanning. Skip that row.
If you tell an agent to “clone Splitwise”, it aims at the third row. Copy the prompt, then pin it to the first one.
Store Group, Member, Expense, ExpenseShare, and Settlement. A group is the trip or the apartment, with an invite link. A member has a balance derived from the ledger. An expense is one cost, one payer or several, and a date. An expense share is what that member paid and what they owe. A settlement is a recorded payment between two members. It is a new row. It does not edit the expense.
The guardrail is on the card. Store amounts as integer minor units. Require the shares to sum exactly to the expense total. Never move real money.
The audience is housemates and trip groups. The goal is to track who paid what and settle with the fewest transfers. The same v1 also stands in for Tricount and Settle Up. The card lists both and does not give them prices.
A household budget is YNAB at $9.08–$14.99 a month, in Build a YNAB alternative. A receipt you submit to a manager is Expensify at $5–$9 a month. An invoice you send a client is FreshBooks at $23–$60 a month, in Vibe code your own FreshBooks. Those move different money. This build records a debt and stops.
How does Splitwise work
A group in the API is people who share expenses, a home or a trip in their examples. The same two people can also have expenses outside it. Expenses with no group show up under group id 0.
Creating a group takes a name, a type such as home or trip, and simplify_by_default. The response includes members, an invite link, and two debt lists. Each member’s balance is a list of currency code plus amount. original_debts and simplified_debts are both from, to, amount, and currency_code.
Creating an expense takes a cost as a decimal string with two places, a description, a currency, and a group. You set split_equally, or you send paid_share and owed_share per person. An equal split assumes the signed-in user paid. There is no percentage field on the call. A 200 is success only when errors is empty.
The expense object also has payment, repayments, deleted_at, repeat_interval, comments, and a receipt. Restore expense exists, so a delete they expose can come back. The sample sets payment true next to a brunch description, so I would not treat that sample as proof a settle-up is stored as an expense. The fields are public. The tables behind them are not.
Simplify Debts, on the help page, restructures who owes whom inside one group so fewer payments are needed. Totals stay the same. Anna owes Bob $20, and Bob owes Charlie $20. With the setting on, Anna pays Charlie $20, and Bob owes nothing. They rebuild that list when an expense or a payment is added. They tell you to watch the total, because the pairwise lines may move. More than one currency means simplify runs inside each currency and does not convert. Notification types 14 and 15 are currency conversion, separate from type 11, debt simplification.
Any member can toggle the setting, and the activity log records it. If people have already paid, they say leave it on. Turning it off brings the individual debts back. A payment along the simplified path may no longer match, and someone may have to pay the person the raw debts name. They say nobody overpays, and that it gets confusing.
The 2012 post splits this from a second button, “Simplify my debts”, across friends who share no group. Ryan Laughlin wrote that group simplify keeps each net and can name a new person to pay. You owe Betty $20, Betty owes Carlos $20, and the group feature tells you to pay Carlos. The friend-wide button added a third rule. Nobody owes a person they did not already owe. Marshall Weir wrote that a private debt between two friends stays out of the group. I have not found a current help page for that account-wide shuffle. Treat the 2012 post as what they shipped then.
They have not published the algorithm. Pairing the biggest debtor with the biggest creditor until the nets are zero would reproduce Anna paying Charlie, and it may invent a new pair. Whether they do that is a guess. The 2012 friend-wide rule rejects a new pair even when the payment count would drop.
The self-serve API is for your own account and for plugins. The overview says it is not for a fee-based service, and the terms say not to build an app that replicates Splitwise. The clone uses your own ledger.
Screens of a Splitwise alternative
v1 needs the group, the expense form, and a settle action. Receipts, repeat intervals, and comments are the 2-day row. The API already has those fields. The card still waits.
Group
The group screen is the name, the members, each net, and the short payment list. Lisbon has Ada, Bea, and Cam. Ada’s net is minus $20. Bea’s net is $0. Cam’s net is plus $20. The simplified line says Ada pays Cam $20. The raw lines, Ada pays Bea and Bea pays Cam, can sit behind a toggle that stays on once someone settles.
Expense
The expense screen asks who paid, the total in cents, and what each person owes. Exact amounts, a percentage, an equal split, and a share count are the four inputs on the card. All four have to become owed shares that sum to the total before save. $20.00 is 2000 cents. If Ada owes 2000 and the others owe 0, the sum is the cost, and save works. If the shares add to 1999, save refuses.
Settle
Settle is a from, a to, and an amount, taken from the simplified list. Ada pays Cam $20. Saving writes a settlement. The expenses stay. The nets go to zero because the settlement is in the same sum as the shares.
How a trip expense gets settled
Cam paid the apartment, $20, and only Bea owes it. Bea paid dinner, $20, and only Ada owes it. You save both expenses. The app stores 2000 cents each, checks the shares, and recomputes nets.
Ada is minus 2000. Bea paid 2000 and owes 2000, so Bea is at zero. Cam is plus 2000. The raw debts are Ada to Bea, and Bea to Cam. The simplified debt is Ada to Cam. That is the help page’s apartment example, with our names.
Ada records the $20 payment to Cam. The settlement row is appended. The next read adds that payment into the same totals, and every net is zero. Nobody deleted dinner.
Your browser talks to one Astro app. Node.js plus Astro is the default. Use TanStack Start if React is your weekday language. The capability line on the card is Astro, HTMX, and D1. D1 holds the ledger. There is no payment provider in this row, and no cron. A balance is a sum you run when the page loads.
The hard half of a Splitwise alternative
The 8-hour simplify is one group and one currency. Keep each net. Let Ada pay Cam even though the raw debt named Bea. Recompute on save. Leave the setting on after the first settlement, because the help page says turning it off later pulls the old pairs back under a payment that already happened.
That function is small once the ledger is right. A share that is one cent short has to fail save. A settlement has to sit in the same sum. Reload the group and get the same nets.
Multi-currency is a list of balances, and simplify must not add dollars to euros. The card puts currencies on the month row. The non-goal says not to convert.
The friend graph is the other product. Group id 0, private debts Weir said should stay out of the group, and a 2012 shuffle that could edit balances the actor cannot see. A 2013 support thread on that same post mentions a removed member still showing as “[Unknown] owes”. I don’t know if that case still happens. Membership and the simplified view still have to agree after someone leaves.
Real payments are the non-goal. A settlement is a note that Ada paid Cam. Receipt scanning and native apps are on the same skip row. Repeats, comments, and receipt files are in the API, and they are the 2-day row on the card.
The scope post is the same three-row habit. The prompt post is where you paste the exact-sum rule so the agent does not store a balance it cannot rebuild.
Start with the first row
Go to Build your own Splitwise. Copy the Astro prompt, or TanStack Start if that is what you write.
Tell the agent the first estimate only. Groups, unequal splits, balances, simplified debts. Eight hours.
Enter the two Lisbon expenses, check that Ada pays Cam, record that payment, and reload. The nets should read zero, and dinner should still be on the list. If you need euros and dollars in one group, or a charge that actually leaves a bank, keep the $3.33 plan for that part.