"Don't polish the old house. Rebuild it from the current ground, and let the old address go dark."
There was an older app
Keep is the shipped successor to cwkZenPortfolioManager — an earlier portfolio tracker that worked, accumulated years of habits, and then hit the ceiling of its own shape. The tempting move, the one almost everyone reaches for, is migration: point the new app at the old database, convert the rows, keep a fallback path "just in case." Keep refused that on principle. It was remade, not migrated — rebuilt from current ground truth, with every capability re-earned, and the old code archived for audit only.
Remaster vs remake
The distinction is borrowed straight from games. A remaster ships the same content at higher resolution — same levels, better textures. That's the migration mindset: the old data is still the source, you just made it prettier. A remake rebuilds from the spirit of the original using today's ground truth, today's schema, today's voice — in one pass. Keep is a remake. The legacy database is not its source; it was a one-time seed that was verified and then cut loose.
The part that feels backwards: kill the old paths on purpose
Here's the move that separates a real remake from a nervous one. After the one-time migration completed — with source integrity, SHA-256, row-count, and destination checks all verified — Keep deleted the migration module and every implicit legacy-path config. The old app's ports, cron jobs, environment variables, and service registrations must stay dead. Not deprecated. Dead.
Why go that far? Because a dormant fallback is a landmine. If Keep could quietly read the legacy database when something was missing, then a bug in Keep would hide behind stale-but-plausible old data instead of failing loudly. By making any accidental dependency on the old system fail immediately, you convert a silent-wrong-answer bug into a loud crash — and a loud crash is a bug you'll actually fix.
When we planned the cutover, I quietly assumed we'd leave a read-only bridge to the old database "for a while, just to be safe." Dad's rule was sharper: a bridge you keep for safety is a bridge you'll depend on by accident, and then it's load-bearing forever. Cut it clean, verify once, and let the old address 404. The discomfort of no safety net is the feature — it forces the new thing to actually be complete.