13 KiB
13 KiB
Changelog
July 2026
- Autonomous pipeline overhaul: new
/daily-pipelineskill chains capture → bundle → review graduation → pick-of-the-day → build → commit → push and ends with a digest;daily-findsgains a score-and-shortlist stage (up to 12shortlist: truefinds per run, top 1-3 flagged as review candidates), feed-first fetching (fetch: "feed"+feedUrlin sources.json), cadence-aware scanning, and authority to apply mechanical source maintenance itself;build-bundle/cluster-bundles/build-reviewgain unattendedautomodes (publish + log instead of pausing for confirmation), andbuild-bundle weeklywrites a date-based "week's catch" so shortlisted finds never sit unbundled for weeks - Review heroes are now auto-discovered:
src/lib/hero.tsglobsreviews/*/hero.<ext>(images andhero.mp4), so a new review needs no registration — only legacy non-hero-named assets remain as explicit overrides; both hero globs also accept.avif - Pick of the day moves from a hardcoded constant in
src/pages/index.astrotosrc/data/pick.json(falls back to the latest review); the dev-mode "Make today's pick" button writes the JSON file - Optional
amazonLinkfrontmatter on finds and reviews renders an "Also on Amazon" link with the existing affiliate tagging, badge, and disclosure; the capture pipeline looks up exact Amazon matches for shortlisted physical products - Fact-checking against the product's own site is now a mandatory step when a find graduates to a review unattended
May 2026
- Bucket
find/folders by capture date: every find moves fromsrc/content/find/<slug>/index.mdxtosrc/content/find/<year>/<month>/<slug>/index.mdx(all 289 existing finds migrated to2026/05/). Thefindcontent-collection loader uses a newleafSluggenerateIdso the id (and therefore the URL at/find/<slug>/) stays flat, andsrc/lib/find-hero.tsswitched to a recursive**/hero.{...}glob. No URL changes; bundleitems[],promotedTo/fromFindcross-references, and category/tag pages all keep working unchanged. Rationale: the flat folder was getting hard to scan and slowgit statusat ~290 finds and growing 20+/day - Rename the "finds" superpost concept to bundle. The
findscollection becomesbundles(src/content/bundles/), URLs move from/finds/<slug>/to/bundles/<slug>/, and the home/footer/search labels switch from "List" to "Bundle". Internal renames:findListMosaic→bundleMosaic,FindsPost→Bundle,findsReferencing→bundlesReferencing,Entry.type 'finds'→'bundle',OgFallback 'finds'→'bundles'. Build script and generated mosaic dir follow (scripts/build-bundle-mosaics.mjs,src/generated/bundle-mosaics/). Skillsbuild-findsandcluster-findsrenamed tobuild-bundleandcluster-bundles. Thefindcollection (individual items) is unchanged - Add Cloudflare Web Analytics: privacy-preserving, cookieless beacon injected into
BaseLayout.astroso per-page traffic, referrers, and Core Web Vitals show up in the Cloudflare dashboard scoped tounique.rzen.dev. Privacy statement on/legal/updated to disclose the beacon - Strengthen the "Use of the site" section on
/legal/: explicit "inclusion isn't endorsement" + no warranty on safety/quality/durability/fit/continued-existence + no responsibility for what happens after click-through. Tone kept plain, not legalese - Colocate every collection's articles with their media: each entry is now a folder
<slug>/index.mdxwith sibling media files. Applied toreviews/,find/(104 articles + 89 heroes auto-resolved bysrc/lib/find-hero.tsviaimport.meta.glob('../content/find/*/hero.{...}')),finds/, andposts/. Slug derivation handled by a sharedstripIndexhelper on each glob loader; URLs unchanged across the entire site. MDX paths shortened from../../assets/reviews/<slug>/<file>to./<file>.src/assets/removed entirely - Media optimization pass: re-encode the 13 heaviest assets (h264 CRF 28, scale ≤1280px, audio stripped) and convert the two animated GIFs (cotypist, flux-markdown) to MP4 —
dist/drops from 53 MB to 31 MB (~42% smaller); biggest single wins arehomerow/search.mp4(6.7 MB → 1.6 MB),antinote/links.mp4(2.9 MB → 193 KB),flux-markdown/demo.gif(3.9 MB → 1.3 MB MP4). Originals preserved atsrc/assets/reviews/<slug>/source/and never bundled - Tile videos on
/and/grid/switched frompreload="metadata"topreload="none"so below-the-fold demos don't fetch on page load src/lib/hero.tsand the cotypist/flux-markdown review MDX updated to render the new MP4 heroes as inline autoplay-loop muted<video>instead of<img>- Comprehensive SEO pass: new
<SEO>component centralising every head-level tag (canonical, Open Graph, Twitter Card, theme-color, RSS alternate, JSON-LD); page-aware structured data —Review+BreadcrumbListon review pages,BlogPostingon posts,Product+BreadcrumbListon finds,Article+ItemListon finds superposts,CollectionPage+ItemListon category/tag/sources/blog pages,WebSite+Organization+ItemListon the home page,AboutPageon /about - Add
@astrojs/sitemap(auto sitemap-index.xml excluding/grid/,/index3/,/404/) and@astrojs/rss(feed at/rss.xmlcovering reviews + posts + finds superposts); addpublic/robots.txtpointing at the sitemap - Add custom 404 page with recent reviews + nav fallback (noindex)
- Wire promoted finds to canonical to their review (via
promotedTo); other finds self-canonical - Noindex
/grid/and/index3/(kept linked but absent from sitemap and search) - Per-page descriptions + OG image alt text for every page; count-bearing titles and descriptions on category/tag pages (
{category} ({n})); hero image upgraded with real alt text,fetchpriority="high",loading="eager",decoding="sync"; static OG fallback tiers in/public/og/(default/reviews/finds/posts — PNGs to be supplied) - Set
trailingSlash: 'always'andbuild.format: 'directory'explicitly to keep canonical URLs stable - Memoize
getSiteStats()so per-page SEO additions don't multiply build cost - Site-wide UI/UX refresh: newspaper-style masthead on every page (entry-count + last-updated on the left, large serif "Unique" wordmark centered between thin rules, About · Blog nav on the right), per-page italic subheader with last-updated date on listing pages, and an SEO-friendly footer with Browse / Collections / About link columns
- Home page swapped to a Pinterest-style hero + masonry grid; the plain chronological list view moves to
/index3/ - New
/aboutstub and/blogindex (Astro page over thepostscollection with an empty-state when no posts exist) - Single 76rem page width across the entire site (replaces the 42rem default +
wideprop split); article prose is constrained to a 42rem reading measure inside the wider layout so reviews/finds stay readable - New
getSiteStats()helper insrc/lib/entries.tspowers the masthead counts and footer Collections column live - Amazon affiliate handling: outbound links to
amazon.com,amzn.to,a.co, andsmile.amazon.comget the configured tracking ID appended at render time, are marked withrel="sponsored noopener noreferrer", and display a clearly-signposted "Affiliate" badge plus a one-line FTC-style disclosure on review and find pages. Tracking IDs live insrc/lib/affiliate.tskeyed by marketplace; non-US Amazon hostnames are recognized but left untagged until a marketplace-specific ID is added - Restructure into a four-collection content pipeline:
find(captured items, hidden from indexes),finds(editorial superposts that reference find slugs in a Pinterest-style grid),reviews(existing — gains optionalsourceandfromFindfields for graduations), andposts(existing, generic essays) - New routes
/find/<slug>/(direct URL only — finds don't appear on home, tag, or category pages) and/finds/<slug>/(superpost detail with intro + grid) - New components:
FindCard,FindsGrid,Backlinks,SourceBadge /sourcescards gain a "Recent finds" sub-list per source — the one cross-cutting surface where individual finds are visible- Find pages show "Featured in:" backlinks computed at build time from any superpost referencing them; review pages show "← First surfaced…" when promoted from a find
- New project-local skills under
.claude/skills/:daily-finds(capture-only — no theme detection, no candidate post, no winner pick),build-finds(editorial superpost author),build-review(find → review graduation) sources.jsongains per-sourcefetchstrategy (webfetch/curl/skip) with optionalfetchUrloverride; 11 sources switch to curl with a Safari User-Agent (Cool Material, MoMA Design Store, StyleForum, Atlas Obscura, etc.); 9 markedskipafter Cloudflare JS challenges and active anti-bot defeats both WebFetch and curl- New
/sourcespage (3-column card stream listing every source with its type, cadence, topics, and notes) - Migrate the seed daily-finds post: extract 5 candidates into individual find files, slim the superpost to just the intro paragraph, move from
posts/tofinds/ - Initial
sources.jsoncurated across macOS apps, useful tools, gifts, clothing, travel, and general-delight feeds (47 sources) - Daily-finds capture log at
daily-finds.log.md; new-source nominations queued atcandidate-sources.md - Initial blog scaffold with Astro 5 (content collections, no client JS)
- Base layout with light/dark theme via
prefers-color-scheme - Index page listing posts by date (newest first)
- Per-post page with title, date, category, optional external link, tags
- Auto-generated category and tag listing pages
- Seed content: 12 posts on delightful Mac apps (Cotypist, Folder Peek, DockDoor, TypeWhisper, Hyperkey, AntiNote, FluxMarkdown, Monocle, Alcove, Shottr, MiddleDrag, LinearMouse)
- Switch to MDX (
@astrojs/mdx) for post bodies - Restructure into two content types:
reviews(name + subtitle + body) andposts(title + body, empty for now) - Unified entry helper (
src/lib/entries.ts) and sharedEntryListcomponent so the home, category, and tag pages render a mixed chronological feed across collections - Reviews route moved to
/reviews/<slug>/; review detail pages show name as<h1>with subtitle as a tagline beneath - Index entries now show two lines for reviews (bold name + muted subtitle), single line for posts
- Migrate the 12 seed entries from
src/content/posts/*.mdtosrc/content/reviews/*.mdxwith the new schema - Add 5 new reviews: Ice (interface), AltTab (interface), Mac Mouse Fix (input), Homerow (input), Tot (writing)
- Establish media convention at
src/assets/reviews/<slug>/for real screenshots/clips downloaded from each app's site - Add visuals to 15 of 17 reviews (mp4 demos, animated gifs, or App Store screenshots), with one-line italic captions naming what's shown
- Style images and videos in review pages: max-width 100%, centered, soft border-radius; italic-only paragraphs auto-render as captions
- Use
import …?urlfor animated GIFs (cotypist, flux-markdown) to bypass Sharp and preserve animation - linearmouse and middledrag intentionally have no visual: linearmouse.app is JS-only with no scrapeable demo and the repo carries no screenshots; the
artginzburg/MiddleDragrepo cited in the review no longer exists - Rewrite all 17 reviews — informative, concise, no sales tone; longer reviews lead with a pre-review blockquote summary
- Style
.body blockquoteas a confident lead (accent left-border, no italics, foreground color) on review and post detail pages - Add optional
linkTextfield to reviews: overrides the external-link label (e.g. "Visit in App Store" or "Visit on GitHub"); defaults to the link's hostname withwww.stripped - Sample a Pinterest-like 3-column tile stream at
/grid/(CSScolumn-countmasonry, no JS); responsive to 2 cols / 1 col on narrow viewports src/lib/hero.tsmaps slug → hero asset (image or video) so the grid can render visuals; reviews without media (linearmouse, middledrag) become text-only tiles with an accent gradient- Add
wideprop toBaseLayoutfor pages that need a wider max-width than the default reading column - Floating "grid view →" link from the home page; the main index keeps its plain list layout
- Add a CSS-only scroll-snap carousel for reviews with multiple visuals: each
<figure>slide carries its own<figcaption>; pure CSS, no client JS; thin scrollbar visible on desktop, swipe on touch - Expand 8 reviews into multi-slide carousels with downloaded media — antinote (5), typewhisper (6), dockdoor (3), shottr (3), folder-peek (3), homerow (3), ice (3), tot (2); 28 slides total across the site
- Limit the home page index to the 12 most recent entries across all collections; older entries remain reachable via
/grid/, categories, and tags