site: bucket find/ folders by capture date + 2026-05-09 capture (67 finds)
Migrate every find from src/content/find/<slug>/ to src/content/find/<year>/<month>/<slug>/ — all 289 existing finds moved into 2026/05/. The find content-collection loader gets a new leafSlug generateId so ids (and therefore URLs at /find/<slug>/) stay flat; src/lib/find-hero.ts switches to a recursive **/hero glob. Bundle items[], promotedTo/fromFind keys, /sources cross-refs, and category/tag pages all keep working unchanged. Skill docs (daily-finds, build-review, build-bundle, cluster-bundles), README, and CHANGELOG updated for the new on-disk path. Also: 67 new finds from the 2026-05-09 capture run (Web Curios 8, MoMA 7, r/macapps 7, r/dadjokes 6, icanhazdadjoke 6, Wallpaper* Travel 5, Snow Peak 5, Kottke 3, Boutique Homes 3, etc.); felo-ergonic-screwdriver-set rolled back per editorial decision.
This commit is contained in:
@@ -12,7 +12,7 @@ Invoke from inside the `unique.rzen.dev` repo.
|
||||
|
||||
## Inputs
|
||||
|
||||
- `src/content/find/*.mdx` — the available pool of finds.
|
||||
- `src/content/find/<year>/<month>/<slug>/index.mdx` — the available pool of finds (folders are nested by date but slugs are globally unique; recurse with `find src/content/find -name index.mdx` or rely on the `find` content collection's id which is the leaf slug).
|
||||
- `src/content/bundles/*.mdx` — existing bundles (used to detect already-bundled finds).
|
||||
- Optional argument: a theme phrase (e.g. "single-virtue tools", "things-disguised-as-other-things").
|
||||
- Optional argument: an explicit list of find slugs the user wants in the bundle.
|
||||
@@ -99,7 +99,7 @@ Example body:
|
||||
|
||||
### 4. Verify
|
||||
|
||||
- Confirm every slug in `items[]` exists at `src/content/find/<slug>/index.mdx`. If any is missing, abort and report — never reference a non-existent find.
|
||||
- Confirm every slug in `items[]` exists at `src/content/find/<year>/<month>/<slug>/index.mdx` (use `find src/content/find -type d -name "<slug>"` to locate). If any is missing, abort and report — never reference a non-existent find.
|
||||
- Run `npm run build` to confirm the new bundle compiles.
|
||||
|
||||
### 5. Update the log
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: build-review
|
||||
description: Graduate a find item to a full review for unique.rzen.dev. Reads src/content/find/<slug>.mdx, expands the body into a full review, writes src/content/reviews/<slug>.mdx, and links the two via fromFind / promotedTo. Use when the user runs /build-review <slug>, says "review this find", or "graduate <slug>".
|
||||
description: Graduate a find item to a full review for unique.rzen.dev. Reads src/content/find/<year>/<month>/<slug>/index.mdx, expands the body into a full review, writes src/content/reviews/<slug>/index.mdx, and links the two via fromFind / promotedTo. Use when the user runs /build-review <slug>, says "review this find", or "graduate <slug>".
|
||||
disable-model-invocation: true
|
||||
---
|
||||
|
||||
@@ -12,8 +12,10 @@ Invoke from inside the `unique.rzen.dev` repo with a find slug as the argument.
|
||||
|
||||
## Inputs
|
||||
|
||||
- `src/content/find/<slug>.mdx` — the source find (must exist; abort otherwise).
|
||||
- `src/content/reviews/<slug>.mdx` — must NOT exist (abort if a review with the same slug is already there; ask the user to disambiguate).
|
||||
- `src/content/find/<year>/<month>/<slug>/index.mdx` — the source find (must exist; abort otherwise). The slug is unique across the whole `find/` tree, so locate it via `find src/content/find -type d -name "<slug>"` if you don't already know the year/month.
|
||||
- `src/content/reviews/<slug>/index.mdx` — must NOT exist (abort if a review with the same slug is already there; ask the user to disambiguate).
|
||||
|
||||
Note on hero assets: the find's hero, when present, sits at `src/content/find/<year>/<month>/<slug>/hero.<ext>` next to its `index.mdx`. The review's hero goes at `src/content/reviews/<slug>/hero.<ext>` (flat — reviews are not date-bucketed).
|
||||
|
||||
## Procedure
|
||||
|
||||
@@ -31,7 +33,7 @@ Look at the external link and propose a hero asset — a screenshot, demo gif, o
|
||||
- Physical products: the maker's product photo.
|
||||
- Travel destinations: a Wikipedia or Wikimedia Commons photo (free-to-use only).
|
||||
|
||||
Tell the user what you'd download and where to place it (`src/assets/reviews/<slug>/hero.<ext>` or similar). Pause for approval before downloading.
|
||||
Tell the user what you'd download and where to place it (`src/content/reviews/<slug>/hero.<ext>` — colocated with the review's `index.mdx`). Pause for approval before downloading.
|
||||
|
||||
### 3. Expand the body
|
||||
|
||||
@@ -45,7 +47,7 @@ Take the find's 2-3 sentence body and expand it to a full review:
|
||||
|
||||
### 4. Write the review
|
||||
|
||||
File: `src/content/reviews/<slug>.mdx`.
|
||||
File: `src/content/reviews/<slug>/index.mdx`.
|
||||
|
||||
Frontmatter:
|
||||
|
||||
@@ -68,7 +70,7 @@ If the find had no `subtitle`, generate one — it's required on reviews.
|
||||
|
||||
### 5. Update the find
|
||||
|
||||
Edit `src/content/find/<slug>.mdx` frontmatter: add `promotedTo: <review-slug>`.
|
||||
Edit `src/content/find/<year>/<month>/<slug>/index.mdx` frontmatter: add `promotedTo: <review-slug>`.
|
||||
|
||||
(Slug usually matches the find's slug, so `promotedTo` and the find's filename match.)
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ Invoke from inside the `unique.rzen.dev` repo.
|
||||
|
||||
## Inputs
|
||||
|
||||
- `src/content/find/*.mdx` — the full pool to cluster.
|
||||
- `src/content/find/<year>/<month>/<slug>/index.mdx` — the full pool to cluster (folders are nested by date but slugs are globally unique; iterate with `find src/content/find -name index.mdx`).
|
||||
- `src/content/bundles/*.mdx` — already-written bundles. Their `items[]` lists are the prior clustering — read these to know which finds already have a home and what themes have been used.
|
||||
- Optional argument: a number of clusters to target (default: model's call, usually 4-7).
|
||||
- Optional argument: a list of theme phrases to seed clustering around.
|
||||
@@ -86,7 +86,7 @@ Body rules (same as `build-bundle`):
|
||||
|
||||
### 6. Verify
|
||||
|
||||
- Every slug in every `items[]` must exist at `src/content/find/<slug>/index.mdx`. Confirm before declaring done.
|
||||
- Every slug in every `items[]` must exist at `src/content/find/<year>/<month>/<slug>/index.mdx` (locate with `find src/content/find -type d -name "<slug>"`). Confirm before declaring done.
|
||||
- Run `npm run build`. If any bundle fails to compile, fix and re-run.
|
||||
|
||||
### 7. Update the log
|
||||
|
||||
@@ -14,8 +14,8 @@ Invoke from inside the `unique.rzen.dev` repo.
|
||||
|
||||
- `sources.json` at the project root — curated source list with per-source `fetch` strategy (`webfetch` / `curl` / `skip`) and optional `fetchUrl`.
|
||||
- `daily-finds.log.md` — running log of every find slug ever written (used to skip duplicates).
|
||||
- `src/content/find/*.mdx` — already-captured finds (every existing slug is a "do not re-suggest" item).
|
||||
- `src/content/reviews/*.mdx` — already-reviewed items (do not re-suggest).
|
||||
- `src/content/find/<year>/<month>/<slug>/index.mdx` — already-captured finds (every existing slug is a "do not re-suggest" item; slugs are globally unique across years/months even though folders are nested by date).
|
||||
- `src/content/reviews/<slug>/index.mdx` — already-reviewed items (do not re-suggest).
|
||||
- `candidate-sources.md` — newly nominated sources awaiting user vetting.
|
||||
|
||||
## The bar
|
||||
@@ -42,14 +42,14 @@ For each source record: items extracted, or `empty` / `blocked` / `skipped`.
|
||||
|
||||
For each extracted item, drop:
|
||||
|
||||
- Anything whose slug already exists in `src/content/find/`.
|
||||
- Anything whose slug already exists anywhere under `src/content/find/` (find slugs are globally unique — check the leaf folder name across all `<year>/<month>/` buckets).
|
||||
- Anything whose name appears anywhere in `daily-finds.log.md`.
|
||||
- Anything reviewed in `src/content/reviews/` (compare by `name` field).
|
||||
- Items that fail the bar above.
|
||||
|
||||
### 3. Write find files
|
||||
|
||||
For every survivor, write one file at `src/content/find/<slug>.mdx`:
|
||||
For every survivor, write one file at `src/content/find/<year>/<month>/<slug>/index.mdx` where `<year>` and `<month>` come from today's date (e.g. `src/content/find/2026/05/<slug>/index.mdx`). Hero image (when present) sits next to it as `src/content/find/<year>/<month>/<slug>/hero.<ext>`. The leaf folder name is the slug; URLs stay flat at `/find/<slug>/` because the content-collection loader uses a `leafSlug` id derivation.
|
||||
|
||||
- Slug: kebab-case form of the name (lowercase, ASCII, no leading numbers).
|
||||
- Frontmatter: `name`, `subtitle` (optional, one-liner), `date` (today), `link` (external URL — required), `linkText` (optional), `source` (the source name from sources.json — required, exact match), `topics` (copied from the source's `topics`), `tags` (free editorial tags inferred from the item — keep to 2-4), `description` (optional meta override).
|
||||
@@ -63,7 +63,7 @@ If `link` for a Reddit-discovered item points at a v.redd.it / i.redd.it URL, fe
|
||||
For every find, try to retrieve a single representative image from the linked page so the find has visual support if it later graduates to a review (or gets surfaced on a tile).
|
||||
|
||||
- **Where to look (in priority order):** `og:image` meta tag → JSON-LD `image` field → main product photo / hero image markup → first article image.
|
||||
- **Where to save:** `src/assets/finds/<slug>/hero.<ext>`. Preserve the original extension (`.jpg`, `.png`, `.webp`, `.gif`). One file per find — `hero` is the canonical name.
|
||||
- **Where to save:** `src/content/find/<year>/<month>/<slug>/hero.<ext>` — colocated next to `index.mdx`. Preserve the original extension (`.jpg`, `.png`, `.webp`, `.gif`). One file per find — `hero` is the canonical name.
|
||||
- **What to skip:** images with marketing/sales overlay text (Amazon-style "BEST PRESS / NO GRIT" tags), tiny thumbnails (<400px on the long edge), generic site logos, paywalled CDN URLs that 403 to curl. If the only available shots are marketing collages, skip rather than save a noisy image — a missing hero is fine, a bad one isn't.
|
||||
- **For Mac/iOS apps:** prefer the App Store hero or developer-site screenshot. For physical products: prefer a clean studio shot or lifestyle photo without overlay copy. For travel destinations: prefer a Wikimedia Commons / Wikipedia image (free-to-use only). For text-only finds (quotes, dad jokes, essays): no media expected — skip.
|
||||
- **Fetch strategy:** `curl -sL --max-time 25 -A "Mozilla/5.0 (...Safari...)" "<image-url>" -o <path>`. WebFetch is for HTML, not binaries.
|
||||
|
||||
Reference in New Issue
Block a user