# Curated posts — method, feed results, known gaps

Dataset: `data/curated_posts.json` / `data/curated_posts.csv` (90 records, as of 2026-10-10). The static seed of `/news/voices`; the live table `curated_posts` (Supabase) replaces it in the browser once the site is configured. Built by `scripts/build_curated_posts.py`.

## 1. Method

* scripts/build_curated_posts.py: the commentators' YouTube channel feeds (Atom, media:group) and Substack feeds fetched once by the fetch workflow (scripts/fetch/curated_feeds.txt, data/raw/curated/<date>), plus hand-kept entries from data/raw/curated/manual.json; each post taken as published (title, link, date, the publisher's description cut to 300 characters), classified by the shared keyword rules, duplicates by canonical URL dropped, at most 15 per source and 120 in total, newest first.
* The YouTube feeds are the public channel feeds (youtube.com/feeds/videos.xml?channel_id=…, no API key), as the author asked; the ingest-news Edge Function fetches them every 30 minutes for the live table. Substack feeds and hand-kept entries reach the live table through this file, which the function reads from the published site.

## 2. Feed results

| Source | Feed | HTTP | Items in feed | Kept | Note |
|---|---|---|---|---|---|
| uranium-insider-youtube | https://www.youtube.com/feeds/videos.xml?channel_id=UCDmY09g5tiR0ocNXvEnOddg | 200 | 15 | 15 |  |
| triangle-investor-youtube | https://www.youtube.com/feeds/videos.xml?channel_id=UC1Gm1jH1Ty-FexzycW2PqIg | 200 | 15 | 15 |  |
| crux-investor-youtube | https://www.youtube.com/feeds/videos.xml?channel_id=UCc0h6rwJD4vr_Rtdasuyn-w | 200 | 15 | 15 |  |
| decouple-youtube | https://www.youtube.com/feeds/videos.xml?channel_id=UCKKlj_Qf3f6Op0vexKMK7Qw | 200 | 15 | 15 |  |
| resource-talks-youtube | https://www.youtube.com/feeds/videos.xml?channel_id=UCBaoncRxZ_qtV2h9EhRhwrw | 200 | 15 | 15 |  |
| decouple-substack | https://www.decouple.media/feed | 200 | 20 | 15 |  |
| n/a | https://triangleinvestor.substack.com/feed | 403 | 0 | 0 | answered HTTP 403; no entries |
| triangle-investor-substack | https://substack.com/@triangleinvestor | 403 | 0 | 0 | answered HTTP 403; no entries |
| uranium-insider-site | https://www.uraniuminsider.com/media | 200 | 0 | 0 | an HTML page, not a feed; nothing taken from it |

## 3. Platforms

| Platform | Entries |
|---|---|
| youtube | 75 |
| substack | 15 |
| x | 0 |
| other | 0 |

## 4. Known gaps

* X posts cannot be fetched without login or API; John Quakes (@quakes99), Uranium Insider (@uraniuminsider) and Crux Investor (@CruxInvestor) appear on /news/voices as sources with their profile links and no entries until the author adds a post with its URL and date to data/raw/curated/manual.json.
* Triangle Investor's Substack (feed and profile URL) answered 403 to the runner; only the YouTube channel is listed.
* YouTube's feed carries the newest 15 videos per channel; older videos are not fetched. The ingest function refreshes the channels every 30 minutes (D66).
* Excerpts are the publisher's own description cut to 300 characters; a video without a description has none.
* Categories and tags come from the keyword rules (rules.json); a commentary source has no default category, so an entry no rule matches has none.
* 3 fetched URLs gave no entries: https://triangleinvestor.substack.com/feed (answered HTTP 403; no entries); https://substack.com/@triangleinvestor (answered HTTP 403; no entries); https://www.uraniuminsider.com/media (an HTML page, not a feed; nothing taken from it).
