Tag pages are now generated from the union of entry and find tags —
1,179 tags that existed only on finds (most tag links on find pages)
previously 404'd. Tagged finds render in a compact secondary "Finds"
list below the entry grid, keeping the editorial tier on top. Find-only
tag pages with fewer than 3 finds are noindexed until they fill out.
Tag feeds stay entries-only; the RSS pill and autodiscovery link only
render where a feed exists. Category pages unchanged (finds have no
category).
Claude-Session: https://claude.ai/code/session_01WZaczDJjL3xZ3u5spsN5AL
With trailingSlash 'always', astro dev only matches dynamic-route
endpoints when the request has a trailing slash, so the RSS pill links
(/tags/<t>/rss.xml, /categories/<c>/rss.xml) 404'd locally while the
built site served them fine. Dev-only vite middleware rewrites those
requests to the slashed form.
Claude-Session: https://claude.ai/code/session_01WZaczDJjL3xZ3u5spsN5AL
Autodiscovery alone is invisible since browsers dropped feed-detection
UI — add a small RSS pill in the subheader (new feedHref prop on
BaseLayout) linking to the page's scoped feed.
Claude-Session: https://claude.ai/code/session_01WZaczDJjL3xZ3u5spsN5AL
Feeds: JSON Feed 1.1 at /feed.json, per-category and per-tag RSS at
/categories/<name>/rss.xml and /tags/<name>/rss.xml alongside the main
/rss.xml — all from a shared src/lib/feed.ts item source. Category/tag
pages advertise their scoped feed via autodiscovery; new /feeds/
directory page (footer-linked) lists every feed with counts; RSS feeds
gain an atom:link self reference and a feed.xsl stylesheet so they
render readably in browsers.
Programmatic readers: build-generated /llms.txt (site map with every
review/bundle/post), SearchAction on the WebSite JSON-LD wired to
/search/?q=, and a "For robots" section on /feeds/ documenting
search.json, llms.txt, the sitemap, and JSON-LD coverage.
Claude-Session: https://claude.ai/code/session_01WZaczDJjL3xZ3u5spsN5AL
The width-tier system (full-bleed wide tier, body max-width tweens,
absolute-positioned FLIP masonry) is gone. Grid pages are 4 columns in a
55.5rem container (>=69rem viewport), everything else 3, with the existing
1-2 column steps on small screens. Masonry returns to real flex columns.
This also fixes bundle pages rendering as a diagonal card cascade: the old
.masonry > .masonry-tile { position: absolute } tied with FindCard's scoped
position: relative on specificity, and on bundle pages the FindCard rule won
the cascade order, leaving tiles in normal flow with masonry translate()
offsets stacked on top. Flex columns don't position tiles, so the tie is gone.
Kept from the motion pass: staggered tile reveal on initial load and
"Load more" (now via animation-delay), card hover lifts, button tactility.
- Images/videos fade in on load instead of popping (cached media renders
instantly; nothing is hidden without JS)
- Cross-document view transitions: soft cross-fade between pages where
supported
- Masonry reveals ripple: initial grid and "Load more" batches stagger in
per-tile instead of blinking on at once
- Card hover: gentle -2px lift + slow image zoom on hero, home/grid tiles,
and find cards; find-card lift switched to `translate` so it composes
with the masonry's inline transform (it was silently dead before), and
its transition list unified with .masonry-tile's to end their cascade tie
- Tactile press/lift on "Load more" and the external CTA button
- Accent-tinted ::selection, visible :focus-visible rings, smooth anchor
scrolling; global prefers-reduced-motion catch-all disables it all
Claude-Session: https://claude.ai/code/session_01ADR9r5rw5NuvvnCxfYbMuc
Named width tiers (mobile/narrow/regular/wide) with body max-width easing
between them; grid pages opt in via BaseLayout `wide`. Masonry is now
absolute-positioned with FLIP glides on column-count changes: targets are
computed from the *final* container width (reading --max, which flips
instantly while max-width tweens), mid-glide column changes retarget
instead of being dropped, and container height eases so content below
rides along.
Claude-Session: https://claude.ai/code/session_01ADR9r5rw5NuvvnCxfYbMuc