27 lines
3.2 KiB
Markdown
27 lines
3.2 KiB
Markdown
# 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 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
|
||
|
||
- **`EDITORIAL.md` is the editorial charter** — the voice (concise, to the point, inspiring delight through specificity, never ad copy; word budgets per copy type) *and* the canonical content rules (no tobacco/alcohol anywhere; no camping gear or harm-adjacent items as pick of the day; rules apply forward only — published stays published). All audience-facing prose and every selection stage follow it; the pipeline runs a fresh-eyes copy-edit stage over each day's new copy. Skills restate the rules for their stage, but the charter wins on drift.
|
||
- 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 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.
|