tl;dr: Pages now arrive with their content already in them — plus a security policy that finally applies, and field reports that stop losing your teams.
For a long time, pages were arriving as empty envelopes. The first paint should have carried real content; instead, hundreds of public pages and every single logged-in page shipped literally zero bytes of it, then waited for JavaScript to fill the gap. That's fixed across the board. The landing page now paints roughly 61 KB of actual content immediately, and on phones the app opens with the bottom nav bar already there instead of a blank rectangle. Fixing it also flushed out 26 build errors that had been hiding inside all that emptiness.
The same bug wore different costumes elsewhere. The news index was rendering every article at zero opacity and holding them hostage to a 1.4-second animation — articles are now readable the instant the page lands, with the featured cover image preloaded. The about page had 20 invisible wrappers doing the same trick, and was downloading its hero image twice for every visitor; now it's one download, plain server-rendered sections, and hover effects that whisper instead of shout. The hunting seasons table — the handbook's most-visited page — was building its 66 periods client-side, which meant search crawlers indexed six loading skeletons and nothing else. The full table now prerenders, with only the live badges and countdowns computed in your browser, where they belong. County pages got a related fix: a chart library that was supposed to be code-split had been quietly riding along in the initial bundle anyway.
Weight came off everywhere. Every public page used to carry the site's entire 93 KB translation dictionary, whether it needed six words or six hundred — about 58 MB across the site, now down to just over 1 MB. That's a 98% cut. A privacy page that shipped the whole dictionary now ships 1.8 KB. Navigation got faster on top of that: your account details and team list are cached per user in two layers, so warm page loads ask the database nothing at all, and hovering a link delivers the next page's frame before you click. Saves stopped doing their work twice, and changing your name no longer shows the old one on other pages for five minutes.
Two things needed fixing that had nothing to do with speed. The strict security policy written for logged-in pages had never once been delivered — a config conflict meant the permissive marketing rules won silently, so ad domains were allowed in the app. Real policy now applies to logged-in and admin pages, marketing scripts are gone from those trees, and along the way we found the feedback widget had been blocked site-wide by mistake. The onboarding gate had also degraded into a polite suggestion that anything without JavaScript could walk straight past; it's back at the front door. And field reports shared with multiple hunting teams no longer lose the extras — tick three teams, get three teams, and editing a note won't silently unshare it.
The rest is scaffolding: build guards that fail loudly when a page loses a word or ships an empty shell, a browser test that pauses navigation mid-flight to prove your name is already on screen, a security probe honest enough to catch what our automation tools can't see, and a round of hardening that blocks eval in production and stops the proxy forwarding raw client headers. Thirty-one tracked issues closed. Also: a proper 404 inside the app instead of a bare white page, and a handful of dead components deleted for good measure.
Nothing here asks you to change how you work. It just means the app does less waiting, less leaking, and less quiet forgetting.