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
- src/lib/hero.ts: review heroes are now auto-discovered via import.meta.glob
over reviews/*/hero.<ext>; only legacy non-hero-named assets remain as
explicit overrides. New reviews need zero registration.
- Pick of the day moves from a hardcoded HERO_SLUG in index.astro to
src/data/pick.json (content edit, not code edit); dev set-pick API and
the review-page button now write pick.json. Fallback: latest review.
- Schemas: finds gain shortlist (bool) + amazonLink; reviews gain amazonLink.
- Review + find pages render an 'Also on Amazon' affiliate link when
amazonLink is set, with shared disclosure handling.
- Both hero globs now include .avif (two June finds ship avif heroes).
New review under category `automation` (introduced for Apple
Shortcuts and similar workflow graduates — none of the existing
review categories fit). Hero registered in src/lib/hero.ts so the
grid card renders. Find marked `promotedTo: smartmover-shortcut`.
Also: HERO_SLUG bumped from superkey → monitorcontrol on the home
page (today's pick).
Eliminates the byte-dedup hazard that just bit timelined and apex: every
image consumer now goes through Astro's image pipeline, so duplicate
bytes share their webp variants instead of one consumer's strategy
silently winning and dropping the original asset.
Side-benefit is significant: tiles and the home hero now ship responsive
webp variants via srcset/sizes instead of the original PNG/JPG. The
superkey hero alone drops from 192 KB to ~29 KB at the largest size.
Video branches stay raw — astro:assets is image-only and videos don't
have this bug.
Adds a build-time mosaic generator (scripts/build-list-mosaics.mjs, sharp)
that composites a single tile image per superpost from its referenced
finds. Wired via predev/prestart/prebuild hooks; output lives in
src/generated/ (gitignored). The /finds/ index and home grid both render
the mosaic when present and fall back to text-only tiles otherwise.
UI / dev tooling
- /find/ index: sort by file birthtime desc (sub-day chronology even when
many finds share the same frontmatter date); render the captured-at on
its own line under the host (~0.65rem mono muted)
- New dev-only filter at the top of /find/: All / Not in lists, persisted
in localStorage; "not in lists" hides finds referenced by any superpost
- New editorial-tags chip strip on each find card (dev-only): selected
tags visible by default, full picker on hover/focus-within with a "…"
button for arbitrary tag entry; clicks copy /edit-find-tag <slug> <tag>
to the clipboard via the existing EditConfirm singleton
- New optional editorialTags: string[] field on the find collection
- New src/data/editorial-tags.json — master list of available tags (initial
set: ["delete"]); display order follows file order
/grid/ now uses the JS Masonry component instead of CSS column-count, so
the middle column no longer "dips"; tile hover updated to match the home
page's accent-glow / no-translate style
Content
- New review: apex-markdown-processor (graduated from find of same slug;
hero reused from the find folder)
- New review: sindre-sorhus-older-mac-apps (graduated; intentionally
hero-less per the source page's text-only design)
- New review: superkey (added by user; hero wired in src/lib/hero.ts)
- 24 new finds captured by /daily-finds across travel, jokes, quotes,
product picks, and indie tools
- 2 new finds superposts: 2026-05-04-a-small-atlas, 2026-05-04-off-until-needed
Misc
- daily-finds.log.md and candidate-sources.md updated with the day's runs
- build-finds skill prompt iterated by user
- New "Why this exists" post; masthead "founded" links to it
- Post template: serif headline + date in masthead, "Filed under {category}" in footer
- Drop counts from footer Collections list
- Masonry component for home + sources grid; source badges link to /sources/#slug
- Theme toggle (settings page + cog) with dark-mode-aware tokens
- Six new themed find lists; cluster-finds skill
- newspaper-style masthead (stats | "Unique" | About/Blog) on every page
with per-page italic subheader + last-updated date on listing pages;
sitewide 42rem reading width
- pinterest home (hero + masonry, "load more"); old list view at /index3/
- new pages: /about, /blog, /legal, /find/, /finds/, custom 404
- footer collection links now clickable; "founded" stat replaces "updated"
in the masthead
- centralised SEO component with per-page json-ld (Review, BlogPosting,
Product, Article, CollectionPage, ItemList, BreadcrumbList, etc.);
@astrojs/sitemap + @astrojs/rss; robots.txt; promoted finds canonical
to their review
- memoize getSiteStats() so the masthead/footer counts don't multiply
per-page build cost
- 25 new daily-finds captures
A small Astro + MDX blog for delightful, daily-use finds. The architecture
separates capture from publication and supports reuse:
- find/ captured items, hidden from indexes
- finds/ editorial superposts referencing find slugs in a grid
- reviews/ full-length writeups; can graduate from a find via fromFind
- posts/ regular essays
Three project-local skills under .claude/skills/ drive the pipeline:
daily-finds (capture-only sweep across sources.json), build-finds (draft
a thematic superpost), build-review (graduate a find).
sources.json carries 47 curated feeds with per-source fetch strategy
(webfetch / curl / skip) so Cloudflare-blocked sites and Reddit JSON
endpoints are handled deterministically. /sources renders a 3-column
card stream with a "Recent finds" cross-reference per source.
Seeds: 17 reviews and one superpost referencing 5 finds.