| import type { Feed } from '@/types'; |
| import { SITE_VARIANT } from './variant'; |
| import { rssProxyUrl } from '@/utils'; |
| import { mergeCanonicalFeeds } from './feed-resolution'; |
| import { |
| getSourceProvenanceState, |
| type SourceProvenanceState, |
| } from '../../shared/source-provenance'; |
|
|
| const rss = rssProxyUrl; |
| const railwayRss = rssProxyUrl; |
|
|
| |
| |
| export { SOURCE_TIERS, getSourceTier } from '../../server/_shared/source-tiers'; |
| export { |
| SOURCE_PROPAGANDA_RISK, |
| SOURCE_TYPES, |
| UNREVIEWED_SOURCE_RISK, |
| describePropagandaBadge, |
| getSourcePropagandaRisk, |
| getSourceProvenanceState, |
| getSourceTierBadgeTitle, |
| getSourceType, |
| hasDeclaredPropagandaRisk, |
| hasDeclaredSourceType, |
| hasReviewedPropagandaRisk, |
| hasReviewedSourceType, |
| isStateAffiliatedSource, |
| } from '../../shared/source-provenance'; |
| export type { |
| PropagandaRisk, |
| SourceProvenanceState, |
| SourceRiskProfile, |
| SourceType, |
| } from '../../shared/source-provenance'; |
|
|
| let _sourcePanelMap: Map<string, string> | null = null; |
| export function getSourcePanelId(sourceName: string): string { |
| if (!_sourcePanelMap) { |
| _sourcePanelMap = new Map(); |
| |
| |
| |
| for (const [category, feeds] of Object.entries(CANONICAL_FEEDS)) { |
| for (const feed of feeds) _sourcePanelMap.set(feed.name, category); |
| } |
| for (const [category, feeds] of Object.entries(FEEDS)) { |
| for (const feed of feeds) _sourcePanelMap.set(feed.name, category); |
| } |
| for (const feed of INTEL_SOURCES) _sourcePanelMap.set(feed.name, 'intel'); |
| } |
| return _sourcePanelMap.get(sourceName) ?? 'politics'; |
| } |
|
|
| const FULL_FEEDS: Record<string, Feed[]> = { |
| politics: [ |
| { name: 'BBC World', url: rss('https://feeds.bbci.co.uk/news/world/rss.xml') }, |
| { name: 'Guardian World', url: rss('https://www.theguardian.com/world/rss') }, |
| { name: 'AP News', url: rss('https://news.google.com/rss/search?q=site:apnews.com&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Reuters World', url: rss('https://news.google.com/rss/search?q=site:reuters.com+world&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'CNN World', url: rss('https://news.google.com/rss/search?q=site:cnn.com+world+news+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| us: [ |
| { name: 'Reuters US', url: rss('https://news.google.com/rss/search?q=site:reuters.com+US&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'NPR News', url: rss('https://feeds.npr.org/1001/rss.xml') }, |
| { name: 'PBS NewsHour', url: rss('https://www.pbs.org/newshour/feeds/rss/headlines') }, |
| { name: 'ABC News', url: rss('https://feeds.abcnews.com/abcnews/topstories') }, |
| { name: 'CBS News', url: rss('https://www.cbsnews.com/latest/rss/main') }, |
| { name: 'NBC News', url: rss('https://feeds.nbcnews.com/nbcnews/public/news') }, |
| { name: 'Wall Street Journal', url: rss('https://feeds.content.dowjones.io/public/rss/RSSUSnews') }, |
| { name: 'Politico', url: rss('https://rss.politico.com/politics-news.xml') }, |
| { name: 'The Hill', url: rss('https://thehill.com/news/feed') }, |
| { name: 'Axios', url: rss('https://api.axios.com/feed/') }, |
| { name: 'Fox News', url: rss('https://moxie.foxnews.com/google-publisher/us.xml') }, |
| ], |
| europe: [ |
| { |
| name: 'France 24', |
| url: { |
| en: rss('https://www.france24.com/en/rss'), |
| fr: rss('https://www.france24.com/fr/rss'), |
| es: rss('https://www.france24.com/es/rss'), |
| ar: rss('https://www.france24.com/ar/rss') |
| } |
| }, |
| { |
| name: 'EuroNews', |
| url: { |
| en: rss('https://www.euronews.com/rss?format=xml'), |
| fr: rss('https://fr.euronews.com/rss?format=xml'), |
| de: rss('https://de.euronews.com/rss?format=xml'), |
| it: rss('https://it.euronews.com/rss?format=xml'), |
| es: rss('https://es.euronews.com/rss?format=xml'), |
| pt: rss('https://pt.euronews.com/rss?format=xml'), |
| ru: rss('https://ru.euronews.com/rss?format=xml'), |
| gr: rss('https://gr.euronews.com/rss?format=xml'), |
| } |
| }, |
| { |
| name: 'Le Monde', |
| url: { |
| en: rss('https://www.lemonde.fr/en/rss/une.xml'), |
| fr: rss('https://www.lemonde.fr/rss/une.xml') |
| } |
| }, |
| { name: 'DW News', url: { en: rss('https://rss.dw.com/xml/rss-en-all'), de: rss('https://rss.dw.com/xml/rss-de-all'), es: rss('https://news.google.com/rss/search?q=site:dw.com/es&hl=es-419&gl=MX&ceid=MX:es-419') } }, |
| |
| { name: 'El País', url: rss('https://feeds.elpais.com/mrss-s/pages/ep/site/elpais.com/portada'), lang: 'es' }, |
| { name: 'El Mundo', url: rss('https://e00-elmundo.uecdn.es/elmundo/rss/portada.xml'), lang: 'es' }, |
| { name: 'BBC Mundo', url: rss('https://www.bbc.com/mundo/index.xml'), lang: 'es' }, |
| |
| { name: 'Tagesschau', url: rss('https://www.tagesschau.de/xml/rss2/'), lang: 'de' }, |
| { name: 'Bild', url: rss('https://www.bild.de/feed/alles.xml'), lang: 'de' }, |
| { name: 'Der Spiegel', url: rss('https://www.spiegel.de/schlagzeilen/tops/index.rss'), lang: 'de' }, |
| { name: 'Die Zeit', url: rss('https://newsfeed.zeit.de/index'), lang: 'de' }, |
| |
| { name: 'ANSA', url: rss('https://www.ansa.it/sito/notizie/topnews/topnews_rss.xml'), lang: 'it' }, |
| { name: 'Corriere della Sera', url: rss('https://www.corriere.it/rss/homepage.xml'), lang: 'it' }, |
| { name: 'Repubblica', url: rss('https://www.repubblica.it/rss/homepage/rss2.0.xml'), lang: 'it' }, |
| |
| { name: 'NOS Nieuws', url: rss('https://feeds.nos.nl/nosnieuwsalgemeen'), lang: 'nl' }, |
| { name: 'NRC', url: rss('https://www.nrc.nl/rss/'), lang: 'nl' }, |
| { name: 'De Telegraaf', url: rss('https://news.google.com/rss/search?q=site:telegraaf.nl+when:1d&hl=nl&gl=NL&ceid=NL:nl'), lang: 'nl' }, |
| |
| { name: 'SVT Nyheter', url: rss('https://www.svt.se/nyheter/rss.xml'), lang: 'sv' }, |
| { name: 'Dagens Nyheter', url: rss('https://www.dn.se/rss/'), lang: 'sv' }, |
| { name: 'Svenska Dagbladet', url: rss('https://www.svd.se/feed/articles.rss'), lang: 'sv' }, |
| |
| { name: 'BBC Turkce', url: rss('https://feeds.bbci.co.uk/turkce/rss.xml'), lang: 'tr' }, |
| { name: 'DW Turkish', url: rss('https://rss.dw.com/xml/rss-tur-all'), lang: 'tr' }, |
| { name: 'Hurriyet', url: rss('https://www.hurriyet.com.tr/rss/anasayfa'), lang: 'tr' }, |
| |
| { name: 'TVN24', url: rss('https://tvn24.pl/swiat.xml'), lang: 'pl' }, |
| { name: 'Polsat News', url: rss('https://www.polsatnews.pl/rss/wszystkie.xml'), lang: 'pl' }, |
| { name: 'Rzeczpospolita', url: rss('https://www.rp.pl/rss_main'), lang: 'pl' }, |
| |
| |
| |
| { name: 'Telex', url: rss('https://telex.hu/rss'), lang: 'hu' }, |
| { name: 'Index.hu', url: rss('https://index.hu/24ora/rss'), lang: 'hu' }, |
| { name: 'HVG', url: rss('https://hvg.hu/rss'), lang: 'hu' }, |
| { name: '444.hu', url: rss('https://444.hu/feed'), lang: 'hu' }, |
| { name: '24.hu', url: rss('https://24.hu/feed/'), lang: 'hu' }, |
| { name: 'Híradó', url: rss('https://news.google.com/rss/search?q=site:hirado.hu+when:2d&hl=hu&gl=HU&ceid=HU:hu'), lang: 'hu' }, |
| { name: 'Portfolio.hu', url: rss('https://portfolio.hu/rss/all.xml'), lang: 'hu' }, |
| { name: 'ATV', url: rss('https://www.atv.hu/rss'), lang: 'hu' }, |
| |
| { name: 'N1 Croatia', url: rss('https://n1info.hr/feed/'), lang: 'hr' }, |
| { name: 'Index.hr', url: rss('https://www.index.hr/rss'), lang: 'hr' }, |
| { name: 'Jutarnji list', url: rss('https://www.jutarnji.hr/feed'), lang: 'hr' }, |
| { name: 'Balkan Insight', url: rss('https://balkaninsight.com/feed/') }, |
| |
| { name: 'Kathimerini', url: rss('https://news.google.com/rss/search?q=site:kathimerini.gr+when:2d&hl=el&gl=GR&ceid=GR:el'), lang: 'el' }, |
| { name: 'Naftemporiki', url: rss('https://www.naftemporiki.gr/feed/'), lang: 'el' }, |
| { name: 'in.gr', url: rss('https://www.in.gr/feed/'), lang: 'el' }, |
| { name: 'iefimerida', url: rss('https://www.iefimerida.gr/rss.xml'), lang: 'el' }, |
| { name: 'Proto Thema', url: rss('https://news.google.com/rss/search?q=site:protothema.gr+when:2d&hl=el&gl=GR&ceid=GR:el'), lang: 'el' }, |
| |
| { name: 'BBC Russian', url: rss('https://feeds.bbci.co.uk/russian/rss.xml'), lang: 'ru' }, |
| { name: 'Meduza', url: rss('https://meduza.io/rss/all'), lang: 'ru' }, |
| { name: 'Novaya Gazeta Europe', url: rss('https://novayagazeta.eu/feed/rss'), lang: 'ru' }, |
| { name: 'TASS', url: rss('https://news.google.com/rss/search?q=site:tass.com+OR+TASS+Russia+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'RT', url: rss('https://www.rt.com/rss/') }, |
| { name: 'RT Russia', url: rss('https://www.rt.com/rss/russia/') }, |
| { name: 'Kyiv Independent', url: rss('https://news.google.com/rss/search?q=site:kyivindependent.com+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Moscow Times', url: rss('https://www.themoscowtimes.com/rss/news') }, |
| ], |
| middleeast: [ |
| { name: 'BBC Middle East', url: rss('https://feeds.bbci.co.uk/news/world/middle_east/rss.xml') }, |
| { name: 'Al Jazeera', url: { en: rss('https://www.aljazeera.com/xml/rss/all.xml'), ar: rss('https://www.aljazeera.net/aljazeerarss/a7c186be-1adb-4b11-a982-4783e765316e/4e17ecdc-8fb9-40de-a5d6-d00f72384a51') } }, |
| |
| { name: 'Al Arabiya', url: { en: rss('https://news.google.com/rss/search?q=site:english.alarabiya.net+when:2d&hl=en-US&gl=US&ceid=US:en'), ar: rss('https://www.alarabiya.net/tools/mrss/?cat=main') } }, |
| |
| { name: 'Guardian ME', url: rss('https://www.theguardian.com/world/middleeast/rss') }, |
| { name: 'BBC Persian', url: rss('https://feeds.bbci.co.uk/persian/rss.xml') }, |
| { name: 'Iran International', url: rss('https://news.google.com/rss/search?q=site:iranintl.com+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Fars News', url: rss('https://news.google.com/rss/search?q=site:farsnews.ir+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'IRNA', url: rss('https://en.irna.ir/rss') }, |
| { name: 'Mehr News', url: rss('https://en.mehrnews.com/rss') }, |
| { name: 'Haaretz', url: rss('https://news.google.com/rss/search?q=site:haaretz.com+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Jerusalem Post', url: rss('https://www.jpost.com/rss/rssfeedsheadlines.aspx') }, |
| { name: 'Ynetnews', url: rss('https://www.ynetnews.com/Integration/StoryRss3089.xml') }, |
| { name: 'Arab News', url: rss('https://news.google.com/rss/search?q=site:arabnews.com+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'The National', url: rss('https://news.google.com/rss/search?q=site:thenationalnews.com+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Oman Observer', url: rss('https://www.omanobserver.om/rssFeed/1') }, |
| { name: 'Asharq Business', url: rss('https://asharqbusiness.com/rss.xml') }, |
| { name: 'Asharq News', url: rss('https://asharq.com/snapchat/rss.xml'), lang: 'ar' }, |
| { name: 'Rudaw', url: rss('https://news.google.com/rss/search?q=site:rudaw.net+when:7d&hl=en&gl=US&ceid=US:en') }, |
| ], |
| tech: [ |
| { name: 'Hacker News', url: rss('https://hnrss.org/frontpage') }, |
| { name: 'Ars Technica', url: rss('https://feeds.arstechnica.com/arstechnica/technology-lab') }, |
| { name: 'The Verge', url: rss('https://www.theverge.com/rss/index.xml') }, |
| { name: 'MIT Tech Review', url: rss('https://www.technologyreview.com/feed/') }, |
| ], |
| ai: [ |
| { name: 'AI News', url: rss('https://news.google.com/rss/search?q=(OpenAI+OR+Anthropic+OR+Google+AI+OR+"large+language+model"+OR+ChatGPT)+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'VentureBeat AI', url: rss('https://venturebeat.com/category/ai/feed/') }, |
| { name: 'The Verge AI', url: rss('https://www.theverge.com/rss/ai-artificial-intelligence/index.xml') }, |
| { name: 'MIT Tech Review', url: rss('https://www.technologyreview.com/topic/artificial-intelligence/feed') }, |
| { name: 'ArXiv AI', url: rss('https://export.arxiv.org/rss/cs.AI') }, |
| ], |
| finance: [ |
| { name: 'CNBC', url: rss('https://www.cnbc.com/id/100003114/device/rss/rss.html') }, |
| { name: 'MarketWatch', url: rss('https://news.google.com/rss/search?q=site:marketwatch.com+markets+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Yahoo Finance', url: rss('https://finance.yahoo.com/news/rssindex') }, |
| { name: 'Financial Times', url: rss('https://www.ft.com/rss/home') }, |
| { name: 'Reuters Business', url: rss('https://news.google.com/rss/search?q=site:reuters.com+business+markets&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| gov: [ |
| { name: 'White House', url: rss('https://news.google.com/rss/search?q=site:whitehouse.gov&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'State Dept', url: rss('https://news.google.com/rss/search?q=site:state.gov+OR+"State+Department"&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Pentagon', url: rss('https://news.google.com/rss/search?q=site:defense.gov+OR+Pentagon&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Treasury', url: rss('https://news.google.com/rss/search?q=site:treasury.gov+OR+"Treasury+Department"&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'DOJ', url: rss('https://news.google.com/rss/search?q=site:justice.gov+OR+"Justice+Department"+DOJ&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Federal Reserve', url: rss('https://www.federalreserve.gov/feeds/press_all.xml') }, |
| { name: 'SEC', url: rss('https://www.sec.gov/news/pressreleases.rss') }, |
| { name: 'CDC', url: rss('https://news.google.com/rss/search?q=site:cdc.gov+OR+CDC+health&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'FEMA', url: rss('https://news.google.com/rss/search?q=site:fema.gov+OR+FEMA+emergency&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'DHS', url: rss('https://news.google.com/rss/search?q=site:dhs.gov+OR+"Homeland+Security"&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'UN News', url: railwayRss('https://news.un.org/feed/subscribe/en/news/all/rss.xml') }, |
| { name: 'CISA', url: railwayRss('https://www.cisa.gov/cybersecurity-advisories/all.xml') }, |
| ], |
| layoffs: [ |
| { name: 'Layoffs.fyi', url: rss('https://news.google.com/rss/search?q=tech+company+layoffs+announced&hl=en&gl=US&ceid=US:en') }, |
| { name: 'TechCrunch Layoffs', url: rss('https://techcrunch.com/tag/layoffs/feed/') }, |
| { name: 'Layoffs News', url: rss('https://news.google.com/rss/search?q=(layoffs+OR+"job+cuts"+OR+"workforce+reduction")+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| thinktanks: [ |
| { name: 'Foreign Policy', url: rss('https://foreignpolicy.com/feed/') }, |
| { name: 'Atlantic Council', url: railwayRss('https://www.atlanticcouncil.org/feed/') }, |
| { name: 'Foreign Affairs', url: rss('https://www.foreignaffairs.com/rss.xml') }, |
| { name: 'CSIS', url: rss('https://news.google.com/rss/search?q=site:csis.org+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'RAND', url: rss('https://www.rand.org/pubs/articles.xml') }, |
| { name: 'Brookings', url: rss('https://news.google.com/rss/search?q=site:brookings.edu+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Carnegie', url: rss('https://news.google.com/rss/search?q=site:carnegieendowment.org+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| |
| { name: 'War on the Rocks', url: rss('https://warontherocks.com/feed') }, |
| |
| { name: 'Responsible Statecraft', url: rss('https://responsiblestatecraft.org/feed/') }, |
| |
| { name: 'RUSI', url: rss('https://news.google.com/rss/search?q=site:rusi.org+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| { name: 'FPRI', url: rss('https://www.fpri.org/feed/') }, |
| |
| { name: 'Jamestown', url: rss('https://jamestown.org/feed/') }, |
| ], |
| crisis: [ |
| { name: 'CrisisWatch', url: rss('https://www.crisisgroup.org/rss') }, |
| { name: 'IAEA', url: rss('https://www.iaea.org/feeds/topnews') }, |
| { name: 'WHO', url: rss('https://www.who.int/rss-feeds/news-english.xml') }, |
| { name: 'UNHCR', url: rss('https://news.google.com/rss/search?q=site:unhcr.org+OR+UNHCR+refugees+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| africa: [ |
| { name: 'Africa News', url: rss('https://news.google.com/rss/search?q=(Africa+OR+Nigeria+OR+Kenya+OR+"South+Africa"+OR+Ethiopia)+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Sahel Crisis', url: rss('https://news.google.com/rss/search?q=(Sahel+OR+Mali+OR+Niger+OR+"Burkina+Faso"+OR+Wagner)+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'News24', url: rss('https://feeds.news24.com/articles/news24/TopStories/rss') }, |
| { name: 'BBC Africa', url: rss('https://feeds.bbci.co.uk/news/world/africa/rss.xml') }, |
| { name: 'Jeune Afrique', url: rss('https://www.jeuneafrique.com/feed/'), lang: 'fr' }, |
| { name: 'Africanews', url: { en: rss('https://www.africanews.com/feed/rss'), fr: rss('https://fr.africanews.com/feed/rss') } }, |
| { name: 'BBC Afrique', url: rss('https://www.bbc.com/afrique/index.xml'), lang: 'fr' }, |
| |
| { name: 'Premium Times', url: rss('https://www.premiumtimesng.com/feed') }, |
| { name: 'Vanguard Nigeria', url: rss('https://www.vanguardngr.com/feed/') }, |
| { name: 'Channels TV', url: rss('https://www.channelstv.com/feed/') }, |
| { name: 'Daily Trust', url: rss('https://dailytrust.com/feed/') }, |
| { name: 'ThisDay', url: rss('https://www.thisdaylive.com/feed') }, |
| ], |
| latam: [ |
| { name: 'Latin America', url: rss('https://news.google.com/rss/search?q=(Brazil+OR+Mexico+OR+Argentina+OR+Venezuela+OR+Colombia)+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'BBC Latin America', url: rss('https://feeds.bbci.co.uk/news/world/latin_america/rss.xml') }, |
| { name: 'Reuters LatAm', url: rss('https://news.google.com/rss/search?q=site:reuters.com+(Brazil+OR+Mexico+OR+Argentina)+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Guardian Americas', url: rss('https://www.theguardian.com/world/americas/rss') }, |
| |
| { name: 'Clarín', url: rss('https://www.clarin.com/rss/lo-ultimo/'), lang: 'es' }, |
| { name: 'O Globo', url: rss('https://news.google.com/rss/search?q=site:oglobo.globo.com+when:1d&hl=pt-BR&gl=BR&ceid=BR:pt-419'), lang: 'pt' }, |
| { name: 'Folha de S.Paulo', url: rss('https://feeds.folha.uol.com.br/emcimadahora/rss091.xml'), lang: 'pt' }, |
| { name: 'Brasil Paralelo', url: rss('https://www.brasilparalelo.com.br/noticias/rss.xml'), lang: 'pt' }, |
| { name: 'El Tiempo', url: rss('https://www.eltiempo.com/rss/mundo_latinoamerica.xml'), lang: 'es' }, |
| { name: 'La Silla Vacía', url: rss('https://www.lasillavacia.com/rss') }, |
| { name: 'Primicias', url: rss('https://www.primicias.ec/feed/'), lang: 'es' }, |
| { name: 'Infobae Americas', url: rss('https://www.infobae.com/arc/outboundfeeds/rss/'), lang: 'es' }, |
| { name: 'El Universo', url: rss('https://www.eluniverso.com/arc/outboundfeeds/rss/category/noticias/?outputType=xml'), lang: 'es' }, |
| |
| { name: 'Mexico News Daily', url: rss('https://mexiconewsdaily.com/feed/') }, |
| { name: 'Mexico Security', url: rss('https://news.google.com/rss/search?q=(Mexico+cartel+OR+Mexico+violence+OR+Mexico+troops+OR+narco+Mexico)+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'AP Mexico', url: rss('https://news.google.com/rss/search?q=site:apnews.com+Mexico+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| { name: 'InSight Crime', url: rss('https://insightcrime.org/feed/') }, |
| { name: 'France 24 LatAm', url: rss('https://www.france24.com/en/americas/rss') }, |
| ], |
| asia: [ |
| { name: 'Asia News', url: rss('https://news.google.com/rss/search?q=(China+OR+Japan+OR+Korea+OR+India+OR+ASEAN)+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'BBC Asia', url: rss('https://feeds.bbci.co.uk/news/world/asia/rss.xml') }, |
| { name: 'The Diplomat', url: rss('https://thediplomat.com/feed/') }, |
| { name: 'South China Morning Post', url: railwayRss('https://www.scmp.com/rss/91/feed/') }, |
| { name: 'Reuters Asia', url: rss('https://news.google.com/rss/search?q=site:reuters.com+(China+OR+Japan+OR+Taiwan+OR+Korea)+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Xinhua', url: rss('https://news.google.com/rss/search?q=site:xinhuanet.com+OR+Xinhua+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Japan Today', url: rss('https://japantoday.com/feed/atom') }, |
| { name: 'Nikkei Asia', url: rss('https://news.google.com/rss/search?q=site:asia.nikkei.com+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Asahi Shimbun', url: rss('https://www.asahi.com/rss/asahi/newsheadlines.rdf'), lang: 'ja' }, |
| { name: 'The Hindu', url: rss('https://www.thehindu.com/news/national/feeder/default.rss'), lang: 'en' }, |
| { name: 'Indian Express', url: rss('https://indianexpress.com/section/india/feed/') }, |
| { name: 'NDTV', url: rss('https://feeds.feedburner.com/ndtvnews-top-stories') }, |
| { name: 'India News Network', url: rss('https://news.google.com/rss/search?q=India+diplomacy+foreign+policy+news&hl=en&gl=US&ceid=US:en') }, |
| |
| { name: 'BBC Hindi', url: rss('https://feeds.bbci.co.uk/hindi/rss.xml'), lang: 'hi' }, |
| { name: 'Aaj Tak', url: rss('https://www.aajtak.in/rssfeeds/?id=home'), lang: 'hi' }, |
| { name: 'NDTV India', url: rss('https://feeds.feedburner.com/ndtvkhabar-latest'), lang: 'hi' }, |
| { name: 'Amar Ujala', url: rss('https://www.amarujala.com/rss/national.xml'), lang: 'hi' }, |
| { name: 'CNA', url: rss('https://www.channelnewsasia.com/api/v1/rss-outbound-feed?_format=xml') }, |
| { name: 'MIIT (China)', url: rss('https://news.google.com/rss/search?q=site:miit.gov.cn+when:7d&hl=zh-CN&gl=CN&ceid=CN:zh-Hans'), lang: 'zh' }, |
| { name: 'MOFCOM (China)', url: rss('https://news.google.com/rss/search?q=site:mofcom.gov.cn+when:7d&hl=zh-CN&gl=CN&ceid=CN:zh-Hans'), lang: 'zh' }, |
| |
| { name: 'Bangkok Post', url: rss('https://news.google.com/rss/search?q=site:bangkokpost.com+when:1d&hl=en-US&gl=US&ceid=US:en'), lang: 'th' }, |
| { name: 'Thai PBS', url: rss('https://news.google.com/rss/search?q=Thai+PBS+World+news&hl=en&gl=US&ceid=US:en'), lang: 'th' }, |
| |
| { name: 'VnExpress', url: rss('https://vnexpress.net/rss/tin-moi-nhat.rss'), lang: 'vi' }, |
| { name: 'Tuoi Tre News', url: rss('https://tuoitrenews.vn/rss'), lang: 'vi' }, |
| |
| { name: 'Yonhap News', url: rss('https://www.yonhapnewstv.co.kr/browse/feed/'), lang: 'ko' }, |
| { name: 'Chosun Ilbo', url: rss('https://www.chosun.com/arc/outboundfeeds/rss/?outputType=xml'), lang: 'ko' }, |
| |
| { name: 'ABC News Australia', url: rss('https://www.abc.net.au/news/feed/2942460/rss.xml') }, |
| { name: 'Guardian Australia', url: rss('https://www.theguardian.com/australia-news/rss') }, |
| |
| { name: 'Island Times (Palau)', url: rss('https://islandtimes.org/feed/') }, |
| ], |
| energy: [ |
| { name: 'Oil & Gas', url: rss('https://news.google.com/rss/search?q=(oil+price+OR+OPEC+OR+"natural+gas"+OR+pipeline+OR+LNG)+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Nuclear Energy', url: rss('https://news.google.com/rss/search?q=("nuclear+energy"+OR+"nuclear+power"+OR+uranium+OR+IAEA)+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Reuters Energy', url: rss('https://news.google.com/rss/search?q=site:reuters.com+(oil+OR+gas+OR+energy+OR+OPEC)+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Mining & Resources', url: rss('https://news.google.com/rss/search?q=(lithium+OR+"rare+earth"+OR+cobalt+OR+mining)+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| }; |
|
|
| |
| const TECH_FEEDS: Record<string, Feed[]> = { |
| tech: [ |
| { name: 'TechCrunch', url: rss('https://techcrunch.com/feed/') }, |
| { name: 'The Verge', url: rss('https://www.theverge.com/rss/index.xml') }, |
| { name: 'Ars Technica', url: rss('https://feeds.arstechnica.com/arstechnica/technology-lab') }, |
| { name: 'Hacker News', url: rss('https://hnrss.org/frontpage') }, |
| { name: 'MIT Tech Review', url: rss('https://www.technologyreview.com/feed/') }, |
| { name: 'ZDNet', url: rss('https://www.zdnet.com/news/rss.xml') }, |
| { name: 'TechMeme', url: rss('https://www.techmeme.com/feed.xml') }, |
| { name: 'Engadget', url: rss('https://www.engadget.com/rss.xml') }, |
| { name: 'Fast Company', url: rss('https://feeds.feedburner.com/fastcompany/headlines') }, |
| ], |
| ai: [ |
| { name: 'AI News', url: rss('https://news.google.com/rss/search?q=(OpenAI+OR+Anthropic+OR+Google+AI+OR+"large+language+model"+OR+ChatGPT+OR+Claude+OR+"AI+model")+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'VentureBeat AI', url: rss('https://venturebeat.com/category/ai/feed/') }, |
| { name: 'The Verge AI', url: rss('https://www.theverge.com/rss/ai-artificial-intelligence/index.xml') }, |
| { name: 'MIT Tech Review AI', url: rss('https://www.technologyreview.com/topic/artificial-intelligence/feed') }, |
| { name: 'MIT Research', url: rss('https://news.mit.edu/rss/research') }, |
| { name: 'ArXiv AI', url: rss('https://export.arxiv.org/rss/cs.AI') }, |
| { name: 'ArXiv ML', url: rss('https://export.arxiv.org/rss/cs.LG') }, |
| { name: 'AI Weekly', url: rss('https://news.google.com/rss/search?q="artificial+intelligence"+OR+"machine+learning"+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Anthropic News', url: rss('https://news.google.com/rss/search?q=Anthropic+Claude+AI+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'OpenAI News', url: rss('https://news.google.com/rss/search?q=OpenAI+ChatGPT+GPT-4+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| startups: [ |
| { name: 'TechCrunch Startups', url: rss('https://techcrunch.com/category/startups/feed/') }, |
| { name: 'VentureBeat', url: rss('https://venturebeat.com/feed/') }, |
| { name: 'Crunchbase News', url: rss('https://news.crunchbase.com/feed/') }, |
| { name: 'SaaStr', url: rss('https://www.saastr.com/feed/') }, |
| { name: 'AngelList News', url: rss('https://news.google.com/rss/search?q=site:angellist.com+OR+"AngelList"+funding+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'TechCrunch Venture', url: rss('https://techcrunch.com/category/venture/feed/') }, |
| { name: 'The Information', url: rss('https://news.google.com/rss/search?q=site:theinformation.com+startup+OR+funding+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Fortune Term Sheet', url: rss('https://news.google.com/rss/search?q="Term+Sheet"+venture+capital+OR+startup+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'PitchBook News', url: rss('https://news.google.com/rss/search?q=site:pitchbook.com+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'CB Insights', url: rss('https://www.cbinsights.com/research/feed/') }, |
| ], |
| vcblogs: [ |
| { name: 'Y Combinator Blog', url: rss('https://www.ycombinator.com/blog/rss/') }, |
| { name: 'a16z Blog', url: rss('https://news.google.com/rss/search?q=site:a16z.com+OR+"Andreessen+Horowitz"+blog+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Sequoia Blog', url: rss('https://news.google.com/rss/search?q=site:sequoiacap.com+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Paul Graham Essays', url: rss('https://news.google.com/rss/search?q="Paul+Graham"+essay+OR+blog+when:30d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'VC Insights', url: rss('https://news.google.com/rss/search?q=("venture+capital"+insights+OR+"VC+trends"+OR+"startup+advice")+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Lenny\'s Newsletter', url: rss('https://www.lennysnewsletter.com/feed') }, |
| { name: 'Stratechery', url: rss('https://stratechery.com/feed/') }, |
| { name: 'FwdStart Newsletter', url: '/api/fwdstart' }, |
| ], |
| regionalStartups: [ |
| |
| { name: 'EU Startups', url: rss('https://news.google.com/rss/search?q=site:eu-startups.com+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Tech.eu', url: rss('https://tech.eu/feed/') }, |
| { name: 'Sifted (Europe)', url: rss('https://sifted.eu/feed') }, |
| { name: 'The Next Web', url: rss('https://news.google.com/rss/search?q=site:thenextweb.com+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| { name: 'Tech in Asia', url: rss('https://news.google.com/rss/search?q=site:techinasia.com+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'KrASIA', url: rss('https://news.google.com/rss/search?q=site:kr-asia.com+OR+KrASIA+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'SEA Startups', url: rss('https://news.google.com/rss/search?q=(Singapore+OR+Indonesia+OR+Vietnam+OR+Thailand+OR+Malaysia)+startup+funding+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Asia VC News', url: rss('https://news.google.com/rss/search?q=("Southeast+Asia"+OR+ASEAN)+venture+capital+OR+funding+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| { name: 'China Startups', url: rss('https://news.google.com/rss/search?q=China+startup+funding+OR+"Chinese+startup"+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: '36Kr English', url: rss('https://news.google.com/rss/search?q=site:36kr.com+OR+"36Kr"+startup+china+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'China Tech Giants', url: rss('https://news.google.com/rss/search?q=(Alibaba+OR+Tencent+OR+ByteDance+OR+Baidu+OR+JD.com+OR+Xiaomi+OR+Huawei)+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| { name: 'Japan Startups', url: rss('https://news.google.com/rss/search?q=Japan+startup+funding+OR+"Japanese+startup"+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Japan Tech News', url: rss('https://news.google.com/rss/search?q=(Japan+startup+OR+Japan+tech+OR+SoftBank+OR+Rakuten+OR+Sony)+funding+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Nikkei Tech', url: rss('https://news.google.com/rss/search?q=site:asia.nikkei.com+technology+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| { name: 'Korea Tech News', url: rss('https://news.google.com/rss/search?q=(Korea+startup+OR+Korean+tech+OR+Samsung+OR+Kakao+OR+Naver+OR+Coupang)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Korea Startups', url: rss('https://news.google.com/rss/search?q=Korea+startup+funding+OR+"Korean+unicorn"+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| { name: 'Inc42 (India)', url: rss('https://inc42.com/feed/') }, |
| { name: 'YourStory', url: rss('https://yourstory.com/feed') }, |
| { name: 'India Startups', url: rss('https://news.google.com/rss/search?q=India+startup+funding+OR+"Indian+startup"+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'India Tech News', url: rss('https://news.google.com/rss/search?q=(Flipkart+OR+Razorpay+OR+Zerodha+OR+Zomato+OR+Paytm+OR+PhonePe)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| { name: 'SEA Tech News', url: rss('https://news.google.com/rss/search?q=(Grab+OR+GoTo+OR+Sea+Limited+OR+Shopee+OR+Tokopedia)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Vietnam Tech', url: rss('https://news.google.com/rss/search?q=Vietnam+startup+OR+Vietnam+tech+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Indonesia Tech', url: rss('https://news.google.com/rss/search?q=Indonesia+startup+OR+Indonesia+tech+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| { name: 'Taiwan Tech', url: rss('https://news.google.com/rss/search?q=(Taiwan+startup+OR+TSMC+OR+MediaTek+OR+Foxconn)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| { name: 'LAVCA (LATAM)', url: rss('https://news.google.com/rss/search?q=site:lavca.org+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'LATAM Startups', url: rss('https://news.google.com/rss/search?q=("Latin+America"+startup+OR+LATAM+funding)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Startups LATAM', url: rss('https://news.google.com/rss/search?q=(startup+Brazil+OR+startup+Mexico+OR+startup+Argentina+OR+startup+Colombia+OR+startup+Chile)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Brazil Tech', url: rss('https://news.google.com/rss/search?q=(Nubank+OR+iFood+OR+Mercado+Libre+OR+Rappi+OR+VTEX)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'FinTech LATAM', url: rss('https://news.google.com/rss/search?q=fintech+(Brazil+OR+Mexico+OR+Argentina+OR+"Latin+America")+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| { name: 'TechCabal (Africa)', url: rss('https://techcabal.com/feed/') }, |
| { name: 'Africa Startups', url: rss('https://news.google.com/rss/search?q=Africa+startup+funding+OR+"African+startup"+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Africa Tech News', url: rss('https://news.google.com/rss/search?q=(Flutterwave+OR+Paystack+OR+Jumia+OR+Andela+OR+"Africa+startup")+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| { name: 'MENA Startups', url: rss('https://news.google.com/rss/search?q=(MENA+startup+OR+"Middle+East"+funding+OR+Gulf+startup)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'MENA Tech News', url: rss('https://news.google.com/rss/search?q=(UAE+startup+OR+Saudi+tech+OR+Dubai+startup+OR+NEOM+tech)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| github: [ |
| { name: 'GitHub Blog', url: rss('https://github.blog/feed/') }, |
| { name: 'GitHub Trending', url: rss('https://mshibanami.github.io/GitHubTrendingRSS/daily/all.xml') }, |
| { name: 'Show HN', url: rss('https://hnrss.org/show') }, |
| { name: 'YC Launches', url: rss('https://news.google.com/rss/search?q=("Y+Combinator"+OR+"YC+launch"+OR+"YC+W25"+OR+"YC+S25")+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Dev Events', url: rss('https://news.google.com/rss/search?q=("developer+conference"+OR+"tech+summit"+OR+"devcon"+OR+"developer+event")+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Open Source News', url: rss('https://news.google.com/rss/search?q="open+source"+project+release+OR+launch+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| ipo: [ |
| { name: 'IPO News', url: rss('https://news.google.com/rss/search?q=(IPO+OR+"initial+public+offering"+OR+SPAC)+tech+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Renaissance IPO', url: rss('https://news.google.com/rss/search?q=site:renaissancecapital.com+IPO+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Tech IPO News', url: rss('https://news.google.com/rss/search?q=tech+IPO+OR+"tech+company"+IPO+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| funding: [ |
| { name: 'SEC Filings', url: rss('https://news.google.com/rss/search?q=(S-1+OR+"IPO+filing"+OR+"SEC+filing")+startup+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'VC News', url: rss('https://news.google.com/rss/search?q=("Series+A"+OR+"Series+B"+OR+"Series+C"+OR+"funding+round"+OR+"venture+capital")+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Seed & Pre-Seed', url: rss('https://news.google.com/rss/search?q=("seed+round"+OR+"pre-seed"+OR+"angel+round"+OR+"seed+funding")+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Startup Funding', url: rss('https://news.google.com/rss/search?q=("startup+funding"+OR+"raised+funding"+OR+"raised+$"+OR+"funding+announced")+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| producthunt: [ |
| { name: 'Product Hunt', url: rss('https://www.producthunt.com/feed') }, |
| ], |
| outages: [ |
| { name: 'AWS Status', url: rss('https://news.google.com/rss/search?q=AWS+outage+OR+"Amazon+Web+Services"+down+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Cloud Outages', url: rss('https://news.google.com/rss/search?q=(Azure+OR+GCP+OR+Cloudflare+OR+Slack+OR+GitHub)+outage+OR+down+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| security: [ |
| { name: 'Krebs Security', url: rss('https://krebsonsecurity.com/feed/') }, |
| { name: 'The Hacker News', url: rss('https://feeds.feedburner.com/TheHackersNews') }, |
| { name: 'Dark Reading', url: rss('https://www.darkreading.com/rss.xml') }, |
| { name: 'Schneier', url: rss('https://www.schneier.com/feed/') }, |
| ], |
| policy: [ |
| |
| { name: 'Politico Tech', url: rss('https://rss.politico.com/technology.xml') }, |
| { name: 'AI Regulation', url: rss('https://news.google.com/rss/search?q=AI+regulation+OR+"artificial+intelligence"+law+OR+policy+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Tech Antitrust', url: rss('https://news.google.com/rss/search?q=tech+antitrust+OR+FTC+Google+OR+FTC+Apple+OR+FTC+Amazon+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'EFF News', url: rss('https://news.google.com/rss/search?q=site:eff.org+OR+"Electronic+Frontier+Foundation"+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| { name: 'EU Digital Policy', url: rss('https://news.google.com/rss/search?q=("Digital+Services+Act"+OR+"Digital+Markets+Act"+OR+"EU+AI+Act"+OR+"GDPR")+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Euractiv Digital', url: rss('https://news.google.com/rss/search?q=site:euractiv.com+digital+OR+tech+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'EU Commission Digital', url: rss('https://news.google.com/rss/search?q=site:ec.europa.eu+digital+OR+technology+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| { name: 'China Tech Policy', url: rss('https://news.google.com/rss/search?q=(China+tech+regulation+OR+China+AI+policy+OR+MIIT+technology)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| { name: 'UK Tech Policy', url: rss('https://news.google.com/rss/search?q=(UK+AI+safety+OR+"Online+Safety+Bill"+OR+UK+tech+regulation)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| { name: 'India Tech Policy', url: rss('https://news.google.com/rss/search?q=(India+tech+regulation+OR+India+data+protection+OR+India+AI+policy)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| thinktanks: [ |
| |
| { name: 'Brookings Tech', url: rss('https://news.google.com/rss/search?q=site:brookings.edu+technology+OR+AI+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'CSIS Tech', url: rss('https://news.google.com/rss/search?q=site:csis.org+technology+OR+AI+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'MIT Tech Policy', url: rss('https://news.google.com/rss/search?q=%22Tech+Policy+Press%22&hl=en&gl=US&ceid=US:en') }, |
| { name: 'Stanford HAI', url: rss('https://news.google.com/rss/search?q=site:hai.stanford.edu+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'AI Now Institute', url: rss('https://news.google.com/rss/search?q=%22AI+Now+Institute%22&hl=en&gl=US&ceid=US:en') }, |
| |
| { name: 'OECD Digital', url: rss('https://news.google.com/rss/search?q=site:oecd.org+digital+OR+AI+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'EU Tech Policy', url: rss('https://news.google.com/rss/search?q=("EU+tech+policy"+OR+"European+digital"+OR+Bruegel+tech)+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Chatham House Tech', url: rss('https://news.google.com/rss/search?q=site:chathamhouse.org+technology+OR+AI+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| { name: 'ISEAS (Singapore)', url: rss('https://news.google.com/rss/search?q=site:iseas.edu.sg+technology+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'ORF Tech (India)', url: rss('https://news.google.com/rss/search?q=(India+tech+policy+OR+ORF+technology+OR+"Observer+Research+Foundation"+tech)+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'RIETI (Japan)', url: rss('https://news.google.com/rss/search?q=site:rieti.go.jp+technology+when:30d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Asia Pacific Tech', url: rss('https://news.google.com/rss/search?q=("Asia+Pacific"+tech+policy+OR+"Lowy+Institute"+technology)+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| { name: 'China Tech Analysis', url: rss('https://news.google.com/rss/search?q=("China+tech+strategy"+OR+"Chinese+AI"+OR+"China+semiconductor")+analysis+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'DigiChina', url: rss('https://news.google.com/rss/search?q=DigiChina+Stanford+China+technology&hl=en&gl=US&ceid=US:en') }, |
| ], |
| finance: [ |
| { name: 'CNBC Tech', url: rss('https://www.cnbc.com/id/19854910/device/rss/rss.html') }, |
| { name: 'MarketWatch Tech', url: rss('https://news.google.com/rss/search?q=site:marketwatch.com+technology+markets+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Yahoo Finance', url: rss('https://finance.yahoo.com/rss/topstories') }, |
| { name: 'Seeking Alpha Tech', url: rss('https://seekingalpha.com/market_currents.xml') }, |
| ], |
| hardware: [ |
| { name: "Tom's Hardware", url: rss('https://www.tomshardware.com/feeds.xml') }, |
| { name: 'SemiAnalysis', url: rss('https://news.google.com/rss/search?q=site:semianalysis.com+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Semiconductor News', url: rss('https://news.google.com/rss/search?q=semiconductor+OR+chip+OR+TSMC+OR+NVIDIA+OR+Intel+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| cloud: [ |
| { name: 'InfoQ', url: rss('https://feed.infoq.com/') }, |
| { name: 'The New Stack', url: rss('https://thenewstack.io/feed/') }, |
| { name: 'DevOps.com', url: rss('https://devops.com/feed/') }, |
| ], |
| dev: [ |
| { name: 'Dev.to', url: rss('https://dev.to/feed') }, |
| { name: 'Lobsters', url: rss('https://lobste.rs/rss') }, |
| { name: 'Changelog', url: rss('https://changelog.com/feed') }, |
| ], |
| layoffs: [ |
| { name: 'Layoffs.fyi', url: rss('https://news.google.com/rss/search?q=tech+layoffs+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'TechCrunch Layoffs', url: rss('https://techcrunch.com/tag/layoffs/feed/') }, |
| ], |
| unicorns: [ |
| { name: 'Unicorn News', url: rss('https://news.google.com/rss/search?q=("unicorn+startup"+OR+"unicorn+valuation"+OR+"$1+billion+valuation")+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'CB Insights Unicorn', url: rss('https://news.google.com/rss/search?q=site:cbinsights.com+unicorn+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Decacorn News', url: rss('https://news.google.com/rss/search?q=("decacorn"+OR+"$10+billion+valuation"+OR+"$10B+valuation")+startup+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'New Unicorns', url: rss('https://news.google.com/rss/search?q=("becomes+unicorn"+OR+"joins+unicorn"+OR+"reaches+unicorn"+OR+"achieved+unicorn")+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| accelerators: [ |
| { name: 'Techstars News', url: rss('https://news.google.com/rss/search?q=Techstars+accelerator+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: '500 Global News', url: rss('https://news.google.com/rss/search?q="500+Global"+OR+"500+Startups"+accelerator+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Demo Day News', url: rss('https://news.google.com/rss/search?q=("demo+day"+OR+"YC+batch"+OR+"accelerator+batch")+startup+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Startup School', url: rss('https://news.google.com/rss/search?q="Startup+School"+OR+"YC+Startup+School"+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| podcasts: [ |
| |
| { name: 'Acquired Episodes', url: rss('https://news.google.com/rss/search?q="Acquired+podcast"+episode+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'All-In Podcast', url: rss('https://news.google.com/rss/search?q="All-In+podcast"+(Chamath+OR+Sacks+OR+Friedberg)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'a16z Insights', url: rss('https://news.google.com/rss/search?q=("a16z"+OR+"Andreessen+Horowitz")+podcast+OR+interview+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'TWIST Episodes', url: rss('https://news.google.com/rss/search?q="This+Week+in+Startups"+Jason+Calacanis+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: '20VC Episodes', url: rss('https://rss.libsyn.com/shows/61840/destinations/240976.xml') }, |
| { name: 'Lex Fridman Tech', url: rss('https://news.google.com/rss/search?q=("Lex+Fridman"+interview)+(AI+OR+tech+OR+startup+OR+CEO)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| { name: 'Verge Shows', url: rss('https://news.google.com/rss/search?q=("Vergecast"+OR+"Decoder+podcast"+Verge)+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Hard Fork (NYT)', url: rss('https://news.google.com/rss/search?q="Hard+Fork"+podcast+NYT+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Pivot Podcast', url: rss('https://feeds.megaphone.fm/pivot') }, |
| |
| { name: 'Tech Newsletters', url: rss('https://news.google.com/rss/search?q=("Benedict+Evans"+OR+"Pragmatic+Engineer"+OR+Stratechery)+tech+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| { name: 'AI Podcasts', url: rss('https://news.google.com/rss/search?q=("AI+podcast"+OR+"artificial+intelligence+podcast")+episode+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'AI Interviews', url: rss('https://news.google.com/rss/search?q=(NVIDIA+OR+OpenAI+OR+Anthropic+OR+DeepMind)+interview+OR+podcast+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| { name: 'How I Built This', url: rss('https://news.google.com/rss/search?q="How+I+Built+This"+Guy+Raz+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Masters of Scale', url: rss('https://rss.art19.com/masters-of-scale') }, |
| ], |
| }; |
|
|
| |
| const FINANCE_FEEDS: Record<string, Feed[]> = { |
| markets: [ |
| { name: 'CNBC', url: rss('https://www.cnbc.com/id/100003114/device/rss/rss.html') }, |
| |
| { name: 'MarketWatch', url: rss('https://news.google.com/rss/search?q=site:marketwatch.com+markets+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Yahoo Finance', url: rss('https://finance.yahoo.com/rss/topstories') }, |
| { name: 'Seeking Alpha', url: rss('https://seekingalpha.com/market_currents.xml') }, |
| { name: 'Reuters Markets', url: rss('https://news.google.com/rss/search?q=site:reuters.com+markets+stocks+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Bloomberg Markets', url: rss('https://news.google.com/rss/search?q=site:bloomberg.com+markets+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Investing.com News', url: rss('https://news.google.com/rss/search?q=site:investing.com+markets+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| forex: [ |
| { name: 'Forex News', url: rss('https://news.google.com/rss/search?q=("forex"+OR+"currency"+OR+"FX+market")+trading+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Dollar Watch', url: rss('https://news.google.com/rss/search?q=("dollar+index"+OR+DXY+OR+"US+dollar"+OR+"euro+dollar")+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Central Bank Rates', url: rss('https://news.google.com/rss/search?q=("central+bank"+OR+"interest+rate"+OR+"rate+decision"+OR+"monetary+policy")+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| bonds: [ |
| { name: 'Bond Market', url: rss('https://news.google.com/rss/search?q=("bond+market"+OR+"treasury+yields"+OR+"bond+yields"+OR+"fixed+income")+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Treasury Watch', url: rss('https://news.google.com/rss/search?q=("US+Treasury"+OR+"Treasury+auction"+OR+"10-year+yield"+OR+"2-year+yield")+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Corporate Bonds', url: rss('https://news.google.com/rss/search?q=("corporate+bond"+OR+"high+yield"+OR+"investment+grade"+OR+"credit+spread")+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| commodities: [ |
| { name: 'Oil & Gas', url: rss('https://news.google.com/rss/search?q=(oil+price+OR+OPEC+OR+"natural+gas"+OR+"crude+oil"+OR+WTI+OR+Brent)+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Gold & Metals', url: rss('https://news.google.com/rss/search?q=(gold+price+OR+silver+price+OR+copper+OR+platinum+OR+"precious+metals")+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Agriculture', url: rss('https://news.google.com/rss/search?q=(wheat+OR+corn+OR+soybeans+OR+coffee+OR+sugar)+price+OR+commodity+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Commodity Trading', url: rss('https://news.google.com/rss/search?q=("commodity+trading"+OR+"futures+market"+OR+CME+OR+NYMEX+OR+COMEX)+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| crypto: [ |
| { name: 'CoinDesk', url: rss('https://www.coindesk.com/arc/outboundfeeds/rss/') }, |
| { name: 'Cointelegraph', url: rss('https://cointelegraph.com/rss') }, |
| { name: 'The Block', url: rss('https://news.google.com/rss/search?q=site:theblock.co+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Crypto News', url: rss('https://news.google.com/rss/search?q=(bitcoin+OR+ethereum+OR+crypto+OR+"digital+assets")+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'DeFi News', url: rss('https://news.google.com/rss/search?q=(DeFi+OR+"decentralized+finance"+OR+DEX+OR+"yield+farming")+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Decrypt', url: rss('https://decrypt.co/feed') }, |
| |
| |
| |
| |
| |
| |
| |
| { name: 'The Defiant', url: rss('https://thedefiant.io/feed') }, |
| { name: 'Bitcoin Magazine', url: rss('https://bitcoinmagazine.com/feed') }, |
| { name: 'DL News', url: rss('https://news.google.com/rss/search?q=site:dlnews.com+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'CryptoSlate', url: rss('https://cryptoslate.com/feed/') }, |
| { name: 'Unchained', url: rss('https://unchainedcrypto.com/feed/') }, |
| { name: 'Wu Blockchain', url: rss('https://news.google.com/rss/search?q=site:wublockchain.com+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Messari', url: rss('https://news.google.com/rss/search?q=site:messari.io+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Bloomberg Crypto', url: rss('https://news.google.com/rss/search?q=bloomberg+crypto+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Reuters Crypto', url: rss('https://news.google.com/rss/search?q=reuters+crypto+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'NFT News', url: rss('https://news.google.com/rss/search?q=(NFT+OR+"non-fungible")+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Stablecoin Policy', url: rss('https://news.google.com/rss/search?q=(stablecoin+regulation+OR+"stablecoin+bill")+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| centralbanks: [ |
| { name: 'Federal Reserve', url: rss('https://www.federalreserve.gov/feeds/press_all.xml') }, |
| { name: 'ECB Watch', url: rss('https://news.google.com/rss/search?q=("European+Central+Bank"+OR+ECB+OR+Lagarde)+monetary+policy+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'BoJ Watch', url: rss('https://news.google.com/rss/search?q=("Bank+of+Japan"+OR+BoJ)+monetary+policy+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'BoE Watch', url: rss('https://news.google.com/rss/search?q=("Bank+of+England"+OR+BoE)+monetary+policy+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'PBoC Watch', url: rss('https://news.google.com/rss/search?q=("People%27s+Bank+of+China"+OR+PBoC+OR+PBOC)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Global Central Banks', url: rss('https://news.google.com/rss/search?q=("rate+hike"+OR+"rate+cut"+OR+"interest+rate+decision")+central+bank+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| economic: [ |
| { name: 'Economic Data', url: rss('https://news.google.com/rss/search?q=(CPI+OR+inflation+OR+GDP+OR+"jobs+report"+OR+"nonfarm+payrolls"+OR+PMI)+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Trade & Tariffs', url: rss('https://news.google.com/rss/search?q=(tariff+OR+"trade+war"+OR+"trade+deficit"+OR+sanctions)+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Housing Market', url: rss('https://news.google.com/rss/search?q=("housing+market"+OR+"home+prices"+OR+"mortgage+rates"+OR+REIT)+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| ipo: [ |
| { name: 'IPO News', url: rss('https://news.google.com/rss/search?q=(IPO+OR+"initial+public+offering"+OR+SPAC+OR+"direct+listing")+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Earnings Reports', url: rss('https://news.google.com/rss/search?q=("earnings+report"+OR+"quarterly+earnings"+OR+"revenue+beat"+OR+"earnings+miss")+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'M&A News', url: rss('https://news.google.com/rss/search?q=("merger"+OR+"acquisition"+OR+"takeover+bid"+OR+"buyout")+billion+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| derivatives: [ |
| { name: 'Options Market', url: rss('https://news.google.com/rss/search?q=("options+market"+OR+"options+trading"+OR+"put+call+ratio"+OR+VIX)+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Futures Trading', url: rss('https://news.google.com/rss/search?q=("futures+trading"+OR+"S%26P+500+futures"+OR+"Nasdaq+futures")+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| fintech: [ |
| { name: 'Fintech News', url: rss('https://news.google.com/rss/search?q=(fintech+OR+"payment+technology"+OR+"neobank"+OR+"digital+banking")+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Trading Tech', url: rss('https://news.google.com/rss/search?q=("algorithmic+trading"+OR+"trading+platform"+OR+"quantitative+finance")+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Blockchain Finance', url: rss('https://news.google.com/rss/search?q=("blockchain+finance"+OR+"tokenization"+OR+"digital+securities"+OR+CBDC)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| 'fin-regulation': [ |
| { name: 'SEC', url: rss('https://www.sec.gov/news/pressreleases.rss') }, |
| { name: 'Financial Regulation', url: rss('https://news.google.com/rss/search?q=(SEC+OR+CFTC+OR+FINRA+OR+FCA)+regulation+OR+enforcement+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Banking Rules', url: rss('https://news.google.com/rss/search?q=(Basel+OR+"capital+requirements"+OR+"banking+regulation")+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Crypto Regulation', url: rss('https://news.google.com/rss/search?q=(crypto+regulation+OR+"digital+asset"+regulation+OR+"stablecoin"+regulation)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| institutional: [ |
| { name: 'Hedge Fund News', url: rss('https://news.google.com/rss/search?q=("hedge+fund"+OR+"Bridgewater"+OR+"Citadel"+OR+"Renaissance")+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Private Equity', url: rss('https://news.google.com/rss/search?q=("private+equity"+OR+Blackstone+OR+KKR+OR+Apollo+OR+Carlyle)+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Sovereign Wealth', url: rss('https://news.google.com/rss/search?q=("sovereign+wealth+fund"+OR+"pension+fund"+OR+"institutional+investor")+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| analysis: [ |
| { name: 'Market Outlook', url: rss('https://news.google.com/rss/search?q=("market+outlook"+OR+"stock+market+forecast"+OR+"bull+market"+OR+"bear+market")+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Risk & Volatility', url: rss('https://news.google.com/rss/search?q=(VIX+OR+"market+volatility"+OR+"risk+off"+OR+"market+correction")+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Bank Research', url: rss('https://news.google.com/rss/search?q=("Goldman+Sachs"+OR+"JPMorgan"+OR+"Morgan+Stanley")+forecast+OR+outlook+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| gccNews: [ |
| { name: 'Arabian Business', url: rss('https://news.google.com/rss/search?q=site:arabianbusiness.com+(Saudi+Arabia+OR+UAE+OR+GCC)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'The National', url: rss('https://news.google.com/rss/search?q=site:thenationalnews.com+(Abu+Dhabi+OR+UAE+OR+Saudi)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Arab News', url: rss('https://news.google.com/rss/search?q=site:arabnews.com+(Saudi+Arabia+OR+investment+OR+infrastructure)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Gulf FDI', url: rss('https://news.google.com/rss/search?q=(PIF+OR+"DP+World"+OR+Mubadala+OR+ADNOC+OR+Masdar+OR+"ACWA+Power")+infrastructure+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Gulf Investments', url: rss('https://news.google.com/rss/search?q=("Saudi+Arabia"+OR+"UAE"+OR+"Abu+Dhabi")+investment+infrastructure+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Vision 2030', url: rss('https://news.google.com/rss/search?q="Vision+2030"+(project+OR+investment+OR+announced)+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| }; |
|
|
| const HAPPY_FEEDS: Record<string, Feed[]> = { |
| positive: [ |
| { name: 'Good News Network', url: rss('https://www.goodnewsnetwork.org/feed/') }, |
| { name: 'Positive.News', url: rss('https://www.positive.news/feed/') }, |
| { name: 'Reasons to be Cheerful', url: rss('https://reasonstobecheerful.world/feed/') }, |
| { name: 'Optimist Daily', url: rss('https://www.optimistdaily.com/feed/') }, |
| { name: 'Upworthy', url: rss('https://www.upworthy.com/feed/') }, |
| { name: 'DailyGood', url: rss('https://www.dailygood.org/feed') }, |
| { name: 'Good Good Good', url: rss('https://www.goodgoodgood.co/articles/rss.xml') }, |
| { name: 'GOOD Magazine', url: rss('https://www.good.is/feed/') }, |
| { name: 'Sunny Skyz', url: rss('https://www.sunnyskyz.com/rss_tebow.php') }, |
| { name: 'The Better India', url: rss('https://thebetterindia.com/feed/') }, |
| ], |
| science: [ |
| { name: 'GNN Science', url: rss('https://www.goodnewsnetwork.org/category/news/science/feed/') }, |
| { name: 'ScienceDaily', url: rss('https://www.sciencedaily.com/rss/all.xml') }, |
| { name: 'Nature News', url: rss('https://www.nature.com/nature.rss') }, |
| { name: 'Live Science', url: rss('https://www.livescience.com/feeds.xml') }, |
| { name: 'New Scientist', url: rss('https://www.newscientist.com/feed/home/') }, |
| { name: 'Singularity Hub', url: rss('https://singularityhub.com/feed/') }, |
| { name: 'Human Progress', url: rss('https://humanprogress.org/feed/') }, |
| { name: 'Greater Good (Berkeley)', url: rss('https://greatergood.berkeley.edu/site/rss/articles') }, |
| ], |
| nature: [ |
| { name: 'GNN Animals', url: rss('https://www.goodnewsnetwork.org/category/news/animals/feed/') }, |
| { name: 'GNN Earth', url: rss('https://www.goodnewsnetwork.org/category/news/earth/feed/') }, |
| { name: 'Mongabay', url: rss('https://news.mongabay.com/feed/') }, |
| { name: 'Conservation Optimism', url: rss('https://conservationoptimism.org/feed/') }, |
| ], |
| health: [ |
| { name: 'GNN Health', url: rss('https://www.goodnewsnetwork.org/category/news/health/feed/') }, |
| ], |
| inspiring: [ |
| { name: 'GNN Heroes', url: rss('https://www.goodnewsnetwork.org/category/news/inspiring/feed/') }, |
| { name: 'GNN Heroes Spotlight', url: rss('https://www.goodnewsnetwork.org/category/news/heroes/feed/') }, |
| ], |
| community: [ |
| { name: 'Shareable', url: rss('https://www.shareable.net/feed/') }, |
| { name: 'Yes! Magazine', url: rss('https://www.yesmagazine.org/feed') }, |
| ], |
| }; |
|
|
| |
| const COMMODITY_FEEDS: Record<string, Feed[]> = { |
| 'commodity-news': [ |
| |
| |
| |
| |
| { name: 'Kitco News', url: rss('https://news.google.com/rss/search?q=site:kitco.com+(gold+OR+silver+OR+metals)+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Mining.com', url: rss('https://www.mining.com/feed/') }, |
| { name: 'Bloomberg Commodities', url: rss('https://news.google.com/rss/search?q=site:bloomberg.com+commodities+OR+metals+OR+mining+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Reuters Commodities', url: rss('https://news.google.com/rss/search?q=site:reuters.com+commodities+OR+metals+OR+mining+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'S&P Global Commodity', url: rss('https://news.google.com/rss/search?q=site:spglobal.com+commodities+metals+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| |
| |
| |
| |
| |
| { name: 'CNBC Commodities', url: rss('https://news.google.com/rss/search?q=site:cnbc.com+(commodities+OR+metals+OR+gold+OR+copper)+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| 'gold-silver': [ |
| |
| |
| { name: 'Kitco Gold', url: rss('https://news.google.com/rss/search?q=site:kitco.com+gold+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Gold Price News', url: rss('https://news.google.com/rss/search?q=(gold+price+OR+"gold+market"+OR+bullion+OR+LBMA)+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Silver Price News', url: rss('https://news.google.com/rss/search?q=(silver+price+OR+"silver+market"+OR+"silver+futures")+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Precious Metals', url: rss('https://news.google.com/rss/search?q=("precious+metals"+OR+platinum+OR+palladium+OR+"gold+ETF"+OR+GLD+OR+SLV)+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'World Gold Council', url: rss('https://news.google.com/rss/search?q="World+Gold+Council"+OR+"central+bank+gold"+OR+"gold+reserves"+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| |
| |
| |
| { name: 'GoldSeek', url: rss('https://www.goldseek.com/rss.xml') }, |
| { name: 'SilverSeek', url: rss('https://www.silverseek.com/rss.xml') }, |
| { name: 'Gold Silver Worlds', url: rss('https://goldsilverworlds.com/feed/') }, |
| |
| |
| |
| { name: 'FX Empire Gold', url: rss('https://news.google.com/rss/search?q=site:fxempire.com+gold+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| energy: [ |
| { name: 'OilPrice.com', url: rss('https://oilprice.com/rss/main') }, |
| { name: 'Rigzone', url: rss('https://www.rigzone.com/news/rss/rigzone_latest.aspx') }, |
| { name: 'EIA Reports', url: rss('https://www.eia.gov/rss/press_room.xml') }, |
| { name: 'OPEC News', url: rss('https://news.google.com/rss/search?q=(OPEC+OR+"oil+price"+OR+"crude+oil"+OR+WTI+OR+Brent+OR+"oil+production")+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Natural Gas News', url: rss('https://news.google.com/rss/search?q=("natural+gas"+OR+LNG+OR+"gas+price"+OR+"Henry+Hub")+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Energy Intel', url: rss('https://news.google.com/rss/search?q=(energy+commodities+OR+"energy+market"+OR+"energy+prices")+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Reuters Energy', url: rss('https://news.google.com/rss/search?q=site:reuters.com+(oil+OR+gas+OR+energy)+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| 'mining-news': [ |
| |
| |
| |
| { name: 'Mining Journal', url: rss('https://news.google.com/rss/search?q=site:mining-journal.com+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Northern Miner', url: rss('https://www.northernminer.com/feed/') }, |
| |
| |
| |
| |
| { name: 'Mining Weekly', url: rss('https://news.google.com/rss/search?q=site:miningweekly.com+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Mining Technology', url: rss('https://www.mining-technology.com/feed/') }, |
| { name: 'Australian Mining', url: rss('https://www.australianmining.com.au/feed/') }, |
| { name: 'Mine Web (SNL)', url: rss('https://news.google.com/rss/search?q=("mining+company"+OR+"mine+production"+OR+"mining+operations")+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Resource World', url: rss('https://news.google.com/rss/search?q=("mining+project"+OR+"mineral+exploration"+OR+"mine+development")+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| 'critical-minerals': [ |
| { name: 'Benchmark Mineral', url: rss('https://news.google.com/rss/search?q=("critical+minerals"+OR+"battery+metals"+OR+lithium+OR+cobalt+OR+"rare+earths")+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Lithium Market', url: rss('https://news.google.com/rss/search?q=(lithium+price+OR+"lithium+market"+OR+"lithium+supply"+OR+spodumene+OR+LCE)+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Cobalt Market', url: rss('https://news.google.com/rss/search?q=(cobalt+price+OR+"cobalt+market"+OR+"DRC+cobalt"+OR+"battery+cobalt")+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Rare Earths News', url: rss('https://news.google.com/rss/search?q=("rare+earth"+OR+"rare+earths"+OR+"REE"+OR+neodymium+OR+praseodymium)+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'EV Battery Supply', url: rss('https://news.google.com/rss/search?q=("EV+battery"+OR+"battery+supply+chain"+OR+"battery+materials")+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'IEA Critical Minerals', url: rss('https://news.google.com/rss/search?q=site:iea.org+(minerals+OR+critical+OR+battery)+when:14d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Uranium Market', url: rss('https://news.google.com/rss/search?q=(uranium+price+OR+"uranium+market"+OR+U3O8+OR+nuclear+fuel)+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| 'base-metals': [ |
| { name: 'LME Metals', url: rss('https://news.google.com/rss/search?q=(LME+OR+"London+Metal+Exchange")+copper+OR+aluminum+OR+zinc+OR+nickel+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Copper Market', url: rss('https://news.google.com/rss/search?q=(copper+price+OR+"copper+market"+OR+"copper+supply"+OR+COMEX+copper)+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Nickel News', url: rss('https://news.google.com/rss/search?q=(nickel+price+OR+"nickel+market"+OR+"nickel+supply"+OR+Indonesia+nickel)+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Aluminum & Zinc', url: rss('https://news.google.com/rss/search?q=(aluminum+price+OR+aluminium+OR+zinc+price+OR+"base+metals")+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Iron Ore Market', url: rss('https://news.google.com/rss/search?q=("iron+ore"+price+OR+"iron+ore+market"+OR+"steel+raw+materials")+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Metals Bulletin', url: rss('https://news.google.com/rss/search?q=("metals+market"+OR+"base+metals"+OR+SHFE+OR+"Shanghai+Futures")+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| 'mining-companies': [ |
| { name: 'BHP News', url: rss('https://news.google.com/rss/search?q=BHP+(mining+OR+production+OR+results+OR+copper+OR+"iron+ore")+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Rio Tinto News', url: rss('https://news.google.com/rss/search?q="Rio+Tinto"+(mining+OR+production+OR+results+OR+Pilbara)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Glencore & Vale', url: rss('https://news.google.com/rss/search?q=(Glencore+OR+Vale)+(mining+OR+production+OR+cobalt+OR+"iron+ore")+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Gold Majors', url: rss('https://news.google.com/rss/search?q=(Newmont+OR+Barrick+OR+AngloGold+OR+Agnico)+(gold+mine+OR+production+OR+results)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Freeport & Copper Miners', url: rss('https://news.google.com/rss/search?q=(Freeport+McMoRan+OR+Southern+Copper+OR+Teck+OR+Antofagasta)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Critical Mineral Companies', url: rss('https://news.google.com/rss/search?q=(Albemarle+OR+SQM+OR+"MP+Materials"+OR+Lynas+OR+Cameco)+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| 'supply-chain': [ |
| { name: 'Shipping & Freight', url: rss('https://news.google.com/rss/search?q=("bulk+carrier"+OR+"dry+bulk"+OR+"commodity+shipping"+OR+"Port+Hedland"+OR+"Strait+of+Hormuz")+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Trade Routes', url: rss('https://news.google.com/rss/search?q=("trade+route"+OR+"supply+chain"+OR+"commodity+export"+OR+"mineral+export")+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'China Commodity Imports', url: rss('https://news.google.com/rss/search?q=(China+imports+copper+OR+iron+ore+OR+lithium+OR+cobalt+OR+"rare+earth")+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Port & Logistics', url: rss('https://news.google.com/rss/search?q=("iron+ore+port"+OR+"copper+port"+OR+"commodity+port"+OR+"mineral+logistics")+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| 'commodity-regulation': [ |
| { name: 'Mining Regulation', url: rss('https://news.google.com/rss/search?q=("mining+regulation"+OR+"mining+policy"+OR+"mining+permit"+OR+"mining+ban")+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'ESG in Mining', url: rss('https://news.google.com/rss/search?q=("mining+ESG"+OR+"responsible+mining"+OR+"mine+closure"+OR+"tailings")+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Trade & Tariffs', url: rss('https://news.google.com/rss/search?q=("mineral+tariff"+OR+"metals+tariff"+OR+"critical+mineral+policy"+OR+"mining+export+ban")+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Indonesia Nickel Policy', url: rss('https://news.google.com/rss/search?q=(Indonesia+nickel+OR+"nickel+export"+OR+"nickel+ban"+OR+"nickel+processing")+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'China Mineral Policy', url: rss('https://news.google.com/rss/search?q=(China+"rare+earth"+OR+"mineral+export"+OR+"critical+mineral")+policy+OR+restriction+when:7d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| markets: [ |
| { name: 'Yahoo Finance Commodities', url: rss('https://finance.yahoo.com/rss/topstories') }, |
| { name: 'CNBC Markets', url: rss('https://www.cnbc.com/id/100003114/device/rss/rss.html') }, |
| { name: 'Seeking Alpha Metals', url: rss('https://news.google.com/rss/search?q=site:seekingalpha.com+(gold+OR+silver+OR+copper+OR+mining)+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Commodity Futures', url: rss('https://news.google.com/rss/search?q=(COMEX+OR+NYMEX+OR+"commodity+futures"+OR+CME+commodities)+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| finance: [ |
| { name: 'CNBC', url: rss('https://www.cnbc.com/id/100003114/device/rss/rss.html') }, |
| { name: 'MarketWatch', url: rss('https://news.google.com/rss/search?q=site:marketwatch.com+markets+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Yahoo Finance', url: rss('https://finance.yahoo.com/news/rssindex') }, |
| { name: 'Financial Times', url: rss('https://www.ft.com/rss/home') }, |
| { name: 'Reuters Business', url: rss('https://news.google.com/rss/search?q=site:reuters.com+business+markets&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| }; |
|
|
| |
| |
| |
| |
| const ENERGY_FEEDS: Record<string, Feed[]> = { |
| 'live-news': [ |
| { name: 'OilPrice.com', url: rss('https://oilprice.com/rss/main') }, |
| { name: 'Rigzone', url: rss('https://www.rigzone.com/news/rss/rigzone_latest.aspx') }, |
| { name: 'Reuters Energy', url: rss('https://news.google.com/rss/search?q=site:reuters.com+(oil+OR+gas+OR+energy+OR+OPEC+OR+pipeline+OR+LNG)+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Bloomberg Energy', url: rss('https://news.google.com/rss/search?q=site:bloomberg.com+(oil+OR+gas+OR+energy+OR+pipeline+OR+LNG)+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'FT Energy', url: rss('https://news.google.com/rss/search?q=site:ft.com+(oil+OR+gas+OR+energy+OR+LNG+OR+OPEC)+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'IEA News', url: rss('https://news.google.com/rss/search?q=site:iea.org+(oil+OR+gas+OR+energy)+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'S&P Global Platts', url: rss('https://news.google.com/rss/search?q=site:spglobal.com+(oil+OR+gas+OR+LNG+OR+pipeline)+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| energy: [ |
| { name: 'OilPrice.com', url: rss('https://oilprice.com/rss/main') }, |
| { name: 'Rigzone', url: rss('https://www.rigzone.com/news/rss/rigzone_latest.aspx') }, |
| { name: 'EIA Press Room', url: rss('https://www.eia.gov/rss/press_room.xml') }, |
| { name: 'OPEC & Crude', url: rss('https://news.google.com/rss/search?q=(OPEC+OR+"oil+price"+OR+"crude+oil"+OR+WTI+OR+Brent+OR+"oil+production"+OR+"oil+inventory")+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Natural Gas & LNG', url: rss('https://news.google.com/rss/search?q=("natural+gas"+OR+LNG+OR+"gas+price"+OR+"Henry+Hub"+OR+TTF+OR+JKM+OR+"LNG+cargo")+when:1d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Pipelines & Chokepoints', url: rss('https://news.google.com/rss/search?q=(pipeline+OR+Druzhba+OR+"Nord+Stream"+OR+TurkStream+OR+"Strait+of+Hormuz"+OR+"Bab+el-Mandeb"+OR+"Suez+Canal"+OR+"Power+of+Siberia")+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Energy Crisis & Shortages', url: rss('https://news.google.com/rss/search?q=("fuel+shortage"+OR+"gas+shortage"+OR+"diesel+shortage"+OR+"jet+fuel+shortage"+OR+"energy+crisis"+OR+rationing+OR+"petrol+shortage")+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Refinery & Disruptions', url: rss('https://news.google.com/rss/search?q=(refinery+OR+"refinery+outage"+OR+"force+majeure"+OR+"pipeline+sabotage"+OR+"pipeline+attack")+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Energy Intel', url: rss('https://news.google.com/rss/search?q=(energy+commodities+OR+"energy+market"+OR+"energy+prices"+OR+"energy+security")+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| 'supply-chain': [ |
| { name: 'Tanker & Shipping', url: rss('https://news.google.com/rss/search?q=(tanker+OR+VLCC+OR+Suezmax+OR+Aframax+OR+"oil+shipping"+OR+"LNG+carrier"+OR+"shadow+fleet")+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Strategic Chokepoints', url: rss('https://news.google.com/rss/search?q=("Strait+of+Hormuz"+OR+"Strait+of+Malacca"+OR+"Bab+el-Mandeb"+OR+"Suez+Canal"+OR+"Panama+Canal"+OR+"Turkish+Straits"+OR+"Danish+Straits")+when:2d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Energy Sanctions', url: rss('https://news.google.com/rss/search?q=("oil+sanctions"+OR+"gas+sanctions"+OR+"price+cap"+OR+"energy+embargo"+OR+"LNG+sanctions")+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| { name: 'Port & Terminal', url: rss('https://news.google.com/rss/search?q=("LNG+terminal"+OR+"crude+terminal"+OR+"oil+port"+OR+"Ras+Laffan"+OR+"Sabine+Pass"+OR+"Rotterdam+oil")+when:3d&hl=en-US&gl=US&ceid=US:en') }, |
| ], |
| }; |
|
|
| |
| export const FEEDS = SITE_VARIANT === 'tech' |
| ? TECH_FEEDS |
| : SITE_VARIANT === 'finance' |
| ? FINANCE_FEEDS |
| : SITE_VARIANT === 'happy' |
| ? HAPPY_FEEDS |
| : SITE_VARIANT === 'commodity' |
| ? COMMODITY_FEEDS |
| : SITE_VARIANT === 'energy' |
| ? ENERGY_FEEDS |
| : FULL_FEEDS; |
|
|
| |
| |
| |
| |
| |
| |
| |
| export const CANONICAL_FEEDS: Record<string, Feed[]> = mergeCanonicalFeeds([ |
| FULL_FEEDS, |
| TECH_FEEDS, |
| FINANCE_FEEDS, |
| COMMODITY_FEEDS, |
| ENERGY_FEEDS, |
| HAPPY_FEEDS, |
| ]); |
|
|
| export const SOURCE_REGION_MAP: Record<string, { labelKey: string; feedKeys: string[] }> = { |
| |
| worldwide: { labelKey: 'header.sourceRegionWorldwide', feedKeys: ['politics', 'crisis'] }, |
| us: { labelKey: 'header.sourceRegionUS', feedKeys: ['us', 'gov'] }, |
| europe: { labelKey: 'header.sourceRegionEurope', feedKeys: ['europe'] }, |
| middleeast: { labelKey: 'header.sourceRegionMiddleEast', feedKeys: ['middleeast'] }, |
| africa: { labelKey: 'header.sourceRegionAfrica', feedKeys: ['africa'] }, |
| latam: { labelKey: 'header.sourceRegionLatAm', feedKeys: ['latam'] }, |
| asia: { labelKey: 'header.sourceRegionAsiaPacific', feedKeys: ['asia'] }, |
| topical: { labelKey: 'header.sourceRegionTopical', feedKeys: ['energy', 'tech', 'ai', 'finance', 'layoffs', 'thinktanks'] }, |
| intel: { labelKey: 'header.sourceRegionIntel', feedKeys: [] }, |
|
|
| |
| techNews: { labelKey: 'header.sourceRegionTechNews', feedKeys: ['tech', 'hardware'] }, |
| aiMl: { labelKey: 'header.sourceRegionAiMl', feedKeys: ['ai'] }, |
| startupsVc: { labelKey: 'header.sourceRegionStartupsVc', feedKeys: ['startups', 'vcblogs', 'funding', 'unicorns', 'accelerators', 'ipo'] }, |
| regionalTech: { labelKey: 'header.sourceRegionRegionalTech', feedKeys: ['regionalStartups'] }, |
| developer: { labelKey: 'header.sourceRegionDeveloper', feedKeys: ['github', 'cloud', 'dev', 'producthunt', 'outages'] }, |
| cybersecurity: { labelKey: 'header.sourceRegionCybersecurity', feedKeys: ['security'] }, |
| techPolicy: { labelKey: 'header.sourceRegionTechPolicy', feedKeys: ['policy', 'thinktanks'] }, |
| techMedia: { labelKey: 'header.sourceRegionTechMedia', feedKeys: ['podcasts', 'layoffs', 'finance'] }, |
|
|
| |
| marketsAnalysis: { labelKey: 'header.sourceRegionMarkets', feedKeys: ['markets', 'analysis', 'ipo'] }, |
| fixedIncomeFx: { labelKey: 'header.sourceRegionFixedIncomeFx', feedKeys: ['forex', 'bonds'] }, |
| commoditiesRegion: { labelKey: 'header.sourceRegionCommodities', feedKeys: ['commodities'] }, |
| cryptoDigital: { labelKey: 'header.sourceRegionCryptoDigital', feedKeys: ['crypto', 'fintech'] }, |
| centralBanksEcon: { labelKey: 'header.sourceRegionCentralBanks', feedKeys: ['centralbanks', 'economic'] }, |
| dealsCorpFin: { labelKey: 'header.sourceRegionDeals', feedKeys: ['institutional', 'derivatives'] }, |
| finRegulation: { labelKey: 'header.sourceRegionFinRegulation', feedKeys: ['fin-regulation'] }, |
| gulfMena: { labelKey: 'header.sourceRegionGulfMena', feedKeys: ['gccNews'] }, |
| }; |
|
|
| export const INTEL_SOURCES: Feed[] = [ |
| |
| { name: 'Defense One', url: rss('https://www.defenseone.com/rss/all/'), type: 'defense' }, |
| { name: 'The War Zone', url: rss('https://www.twz.com/feed'), type: 'defense' }, |
| { name: 'Defense News', url: rss('https://www.defensenews.com/arc/outboundfeeds/rss/?outputType=xml'), type: 'defense' }, |
| { name: 'Janes', url: rss('https://news.google.com/rss/search?q=site:janes.com+when:3d&hl=en-US&gl=US&ceid=US:en'), type: 'defense' }, |
| { name: 'Military Times', url: rss('https://www.militarytimes.com/arc/outboundfeeds/rss/?outputType=xml'), type: 'defense' }, |
| { name: 'Task & Purpose', url: rss('https://taskandpurpose.com/feed/'), type: 'defense' }, |
| { name: 'USNI News', url: rss('https://news.google.com/rss/search?q=site:news.usni.org+when:3d&hl=en-US&gl=US&ceid=US:en'), type: 'defense' }, |
| { name: 'gCaptain', url: rss('https://gcaptain.com/feed/'), type: 'defense' }, |
| { name: 'Oryx OSINT', url: rss('https://www.oryxspioenkop.com/feeds/posts/default?alt=rss'), type: 'defense' }, |
| |
| |
| |
| |
| |
| |
| |
| |
| { name: 'Breaking Defense', url: rss('https://breakingdefense.com/feed/'), type: 'defense' }, |
| { name: 'UK MOD', url: rss('https://www.gov.uk/government/organisations/ministry-of-defence.atom'), type: 'defense' }, |
| { name: 'CSIS', url: rss('https://news.google.com/rss/search?q=site:csis.org&hl=en&gl=US&ceid=US:en'), type: 'defense' }, |
|
|
| |
| { name: 'Chatham House', url: rss('https://news.google.com/rss/search?q=site:chathamhouse.org+when:7d&hl=en-US&gl=US&ceid=US:en'), type: 'intl' }, |
| { name: 'ECFR', url: rss('https://news.google.com/rss/search?q=site:ecfr.eu+when:7d&hl=en-US&gl=US&ceid=US:en'), type: 'intl' }, |
| { name: 'Foreign Policy', url: rss('https://foreignpolicy.com/feed/'), type: 'intl' }, |
| { name: 'Foreign Affairs', url: rss('https://www.foreignaffairs.com/rss.xml'), type: 'intl' }, |
| { name: 'Atlantic Council', url: railwayRss('https://www.atlanticcouncil.org/feed/'), type: 'intl' }, |
| { name: 'Middle East Institute', url: rss('https://news.google.com/rss/search?q=site:mei.edu+when:7d&hl=en-US&gl=US&ceid=US:en'), type: 'intl' }, |
|
|
| |
| { name: 'RAND', url: rss('https://www.rand.org/pubs/articles.xml'), type: 'research' }, |
| { name: 'Brookings', url: rss('https://news.google.com/rss/search?q=site:brookings.edu&hl=en&gl=US&ceid=US:en'), type: 'research' }, |
| { name: 'Carnegie', url: rss('https://news.google.com/rss/search?q=site:carnegieendowment.org&hl=en&gl=US&ceid=US:en'), type: 'research' }, |
| { name: 'FAS', url: rss('https://news.google.com/rss/search?q=site:fas.org+nuclear+weapons+security&hl=en&gl=US&ceid=US:en'), type: 'research' }, |
| { name: 'NTI', url: rss('https://news.google.com/rss/search?q=site:nti.org+when:30d&hl=en-US&gl=US&ceid=US:en'), type: 'research' }, |
| { name: 'RUSI', url: rss('https://news.google.com/rss/search?q=site:rusi.org+when:7d&hl=en-US&gl=US&ceid=US:en'), type: 'research' }, |
| { name: 'Wilson Center', url: rss('https://news.google.com/rss/search?q=site:wilsoncenter.org+when:7d&hl=en-US&gl=US&ceid=US:en'), type: 'research' }, |
| { name: 'GMF', url: rss('https://news.google.com/rss/search?q=site:gmfus.org+when:7d&hl=en-US&gl=US&ceid=US:en'), type: 'research' }, |
| { name: 'Stimson Center', url: rss('https://www.stimson.org/feed/'), type: 'research' }, |
| { name: 'CNAS', url: rss('https://news.google.com/rss/search?q=site:cnas.org+when:7d&hl=en-US&gl=US&ceid=US:en'), type: 'research' }, |
| { name: 'Lowy Institute', url: rss('https://news.google.com/rss/search?q=site:lowyinstitute.org+when:7d&hl=en-US&gl=US&ceid=US:en'), type: 'research' }, |
|
|
| |
| { name: 'Arms Control Assn', url: rss('https://news.google.com/rss/search?q=site:armscontrol.org+when:7d&hl=en-US&gl=US&ceid=US:en'), type: 'nuclear' }, |
| { name: 'Bulletin of Atomic Scientists', url: rss('https://news.google.com/rss/search?q=site:thebulletin.org+when:7d&hl=en-US&gl=US&ceid=US:en'), type: 'nuclear' }, |
|
|
| |
| { name: 'Bellingcat', url: rss('https://news.google.com/rss/search?q=site:bellingcat.com+when:30d&hl=en-US&gl=US&ceid=US:en'), type: 'osint' }, |
| { name: 'Krebs Security', url: rss('https://krebsonsecurity.com/feed/'), type: 'cyber' }, |
| { name: 'Ransomware.live', url: rss('https://www.ransomware.live/rss.xml'), type: 'cyber' }, |
|
|
| |
| { name: 'FAO News', url: rss('https://www.fao.org/feeds/fao-newsroom-rss'), type: 'economic' }, |
| { name: 'FAO GIEWS', url: rss('https://news.google.com/rss/search?q=site:fao.org+GIEWS+food+security+when:30d&hl=en-US&gl=US&ceid=US:en'), type: 'economic' }, |
|
|
| |
| |
| { name: 'OCCRP', url: rss('https://www.occrp.org/en/feed'), type: 'investigative' }, |
| |
| { name: 'DFRLab', url: rss('https://dfrlab.org/feed/'), type: 'investigative' }, |
| |
| { name: 'Lighthouse Reports', url: rss('https://www.lighthousereports.com/feed/'), type: 'investigative' }, |
| |
| { name: 'The Sentry', url: rss('https://thesentry.org/feed/'), type: 'investigative' }, |
| |
| { name: 'GITOC', url: rss('https://globalinitiative.net/feed/'), type: 'investigative' }, |
| |
| { name: 'VSquare', url: rss('https://vsquare.org/feed/'), type: 'investigative' }, |
| |
| { name: 'Correctiv', url: rss('https://correctiv.org/feed/'), type: 'investigative' }, |
|
|
| { name: 'EU ISS', url: rss('https://news.google.com/rss/search?q=site:iss.europa.eu+when:7d&hl=en-US&gl=US&ceid=US:en'), type: 'intl' }, |
| ]; |
|
|
| |
| export function listConfiguredFeedNames(): string[] { |
| const names = new Set<string>(); |
| for (const feeds of Object.values(CANONICAL_FEEDS)) { |
| for (const feed of feeds) names.add(feed.name); |
| } |
| for (const feed of INTEL_SOURCES) names.add(feed.name); |
| return [...names].sort((a, b) => a.localeCompare(b)); |
| } |
|
|
| |
| |
| |
| |
| |
| export function getFeedProvenanceState(sourceName: string): SourceProvenanceState { |
| return getSourceProvenanceState(sourceName); |
| } |
|
|
| |
| export const DEFAULT_ENABLED_SOURCES: Record<string, string[]> = { |
| politics: ['BBC World', 'Guardian World', 'AP News', 'Reuters World', 'CNN World'], |
| us: ['Reuters US', 'NPR News', 'PBS NewsHour', 'ABC News', 'CBS News', 'NBC News', 'Wall Street Journal', 'Politico', 'The Hill'], |
| europe: ['France 24', 'EuroNews', 'Le Monde', 'DW News', 'Tagesschau', 'ANSA', 'NOS Nieuws', 'SVT Nyheter', 'Balkan Insight'], |
| middleeast: ['BBC Middle East', 'Al Jazeera', 'Al Arabiya', 'Guardian ME', 'BBC Persian', 'Iran International', 'IRNA', 'Mehr News', 'Haaretz', 'Jerusalem Post', 'Ynetnews', 'Asharq News', 'The National'], |
| africa: ['BBC Africa', 'News24', 'Africanews', 'Jeune Afrique', 'Africa News', 'Premium Times', 'Channels TV', 'Sahel Crisis'], |
| latam: ['BBC Latin America', 'Reuters LatAm', 'InSight Crime', 'Mexico News Daily', 'Clarín', 'Primicias', 'Infobae Americas', 'El Universo'], |
| asia: ['BBC Asia', 'The Diplomat', 'South China Morning Post', 'Reuters Asia', 'Nikkei Asia', 'CNA', 'Asia News', 'The Hindu'], |
| tech: ['Hacker News', 'Ars Technica', 'The Verge', 'MIT Tech Review'], |
| ai: ['AI News', 'VentureBeat AI', 'The Verge AI', 'MIT Tech Review', 'ArXiv AI'], |
| finance: ['CNBC', 'MarketWatch', 'Yahoo Finance', 'Financial Times', 'Reuters Business'], |
| gov: ['White House', 'State Dept', 'Pentagon', 'UN News', 'CISA', 'Treasury', 'DOJ', 'CDC'], |
| layoffs: ['Layoffs.fyi', 'TechCrunch Layoffs', 'Layoffs News'], |
| thinktanks: ['Foreign Policy', 'Atlantic Council', 'Foreign Affairs', 'CSIS', 'RAND', 'Brookings', 'Carnegie', 'War on the Rocks'], |
| crisis: ['CrisisWatch', 'IAEA', 'WHO', 'UNHCR'], |
| energy: ['Oil & Gas', 'Nuclear Energy', 'Reuters Energy', 'Mining & Resources'], |
| }; |
|
|
| export const DEFAULT_ENABLED_INTEL: string[] = [ |
| 'Defense One', 'Breaking Defense', 'The War Zone', 'Defense News', |
| 'Military Times', 'USNI News', 'Bellingcat', 'Krebs Security', |
| ]; |
|
|
| export function getAllDefaultEnabledSources(): Set<string> { |
| const s = new Set<string>(); |
| for (const names of Object.values(DEFAULT_ENABLED_SOURCES)) names.forEach(n => s.add(n)); |
| DEFAULT_ENABLED_INTEL.forEach(n => s.add(n)); |
| return s; |
| } |
|
|
| |
| export function getLocaleBoostedSources(locale: string): Set<string> { |
| const lang = (locale.split('-')[0] ?? 'en').toLowerCase(); |
| const boosted = new Set<string>(); |
| if (lang === 'en') return boosted; |
| const allFeeds = [...Object.values(FULL_FEEDS).flat(), ...INTEL_SOURCES]; |
| for (const f of allFeeds) { |
| if (f.lang === lang) boosted.add(f.name); |
| if (typeof f.url === 'object' && lang in f.url) boosted.add(f.name); |
| } |
| return boosted; |
| } |
|
|
| export function computeDefaultDisabledSources(locale?: string): string[] { |
| const enabled = getAllDefaultEnabledSources(); |
| if (locale) { |
| for (const name of getLocaleBoostedSources(locale)) enabled.add(name); |
| } |
| const all = new Set<string>(); |
| for (const feeds of Object.values(FULL_FEEDS)) for (const f of feeds) all.add(f.name); |
| for (const f of INTEL_SOURCES) all.add(f.name); |
| return [...all].filter(name => !enabled.has(name)); |
| } |
|
|
| export function getTotalFeedCount(): number { |
| const all = new Set<string>(); |
| for (const feeds of Object.values(FULL_FEEDS)) for (const f of feeds) all.add(f.name); |
| for (const f of INTEL_SOURCES) all.add(f.name); |
| return all.size; |
| } |
|
|
| if (import.meta.env.DEV) { |
| const allFeedNames = new Set<string>(); |
| for (const feeds of Object.values(FULL_FEEDS)) for (const f of feeds) allFeedNames.add(f.name); |
| for (const f of INTEL_SOURCES) allFeedNames.add(f.name); |
| const defaultEnabled = getAllDefaultEnabledSources(); |
| for (const name of defaultEnabled) { |
| if (!allFeedNames.has(name)) console.error(`[feeds] DEFAULT_ENABLED name "${name}" not found in FULL_FEEDS!`); |
| } |
| console.log(`[feeds] ${defaultEnabled.size} unique default-enabled sources / ${allFeedNames.size} total`); |
| } |
|
|
| |
| export const ALERT_KEYWORDS = [ |
| 'war', 'invasion', 'military', 'nuclear', 'sanctions', 'missile', |
| 'airstrike', 'drone strike', 'troops deployed', 'armed conflict', 'bombing', 'casualties', |
| 'ceasefire', 'peace treaty', 'nato', 'coup', 'martial law', |
| 'assassination', 'terrorist', 'terror attack', 'cyber attack', 'hostage', 'evacuation order', |
| ]; |
|
|
| |
| export const ALERT_EXCLUSIONS = [ |
| 'protein', 'couples', 'relationship', 'dating', 'diet', 'fitness', |
| 'recipe', 'cooking', 'shopping', 'fashion', 'celebrity', 'movie', |
| 'tv show', 'sports', 'game', 'concert', 'festival', 'wedding', |
| 'vacation', 'travel tips', 'life hack', 'self-care', 'wellness', |
| ]; |
|
|