openvibers/openvibe.sources Commits
README and STATUS give production's real numbers: 43 of 47 sources enabled and 55,683 items from 4,762 fetch runs on 2026-10-22, not 0 runs and 0 items (#85)
Changes
@@@ -4,9 +4,10 @@> carries where it came from, when it was retrieved and on what terms, and a failed fetch is a> recorded failure — never replaced by invented content.--**Status:** alpha (roadmap Wave 14). Deployed internally, not launched: it runs on the production host--(127.0.0.1:4720 only, since 2026-09-23) with the six seeded sources **disabled**, so it has made 0 fetch--runs and holds 0 items.++**Status:** alpha (roadmap Wave 14). Deployed internally: the API runs on the production host (127.0.0.1:4720 only,++since 2026-09-23). On 2026-10-22, 43 of its 47 sources were enabled and it held 55,683 items from 4,762 fetch runs++(the first on 2026-10-07; 431 in the last 24 hours), and none of the enabled sources was failing. The counts by category++are under [Acceptance](#acceptance-tests).**Domain:** `sources.openvibe.network` (a short "internal service" page and health on thisrepository's vhost; the API is loopback-only). Install steps: [Public host](#public-host).**Plan:** OpenVibe End-to-End Realignment & Implementation Plan, revision 3 — roadmap §4.2 B, §15.12, §29, anti-goals 13, 26, 27.@@@ -24,7 +25,7 @@ decide — under their own review and indexability rules — what, if anything,```bashnpm installcp .env.example .env--npm run seed # six real sources, one per category, all disabled++npm run seed # the 47 sources in seeds/sources.json, created disablednpm run dev # http://127.0.0.1:4720npm test # every test/*.test.js against local stub sites; no internet```@@@ -228,23 +229,22 @@ for the N-1 rollback window.## Seeds--[seeds/sources.json](seeds/sources.json) — one real source per category, **all disabled**, robots--checked by hand on 2026-09-22 (the fetcher re-checks on every run), terms to be re-verified by a--person before enabling:----| Key | Category | Type | Endpoint |--|---|---|---|---|--| `nasa-news-releases` | news | rss | nasa.gov news-release feed |--| `nodejs-blog` | blog | rss | nodejs.org blog feed |--| `dealnews-coupon-codes` | coupons | rss | The DealNews feed with `extract`: only items that state a coupon code and the shop, as kind `coupon` (code, merchant, expires) |--| `steam-reviews-portal-2` | reviews | api | Steam `appreviews` for app 620 — signals only, review text not mapped |--| `steam-reviews-<game>` (18 more, 2026-10-14) | reviews | api | The same Steam endpoint, terms and mapping for Portal, Stardew Valley, Terraria, Hollow Knight, Hades, Slay the Spire, The Witcher 3, Baldur's Gate 3, Counter-Strike 2, Dota 2, Elden Ring, Celeste, Dead Cells, Valheim, Half-Life 2, Vampire Survivors, Outer Wilds and Lethal Company (app ids checked against Steam's appdetails) |--| `dealnews-daily` | deals | rss | dealnews.com RSS (Crawl-delay 2) |--| `staff-coupon-codes` | coupons | manual | codes a merchant published itself, entered with the evidence URL |--| `lowendtalk-offers` (2026-10-14) | hosting | rss | LowEndTalk's Offers board feed: OpenVibe.Host's offers page (headline, poster, date, link, the stated price) |--| `lowendbox-posts` (2026-10-14) | hosting | rss | LowEndBox's feed: Host keeps only the offer posts |--| `sec-xbrl-filings` | trade | rss | SEC EDGAR XBRL filings RSS (`/cgi-bin` is robots-disallowed, so the getcurrent feed is not used) |--| `sec-company-tickers` | trade | api | SEC's ticker, CIK and exchange list (`company_tickers_exchange.json`), one request a day; each row is an `instrument` item OpenVibe.Trade turns into a company page. Needs the per-fetch cap (`SOURCES_MAX_ITEMS_PER_FETCH`, default 12000) |++[seeds/sources.json](seeds/sources.json) holds the 47 registered sources, each with its robots, terms and licence notes.++`npm run seed` creates the ones that do not exist yet, **all disabled**, and never changes an existing one; a person++enables a source after reading its terms (`PATCH /api/v1/sources/:key {"enabled": true}`), and the fetcher re-checks++robots.txt on every run. Production on 2026-10-22:++++| Category | Sources (type) | Enabled in production |++|---|---|---|++| news | `nasa-news-releases`, `eu-press-corner`, `fda-food-recalls`, `noaa-news` (rss); `govuk-news` (atom) | 4 of 5: `noaa-news` is off (NOAA's robots.txt answers 403 to our user agent, so its rules cannot be read) |++| blog | `nodejs-blog` (rss) | 1 of 1 |++| reviews | `steam-reviews-<game>` for 19 games (api: Steam `appreviews` signals only, review text not mapped); `cfpb-complaints-by-company`, `nyc-restaurant-inspections`, `nyc-hpd-open-violations` (api: official records) | 22 of 22 |++| deals | `dealnews-daily` (rss, `feed@3`: the offer's price, retailer, end date, category and editors' pick) | 1 of 1 |++| coupons | `dealnews-coupon-codes` (rss with `extract`: only items that state a code and the shop, as kind `coupon`); `staff-coupon-codes` (manual, with the evidence URL) | 2 of 2 |++| trade | `sec-xbrl-filings`, `ecb-euro-reference-rates` (rss); `sec-company-tickers`, `frankfurter-eur-rates` (api) | 4 of 4 |++| hosting | `porkbun-tld-pricing`, `ovhcloud-vps`, `linode-types`, `aws-lightsail-bundles`, `vultr-plans` (api); `lowendspirit-offers`, `lowendtalk-offers`, `lowendbox-posts` (rss) | 5 of 8: `vultr-plans` is off (its API host's robots.txt disallows every path), and LowEndTalk's and LowEndBox's feeds answer 403 to the production host |++| crowdfunding | `opencollective-accounts` (api) | 1 of 1 |++| games | `steam-top-sellers`, `steam-new-releases`, `steam-specials` (api: the store's featured lists, in their order) | 3 of 3 |Candidates rejected on 2026-09-22: CheapShark's API (`/api/1.0/` is disallowed in itsrobots.txt) and EDGAR's `getcurrent` Atom feed (`/cgi-bin` disallowed). The seeded feeds were@@@ -317,16 +317,16 @@ through Events.- the public host shows only an honest "internal service" page, and the vhost keeps the APIloopback-only (`test/public-host.test.js`)--Demonstrated on production (2026-10-15):--- 32 sources are enabled, each after its terms and robots were read: news 3, reviews 19, deals 1, coupons 2, trade 3,-- hosting 3 and blog 1.--- Their items are consumed by News (237 wire reports), Reviews (1,183 items), Deals (1,862), Trade (2,314 rates),-- Coupons, and Host (135 plans across Linode, Amazon Lightsail and OVHcloud; the OVHcloud catalog is about 12 MB).++Production on 2026-10-22 (counts read from `ov_sources`):++- 43 of 47 sources enabled, each after its terms and robots were read (by category in [Seeds](#seeds)); none of them++ failing. 4,762 fetch runs since the first on 2026-10-07, 431 in the last 24 hours.++- 55,683 items, none removed: reviews 33,635, trade 15,736, deals 3,465, hosting 1,097, news 529, crowdfunding 504,++ games 362, coupons 297 and blog 58; 58,355 item revisions. The database is 253 MB.++- Their items feed News, Reviews (Steam signals and the CFPB, NYC Health and NYC HPD records), Deals (DealNews and++ Open Collective for crowdfunding), Coupons, Trade (SEC, ECB and Frankfurter rates), Host (Porkbun, OVHcloud, Linode,++ Lightsail and LowEndSpirit), Games (Steam's featured lists) and Blog's desks.--Before that, every seed was disabled until a person verified its terms, and no product consumed real items. News and Reviews run--loopback-only on the host and are subscribed to `sources.item.*` through Events (Deals, Coupons and--Trade also run loopback-only and have Sources import clients), but with no enabled source none of them has--received an item.++The first production fetch run was on 2026-10-07; until then every seed stayed disabled.Restore drill: `ovhost drill sources` passed on the production host on 2026-09-23 (integrity check,readiness, row counts; see OpenVibe.Host `docs/restore-drills.md`).@@@ -28,14 +28,17 @@"api","manual"],-- "seededSources": 40,-- "enabledSources": 35,++ "seededSources": 47,++ "enabledSources": 43,"deployed": true,-- "deployment": "Deployed with `sudo ovhost deploy sources`: /opt/openvibe.sources, unit openvibe-sources, 127.0.0.1:4720, principal sources. On 2026-10-16, 35 of 39 sources were enabled in production (reviews 19, trade 4, news 4, hosting 3, coupons 2, and blog, crowdfunding and deals 1 each), with 17,965 items from 2,156 fetch runs; they feed OpenVibe.Deals, News, Reviews, Trade, Host, Coupons, Blog's desks and Deals' crowdfunding search. Restore drill passed 2026-09-23.",++ "deployment": "Deployed with `sudo ovhost deploy sources`: /opt/openvibe.sources, unit openvibe-sources, 127.0.0.1:4720, principal sources. On 2026-10-22, 43 of the 47 sources were enabled in production (reviews 22, hosting 5, news 4, trade 4, games 3, coupons 2, and blog, crowdfunding and deals 1 each; none failing), with 55,683 items from 4,762 fetch runs since the first on 2026-10-07; they feed OpenVibe.News, Reviews, Deals (with its crowdfunding search), Coupons, Trade, Host, Games and Blog's desks. Restore drill passed 2026-09-23.","features": ["source registry with terms, robots and licence notes","rss, atom, sitemap, jsonld, api and manual adapters",-- "a deal feed's own offer elements kept as stated (feed@2: DealNews' price, currency, retailer, end date)",++ "categories: news, blog, reviews, deals, coupons, trade, hosting, crowdfunding and games",++ "a deal feed's own offer elements kept as stated (feed@3: DealNews' price, currency, retailer, end date, category and editors' pick)",++ "api mappings: keyed maps, where conditions and patterns, $index for ranked lists; per-endpoint timeout_ms and max_bytes",++ "facts a feed states in prose (extract): coupon codes with the shop and expiry","polite scheduler: robots.txt, per-host spacing, conditional GET, backoff","SSRF-guarded fetcher","failed fetches recorded, never fabricated",@@@ -45,5 +48,5 @@"staff-only index documents for Search","per-actor limits (openvibe-sdk/limits)"],-- "updated": "2026-10-20"++ "updated": "2026-10-22"}
@@ -4,9 +4,10 @@
@@ -4,9 +4,10 @@
> carries where it came from, when it was retrieved and on what terms, and a failed fetch is a
> carries where it came from, when it was retrieved and on what terms, and a failed fetch is a
> recorded failure — never replaced by invented content.
> recorded failure — never replaced by invented content.
-**Status:** alpha (roadmap Wave 14). Deployed internally, not launched: it runs on the production host
-(127.0.0.1:4720 only, since 2026-09-23) with the six seeded sources **disabled**, so it has made 0 fetch
-runs and holds 0 items.
+**Status:** alpha (roadmap Wave 14). Deployed internally: the API runs on the production host (127.0.0.1:4720 only,
+since 2026-09-23). On 2026-10-22, 43 of its 47 sources were enabled and it held 55,683 items from 4,762 fetch runs
+(the first on 2026-10-07; 431 in the last 24 hours), and none of the enabled sources was failing. The counts by category
+are under [Acceptance](#acceptance-tests).
**Domain:** `sources.openvibe.network` (a short "internal service" page and health on this
**Domain:** `sources.openvibe.network` (a short "internal service" page and health on this
repository's vhost; the API is loopback-only). Install steps: [Public host](#public-host).
repository's vhost; the API is loopback-only). Install steps: [Public host](#public-host).
**Plan:** OpenVibe End-to-End Realignment & Implementation Plan, revision 3 — roadmap §4.2 B, §15.12, §29, anti-goals 13, 26, 27.
**Plan:** OpenVibe End-to-End Realignment & Implementation Plan, revision 3 — roadmap §4.2 B, §15.12, §29, anti-goals 13, 26, 27.
@@ -24,7 +25,7 @@ decide — under their own review and indexability rules — what, if anything,
@@ -24,7 +25,7 @@ decide — under their own review and indexability rules — what, if anything,
```bash
```bash
npm install
npm install
cp .env.example .env
cp .env.example .env
-npm run seed # six real sources, one per category, all disabled
+npm run seed # the 47 sources in seeds/sources.json, created disabled
npm run dev # http://127.0.0.1:4720
npm run dev # http://127.0.0.1:4720
npm test # every test/*.test.js against local stub sites; no internet
npm test # every test/*.test.js against local stub sites; no internet
```
```
@@ -228,23 +229,22 @@ for the N-1 rollback window.
@@ -228,23 +229,22 @@ for the N-1 rollback window.
## Seeds
## Seeds
-[seeds/sources.json](seeds/sources.json) — one real source per category, **all disabled**, robots
-checked by hand on 2026-09-22 (the fetcher re-checks on every run), terms to be re-verified by a
-person before enabling:
-
-| Key | Category | Type | Endpoint |
-|---|---|---|---|
-| `nasa-news-releases` | news | rss | nasa.gov news-release feed |
-| `nodejs-blog` | blog | rss | nodejs.org blog feed |
-| `dealnews-coupon-codes` | coupons | rss | The DealNews feed with `extract`: only items that state a coupon code and the shop, as kind `coupon` (code, merchant, expires) |
-| `steam-reviews-portal-2` | reviews | api | Steam `appreviews` for app 620 — signals only, review text not mapped |
-| `steam-reviews-<game>` (18 more, 2026-10-14) | reviews | api | The same Steam endpoint, terms and mapping for Portal, Stardew Valley, Terraria, Hollow Knight, Hades, Slay the Spire, The Witcher 3, Baldur's Gate 3, Counter-Strike 2, Dota 2, Elden Ring, Celeste, Dead Cells, Valheim, Half-Life 2, Vampire Survivors, Outer Wilds and Lethal Company (app ids checked against Steam's appdetails) |
-| `dealnews-daily` | deals | rss | dealnews.com RSS (Crawl-delay 2) |
-| `staff-coupon-codes` | coupons | manual | codes a merchant published itself, entered with the evidence URL |
-| `lowendtalk-offers` (2026-10-14) | hosting | rss | LowEndTalk's Offers board feed: OpenVibe.Host's offers page (headline, poster, date, link, the stated price) |
-| `lowendbox-posts` (2026-10-14) | hosting | rss | LowEndBox's feed: Host keeps only the offer posts |
-| `sec-xbrl-filings` | trade | rss | SEC EDGAR XBRL filings RSS (`/cgi-bin` is robots-disallowed, so the getcurrent feed is not used) |
-| `sec-company-tickers` | trade | api | SEC's ticker, CIK and exchange list (`company_tickers_exchange.json`), one request a day; each row is an `instrument` item OpenVibe.Trade turns into a company page. Needs the per-fetch cap (`SOURCES_MAX_ITEMS_PER_FETCH`, default 12000) |
+[seeds/sources.json](seeds/sources.json) holds the 47 registered sources, each with its robots, terms and licence notes.
+`npm run seed` creates the ones that do not exist yet, **all disabled**, and never changes an existing one; a person
+enables a source after reading its terms (`PATCH /api/v1/sources/:key {"enabled": true}`), and the fetcher re-checks
+robots.txt on every run. Production on 2026-10-22:
+
+| Category | Sources (type) | Enabled in production |
+|---|---|---|
+| news | `nasa-news-releases`, `eu-press-corner`, `fda-food-recalls`, `noaa-news` (rss); `govuk-news` (atom) | 4 of 5: `noaa-news` is off (NOAA's robots.txt answers 403 to our user agent, so its rules cannot be read) |
+| blog | `nodejs-blog` (rss) | 1 of 1 |
+| reviews | `steam-reviews-<game>` for 19 games (api: Steam `appreviews` signals only, review text not mapped); `cfpb-complaints-by-company`, `nyc-restaurant-inspections`, `nyc-hpd-open-violations` (api: official records) | 22 of 22 |
+| deals | `dealnews-daily` (rss, `feed@3`: the offer's price, retailer, end date, category and editors' pick) | 1 of 1 |
+| coupons | `dealnews-coupon-codes` (rss with `extract`: only items that state a code and the shop, as kind `coupon`); `staff-coupon-codes` (manual, with the evidence URL) | 2 of 2 |
+| trade | `sec-xbrl-filings`, `ecb-euro-reference-rates` (rss); `sec-company-tickers`, `frankfurter-eur-rates` (api) | 4 of 4 |
+| hosting | `porkbun-tld-pricing`, `ovhcloud-vps`, `linode-types`, `aws-lightsail-bundles`, `vultr-plans` (api); `lowendspirit-offers`, `lowendtalk-offers`, `lowendbox-posts` (rss) | 5 of 8: `vultr-plans` is off (its API host's robots.txt disallows every path), and LowEndTalk's and LowEndBox's feeds answer 403 to the production host |
+| crowdfunding | `opencollective-accounts` (api) | 1 of 1 |
+| games | `steam-top-sellers`, `steam-new-releases`, `steam-specials` (api: the store's featured lists, in their order) | 3 of 3 |
Candidates rejected on 2026-09-22: CheapShark's API (`/api/1.0/` is disallowed in its
Candidates rejected on 2026-09-22: CheapShark's API (`/api/1.0/` is disallowed in its
robots.txt) and EDGAR's `getcurrent` Atom feed (`/cgi-bin` disallowed). The seeded feeds were
robots.txt) and EDGAR's `getcurrent` Atom feed (`/cgi-bin` disallowed). The seeded feeds were
@@ -317,16 +317,16 @@ through Events.
@@ -317,16 +317,16 @@ through Events.
- the public host shows only an honest "internal service" page, and the vhost keeps the API
- the public host shows only an honest "internal service" page, and the vhost keeps the API
loopback-only (`test/public-host.test.js`)
loopback-only (`test/public-host.test.js`)
-Demonstrated on production (2026-10-15):
-- 32 sources are enabled, each after its terms and robots were read: news 3, reviews 19, deals 1, coupons 2, trade 3,
- hosting 3 and blog 1.
-- Their items are consumed by News (237 wire reports), Reviews (1,183 items), Deals (1,862), Trade (2,314 rates),
- Coupons, and Host (135 plans across Linode, Amazon Lightsail and OVHcloud; the OVHcloud catalog is about 12 MB).
+Production on 2026-10-22 (counts read from `ov_sources`):
+- 43 of 47 sources enabled, each after its terms and robots were read (by category in [Seeds](#seeds)); none of them
+ failing. 4,762 fetch runs since the first on 2026-10-07, 431 in the last 24 hours.
+- 55,683 items, none removed: reviews 33,635, trade 15,736, deals 3,465, hosting 1,097, news 529, crowdfunding 504,
+ games 362, coupons 297 and blog 58; 58,355 item revisions. The database is 253 MB.
+- Their items feed News, Reviews (Steam signals and the CFPB, NYC Health and NYC HPD records), Deals (DealNews and
+ Open Collective for crowdfunding), Coupons, Trade (SEC, ECB and Frankfurter rates), Host (Porkbun, OVHcloud, Linode,
+ Lightsail and LowEndSpirit), Games (Steam's featured lists) and Blog's desks.
-Before that, every seed was disabled until a person verified its terms, and no product consumed real items. News and Reviews run
-loopback-only on the host and are subscribed to `sources.item.*` through Events (Deals, Coupons and
-Trade also run loopback-only and have Sources import clients), but with no enabled source none of them has
-received an item.
+The first production fetch run was on 2026-10-07; until then every seed stayed disabled.
Restore drill: `ovhost drill sources` passed on the production host on 2026-09-23 (integrity check,
Restore drill: `ovhost drill sources` passed on the production host on 2026-09-23 (integrity check,
readiness, row counts; see OpenVibe.Host `docs/restore-drills.md`).
readiness, row counts; see OpenVibe.Host `docs/restore-drills.md`).
@@ -28,14 +28,17 @@
@@ -28,14 +28,17 @@
"api",
"api",
"manual"
"manual"
],
],
- "seededSources": 40,
- "enabledSources": 35,
+ "seededSources": 47,
+ "enabledSources": 43,
"deployed": true,
"deployed": true,
- "deployment": "Deployed with `sudo ovhost deploy sources`: /opt/openvibe.sources, unit openvibe-sources, 127.0.0.1:4720, principal sources. On 2026-10-16, 35 of 39 sources were enabled in production (reviews 19, trade 4, news 4, hosting 3, coupons 2, and blog, crowdfunding and deals 1 each), with 17,965 items from 2,156 fetch runs; they feed OpenVibe.Deals, News, Reviews, Trade, Host, Coupons, Blog's desks and Deals' crowdfunding search. Restore drill passed 2026-09-23.",
+ "deployment": "Deployed with `sudo ovhost deploy sources`: /opt/openvibe.sources, unit openvibe-sources, 127.0.0.1:4720, principal sources. On 2026-10-22, 43 of the 47 sources were enabled in production (reviews 22, hosting 5, news 4, trade 4, games 3, coupons 2, and blog, crowdfunding and deals 1 each; none failing), with 55,683 items from 4,762 fetch runs since the first on 2026-10-07; they feed OpenVibe.News, Reviews, Deals (with its crowdfunding search), Coupons, Trade, Host, Games and Blog's desks. Restore drill passed 2026-09-23.",
"features": [
"features": [
"source registry with terms, robots and licence notes",
"source registry with terms, robots and licence notes",
"rss, atom, sitemap, jsonld, api and manual adapters",
"rss, atom, sitemap, jsonld, api and manual adapters",
- "a deal feed's own offer elements kept as stated (feed@2: DealNews' price, currency, retailer, end date)",
+ "categories: news, blog, reviews, deals, coupons, trade, hosting, crowdfunding and games",
+ "a deal feed's own offer elements kept as stated (feed@3: DealNews' price, currency, retailer, end date, category and editors' pick)",
+ "api mappings: keyed maps, where conditions and patterns, $index for ranked lists; per-endpoint timeout_ms and max_bytes",
+ "facts a feed states in prose (extract): coupon codes with the shop and expiry",
"polite scheduler: robots.txt, per-host spacing, conditional GET, backoff",
"polite scheduler: robots.txt, per-host spacing, conditional GET, backoff",
"SSRF-guarded fetcher",
"SSRF-guarded fetcher",
"failed fetches recorded, never fabricated",
"failed fetches recorded, never fabricated",
@@ -45,5 +48,5 @@
@@ -45,5 +48,5 @@
"staff-only index documents for Search",
"staff-only index documents for Search",
"per-actor limits (openvibe-sdk/limits)"
"per-actor limits (openvibe-sdk/limits)"
],
],
- "updated": "2026-10-20"
+ "updated": "2026-10-22"
}
}