feat(feeds): add IRNA, Mehr, Jerusalem Post, Ynetnews to middleeast#3236
Conversation
Four direct-RSS sources verified from a clean IP and absent everywhere in the repo (src/config/feeds.ts, scripts/seed-*, ais-relay.cjs, RSS allowlist). Closes the highest-ROI Iran / Israel domestic-press gap from the ME source audit (PR #3226) with zero infra changes. - IRNA https://en.irna.ir/rss - Mehr News https://en.mehrnews.com/rss - Jerusalem Post https://www.jpost.com/rss/rssfeedsheadlines.aspx - Ynetnews https://www.ynetnews.com/Integration/StoryRss3089.xml Propaganda-risk metadata: - IRNA + Mehr tagged high / Iran state-affiliated (join Press TV). - JPost + Ynetnews tagged low with knownBiases for transparency. RSS allowlist updated in all three mirrors (shared/, scripts/shared/, api/_rss-allowed-domains.js) per the byte-identical mirror contract enforced by tests/edge-functions.test.mjs. Deferred (separate PRs): - Times of Israel: already in allowlist; was removed from feeds for cloud-IP 403. Needs Decodo routing. - IDF Spokesperson: idf.il has no direct RSS endpoint; needs scraper. - Tasnim / Press TV RSS / Israel Hayom: known cloud-IP blocks. - WAM / SPA / KUNA / QNA / BNA: public RSS endpoints are dead; sites migrated to SPAs or gate with 403. Plan doc (PR #3226) overstated the gap: it audited only feeds.ts and missed that travel advisories + US Embassy alerts are already covered by scripts/seed-security-advisories.mjs. NOTAM claim in that doc is also wrong: we use ICAO's global NOTAM API, not FAA.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Greptile SummaryAdds four direct-RSS Middle East sources (IRNA, Mehr News, Jerusalem Post, Ynetnews) to Confidence Score: 5/5Safe to merge; all remaining findings are cosmetic P2 style suggestions All four allowlist mirrors are updated consistently, risk profiles are correctly set, no new infrastructure is needed, and the only finding is a section-ordering cosmetic issue in SOURCE_PROPAGANDA_RISK No files require special attention Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[RSS Proxy Request] --> B{Domain in allowlist?}
B -- No --> C[Reject 403]
B -- Yes --> D[Fetch RSS feed]
D --> E{Feed source}
E --> F["en.irna.ir (IRNA · high risk)"]
E --> G["en.mehrnews.com (Mehr News · high risk)"]
E --> H["www.jpost.com (Jerusalem Post · low risk)"]
E --> I["www.ynetnews.com (Ynetnews · low risk)"]
F --> J[Apply SOURCE_PROPAGANDA_RISK label]
G --> J
H --> J
I --> J
J --> K[Return RSS to client]
Reviews (1): Last reviewed commit: "feat(feeds): add IRNA, Mehr, Jerusalem P..." | Re-trigger Greptile |
| 'Jerusalem Post': { risk: 'low', knownBiases: ['Israeli centre-right'], note: 'English-language Israeli daily of record' }, | ||
| 'Ynetnews': { risk: 'low', knownBiases: ['Israeli mainstream'], note: 'Yedioth Ahronoth English edition' }, |
There was a problem hiding this comment.
Low-risk entries placed inside medium-risk comment block
Jerusalem Post and Ynetnews are inserted between the last medium-risk entry (Moscow Times) and the // Low risk section header. Both have risk: 'low', so they belong below the // Low risk - Independent with editorial standards (explicit) comment rather than above it. Not a runtime bug, but it makes the section boundary misleading for future contributors scanning for risk tiers.
| 'Jerusalem Post': { risk: 'low', knownBiases: ['Israeli centre-right'], note: 'English-language Israeli daily of record' }, | |
| 'Ynetnews': { risk: 'low', knownBiases: ['Israeli mainstream'], note: 'Yedioth Ahronoth English edition' }, | |
| 'Moscow Times': { risk: 'medium', knownBiases: ['Anti-Kremlin'], note: 'Independent, critical of Russian government' }, | |
| // Low risk - Independent with editorial standards (explicit) | |
| 'Jerusalem Post': { risk: 'low', knownBiases: ['Israeli centre-right'], note: 'English-language Israeli daily of record' }, | |
| 'Ynetnews': { risk: 'low', knownBiases: ['Israeli mainstream'], note: 'Yedioth Ahronoth English edition' }, |
Reviewer on #3236 flagged that adding the four new ME feeds to FULL_FEEDS.middleeast alone leaves them disabled on first run, because App.ts:661 persists computeDefaultDisabledSources() output derived from DEFAULT_ENABLED_SOURCES. Users would have to manually re-enable via Settings > Sources, defeating the purpose of broadening the default ME mix. Add the four new sources to DEFAULT_ENABLED_SOURCES.middleeast so they ship on by default. Placement keeps them adjacent to their peers (IRNA / Mehr with the other Iran sources, JPost / Ynetnews after Haaretz). Risk/slant tags already in SOURCE_PROPAGANDA_RISK ensure downstream digest dedup + summarization weights them correctly.
Greptile on #3236 flagged that both entries are risk: 'low' but were inserted above the `// Low risk - Independent with editorial standards` comment header, making the section boundary misleading for future contributors. Shift them under the header where they belong. No runtime change; cosmetic ordering only.
Feeds.ts is at 523 entries after PR #3236 landed. The "435+" figure has been baked into marketing copy, docs, press kit, and localized strings for a long time and is now noticeably understated. Bump to 500+ as the new canonical figure. Also aligned three stale claims in less-visited docs: docs/getting-started.mdx 70+ RSS feeds => 500+ RSS feeds docs/ai-intelligence.mdx 344 sources => 500+ sources docs/COMMUNITY-PROMOTION-GUIDE 170+ news feeds => 500+ news feeds 170+ news sources => 500+ news sources And bumped the digest-dedup copy 400+ to 500+ (English + French locales + pro-test/index.html prerendered body) for consistency with the pricing and GDELT panels. Left alone on purpose (different metric): 22 services / 22 service domains 24 feeds (security-advisory seeder specifically) 31 sources (freshness tracker) 45 map layers Rebuilt /pro bundle so the per-locale chunks + prerendered index.html under public/pro/assets ship the new copy. 20 locales updated.
Summary
Add four direct-RSS Middle East sources absent everywhere in the repo today. Highest-ROI slice of the ME source audit (#3226) shippable as a drop-in: no Decodo routing, no custom fetcher, no new Redis keys, no infra.
All four verified to return real RSS XML on `curl` from a clean IP, and grep-verified absent across `src/config/feeds.ts`, `scripts/seed-*.mjs`, `scripts/ais-relay.cjs`, `api/`, and the RSS allowlist.
Changes
`src/config/feeds.ts`
RSS allowlist (byte-identical mirrors enforced by `tests/edge-functions.test.mjs`):
Added: `en.irna.ir`, `en.mehrnews.com`, `www.jpost.com`, `www.ynetnews.com`.
Deferred (separate PRs)
Notes on the parent audit (#3226)
While verifying I hit two factual errors in that plan worth correcting before downstream PRs kick off:
Test plan
Risks