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
2.6 KiB
2.6 KiB
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 CIpublish-unique-dailyjob./daily-finds— capture-only sweep ofsources.json; writessrc/content/find/<yyyy>/<mm>/<slug>/, marks the day's shortlist (shortlist: true, up to 12), addsamazonLinkfor 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 4–7 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.tsglob) — name the filehero.*; 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. sourcefrontmatter must exactly match anameinsources.json.topicsfrontmatter (finds and reviews) must come from the controlled vocabulary insrc/lib/topics.ts(TOPIC_METAkeys) — 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.tsadds the tracking ID, badge, and disclosure at render time. - Commit style: see
git log—content: …for capture runs,site: …for everything user-visible; one commit per pipeline stage. npm run build(astro check + build) must pass before pushing.