"Old data isn't a problem to hide. It's a fact to label. The lie is pretending it's fresh."
What to do when data gets old
Data ages. A quote from this morning is stale by afternoon; a value from last Friday is stale after a long weekend. A high-trigger app treats staleness as an emergency — it flashes, it urgently re-fetches, it hides the old number. Keep does the calm thing: stale data remains visible and labelled instead of vanishing. The old value stays on screen, wearing its age honestly — "as of this date, this many hours old" — so you can see both the number and exactly how much to trust it. Nothing disappears, nothing screams, nothing pretends to be fresher than it is.
Why hiding stale data is the worse option
Two apps, same stale quote. App A hides it and shows a spinner until a fresh value arrives — but the provider is down, so you stare at a blank where your portfolio should be, anxious. App B shows the last known value with a clear "4 hours old" tag — you have the information and its exact caveat, and you're calm. Hiding stale data doesn't protect the user from anything; it just replaces a labelled fact with an anxious void. The honest label is both more useful and more calming than the hidden truth.
Caching without changing policy
Keep caches provider data to avoid hammering the sources, and the cache windows are chosen to match how fast each kind of data actually changes:
- Daily bars → cached for a day (they don't change intraday)
- Sparkline windows → an hour
- Fundamentals → six hours (they move slowly)
- Derived simulation calibration → a day
Caching speeds things up without changing policy — a cached value is still shown with honest provenance and age. And one deliberate exception: seed prices for a simulation run are always resolved fresh at run time, never served from cache, because a scenario's starting point must be exact and reproducible (you'll see why in the next track).