
The trip list
Each trip shows its dates, who is going and where it stands: which day of the trip it is, how many days are left, or what you owe in red if you have an open debt.
Case study · 2026
A mobile app for organising a group trip. Each trip holds the itinerary, the tasks, the map and the expenses, and the app works out who owes what to whom.
It's not on the app stores: it runs locally with Docker and Flutter.
It came from a holiday with friends: the plan was split across three chats, one of us had paid for the hostel and another for the dinners, and we settled up a month later, from memory.
In TodoTrip you join a trip with an invite code. From then on you see everything about that trip and nothing else.

Each trip shows its dates, who is going and where it stands: which day of the trip it is, how many days are left, or what you owe in red if you have an open debt.

Events are grouped by day. Only the next event is highlighted, with how long until it starts, so it's clear what happens next.

At the top you see what you owe and the trip total, and below that every expense with who paid and your share. Shares can be different: if you weren't at dinner, you don't pay for it. A debt isn't shown by red alone but also in words.

Each task has a deadline and the people responsible. Completed tasks go into a group you can collapse, so only what's left stays in view. Next to them are lists, for things to buy or to bring.
Amounts are whole numbers of cents, and balances are recalculated every time from the expenses and repayments.
Floating point numbers and a balance stored in a table. Floating point picks up rounding errors after a few splits, and a stored balance sooner or later stops matching the expenses.
When something changes, the server only says that it changed, and the app reloads the data the usual way. If the real-time connection drops, the app keeps working and reloads when you switch screens. The exception is live location: it's two coordinates that change every 20 seconds, so they travel directly over the connection.
Sending the new data inside the update: the phone would have to merge two versions and handle conflicts.
Leaving is blocked until your balance is zero. Closing an account clears the user's profile details but keeps the row for accounting references, so past expenses still add up. Historical user-written content is not rewritten.
Deleting the person and their shares: everyone else's balances would change.