cebimde.io is personal finance in Turkish — spending, subscriptions, instalments and monthly limits in one place. It is the only thing I build that is not in English, because the problem it solves is not language-neutral: it is about the lira. It is at cebimde.io (opens in a new tab).
If you live in Turkey and pay for anything in dollars — a hosting bill, a Medium subscription — then "how much did that cost me" has no fixed answer. It has an answer per day. A tool that converts your history at today's rate will tell you a different story every time you open it, and none of those stories is what happened.
So an expense in a foreign currency does not store an amount. It stores three things: the amount you paid, the lira equivalent, and the rate that produced it, along with the date that rate is from. The rate is the central bank's for the day of the expense, not for today. Nothing recomputes later. Your July is your July, permanently, and the total at the bottom of the page is a fact rather than a live conversion.
That is the design. The rest of this section is about how long it took to be true everywhere.
Storing the rate is only correct if every path that creates an expense does it. Four of them did not, and each one was found separately:
None of these showed an error. The app looked fine; the totals were just quietly wrong, and only for the expenses least likely to be noticed — the automatic ones. It is the same category of failure as Lite Journal rendering an empty timeline when a query failed: nothing breaks, and the software tells you something untrue about your own life.
Instalments — taksit — are how a great deal gets bought in Turkey, so an instalment plan has to land on the right dates for twelve months. It did not, and the reason is a piece of JavaScript that behaves exactly as documented and not at all as expected: adding one month to the 31st of January gives you the 3rd of March, because February has no 31st and the date quietly rolls forward into the overflow.
Every instalment now clamps to the last day of a short month instead. January the 31st becomes February the 28th, then March the 31st again — the day is preserved where it exists and pulled back where it does not, rather than being allowed to wander into the next month.
The app was built on a component library and a utility CSS framework, which is the sensible way to start and was steadily less true as the interface acquired opinions. The design system that replaced it is the app's own: its own tokens, its own modal, its own buttons, its own dark mode. The migration finished with a commit that could state it plainly — no component library and no utility classes left anywhere in the product UI.
What that bought is not visual novelty. It is that a change to a modal is now a change to one file that belongs to this app, rather than a fight with defaults written for a different one.
Reading the history back, the largest single category is things taken out. Colour bars behind category lists. Percentage bars in the top-expenses list. Countdown badges on upcoming subscriptions. A separate section for subscription expenses, folded back into the ordinary list because the separation was a database distinction rather than a human one. A category strip on the dashboard. The word kullanıldı from the end of every limit row.
A finance dashboard is where decoration goes to disguise itself as information, and every one of those elements was decoration in the shape of a chart. What is left is the numbers, at the sizes their importance deserves.
One thing came back twice, which is worth admitting: a chart whose height flexed with its container was tried, reverted for causing a render loop, tried again, and reverted again to a fixed height. The third attempt was to stop attempting it.
Six hundred and ten commits across a web app, an API and an iOS client, the first of them in July 2025. It is in Turkish and stays in Turkish: translating it would mean pretending the lira problem at its centre is a formatting question. If you want to use it rather than read about it, it is at cebimde.io (opens in a new tab).