Rewriting an app from scratch forces a question you don’t usually have to ask: of everything the old version did, what actually deserves to exist in the new one?

What Survived

Session saving. Every translated conversation gets stored so I can look back at what was actually said. The old app also had a meeting-minutes mode, hiding the translation, enlarging the transcript, and alternating the background color for each recording segment so a long meeting stayed readable instead of turning into one wall of text. That mode carried over into the new web app unchanged in spirit, just triggered by a CSS class instead of a native screen.

A personal glossary. Names, technical terms, and anything else that kept getting mistranslated the same way every single time. Without it, a repeat conversation means correcting the same word over and over. With it, the glossary feeds into the model alongside the translation settings, through the same systemInstruction channel the app already uses to hint at a starting language, so the model gets it right consistently instead of by luck.

Both features existed because a real, felt annoyance from actually using the old app pointed at them. That’s the bar I used for deciding what to keep.

What Didn’t Survive, on Purpose

The old app had a credit system: new users got five free credits, a recharge dialog for buying more, and a server-side file listing which users got free VIP access. All of it is gone in the new version, and none of it was replaced with something similar.

Instead, each device stores its own Gemini API key, entered once, masked like a password, and never sent to any server. There’s no login. No credit ledger. No billing code to maintain, patch, or worry about someone abusing.

The honest reason is scale, not principle. This app currently has an audience of one family on a handful of personal devices. A server that tracks other people’s money is a meaningfully heavier piece of software than the one this project actually needs right now, and building it in “just in case someone else wants this someday” would have meant carrying that weight for a use case that doesn’t exist yet. If real outside users ever want TransLee, the credit-and-payment question gets asked again then, with an actual reason behind the answer.

One small leftover: the old vip_users.json file is still sitting in the codebase, unused. I decided to leave it alone rather than clean it out for the sake of tidiness. It isn’t doing any harm, and it isn’t worth the time.

The Actual Rule

A rewrite is a chance to keep the parts that solved a real problem and let go of the parts you built because you assumed you’d need them later. Sessions and a glossary earned their place because I kept running into their absence. The credit system didn’t get rebuilt because nothing about the current, honest scale of this app needs it.

Since there’s no credit system anymore, cost tracking for this app is now just one plain question: how much did my own Gemini API key actually get billed. I haven’t collected enough days of real use to answer that honestly yet. Once I have, I’ll update this post with real numbers instead of a guess.