This site uses one functional cookie to keep feature rollouts consistent for you. Nothing is set until you choose. See the privacy notice.
Dev notes
A full-stack personal calendar with four views, Google Calendar sync, event sharing, and Pokémon card attachments — built on Postgres and date-fns.
date-fns for all date math — named imports so only the functions used land in the bundleaddCalendarAclEntry fires fire-and-forget after the DB insert so ACL latency never delays the HTTP responseUpdate — August 10, 2026
The months jumped while you scrolled. The infinite scroller compensated for exactly one thing — prepending a period at the top, capturing scrollHeight before the insert and correcting after. Right idea, too narrow. The period renderer also depends on the events and countdowns, so cells change height whenever data arrives, and content growing above the viewport shoves what you are reading down the screen with nothing to correct it.
Rather than add a second special case I replaced it with one mechanism: anchor on the period the reader is looking at, and put it back after any render. That covers prepends, data arrival, and whatever gets added next. I had ruled out the more obvious suspect first — the period callbacks are properly memoised, so the observers were not tearing down on every scroll.
What I would take from it: compensating for a known mutation is a trap, because the next mutation will not be known. Anchoring on what the reader is looking at makes the mechanism independent of what changed. The same mistake, in a different shape, is what made the Explore Toronto rail move around before it was laid out as a grid.
The accessibility pass was not cosmetic. Enforcing axe best-practice rules rather than just violations flagged real structural problems here — a calendar is a grid of interactive cells, which is exactly where landmark and heading structure quietly goes wrong. Fixing those meant changing markup, not adding attributes, which is the right outcome and the more invasive one.