Skip to content
Aaron WaltersPERSONAL DASHBOARD

On the record

Decisions.

Every useful system is a pile of tradeoffs wearing a clean interface. These are the choices behind this one: what I picked, what I did not, and what the decision cost. If a choice has no downside, it is probably marketing copy wearing a hard hat.

  1. No charting library

    The trend lines are drawn directly in SVG, without a charting package.

    What it cost

    The sparklines can’t be hovered for a value. Every new chart type needs its own drawing code. The chart on the home console updates in the browser when you switch channels; the other charts render on the server.

  2. Cache stale data rather than show none

    Feed and quote caches outlive their refresh interval by a full extra run, so a missed job leaves yesterday on screen instead of an empty page.

    What it cost

    A headline can be up to two days old if the scheduled job fails repeatedly. The timestamp is on the page, but it's small, and someone skimming will miss it.

  3. The market board works with no API key

    Live quotes when a key is configured; end-of-day closes from a keyless source when it is not. Every quote records which it was.

    What it cost

    Without a key the numbers are yesterday, and someone who does not read the label could mistake them for live. That is why the label is not optional.

  4. Playback position lives in the browser, not on a server

    Where you stopped listening is kept in local storage, with no account and no record of it anywhere else.

    What it cost

    It does not follow you to another device, and clearing site data loses it. Nobody has to trust me with a listening history to use the player.

  5. Keyboard shortcuts are off until asked for

    Single-key controls — space, J, K, L, M — are opt-in per browser rather than always live.

    What it cost

    Almost nobody will find them. Those same keys are how screen-reader users navigate, and taking them by default breaks the page for people who need it most.

  6. Two contexts for one audio player

    Transport state and the playback clock are separate React contexts, so the four-times-a-second tick reaches only the scrubber.

    What it cost

    More moving parts than one context, and a rule a future reader has to know before touching it: subscribe to the clock and you re-render on every tick. Nothing in the code stops someone getting that wrong.

SPY / DAILY CLOSES771.79Finnhub quote · daily close history
No chart data available

Disagree with one of these? Good. Those are usually the useful conversations.