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
This commit is contained in:
2026-07-12 19:39:11 -04:00
parent be7263b912
commit 9e5fce1eb0
21 changed files with 695 additions and 14 deletions
+2
View File
@@ -2,6 +2,8 @@
## July 2026
- Topics — a new coarse classification axis for following slices of the site: an 18-value controlled vocabulary (`src/lib/topics.ts`), enum-enforced by the content schema on finds and reviews so unattended capture runs can't drift it. All 864 finds and 64 reviews retroactively classified (subagent batch job); the retired source-inherited values (`dad-jokes`, `quotes`, `apple-tips`, `general-delight`…) map into the new set, and `gifts` became a `giftable` tag on 140 finds ("giftable" is a facet, not a topic). New `/topics/` index and `/topics/<topic>/` pages where finds are first-class alongside reviews, per-topic RSS feeds that include finds (unlike category/tag feeds), a "By topic" section on `/feeds/`, a Topics footer link, and a Topics section in `llms.txt`; `daily-finds` and `build-review` skills now classify at capture/graduation time
- Per-source indexes: `/sources/<slug>/` lists everything surfaced via a source (reviews + finds, newest first, with the source's outbound link and notes); find and review colophons gain a "(more from this source)" link next to the source name, and `/sources/` cards link through via "everything from this source →". Pages exist for every source ever named in content, including retired ones; sub-3-item pages are noindexed
- Tag pages now include finds: `/tags/<tag>/` is generated from the union of entry and find tags (1,179 tags that existed only on finds — most tag links on find pages — previously 404'd) and lists tagged finds in a compact secondary section below the entry grid, keeping reviews/bundles/posts visually on top. Find-only tag pages with fewer than 3 finds are noindexed until they fill out; tag feeds stay entries-only, and the RSS pill only renders where a feed exists. Category pages are unaffected (finds have no category)
- Feeds for everything: alongside the existing `/rss.xml`, add a JSON Feed 1.1 at `/feed.json`, per-category RSS at `/categories/<name>/rss.xml`, and per-tag RSS at `/tags/<name>/rss.xml` — all derived from a shared `src/lib/feed.ts` item source (reviews + posts + bundles, same visibility rules as the site). Category/tag pages advertise their scoped feed via `<link rel="alternate">` autodiscovery and show a visible RSS pill in the subheader (browsers dropped feed-detection UI years ago, so autodiscovery alone is invisible); a new `/feeds/` directory page (linked from the footer) lists every feed with entry counts; every RSS feed carries an `atom:link` self reference and renders as a readable page in browsers via `public/feed.xsl`
- Programmatic-reader pass: build-generated `/llms.txt` (llmstxt.org format — site description, feed/endpoint map, and every review, bundle, and post with one-line descriptions), `SearchAction` on the home-page `WebSite` JSON-LD wired to `/search/?q=`, and a "For robots" section on `/feeds/` documenting `search.json`, `llms.txt`, the sitemap, and JSON-LD coverage