Files
unique/CLAUDE.md
T
rzen 9e5fce1eb0 site: topics axis + per-source indexes
Topics — the curated subscription layer: 18-value controlled vocabulary
in src/lib/topics.ts, enum-enforced by the content schema on finds and
reviews so unattended runs can't drift it. /topics/ index +
/topics/<t>/ pages with finds first-class alongside reviews, per-topic
RSS feeds that include finds (unlike category/tag feeds), "By topic"
section on /feeds/, Topics footer link and llms.txt section, dev-shim
coverage for the new feed URLs. daily-finds and build-review skills now
classify at capture/graduation time; "giftable" is a tag, never a
topic.

Per-source indexes: /sources/<slug>/ lists every review and find from a
source (catalog ∪ names in content, so retired sources resolve);
find/review colophons link "(more from this source)"; /sources/ cards
link "everything from this source →"; sub-3-item pages noindexed.

Claude-Session: https://claude.ai/code/session_01WZaczDJjL3xZ3u5spsN5AL
2026-07-12 19:39:11 -04:00

2.6 KiB
Raw Blame History

unique.rzen.dev

A daily product-discovery site (Astro, static). The editorial pipeline is skill-driven and designed to run unattended.

Pipeline

  • /daily-pipeline — the whole daily chain: capture → bundle → reviews (several per run, judgment call) → pick of the day (explicit decision every run) → build → commit → push → digest. This is the entrypoint for scheduled/headless runs; scheduled runs auto-deploy afterwards via the lab CI publish-unique-daily job.
  • /daily-finds — capture-only sweep of sources.json; writes src/content/find/<yyyy>/<mm>/<slug>/, marks the day's shortlist (shortlist: true, up to 12), adds amazonLink for confidently-matched physical products, and applies mechanical source maintenance.
  • /build-bundle [auto|weekly|<theme>|<slugs>] — one themed roundup referencing find slugs. weekly = date-based catch of unbundled shortlist finds.
  • /cluster-bundles [auto] — batch-cluster the backlog into 47 bundles.
  • /build-review <slug> [auto] — graduate a find to a full review (fact-check against the product's own site is mandatory in auto mode).

Unattended runs never pause for confirmation — they publish, log to daily-finds.log.md, and report a digest; the user vetoes after the fact. Only two things stay user-only: vetting candidate-sources.md nominees into sources.json, and scheduling.

Conventions that bite

  • Review heroes are auto-discovered from src/content/reviews/<slug>/hero.<ext> (src/lib/hero.ts glob) — name the file hero.*; no registration.
  • The homepage "pick of the day" is src/data/pick.json ({"hero": "<review-slug>"}); falls back to the latest review.
  • Find slugs are globally unique although folders are date-bucketed; URLs stay flat at /find/<slug>/.
  • Finds are reachable through bundles and through tag pages (a secondary "Finds" list under the entry grid on /tags/<tag>/) — an unbundled find is still invisible on the home feed, grids, and category pages.
  • source frontmatter must exactly match a name in sources.json.
  • topics frontmatter (finds and reviews) must come from the controlled vocabulary in src/lib/topics.ts (TOPIC_META keys) — the schema enum fails the build on anything else. Tags are free-form; topics are curated. "Giftable" is a tag (giftable), never a topic.
  • Amazon links: store canonical https://www.amazon.com/dp/<ASIN> with no query params; src/lib/affiliate.ts adds the tracking ID, badge, and disclosure at render time.
  • Commit style: see git logcontent: … for capture runs, site: … for everything user-visible; one commit per pipeline stage.
  • npm run build (astro check + build) must pass before pushing.