diff --git a/data/sources.json b/data/sources.json index 94127acf..ec45ff2f 100644 --- a/data/sources.json +++ b/data/sources.json @@ -33,7 +33,7 @@ "region": "eu", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "No RSS endpoint consistently published; using the News Release listing and relying on keyword filtering.", + "comment": "Canonical Frontex news-release archive page.", "refreshEveryHours": 1 }, { @@ -98,13 +98,13 @@ { "id": "ecfr-feeds-index", "provider": "ECFR - Feeds", - "endpoint": "https://ecfr.eu/feeds/", - "kind": "html", + "endpoint": "https://ecfr.eu/feed/", + "kind": "rss", "lane": "context", "region": "eu", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "ECFR feed index page for European foreign-policy and security research feed discovery." + "comment": "ECFR main RSS feed endpoint." }, { "id": "enisa-news", @@ -119,15 +119,15 @@ "refreshEveryHours": 1 }, { - "id": "enisa-rss-transition-page", - "provider": "ENISA - RSS Feeds Transition Notice", - "endpoint": "https://www.enisa.europa.eu/rss-feeds-discontinued-new-subscription-mechanism-coming-soon", - "kind": "html", + "id": "cert-eu-security-advisories-rss", + "provider": "CERT-EU - Security Advisories (RSS)", + "endpoint": "https://cert.europa.eu/publications/security-advisories-rss", + "kind": "rss", "lane": "context", "region": "eu", "isTrustedOfficial": true, - "requiresKeywordMatch": false, - "comment": "ENISA notice page documenting RSS feed changes and subscription transition.", + "requiresKeywordMatch": true, + "comment": "Active CERT-EU security advisories RSS replacing ENISA RSS-discontinued notice page.", "refreshEveryHours": 1 }, { @@ -155,13 +155,13 @@ { "id": "eurojust-press-news-html", "provider": "Eurojust - Press Releases and News", - "endpoint": "https://www.eurojust.europa.eu/media-and-events/press-releases-and-news", - "kind": "html", + "endpoint": "https://www.eurojust.europa.eu/rss/press-releases.xml", + "kind": "rss", "lane": "context", "region": "eu", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Eurojust press and news page for prosecutions, judicial cooperation and terrorism-case updates.", + "comment": "Official Eurojust press releases/news RSS feed.", "refreshEveryHours": 1 }, { @@ -179,13 +179,13 @@ { "id": "europol-media-press", "provider": "Europol a Media and Press", - "endpoint": "https://www.europol.europa.eu/media-press", - "kind": "html", + "endpoint": "https://www.europol.europa.eu/cms/api/rss/news", + "kind": "rss", "lane": "context", "region": "eu", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Europol media and press releases page; no dedicated RSS endpoint, using the listing page with keyword filtering.", + "comment": "Official Europol newsroom RSS feed.", "refreshEveryHours": 1 }, { @@ -203,25 +203,25 @@ { "id": "europol-newsroom-html", "provider": "Europol - Newsroom", - "endpoint": "https://www.europol.europa.eu/media-press/newsroom", - "kind": "html", + "endpoint": "https://www.europol.europa.eu/rss.xml", + "kind": "rss", "lane": "context", "region": "eu", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Europol newsroom page variant for press releases, operational updates and EU policing statements.", + "comment": "Alternative Europol RSS feed to avoid JS-heavy newsroom pages.", "refreshEveryHours": 1 }, { "id": "finland-supo-news", "provider": "Finnish Security Intelligence Service - News", - "endpoint": "https://supo.fi/en/current-issues", - "kind": "html", + "endpoint": "https://supo.fi/en/news-and-press-releases/-/asset_publisher/LVkvGHGkmM3J/rss", + "kind": "rss", "lane": "context", "region": "eu", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Finnish Supo updates on terrorism, extremism and hostile-state security concerns.", + "comment": "Official Finnish Security and Intelligence Service RSS feed.", "refreshEveryHours": 1 }, { @@ -285,26 +285,26 @@ }, { "id": "spain-interior-ministry-news", - "provider": "Spanish Ministry of the Interior - Press", - "endpoint": "https://www.interior.gob.es/opencms/en/prensa/", + "provider": "Spanish Ministry of the Interior - News", + "endpoint": "https://www.interior.gob.es/opencms/en/prensa/noticias/", "kind": "html", "lane": "context", "region": "eu", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Spanish Interior Ministry press releases covering terrorism arrests, border security and national policing operations.", + "comment": "Direct Spanish Interior Ministry news listing page.", "refreshEveryHours": 1 }, { "id": "statewatch-news", "provider": "Statewatch - News", - "endpoint": "https://www.statewatch.org/news/", - "kind": "html", + "endpoint": "https://www.statewatch.org/news/rssfeed", + "kind": "rss", "lane": "context", "region": "eu", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Statewatch news page for civil-liberties, policing, borders and counter-terror policy scrutiny." + "comment": "Direct Statewatch news RSS feed." }, { "id": "sweden-sapo-news", @@ -344,6 +344,267 @@ "reliabilityProfile": "major_media", "comment": "Ireland Independent RSS feed." }, + { + "id": "de-bfv-islamist-extremism", + "provider": "BfV - Islamist Extremism and Terrorism", + "endpoint": "https://www.verfassungsschutz.de/EN/topics/islamist-extremism-and-islamist-terrorism/islamist-extremism-and-islamist-terrorism_node.html", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "BfV thematic page for Islamist extremism and terrorism threat context in Germany.", + "refreshEveryHours": 1 + }, + { + "id": "de-bayern-stmi-press-rss", + "provider": "Bavarian Interior Ministry - Press RSS", + "endpoint": "https://www.stmi.bayern.de/news/rss/pressemitteilungen?type=9818", + "kind": "rss", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Bavarian Interior Ministry RSS for security-policy and operational interior updates.", + "refreshEveryHours": 1 + }, + { + "id": "de-bmj-press-rss", + "provider": "German Federal Ministry of Justice - RSS", + "endpoint": "https://www.bmj.de/DE/presse/newsletter/rssnewsfeed/rss_node.html", + "kind": "rss", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "BMJ RSS feed for legal and criminal-justice changes relevant to terrorism prosecutions.", + "refreshEveryHours": 1 + }, + { + "id": "de-bdk-bka-rss", + "provider": "Bund Deutscher Kriminalbeamter - BKA RSS", + "endpoint": "https://www.bdk.de/rss/bundeskriminalamt/RSS", + "kind": "rss", + "lane": "context", + "region": "eu", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "BDK BKA-focused feed for secondary investigative-policy and capability context." + }, + { + "id": "me-ministry-defence", + "provider": "Montenegro Ministry of Defence", + "endpoint": "https://www.gov.me/en/mod", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Defence ministry page for security posture, NATO and defence-sector context.", + "refreshEveryHours": 1 + }, + { + "id": "me-osce-montenegro-security", + "provider": "OSCE Mission to Montenegro", + "endpoint": "https://montenegro.osce.org/mission-to-montenegro/what-we-do", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "OSCE mission work page covering security-sector reform, small arms and justice context.", + "refreshEveryHours": 1 + }, + { + "id": "me-moneyval-aml-cft", + "provider": "Council of Europe MONEYVAL", + "endpoint": "https://www.coe.int/en/web/moneyval", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "MONEYVAL page for AML/CFT and terrorist-financing compliance context.", + "refreshEveryHours": 1 + }, + { + "id": "sk-minv-press", + "provider": "Slovak Ministry of Interior - Press", + "endpoint": "https://www.minv.sk/?tlacove-spravy-2=", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Official Slovak interior ministry press listing for police, migration, border and security updates.", + "refreshEveryHours": 1 + }, + { + "id": "sk-sis-news", + "provider": "Slovak Information Service - News", + "endpoint": "https://www.sis.gov.sk/news/news.html", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "SIS intelligence service news page for high-authority Slovak security context.", + "refreshEveryHours": 1 + }, + { + "id": "sk-sis-annual-report", + "provider": "Slovak Information Service - Annual Report", + "endpoint": "https://www.sis.gov.sk/for-you/sis-annual-report.html", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "SIS annual report page for terrorism, extremism, organised-crime and hybrid-threat background context.", + "refreshEveryHours": 1 + }, + { + "id": "sk-general-prosecutor-news", + "provider": "Slovak General Prosecutor - News", + "endpoint": "https://www.genpro.gov.sk/informacie/spravy/", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "General Prosecutor news for Slovak prosecution and cross-border criminal-justice developments.", + "refreshEveryHours": 1 + }, + { + "id": "sk-justice-press", + "provider": "Slovak Ministry of Justice - Press", + "endpoint": "https://www.justice.gov.sk/tlacovespravy/", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Justice ministry press archive for court, criminal-law and terrorism-victim support context.", + "refreshEveryHours": 1 + }, + { + "id": "sk-defence-press", + "provider": "Slovak Ministry of Defence - Press", + "endpoint": "https://www.mosr.sk/tlacove-spravy/", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Defence ministry releases for Slovak military posture, NATO activity and security-sector context.", + "refreshEveryHours": 1 + }, + { + "id": "sk-mfa-all-news", + "provider": "Slovak Foreign Ministry - All News", + "endpoint": "https://www.mzv.sk/en/web/en/what-is-new/all-news", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Foreign ministry all-news page for crisis, sanctions and diplomatic-security updates.", + "refreshEveryHours": 1 + }, + { + "id": "sk-csirt", + "provider": "Government CSIRT Slovakia", + "endpoint": "https://www.csirt.gov.sk/", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Government CSIRT site for Slovak cyber incident and vulnerability-warning context.", + "refreshEveryHours": 1 + }, + { + "id": "sk-iom-press-rss", + "provider": "IOM Slovakia - Press RSS", + "endpoint": "https://iom.sk/en/press-room/press-releases-articles?format=feed&type=rss", + "kind": "rss", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "IOM Slovakia RSS for migration, trafficking, return and integration context updates.", + "refreshEveryHours": 1 + }, + { + "id": "sk-aktuality-krimi-rss", + "provider": "Aktuality.sk - Krimi", + "endpoint": "https://www.aktuality.sk/rss/krimi/", + "kind": "rss", + "lane": "context", + "region": "eu", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Slovak crime RSS feed used as civilian trigger context for public-safety and organised-crime reporting." + }, + { + "id": "sk-teraz-slovensko-rss", + "provider": "Teraz.sk - Slovensko", + "endpoint": "https://www.teraz.sk/rss/slovensko.rss", + "kind": "rss", + "lane": "context", + "region": "eu", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Slovensko channel RSS used as broad Slovakia trigger feed under strict keyword gating." + }, + { + "id": "germany-federal-prosecutor-current-press-en", + "provider": "German Federal Public Prosecutor - Current Press Releases (EN)", + "endpoint": "https://www.generalbundesanwalt.de/EN/Press/current_press_releases/current_press_releases_node.html", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Official German federal prosecutor English press releases covering terrorism and national-security prosecutions.", + "refreshEveryHours": 1 + }, + { + "id": "netherlands-om-terrorisme", + "provider": "Dutch Public Prosecution Service - Terrorisme", + "endpoint": "https://www.om.nl/onderwerpen/terrorisme", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Dutch prosecution service terrorism topic page for arrests, charges and court actions linked to terrorism cases.", + "refreshEveryHours": 1 + }, + { + "id": "netherlands-om-terrorismefinanciering-nieuws", + "provider": "Dutch Public Prosecution Service - Terrorismefinanciering Nieuws", + "endpoint": "https://www.om.nl/onderwerpen/terrorismefinanciering/nieuws", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Dutch prosecution updates focused on terrorism-financing investigations and prosecutions.", + "refreshEveryHours": 1 + }, + { + "id": "guardia-civil-rss-list", + "provider": "Guardia Civil - RSS List", + "endpoint": "https://web.guardiacivil.es/va/tramites/rss_list/", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Spanish Guardia Civil RSS index page for official feed discovery on law-enforcement and security operations.", + "refreshEveryHours": 1 + }, { "id": "belgian-federal-police-news", "provider": "Belgian Federal Police - News", @@ -395,13 +656,13 @@ { "id": "finland-police-news", "provider": "Finnish Police - News", - "endpoint": "https://poliisi.fi/en/news", - "kind": "html", + "endpoint": "https://poliisi.fi/en/national-bureau-of-investigation/-/asset_publisher/ZtAEeHB39Lxr/rss", + "kind": "rss", "lane": "incidents", "region": "eu", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Finnish Police updates on major incidents, terror-related investigations and national policing operations.", + "comment": "Finnish NBI RSS feed for serious crime and CT-relevant police updates.", "refreshEveryHours": 1 }, { @@ -501,98 +762,326 @@ "refreshEveryHours": 1 }, { - "id": "curia-press-rss-en", - "provider": "Court of Justice of the European Union - RSS (EN/FR)", - "endpoint": "https://curia.europa.eu/site/rss.jsp?lang=en&secondLang=fr", - "kind": "rss", - "lane": "oversight", + "id": "de-bka-press", + "provider": "BKA Germany - Press Releases", + "endpoint": "https://www.bka.de/DE/Presse/Listenseite_Pressemitteilungen/listenseite_Pressemitteilungen_node.html", + "kind": "html", + "lane": "incidents", "region": "eu", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Official CURIA RSS feed for CJEU announcements and case-related updates in English and French.", + "comment": "BKA national press-release listing for federal investigations, arrests and PMK-related operations.", "refreshEveryHours": 1 }, { - "id": "eppo-news-node-7", - "provider": "European Public Prosecutor's Office - News (RSS)", - "endpoint": "https://www.eppo.europa.eu/en/news.xml", - "kind": "rss", - "lane": "oversight", + "id": "de-bka-current-alerts", + "provider": "BKA Germany - Current Notices", + "endpoint": "https://www.bka.de/DE/AktuelleInformationen/AktuelleMeldungen/aktuelleMeldungen_node.html", + "kind": "html", + "lane": "incidents", "region": "eu", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Official EPPO RSS feed for investigations, warnings and institutional announcements.", + "comment": "BKA current notices for warnings, wanted bulletins and official federal security updates.", "refreshEveryHours": 1 }, { - "id": "eu-cellar-rss-atom", - "provider": "Publications Office of the European Union (CELLAR) a RSS/Atom Feeds", - "endpoint": "https://op.europa.eu/en/web/cellar/cellar-data/rss-and-atom-feeds", + "id": "de-bundespolizei-presseportal", + "provider": "Bundespolizei via Presseportal", + "endpoint": "https://www.presseportal.de/blaulicht/d/bundespolizei", "kind": "html", - "lane": "oversight", + "lane": "incidents", "region": "eu", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Feed directory for EU Publications Office notifications; specific RSS/Atom endpoints are configured per the documentation.", + "comment": "Bundespolizei operational releases covering border, rail, airport and cross-border incidents.", "refreshEveryHours": 1 }, { - "id": "eu-commission-counter-terrorism-measures-2026", - "provider": "European Commission - Counter Terrorism Measures 2026", - "endpoint": "https://commission.europa.eu/news-and-media/news/commission-proposes-new-measures-prevent-and-counter-terrorism-2026-02-26_en", + "id": "de-zoll-press", + "provider": "German Customs (Zoll) - Press", + "endpoint": "https://www.zoll.de/DE/Presse/presse_node.html", "kind": "html", - "lane": "oversight", + "lane": "incidents", "region": "eu", "isTrustedOfficial": true, - "requiresKeywordMatch": false, - "comment": "Specific European Commission announcement on new EU measures to prevent and counter terrorism.", + "requiresKeywordMatch": true, + "comment": "Zoll press page for sanctions, smuggling, trafficking and financial-crime enforcement updates.", "refreshEveryHours": 1 }, { - "id": "eu-commission-home-affairs-topic", - "provider": "European Commission - Home Affairs News", - "endpoint": "https://home-affairs.ec.europa.eu/news_en", - "kind": "html", - "lane": "oversight", + "id": "de-zoll-press-rss", + "provider": "German Customs (Zoll) - Press RSS", + "endpoint": "https://www.zoll.de/SiteGlobals/Functions/RSSFeed/DE/RSSNewsfeed/RSSPressemitteilungen.xml?nn=280690", + "kind": "rss", + "lane": "incidents", "region": "eu", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Migration and Home Affairs news page used as the best active source for dated policy and security updates.", + "comment": "Cron-friendly Zoll RSS feed for customs enforcement and sanctions-related press releases.", "refreshEveryHours": 1 }, { - "id": "eu-commission-presscorner-home", - "provider": "Council of the EU - Press Releases (RSS)", - "endpoint": "https://www.consilium.europa.eu/en/rss/pressreleases.ashx?source=eu-commission-presscorner-home", + "id": "de-berlin-police-rss", + "provider": "Berlin Police - Press RSS", + "endpoint": "https://www.berlin.de/polizei/polizeimeldungen/index.php/rss", "kind": "rss", - "lane": "oversight", + "lane": "incidents", "region": "eu", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Best-effort replacement using the active Council of the EU press-releases RSS feed.", + "comment": "Berlin police incident RSS feed for urban public-safety and state-protection reporting.", "refreshEveryHours": 1 }, { - "id": "eu-council-fight-against-terrorism", - "provider": "Council of the EU - Fight Against Terrorism", - "endpoint": "https://www.consilium.europa.eu/en/policies/fight-against-terrorism/", - "kind": "html", - "lane": "oversight", + "id": "de-brandenburg-police-overregional-rss", + "provider": "Brandenburg Police - Overregional RSS", + "endpoint": "https://polizei.brandenburg.de/pressemeldungen/rss/region/57581", + "kind": "rss", + "lane": "incidents", "region": "eu", "isTrustedOfficial": true, - "requiresKeywordMatch": false, - "comment": "Council of the EU policy page covering the EU fight against terrorism.", + "requiresKeywordMatch": true, + "comment": "Brandenburg police overregional RSS feed for Berlin-adjacent incident and alert context.", "refreshEveryHours": 1 }, { - "id": "eu-council-jha-meetings", - "provider": "Council of the EU - JHA Press Releases", - "endpoint": "https://www.consilium.europa.eu/en/press/press-releases/?cc%5B%5D=24", - "kind": "html", - "lane": "oversight", + "id": "de-sachsen-police-rss", + "provider": "Saxony Police - RSS", + "endpoint": "https://www.polizei.sachsen.de/de/presse_rss_pdl.xml", + "kind": "rss", + "lane": "incidents", "region": "eu", "isTrustedOfficial": true, - "requiresKeywordMatch": false, + "requiresKeywordMatch": true, + "comment": "Saxony police RSS for regional incidents, extremist violence and operational policing updates.", + "refreshEveryHours": 1 + }, + { + "id": "de-sachsen-generalstaatsanwaltschaft", + "provider": "General Prosecutor Dresden - Press 2026", + "endpoint": "https://www.justiz.sachsen.de/gensta/pressemitteilungen-2026-4747.html", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "General Prosecutor Dresden 2026 press page for prosecution updates in extremist and terrorism cases.", + "refreshEveryHours": 1 + }, + { + "id": "de-sachsen-zesa-archive", + "provider": "General Prosecutor Dresden - Press 2025 Archive", + "endpoint": "https://www.justiz.sachsen.de/gensta/pressemitteilungen-2025-4611.html", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "General Prosecutor Dresden 2025 archive for historical extremist and terrorism case coverage.", + "refreshEveryHours": 1 + }, + { + "id": "de-bayern-police-press", + "provider": "Bavarian Police - Press Releases", + "endpoint": "https://www.polizei.bayern.de/aktuelles/pressemitteilungen/index.html", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Bavarian police press listing for statewide operational and public-safety incidents.", + "refreshEveryHours": 1 + }, + { + "id": "me-police-administration", + "provider": "Montenegro Police Directorate", + "endpoint": "https://www.gov.me/mup/policija", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Official Montenegro police page for operations, border/security updates and incident signals.", + "refreshEveryHours": 1 + }, + { + "id": "me-ministry-interior", + "provider": "Montenegro Ministry of the Interior", + "endpoint": "https://www.gov.me/en/mup", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Interior ministry page for internal-security policy and ministry news/press surfaces.", + "refreshEveryHours": 1 + }, + { + "id": "me-govme-all-news", + "provider": "Government of Montenegro - News", + "endpoint": "https://www.gov.me/en/news?at=1&sort=published_at", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Government-wide Montenegro news stream for cross-ministry security announcements.", + "refreshEveryHours": 1 + }, + { + "id": "me-national-security-agency", + "provider": "Montenegro National Security Agency", + "endpoint": "https://www.gov.me/en/national-security-agency", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "National Security Agency page for low-volume, high-value domestic-security updates.", + "refreshEveryHours": 1 + }, + { + "id": "me-national-security-authority", + "provider": "Montenegro National Security Authority", + "endpoint": "https://www.gov.me/en/dztp", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "National Security Authority page for security architecture and official announcements.", + "refreshEveryHours": 1 + }, + { + "id": "me-customs-administration", + "provider": "Montenegro Customs Administration", + "endpoint": "https://www.gov.me/upravacarina", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Customs page for seizures, smuggling, sanctions and border-enforcement updates.", + "refreshEveryHours": 1 + }, + { + "id": "me-vijesti-black-chronicle", + "provider": "Vijesti - Black Chronicle", + "endpoint": "https://en.vijesti.me/news-b/black-chronicle", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "English black-chronicle section for civilian trigger reporting on crime/security incidents.", + "refreshEveryHours": 1 + }, + { + "id": "me-rtcg-hronika", + "provider": "RTCG - Hronika", + "endpoint": "https://rtcg.me/hronika/", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Montenegro public broadcaster chronicle page for arrest, weapons and public-safety incident reporting.", + "refreshEveryHours": 1 + }, + { + "id": "curia-press-rss-en", + "provider": "Court of Justice of the European Union - RSS (EN/FR)", + "endpoint": "https://curia.europa.eu/site/rss.jsp?lang=en&secondLang=fr", + "kind": "rss", + "lane": "oversight", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Official CURIA RSS feed for CJEU announcements and case-related updates in English and French.", + "refreshEveryHours": 1 + }, + { + "id": "eppo-news-node-7", + "provider": "European Public Prosecutor's Office - News (RSS)", + "endpoint": "https://www.eppo.europa.eu/en/news.xml", + "kind": "rss", + "lane": "oversight", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Official EPPO RSS feed for investigations, warnings and institutional announcements.", + "refreshEveryHours": 1 + }, + { + "id": "eu-cellar-rss-atom", + "provider": "Publications Office of the European Union (CELLAR) a RSS/Atom Feeds", + "endpoint": "https://op.europa.eu/en/web/cellar/cellar-data/rss-and-atom-feeds", + "kind": "html", + "lane": "oversight", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Feed directory for EU Publications Office notifications; specific RSS/Atom endpoints are configured per the documentation.", + "refreshEveryHours": 1 + }, + { + "id": "eu-commission-counter-terrorism-measures-2026", + "provider": "European Commission - Counter Terrorism Measures 2026", + "endpoint": "https://commission.europa.eu/news-and-media/news/commission-proposes-new-measures-prevent-and-counter-terrorism-2026-02-26_en", + "kind": "html", + "lane": "oversight", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": false, + "comment": "Specific European Commission announcement on new EU measures to prevent and counter terrorism.", + "refreshEveryHours": 1 + }, + { + "id": "eu-commission-home-affairs-topic", + "provider": "European Commission - Home Affairs News", + "endpoint": "https://home-affairs.ec.europa.eu/news_en", + "kind": "html", + "lane": "oversight", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Migration and Home Affairs news page used as the best active source for dated policy and security updates.", + "refreshEveryHours": 1 + }, + { + "id": "eu-commission-presscorner-home", + "provider": "Council of the EU - Press Releases (RSS)", + "endpoint": "https://www.consilium.europa.eu/en/rss/pressreleases.ashx?source=eu-commission-presscorner-home", + "kind": "rss", + "lane": "oversight", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Best-effort replacement using the active Council of the EU press-releases RSS feed.", + "refreshEveryHours": 1 + }, + { + "id": "eu-council-fight-against-terrorism", + "provider": "Council of the EU - Fight Against Terrorism", + "endpoint": "https://www.consilium.europa.eu/en/policies/fight-against-terrorism/", + "kind": "html", + "lane": "oversight", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": false, + "comment": "Council of the EU policy page covering the EU fight against terrorism.", + "refreshEveryHours": 1 + }, + { + "id": "eu-council-jha-meetings", + "provider": "Council of the EU - JHA Press Releases", + "endpoint": "https://www.consilium.europa.eu/en/press/press-releases/?cc%5B%5D=24", + "kind": "html", + "lane": "oversight", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": false, "comment": "Closest viable JHA-specific replacement: filtered Council press releases page for justice and home affairs outcomes.", "refreshEveryHours": 1 }, @@ -681,14 +1170,14 @@ }, { "id": "eu-fra-rss", - "provider": "EU Agency for Fundamental Rights (FRA) a RSS", - "endpoint": "https://fra.europa.eu/en/content/rss", + "provider": "OHCHR - Terrorism and Violent Extremism", + "endpoint": "https://www.ohchr.org/en/topic/terrorism-and-violent-extremism", "kind": "html", "lane": "oversight", "region": "eu", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "FRA provides RSS options from this page; using the RSS landing page when direct feed URLs vary by topic.", + "comment": "Replacement for FRA anti-bot RSS endpoint using OHCHR's terrorism and violent extremism topic page.", "refreshEveryHours": 1 }, { @@ -821,14 +1310,14 @@ }, { "id": "fra-rss", - "provider": "Human Rights Watch - News RSS", - "endpoint": "https://www.hrw.org/rss/news", - "kind": "rss", + "provider": "Human Rights Watch - Terrorism and Counterterrorism", + "endpoint": "https://www.hrw.org/topic/terrorism-counterterrorism", + "kind": "html", "lane": "oversight", "region": "eu", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Next-best replacement for blocked FRA feed using HRW's active human-rights news RSS." + "comment": "Direct HRW terrorism and counterterrorism topic page for focused rights oversight." }, { "id": "europol-eu-iru", @@ -865,6 +1354,39 @@ "comment": "Official Dutch NCSC news RSS replacement for the previously failing endpoint.", "refreshEveryHours": 1 }, + { + "id": "de-cemas-digital-seismograph", + "provider": "CeMAS - Digital Seismograph", + "endpoint": "https://cemas.io/en/projects/digital-seismograph/", + "kind": "html", + "lane": "prevention", + "region": "eu", + "isTrustedOfficial": false, + "requiresKeywordMatch": false, + "comment": "CeMAS monitoring project for early warning on right-wing extremist and terrorist activity online." + }, + { + "id": "de-cemas-right-terror-database", + "provider": "CeMAS - Right-Wing Terrorism Database", + "endpoint": "https://report.cemas.io/terror/de/analysis", + "kind": "html", + "lane": "prevention", + "region": "eu", + "isTrustedOfficial": false, + "requiresKeywordMatch": false, + "comment": "CeMAS analysis database of right-wing terrorism in Germany for trend and case enrichment." + }, + { + "id": "de-knix-islamism-prevention", + "provider": "KN:IX - Islamism Prevention Network", + "endpoint": "https://kn-ix.de/", + "kind": "html", + "lane": "prevention", + "region": "eu", + "isTrustedOfficial": false, + "requiresKeywordMatch": false, + "comment": "KN:IX prevention network for Islamism, deradicalisation and practitioner prevention context." + }, { "id": "eu-council-terrorism-sanctions", "provider": "Council of the EU - Sanctions Against Terrorism", @@ -914,13 +1436,13 @@ { "id": "ecfr-publications", "provider": "European Council on Foreign Relations (ECFR) a Publications", - "endpoint": "https://ecfr.eu/publications/", - "kind": "html", + "endpoint": "https://ecfr.eu/feed/?post_type=publication", + "kind": "rss", "lane": "context", "region": "europe", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "ECFR research and commentary on European security, terrorism, and foreign policy used as specialist context." + "comment": "Direct ECFR publications feed." }, { "id": "euronews-europe", @@ -935,14 +1457,14 @@ }, { "id": "financial-times-world", - "provider": "Financial Times a World", - "endpoint": "https://www.ft.com/world", + "provider": "AP News - Terrorism", + "endpoint": "https://apnews.com/hub/terrorism", "kind": "html", "lane": "context", "region": "europe", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Financial Times world coverage used as corroborating context rather than a trigger feed." + "comment": "Replacement for subscription-heavy FT world page using AP's open terrorism hub." }, { "id": "france24-europe-rss", @@ -1016,13 +1538,13 @@ { "id": "politico-europe", "provider": "Politico Europe", - "endpoint": "https://www.politico.eu/", - "kind": "html", + "endpoint": "https://www.politico.eu/feed/", + "kind": "rss", "lane": "context", "region": "europe", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Politico Europe used as corroborating political-security context rather than live trigger input." + "comment": "Politico Europe RSS feed for context coverage." }, { "id": "rte-ireland-news-rss", @@ -1150,7 +1672,7 @@ "region": "europe", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Best-effort replacement for inaccessible PSP news using Portugal-focused crime reporting.", + "comment": "Portugal crime section retained as a live and scrapeable contextual source.", "refreshEveryHours": 1 }, { @@ -1239,14 +1761,14 @@ }, { "id": "isd-global", - "provider": "Institute for Strategic Dialogue (ISD) a Articles & Reports", - "endpoint": "https://www.isdglobal.org/", + "provider": "Institute for Strategic Dialogue (ISD) - Publications", + "endpoint": "https://www.isdglobal.org/publications/", "kind": "html", "lane": "prevention", "region": "europe", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "No stable RSS endpoint across sections; using the homepage and relying on keyword filtering." + "comment": "ISD publications page retained for formal extremism and online-threat reports." }, { "id": "ocam-be-english", @@ -1287,13 +1809,13 @@ { "id": "ran-network", "provider": "RUSI - Terrorism and Conflict", - "endpoint": "https://www.rusi.org/explore-our-research/research-groups/terrorism-and-conflict?source=ran-network", + "endpoint": "https://www.rusi.org/explore-our-research/research-groups/terrorism-and-conflict", "kind": "html", "lane": "prevention", "region": "europe", "isTrustedOfficial": false, "requiresKeywordMatch": false, - "comment": "Best-effort replacement for unavailable RAN network source using RUSI terrorism and conflict analysis." + "comment": "RUSI terrorism and conflict research-group page with stale query parameter removed." }, { "id": "sapo-se-english", @@ -1334,13 +1856,13 @@ { "id": "acled-updates", "provider": "ACLED a Updates and Analysis", - "endpoint": "https://acleddata.com/", + "endpoint": "https://acleddata.com/global-analysis", "kind": "html", "lane": "context", "region": "international", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "ACLED provides conflict event reporting and analysis; RSS varies by section, so the main site is used with keyword filtering." + "comment": "Focused ACLED global analysis page; official RSS is not consistently available." }, { "id": "aljazeera-news-rss", @@ -1528,6 +2050,17 @@ "requiresKeywordMatch": false, "comment": "Long War Journal RSS feed tracking militant ecosystem developments including al-Qaeda, Islamic State, Taliban, and affiliated groups." }, + { + "id": "jamestown-terrorism-monitor", + "provider": "Jamestown Foundation - Terrorism Monitor", + "endpoint": "https://jamestown.org/publications/tm/feed/", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Jamestown Terrorism Monitor feed for analysis of militant movements and security trends." + }, { "id": "nato-news-rss", "provider": "NATO a News (RSS)", @@ -1598,35 +2131,35 @@ { "id": "soufan-center-intelbrief", "provider": "The Soufan Center a IntelBrief", - "endpoint": "https://thesoufancenter.org/category/intelbrief/", - "kind": "html", + "endpoint": "https://thesoufancenter.org/category/intelbrief/feed/", + "kind": "rss", "lane": "context", "region": "international", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "No official RSS link advertised; using the IntelBrief category page and relying on keyword filtering." + "comment": "WordPress category RSS feed for Soufan IntelBrief." }, { "id": "tech-against-terrorism-podcast", "provider": "Tech Against Terrorism - Podcast", - "endpoint": "https://podcast.techagainstterrorism.org/", - "kind": "html", + "endpoint": "https://feeds.buzzsprout.com/1684819.rss", + "kind": "rss", "lane": "context", "region": "international", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Tech Against Terrorism podcast site for interviews and analysis on extremist content and digital threat response." + "comment": "Official Tech Against Terrorism podcast RSS feed." }, { "id": "tony-blair-institute-news", "provider": "Tony Blair Institute for Global Change a Publications", - "endpoint": "https://institute.global/insights", + "endpoint": "https://institute.global/insights/geopolitics-and-security", "kind": "html", "lane": "context", "region": "international", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "TBI publications on counter-extremism, technology and political violence used for strategic context." + "comment": "Focused TBI geopolitics and security page for relevant context." }, { "id": "unodc-news", @@ -1652,1579 +2185,2674 @@ "comment": "War on the Rocks publishes analysis on national security, military affairs and counter-terrorism; keyword filtering applied." }, { - "id": "gctf-news", - "provider": "Global Counterterrorism Forum (GCTF) a News", - "endpoint": "https://www.thegctf.org/News-Stories/PgrID/918/PageID/3", - "kind": "html", - "lane": "oversight", + "id": "usgs-earthquakes-all-hour", + "provider": "USGS - Earthquakes (All Hour)", + "endpoint": "https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_hour.atom", + "kind": "rss", + "lane": "context", "region": "international", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "No RSS endpoint published; using the official news page and relying on keyword filtering.", + "comment": "USGS near-real-time earthquake alerts used as global disruption tripwire context.", "refreshEveryHours": 1 }, { - "id": "unoct-news", - "provider": "UN Office of Counter-Terrorism (UNOCT) - News", - "endpoint": "https://www.un.org/counterterrorism/en/news-articles", - "kind": "html", - "lane": "oversight", + "id": "krebs-on-security", + "provider": "Krebs on Security", + "endpoint": "https://krebsonsecurity.com/feed/", + "kind": "rss", + "lane": "context", "region": "international", - "isTrustedOfficial": true, - "requiresKeywordMatch": false, - "comment": "UNOCT news/articles page used as the current official listing for Counter-Terrorism updates.", - "refreshEveryHours": 1 + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Cyber incident reporting feed for infrastructure and disruption-relevant threat context." }, { - "id": "unsc-counter-terrorism-committee", - "provider": "UN Security Council - Counter-Terrorism Committee (CTC) Updates", - "endpoint": "https://www.un.org/securitycouncil/ctc/news", - "kind": "html", - "lane": "oversight", + "id": "sans-isc-diary", + "provider": "SANS Internet Storm Center", + "endpoint": "https://isc.sans.edu/rssfeed.xml", + "kind": "rss", + "lane": "context", "region": "international", - "isTrustedOfficial": true, + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "No consistent RSS endpoint; using the CTC news page and relying on keyword filtering.", - "refreshEveryHours": 1 + "comment": "SANS ISC feed for emerging cyber threat activity and defensive incident signals." }, { - "id": "gnet-artificial-intelligence-rss", - "provider": "Global Network on Extremism & Technology (GNET) a Artificial Intelligence (RSS)", - "endpoint": "https://gnet-research.org/tag/artificial-intelligence/feed/", + "id": "aviation-herald-rss", + "provider": "The Aviation Herald", + "endpoint": "https://avherald.com/rss.php", "kind": "rss", - "lane": "prevention", + "lane": "context", "region": "international", "isTrustedOfficial": false, - "requiresKeywordMatch": false + "requiresKeywordMatch": true, + "comment": "Aviation incident feed for diversions, emergency landings, and disruption early warning." }, { - "id": "gnet-radicalisation-rss", - "provider": "Global Network on Extremism & Technology (GNET) a Radicalisation (RSS)", - "endpoint": "https://gnet-research.org/tag/radicalisation/feed/", + "id": "broadcastify-feeds-rss", + "provider": "Broadcastify - Feeds", + "endpoint": "https://www.broadcastify.com/feeds/rss/", "kind": "rss", - "lane": "prevention", + "lane": "context", "region": "international", "isTrustedOfficial": false, - "requiresKeywordMatch": false + "requiresKeywordMatch": true, + "comment": "Public scanner-feed index RSS used as responder-chatter proxy context." }, { - "id": "gnet-youth-rss", - "provider": "Global Network on Extremism & Technology (GNET) a Youth (RSS)", - "endpoint": "https://gnet-research.org/tag/youth/feed/", + "id": "maritime-executive-rss", + "provider": "The Maritime Executive", + "endpoint": "https://www.maritime-executive.com/rss", "kind": "rss", - "lane": "prevention", + "lane": "context", "region": "international", "isTrustedOfficial": false, - "requiresKeywordMatch": false + "requiresKeywordMatch": true, + "comment": "Maritime incidents and shipping-security feed for ports and vessel disruption context." }, { - "id": "tech-against-terrorism", - "provider": "Tech Against Terrorism a Blog", - "endpoint": "https://techagainstterrorism.org/", - "kind": "html", - "lane": "prevention", + "id": "above-top-secret-rss", + "provider": "AboveTopSecret Forum", + "endpoint": "https://www.abovetopsecret.com/forum/rss.xml", + "kind": "rss", + "lane": "context", "region": "international", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "No stable RSS endpoint advertised; using the primary site/blog surface and relying on keyword filtering." + "comment": "Conspiracy-forum chatter feed used only as low-confidence topic-spike context." }, { - "id": "tech-against-terrorism-home", - "provider": "Tech Against Terrorism - Home", - "endpoint": "https://techagainstterrorism.org/home", - "kind": "html", - "lane": "prevention", + "id": "godlike-productions-rss", + "provider": "Godlike Productions", + "endpoint": "https://www.godlikeproductions.com/external.php?type=RSS2", + "kind": "rss", + "lane": "context", "region": "international", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Tech Against Terrorism homepage variant for platform safety, extremist content and online prevention context." + "comment": "High-noise conspiracy forum feed retained only as weak early chatter context." }, { - "id": "fatf-news", - "provider": "Financial Action Task Force (FATF) a News", - "endpoint": "https://www.fatf-gafi.org/en/publications.html", - "kind": "html", - "lane": "sanctions", + "id": "hacker-news-rss", + "provider": "Hacker News", + "endpoint": "https://news.ycombinator.com/rss", + "kind": "rss", + "lane": "context", "region": "international", - "isTrustedOfficial": true, + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "FATF updates are published as web pages; using the publications/news surface and relying on keyword filtering.", - "refreshEveryHours": 1 - }, - { - "id": "interpol-notices", - "provider": "INTERPOL a Notices", - "endpoint": "https://www.interpol.int/How-we-work/Notices", - "kind": "html", - "lane": "sanctions", - "region": "international", - "isTrustedOfficial": true, - "requiresKeywordMatch": false, - "comment": "INTERPOL Notices page covering Red, Orange, and other notice types relevant to terrorism and serious crime.", - "refreshEveryHours": 1 - }, - { - "id": "unsc-1267-press-releases", - "provider": "UN Security Council - ISIL/Da'esh & Al-Qaeda Sanctions Committee Press Releases", - "endpoint": "https://main.un.org/securitycouncil/en/sanctions/1267/press-releases", - "kind": "html", - "lane": "sanctions", - "region": "international", - "isTrustedOfficial": true, - "requiresKeywordMatch": false, - "comment": "UN sanctions committee press releases are presented as an HTML list; using the official listing page.", - "refreshEveryHours": 1 + "comment": "Tech community feed for infrastructure and cyber disruption early signals." }, { - "id": "unsc-consolidated-list", - "provider": "UN Security Council - Consolidated Sanctions List Updates (RSS)", - "endpoint": "https://main.un.org/securitycouncil/en/rss-updates-unsc-consolidated-list", + "id": "lobsters-rss", + "provider": "Lobsters", + "endpoint": "https://lobste.rs/rss", "kind": "rss", - "lane": "sanctions", + "lane": "context", "region": "international", - "isTrustedOfficial": true, - "requiresKeywordMatch": false, - "comment": "Official UNSC RSS feed for updates to the consolidated sanctions list covering all UN sanctions regimes.", - "refreshEveryHours": 1 + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Niche engineering/security forum feed for low-volume technical disruption chatter." }, { - "id": "barking-dagenham-council-news", - "provider": "Barking and Dagenham Council a News", - "endpoint": "https://www.lbbd.gov.uk/news", - "kind": "html", + "id": "zerohedge-feed", + "provider": "ZeroHedge", + "endpoint": "https://feeds.feedburner.com/zerohedge/feed", + "kind": "rss", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Barking and Dagenham borough news used for East London incident corroboration and civic response.", - "refreshEveryHours": 1 + "comment": "Market-panic and geopolitical commentary feed used only as corroborative context." }, { - "id": "barnet-council-news", - "provider": "Barnet Post", - "endpoint": "https://barnetpost.co.uk/", - "kind": "html", + "id": "moon-of-alabama-atom", + "provider": "Moon of Alabama", + "endpoint": "https://www.moonofalabama.org/atom.xml", + "kind": "rss", "lane": "context", - "region": "london", + "region": "international", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Best-effort replacement for council feed using Barnet Post local reporting." + "comment": "Opinionated geopolitical analysis feed tracked as low-confidence narrative context." }, { - "id": "barts-health-news", - "provider": "Barts Health NHS Trust a News", - "endpoint": "https://www.bartshealth.nhs.uk/news", - "kind": "html", + "id": "volcano-discovery-rss", + "provider": "Volcano Discovery", + "endpoint": "https://www.volcanodiscovery.com/rss.html", + "kind": "rss", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Barts Health updates used for East London hospital and emergency-response corroboration.", - "refreshEveryHours": 1 + "comment": "Volcanic activity feed for natural-disruption anomaly context and corroboration." }, { - "id": "bbc-news-london-rss", - "provider": "BBC News - London RSS", - "endpoint": "https://feeds.bbci.co.uk/news/england/london/rss.xml", + "id": "sans-isc-full", + "provider": "SANS Internet Storm Center (Full Feed)", + "endpoint": "https://isc.sans.edu/rssfeed_full.xml", "kind": "rss", "lane": "context", - "region": "london", + "region": "international", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "BBC London RSS feed for London incidents and corroborating public reporting." + "comment": "Full ISC feed for higher-volume cyber anomaly and defensive intelligence context." }, { - "id": "bexley-council-news", - "provider": "Bexley Council a News", - "endpoint": "https://www.bexley.gov.uk/news", + "id": "ec-police-news", + "provider": "Policía Nacional del Ecuador - Noticias", + "endpoint": "https://noticias.policia.gob.ec/", "kind": "html", "lane": "context", - "region": "london", + "region": "international", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Bexley borough news used for South-East outer London context and civic response.", + "comment": "Official Ecuador police news stream for operational incidents including drugs, firearms, extortion and organised-crime actions.", "refreshEveryHours": 1 }, { - "id": "brent-council-news", - "provider": "Brent Council a News", - "endpoint": "https://www.brent.gov.uk/news", + "id": "ec-police-organised-crime", + "provider": "Policía Nacional del Ecuador - Lucha contra el crimen organizado", + "endpoint": "https://noticias.policia.gob.ec/categor%C3%ADas/lucha-contra-el-crimen-organizado/", "kind": "html", "lane": "context", - "region": "london", + "region": "international", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Brent borough news used for Wembley-area and borough-level incident context.", + "comment": "Focused Ecuador police category page for organised-crime operations, seizures and group-linked actions.", "refreshEveryHours": 1 }, { - "id": "bromley-council-news", - "provider": "Bromley Council a Newsroom", - "endpoint": "https://www.bromley.gov.uk/news", + "id": "ec-fiscalia-news", + "provider": "Fiscalía General del Estado - Noticias", + "endpoint": "https://www.fiscalia.gob.ec/", "kind": "html", "lane": "context", - "region": "london", + "region": "international", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Replaced Bromley newsroom HTML with RSS endpoint.", + "comment": "Ecuador prosecutor portal for confirmed case and prosecution updates tied to organised crime and security offenses.", "refreshEveryHours": 1 }, { - "id": "camden-council-news", - "provider": "Camden Council a News", - "endpoint": "https://news.camden.gov.uk/", + "id": "ec-ministry-interior-open-data", + "provider": "Ecuador Open Data - Ministerio del Interior", + "endpoint": "https://datosabiertos.presidencia.gob.ec/dataset/?organization=ministerio-del-interior", "kind": "html", "lane": "context", - "region": "london", + "region": "international", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Camden newsroom used for borough-level London corroboration around stations, crowds, and civic response.", + "comment": "Ministry of Interior open-data listing for homicide and public-security datasets used for quantitative context.", "refreshEveryHours": 1 }, { - "id": "chelsea-westminster-news", - "provider": "Chelsea and Westminster Hospital NHS Foundation Trust a News", - "endpoint": "https://www.chelwest.nhs.uk/about-us/news", + "id": "ec-uafe-aml-cft", + "provider": "UAFE Ecuador", + "endpoint": "https://www.uafe.gob.ec/", "kind": "html", "lane": "context", - "region": "london", + "region": "international", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Chelsea and Westminster news used for West and central London hospital corroboration.", + "comment": "Ecuador FIU portal for AML/CFT, illicit-finance and risk-assessment context related to organised-crime financing.", "refreshEveryHours": 1 }, { - "id": "city-of-london-police-fraud-reporting", - "provider": "City of London Police - Fraud Reporting", - "endpoint": "https://www.cityoflondon.police.uk/ro/report/fo/v1/fraud/", + "id": "ec-aduana-senae", + "provider": "Aduana del Ecuador (SENAE)", + "endpoint": "https://www.aduana.gob.ec/", "kind": "html", "lane": "context", - "region": "london", + "region": "international", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "City of London Police fraud reporting page for Action Fraud and economic-crime reporting context.", + "comment": "Customs authority portal for border, port, contraband and interdiction context relevant to weapons and narcotics flows.", "refreshEveryHours": 1 }, { - "id": "cnwl-news", - "provider": "Central and North West London NHS Foundation Trust a News", - "endpoint": "https://www.cnwl.nhs.uk/news", + "id": "ec-ecu911-news", + "provider": "ECU 911", + "endpoint": "https://www.ecu911.gob.ec/", "kind": "html", "lane": "context", - "region": "london", + "region": "international", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "CNWL news used for London community-health, mental-health, and emergency-system context.", + "comment": "National emergency-coordination service updates for large response events and public-safety coordination context.", "refreshEveryHours": 1 }, { - "id": "croydon-council-news", - "provider": "Croydon Council a News", - "endpoint": "https://news.croydon.gov.uk/category/recent-news/", + "id": "ec-cancilleria-security", + "provider": "Cancillería del Ecuador", + "endpoint": "https://www.cancilleria.gob.ec/", "kind": "html", "lane": "context", - "region": "london", + "region": "international", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Croydon recent-news listing used for a cleaner borough news index and London corroboration.", + "comment": "Foreign ministry news for diplomatic-security, international cooperation and transnational-crime framing context.", "refreshEveryHours": 1 }, { - "id": "ealing-council-news", - "provider": "Ealing Council a News", - "endpoint": "https://www.ealing.gov.uk/news", + "id": "ec-primicias-seguridad", + "provider": "Primicias - Seguridad", + "endpoint": "https://www.primicias.ec/seguridad", "kind": "html", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Ealing borough news used for West London corroboration and public-safety context.", - "refreshEveryHours": 1 + "comment": "Ecuador security-news vertical for rapid local coverage of gangs, prisons and organised-crime incidents." }, { - "id": "east-london-nhs-news", - "provider": "East London NHS Foundation Trust a News", - "endpoint": "https://www.elft.nhs.uk/news", + "id": "ec-planv-crimen-organizado", + "provider": "Plan V - Crimen Organizado", + "endpoint": "https://planv.com.ec/historias/crimen-organizado/", "kind": "html", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "ELFT updates used for East London mental-health, community safety, and response context.", - "refreshEveryHours": 1 + "comment": "Investigative Ecuador organised-crime coverage for contextual enrichment around criminal governance and violence patterns." }, { - "id": "enfield-council-news", - "provider": "Enfield Council a News and Events", - "endpoint": "https://www.enfield.gov.uk/news-and-events", - "kind": "html", + "id": "ec-eluniverso-rss", + "provider": "El Universo - RSS", + "endpoint": "https://www.eluniverso.com/rss/", + "kind": "rss", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Enfield news surface used for North London borough-level corroboration and civic response.", - "refreshEveryHours": 1 + "comment": "El Universo RSS index for broad Ecuador media trigger coverage under strict keyword filtering." }, { - "id": "gosh-news", - "provider": "Great Ormond Street Hospital a News", - "endpoint": "https://www.gosh.nhs.uk/news/", + "id": "ec-ap-latin-america", + "provider": "Associated Press - Latin America", + "endpoint": "https://apnews.com/hub/latin-america", "kind": "html", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Great Ormond Street news used for central London hospital and child-health emergency context.", - "refreshEveryHours": 1 + "comment": "AP Latin America hub for regional incident corroboration and cross-border context affecting Ecuador." }, { - "id": "guys-st-thomas-news", - "provider": "Guy's and St Thomas' NHS Foundation Trust a News", - "endpoint": "https://www.guysandstthomas.nhs.uk/news", + "id": "ec-aljazeera-ecuador-gangs", + "provider": "Al Jazeera - Ecuador gangs analysis", + "endpoint": "https://www.aljazeera.com/news/2024/2/14/no-clear-way-out-how-ecuador-descended-into-gang-violence", "kind": "html", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Guy's and St Thomas' news used for central London hospital response and public-safety context.", - "refreshEveryHours": 1 + "comment": "Reference explainer on Ecuador gang violence used for narrative and background context enrichment." }, { - "id": "hackney-council-news", - "provider": "Hackney Council a News", - "endpoint": "https://news.hackney.gov.uk/", + "id": "ec-guardian-ecuador", + "provider": "The Guardian - Ecuador", + "endpoint": "https://www.theguardian.com/world/ecuador", "kind": "html", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Hackney newsroom used for borough emergency-response and public-safety context in East London.", - "refreshEveryHours": 1 + "comment": "Guardian Ecuador topic page for international media corroboration and ongoing country security context." }, { - "id": "hammersmith-fulham-news", - "provider": "Hammersmith and Fulham Council a News", - "endpoint": "https://www.lbhf.gov.uk/news", + "id": "ec-cfr-ecuador-narco-state", + "provider": "Council on Foreign Relations - Ecuador", + "endpoint": "https://www.cfr.org/articles/can-ecuador-avoid-becoming-narco-state", "kind": "html", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Hammersmith and Fulham news used for West London corroboration and civic-safety context.", - "refreshEveryHours": 1 + "comment": "CFR analysis page providing strategic context on Ecuador narco-state risk narratives." }, { - "id": "haringey-council-news", - "provider": "Haringey Community Press", - "endpoint": "https://haringeycommunitypress.co.uk/", + "id": "ec-wola-ecuador-bukele-model", + "provider": "WOLA - Ecuador security analysis", + "endpoint": "https://www.wola.org/analysis/why-ecuador-should-not-replicate-the-bukele-model/", "kind": "html", "lane": "context", - "region": "london", + "region": "international", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Best-effort replacement for unavailable Haringey council feed using local Haringey community news." + "comment": "Policy analysis on Ecuador security model choices used as non-operational context." }, { - "id": "harrow-council-news", - "provider": "Harrow Council a News", - "endpoint": "https://www.harrow.gov.uk/news", + "id": "ec-fcdo-ecuador-safety-security", + "provider": "UK FCDO - Ecuador travel advice", + "endpoint": "https://www.gov.uk/foreign-travel-advice/ecuador/safety-and-security", "kind": "html", "lane": "context", - "region": "london", + "region": "international", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Harrow borough news used for outer-North-West London incident corroboration.", + "comment": "Official UK travel safety guidance for Ecuador used as government security-posture context.", "refreshEveryHours": 1 }, { - "id": "havering-council-news", - "provider": "Havering Council a News", - "endpoint": "https://www.havering.gov.uk/news", + "id": "ec-nctc-los-lobos", + "provider": "US NCTC - Los Lobos", + "endpoint": "https://www.dni.gov/nctc/terrorist_groups/los_lobos.html", "kind": "html", "lane": "context", - "region": "london", + "region": "international", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Havering borough news used for East outer London public-safety corroboration.", + "comment": "US intelligence profile page for Los Lobos used for actor-level context and designation framing.", "refreshEveryHours": 1 }, { - "id": "heathrow-media-centre", - "provider": "Heathrow a Media Centre", - "endpoint": "https://mediacentre.heathrow.com/", + "id": "ec-us-treasury-los-lobos", + "provider": "US Treasury - Los Lobos sanctions", + "endpoint": "https://home.treasury.gov/news/press-releases/jy2394", "kind": "html", "lane": "context", - "region": "london", + "region": "international", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Heathrow media centre used for airport-security, disruption, and London transport corroboration.", + "comment": "US Treasury sanctions press release for Los Lobos financial and designation context.", "refreshEveryHours": 1 }, { - "id": "hillingdon-council-news", - "provider": "Hillingdon Council a News", - "endpoint": "https://pre.hillingdon.gov.uk/news", + "id": "ec-us-treasury-los-choneros", + "provider": "US Treasury - Los Choneros sanctions", + "endpoint": "https://home.treasury.gov/news/press-releases/jy2082", "kind": "html", "lane": "context", - "region": "london", + "region": "international", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Hillingdon canonical news target used for Heathrow corridor and West London local context.", + "comment": "US Treasury sanctions press release for Los Choneros used for organised-crime finance context.", "refreshEveryHours": 1 }, { - "id": "homerton-healthcare-news", - "provider": "Homerton Healthcare NHS Foundation Trust a News", - "endpoint": "https://www.homerton.nhs.uk/trust-news/", - "kind": "html", - "lane": "context", - "region": "london", - "isTrustedOfficial": true, - "requiresKeywordMatch": true, - "comment": "Homerton Healthcare news used for East London hospital and emergency-response context.", - "refreshEveryHours": 1 - }, - { - "id": "hounslow-council-news", - "provider": "Hounslow Council a News", - "endpoint": "https://www.hounslow.gov.uk/news", - "kind": "html", - "lane": "context", - "region": "london", - "isTrustedOfficial": true, - "requiresKeywordMatch": true, - "comment": "Hounslow borough news used for Heathrow-adjacent and West London local context.", - "refreshEveryHours": 1 - }, - { - "id": "imperial-healthcare-news", - "provider": "Imperial College Healthcare NHS Trust a News", - "endpoint": "https://www.imperial.nhs.uk/about-us/news", + "id": "ec-csis-ecuador-crises", + "provider": "CSIS - Ecuador compounding crises", + "endpoint": "https://www.csis.org/analysis/eye-storm-ecuadors-compounding-crises", "kind": "html", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Imperial College Healthcare news used for West London hospital and major-incident context.", - "refreshEveryHours": 1 + "comment": "CSIS strategic analysis page used for macro security context on Ecuador risk evolution." }, { - "id": "islington-council-news", - "provider": "Islington Council a News", - "endpoint": "https://www.islington.media/news/", - "kind": "html", + "id": "jamestown-foundation-feed", + "provider": "Jamestown Foundation - Main Feed", + "endpoint": "https://jamestown.org/feed/", + "kind": "rss", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Islington direct news listing used for local London emergency and community-safety corroboration.", - "refreshEveryHours": 1 + "comment": "Jamestown Foundation primary feed for geopolitical, conflict and security analysis beyond terrorism-only coverage." }, { - "id": "kensington-chelsea-newsroom", - "provider": "Royal Borough of Kensington and Chelsea a Newsroom", - "endpoint": "https://www.rbkc.gov.uk/newsroom", - "kind": "html", + "id": "kyle-orton-blog-feed", + "provider": "Kyle Orton's Blog", + "endpoint": "https://kyleorton.co.uk/feed/", + "kind": "rss", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "RBKC newsroom used for West London community-safety and incident context.", - "refreshEveryHours": 1 + "comment": "Specialist long-form analysis feed covering extremism, insurgency and geopolitical-security history context." }, { - "id": "kings-college-hospital-news", - "provider": "King's College Hospital NHS Foundation Trust a News", - "endpoint": "https://www.kch.nhs.uk/news/", - "kind": "html", + "id": "caert-feed", + "provider": "African Centre for the Study and Research on Terrorism (ACSRT/CAERT)", + "endpoint": "https://caert.org.dz/feed/", + "kind": "rss", "lane": "context", - "region": "london", + "region": "international", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "King's College Hospital news used for South London hospital and emergency-response context.", + "comment": "African Union ACSRT feed for regional counter-terrorism documentation, initiatives and institutional updates.", "refreshEveryHours": 1 }, { - "id": "kingston-council-news", - "provider": "Kingston Council a News", - "endpoint": "https://www.kingston.gov.uk/news", - "kind": "html", + "id": "security-magazine-rss", + "provider": "Security Magazine", + "endpoint": "https://www.securitymagazine.com/rss/15", + "kind": "rss", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Kingston borough news used for South-West London local incident and civic response context.", - "refreshEveryHours": 1 + "comment": "Operational security and cyber-physical risk feed relevant to public-safety, protection and infrastructure threat context." }, { - "id": "lambeth-council-news", - "provider": "Lambeth Council a News", - "endpoint": "https://love.lambeth.gov.uk/all-posts/", - "kind": "html", + "id": "leiden-security-global-affairs-feed", + "provider": "Leiden Security and Global Affairs Blog", + "endpoint": "https://www.leidensecurityandglobalaffairs.nl/feed/", + "kind": "rss", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lambeth all-posts listing used for a cleaner borough news index and civic-response context.", - "refreshEveryHours": 1 + "comment": "Academic security-analysis feed for strategic foresight, state violence and conflict-theory context." }, { - "id": "lewisham-council-news", - "provider": "Salamander News", - "endpoint": "https://salamandernews.org/", - "kind": "html", + "id": "borealis-threat-risk-feed", + "provider": "Borealis Threat and Risk Consulting", + "endpoint": "https://borealisthreatandrisk.com/feed/", + "kind": "rss", "lane": "context", - "region": "london", + "region": "international", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Best-effort replacement for unavailable Lewisham council feed using Lewisham-focused community reporting." + "comment": "Threat-intelligence commentary feed with counter-terrorism and intelligence-policy practitioner perspectives." }, { - "id": "lnwh-news", - "provider": "London North West University Healthcare NHS Trust a News", - "endpoint": "https://www.lnwh.nhs.uk/news", - "kind": "html", + "id": "insight-crime-feed", + "provider": "InSight Crime", + "endpoint": "https://insightcrime.org/feed/", + "kind": "rss", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "LNWH news used for North-West London hospital and system-response context.", - "refreshEveryHours": 1 + "comment": "Investigative organized-crime reporting feed focused on Latin America criminal ecosystems and violence dynamics." }, { - "id": "london-ambulance-news", - "provider": "London Ambulance Service a News", - "endpoint": "https://www.londonambulance.nhs.uk/news/", - "kind": "html", + "id": "southfront-feed", + "provider": "SouthFront", + "endpoint": "https://southfront.org/feed/", + "kind": "rss", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "London Ambulance Service news used for London emergency-response corroboration.", - "refreshEveryHours": 1 + "comment": "Military-conflict narrative feed tracked only as low-confidence geopolitical context under strict keyword gating." }, { - "id": "london-city-airport-media-centre", - "provider": "London City Airport a Media Centre", - "endpoint": "https://www.londoncityairport.com/corporate/media-centre", - "kind": "html", + "id": "inteltechniques-blog-feed", + "provider": "IntelTechniques Blog", + "endpoint": "https://inteltechniques.com/blog/feed/", + "kind": "rss", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "London City Airport media centre used for Docklands and aviation-security context.", - "refreshEveryHours": 1 + "comment": "OSINT tradecraft blog feed for investigative methods, tooling and source-discovery context." }, { - "id": "london-councils-news", - "provider": "London Councils a News", - "endpoint": "https://www.londoncouncils.gov.uk/news-and-press-releases", - "kind": "html", + "id": "reddit-worldnews-rss", + "provider": "Reddit - r/worldnews", + "endpoint": "https://www.reddit.com/r/worldnews/.rss", + "kind": "rss", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "London Councils releases used for citywide borough coordination, resilience, and public-safety context.", - "refreshEveryHours": 1 + "comment": "High-noise social signal feed retained as low-confidence early narrative and incident chatter context." }, { - "id": "london-fire-brigade-news", - "provider": "London Fire Brigade a News", - "endpoint": "https://www.london-fire.gov.uk/news/", - "kind": "html", + "id": "urban-terrorism-europe-feed", + "provider": "Urban Terrorism in Europe (University of Birmingham)", + "endpoint": "https://blog.bham.ac.uk/urbterr/feed/", + "kind": "rss", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "London Fire Brigade news used for London incident corroboration and scene context.", - "refreshEveryHours": 1 + "comment": "Academic research feed focused on urban terrorism trends, impacts and far-right violence in Europe." }, { - "id": "london-gov-home", - "provider": "London.gov.uk", - "endpoint": "https://www.london.gov.uk/", - "kind": "html", + "id": "investigative-project-terrorism-rss", + "provider": "Investigative Project on Terrorism", + "endpoint": "https://www.investigativeproject.org/articles_rss_2.0.xml", + "kind": "rss", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Greater London Authority homepage for City Hall, resilience and public-safety related updates.", - "refreshEveryHours": 1 + "comment": "Specialist terrorism-analysis feed used for extremist-network and financing narrative monitoring." }, { - "id": "london-gov-press-releases-html", - "provider": "London.gov.uk - Press Releases", - "endpoint": "https://www.london.gov.uk/press-releases", - "kind": "html", + "id": "allafrica-international-terrorism-rdf", + "provider": "AllAfrica - International Terrorism", + "endpoint": "https://allafrica.com/tools/headlines/rdf/terrorism/headlines.rdf", + "kind": "rss", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "London.gov.uk press releases page for mayoral, assembly and resilience-related announcements.", - "refreshEveryHours": 1 + "comment": "Africa-focused terrorism headline feed for regional incident and counter-terror operation context." }, { - "id": "london-gov-rss-80603", - "provider": "Mayor of London - Press Releases", - "endpoint": "https://www.london.gov.uk/media-centre/mayors-press-releases", - "kind": "html", + "id": "strategic-intelligence-terrorism-war-feed", + "provider": "Strategic Intelligence Service - Terrorism and War Updates", + "endpoint": "https://intelligencebriefs.com/category/terrorism-war/feed/", + "kind": "rss", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Stable Mayor's press releases page used in place of intermittently unresolved RSS feed ID 80603.", - "refreshEveryHours": 1 + "comment": "Counter-terrorism intelligence update feed for East Africa and broader conflict developments." }, { - "id": "london-gov-rss-80632", - "provider": "London Assembly - Press Releases", - "endpoint": "https://www.london.gov.uk/who-we-are/what-london-assembly-does/london-assembly-press-releases", - "kind": "html", + "id": "intelnews-feed", + "provider": "IntelNews", + "endpoint": "https://intelnews.org/feed/", + "kind": "rss", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Stable London Assembly press releases page used in place of intermittently unresolved RSS feed ID 80632.", - "refreshEveryHours": 1 + "comment": "Intelligence and espionage reporting feed used for security-service and geopolitical escalation context." }, { - "id": "mayor-of-london-press-releases", - "provider": "Mayor of London a Press Releases", - "endpoint": "https://www.london.gov.uk/rss-feeds/80610", + "id": "aymennaltamimi-substack-feed", + "provider": "Aymenn's Monstrous Publications", + "endpoint": "https://www.aymennaltamimi.com/feed", "kind": "rss", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Replaced page endpoint with official City Hall mayoral RSS feed.", - "refreshEveryHours": 1 + "comment": "Middle East conflict-analysis Substack feed with primary-source interviews and militant-group coverage." }, { - "id": "merton-council-news", - "provider": "Merton Council a News", - "endpoint": "https://www.merton.gov.uk/news", - "kind": "html", + "id": "ict-israel-feed", + "provider": "International Institute for Counter-Terrorism (ICT)", + "endpoint": "https://ict.org.il/feed/", + "kind": "rss", "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Merton borough news used for South-West London corroboration and local emergency context.", - "refreshEveryHours": 1 + "comment": "ICT research and situational update feed on terrorism, regional conflict and threat analysis." }, { - "id": "met-police-the-met-tag", - "provider": "Metropolitan Police - The Met Tag", - "endpoint": "https://news.met.police.uk/news/tag/the-met", + "id": "interpol-news-page-en", + "provider": "INTERPOL - News", + "endpoint": "https://www.interpol.int/en/News-and-Events/News", "kind": "html", "lane": "context", - "region": "london", + "region": "international", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Met Police tagged news page for London policing posture and institutional updates.", + "comment": "INTERPOL English news listing for global law-enforcement operations, terrorism and border-security statements.", "refreshEveryHours": 1 }, { - "id": "moorfields-news", - "provider": "Moorfields Eye Hospital NHS Foundation Trust a News", - "endpoint": "https://www.moorfields.nhs.uk/about-us/news-and-blogs/news", + "id": "gctf-news", + "provider": "Global Counterterrorism Forum (GCTF) a News", + "endpoint": "https://www.thegctf.org/News-Stories/PgrID/918/PageID/3", "kind": "html", - "lane": "context", - "region": "london", + "lane": "oversight", + "region": "international", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Moorfields official news and blogs listing for specialist-hospital and emergency-system context.", + "comment": "No RSS endpoint published; using the official news page and relying on keyword filtering.", "refreshEveryHours": 1 }, { - "id": "nelft-news", - "provider": "North East London NHS Foundation Trust a News", - "endpoint": "https://www.nelft.nhs.uk/news-events/", + "id": "unoct-news", + "provider": "UN Office of Counter-Terrorism (UNOCT) - News", + "endpoint": "https://www.un.org/counterterrorism/en/news-articles", "kind": "html", - "lane": "context", - "region": "london", + "lane": "oversight", + "region": "international", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "NELFT updates used for North-East London health-system and community response context.", + "comment": "UNOCT news/articles page used as the current official listing for Counter-Terrorism updates.", "refreshEveryHours": 1 }, { - "id": "newham-council-news", - "provider": "Newham Council a News", - "endpoint": "https://www.newham.gov.uk/news", + "id": "unsc-counter-terrorism-committee", + "provider": "UN Security Council - Counter-Terrorism Committee (CTC) Updates", + "endpoint": "https://www.un.org/securitycouncil/ctc/news", "kind": "html", - "lane": "context", - "region": "london", + "lane": "oversight", + "region": "international", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Newham borough news used for Stratford, transport, venue, and community-safety corroboration.", + "comment": "No consistent RSS endpoint; using the CTC news page and relying on keyword filtering.", "refreshEveryHours": 1 }, { - "id": "nhs-london-ncl-news", - "provider": "NHS North Central London a News", - "endpoint": "https://nclhealthandcare.org.uk/news/", - "kind": "html", - "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "id": "gnet-artificial-intelligence-rss", + "provider": "Global Network on Extremism & Technology (GNET) a Artificial Intelligence (RSS)", + "endpoint": "https://gnet-research.org/tag/artificial-intelligence/feed/", + "kind": "rss", + "lane": "prevention", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": false + }, + { + "id": "gnet-radicalisation-rss", + "provider": "Global Network on Extremism & Technology (GNET) a Radicalisation (RSS)", + "endpoint": "https://gnet-research.org/tag/radicalisation/feed/", + "kind": "rss", + "lane": "prevention", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": false + }, + { + "id": "gnet-youth-rss", + "provider": "Global Network on Extremism & Technology (GNET) a Youth (RSS)", + "endpoint": "https://gnet-research.org/tag/youth/feed/", + "kind": "rss", + "lane": "prevention", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": false + }, + { + "id": "tech-against-terrorism", + "provider": "Tech Against Terrorism - Analysis", + "endpoint": "https://techagainstterrorism.org/analysis", + "kind": "html", + "lane": "prevention", + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "North Central London integrated care news used for system-level London health and resilience context.", - "refreshEveryHours": 1 + "comment": "Focused analysis page for extremist content, platform abuse and online prevention context." }, { - "id": "nhs-london-nel-news", - "provider": "NHS North East London a News", - "endpoint": "https://northeastlondon.icb.nhs.uk/news/", + "id": "tech-against-terrorism-home", + "provider": "Tech Against Terrorism - Home", + "endpoint": "https://techagainstterrorism.org/home", "kind": "html", - "lane": "context", - "region": "london", - "isTrustedOfficial": true, + "lane": "prevention", + "region": "international", + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "North East London ICB news used for city health-system and resilience context.", - "refreshEveryHours": 1 + "comment": "Tech Against Terrorism homepage variant for platform safety, extremist content and online prevention context." }, { - "id": "nhs-london-nwl-news", - "provider": "NHS North West London a News", - "endpoint": "https://www.nwlondonicb.nhs.uk/news", + "id": "fatf-news", + "provider": "Financial Action Task Force (FATF) a News", + "endpoint": "https://www.fatf-gafi.org/en/publications.html", "kind": "html", - "lane": "context", - "region": "london", + "lane": "sanctions", + "region": "international", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "North West London ICB news used for health-system and emergency-preparedness context.", + "comment": "FATF updates are published as web pages; using the publications/news surface and relying on keyword filtering.", "refreshEveryHours": 1 }, { - "id": "nhs-london-sel-news", - "provider": "NHS South East London a News", - "endpoint": "https://www.selondonics.org/icb/about-us/news/", + "id": "interpol-notices", + "provider": "INTERPOL a Notices", + "endpoint": "https://www.interpol.int/How-we-work/Notices", "kind": "html", - "lane": "context", - "region": "london", + "lane": "sanctions", + "region": "international", "isTrustedOfficial": true, - "requiresKeywordMatch": true, - "comment": "South East London ICS news used for borough-spanning health, resilience, and response context.", + "requiresKeywordMatch": false, + "comment": "INTERPOL Notices page covering Red, Orange, and other notice types relevant to terrorism and serious crime.", "refreshEveryHours": 1 }, { - "id": "nhs-london-swl-news", - "provider": "NHS South West London a News", - "endpoint": "https://www.southwestlondon.icb.nhs.uk/news/", + "id": "unsc-1267-press-releases", + "provider": "UN Security Council - ISIL/Da'esh & Al-Qaeda Sanctions Committee Press Releases", + "endpoint": "https://main.un.org/securitycouncil/en/sanctions/1267/press-releases", "kind": "html", - "lane": "context", - "region": "london", + "lane": "sanctions", + "region": "international", "isTrustedOfficial": true, - "requiresKeywordMatch": true, - "comment": "South West London ICB news used for system-level local health and incident context.", + "requiresKeywordMatch": false, + "comment": "UN sanctions committee press releases are presented as an HTML list; using the official listing page.", "refreshEveryHours": 1 }, { - "id": "north-middlesex-news", - "provider": "North Middlesex University Hospital a News", - "endpoint": "https://www.northmid.nhs.uk/news", + "id": "unsc-consolidated-list", + "provider": "UN Security Council - Consolidated Sanctions List Updates (RSS)", + "endpoint": "https://main.un.org/securitycouncil/en/rss-updates-unsc-consolidated-list", + "kind": "rss", + "lane": "sanctions", + "region": "international", + "isTrustedOfficial": true, + "requiresKeywordMatch": false, + "comment": "Official UNSC RSS feed for updates to the consolidated sanctions list covering all UN sanctions regimes.", + "refreshEveryHours": 1 + }, + { + "id": "barking-dagenham-council-news", + "provider": "Barking and Dagenham Council a News", + "endpoint": "https://www.lbbd.gov.uk/news", "kind": "html", "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "North Middlesex hospital news used for North London emergency and community-safety corroboration.", + "comment": "Barking and Dagenham borough news used for East London incident corroboration and civic response.", "refreshEveryHours": 1 }, { - "id": "oxleas-news", - "provider": "Oxleas NHS Foundation Trust a News", - "endpoint": "https://oxleas.nhs.uk/news/", + "id": "barnet-council-news", + "provider": "Barnet Post", + "endpoint": "https://barnetpost.co.uk/", "kind": "html", "lane": "context", "region": "london", - "isTrustedOfficial": true, + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Oxleas updates used for South-East London community and mental-health response context.", - "refreshEveryHours": 1 + "comment": "Best-effort replacement for council feed using Barnet Post local reporting." }, { - "id": "port-of-london-authority-news", - "provider": "Port of London Authority a News", - "endpoint": "https://pla.co.uk/News", + "id": "barts-health-news", + "provider": "Barts Health NHS Trust a News", + "endpoint": "https://www.bartshealth.nhs.uk/news", "kind": "html", "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Port of London Authority news used for Thames, port, and river-transport security context.", + "comment": "Barts Health updates used for East London hospital and emergency-response corroboration.", "refreshEveryHours": 1 }, { - "id": "redbridge-council-news", - "provider": "Redbridge Council a News", - "endpoint": "https://www.redbridge.gov.uk/news/", - "kind": "html", + "id": "bbc-news-london-rss", + "provider": "BBC News - London RSS", + "endpoint": "https://feeds.bbci.co.uk/news/england/london/rss.xml", + "kind": "rss", "lane": "context", "region": "london", - "isTrustedOfficial": true, + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Redbridge borough news used for North-East London community-safety context.", - "refreshEveryHours": 1 + "comment": "BBC London RSS feed for London incidents and corroborating public reporting." }, { - "id": "richmond-council-news", - "provider": "Richmond Council a News", - "endpoint": "https://www.richmond.gov.uk/news", + "id": "bexley-council-news", + "provider": "Bexley Council a News", + "endpoint": "https://www.bexley.gov.uk/news", "kind": "html", "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Richmond borough news used for West London community-safety and local incident context.", + "comment": "Bexley borough news used for South-East outer London context and civic response.", "refreshEveryHours": 1 }, { - "id": "royal-free-london-news", - "provider": "Royal Free London NHS Foundation Trust a News", - "endpoint": "https://www.royalfree.nhs.uk/news", + "id": "brent-council-news", + "provider": "Brent Council a News", + "endpoint": "https://www.brent.gov.uk/news", "kind": "html", "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Royal Free London news used for North London hospital and emergency-response context.", + "comment": "Brent borough news used for Wembley-area and borough-level incident context.", "refreshEveryHours": 1 }, { - "id": "royal-greenwich-news", - "provider": "Royal Borough of Greenwich a News", - "endpoint": "https://www.royalgreenwich.gov.uk/news", + "id": "bromley-council-news", + "provider": "Bromley Council a Newsroom", + "endpoint": "https://www.bromley.gov.uk/news", "kind": "html", "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Greenwich borough news used for South-East London corroboration and civic response context.", + "comment": "Replaced Bromley newsroom HTML with RSS endpoint.", "refreshEveryHours": 1 }, { - "id": "slam-news", - "provider": "South London and Maudsley NHS Foundation Trust a News", - "endpoint": "https://slam.nhs.uk/pressreleases", + "id": "camden-council-news", + "provider": "Camden Council a News", + "endpoint": "https://news.camden.gov.uk/", "kind": "html", "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "SLaM news used for South London mental-health and community-safety context.", + "comment": "Camden newsroom used for borough-level London corroboration around stations, crowds, and civic response.", "refreshEveryHours": 1 }, { - "id": "southwark-newsroom", - "provider": "Southwark Council a Newsroom", - "endpoint": "https://news.southwark.gov.uk/newsroom/news/rss", - "kind": "rss", + "id": "chelsea-westminster-news", + "provider": "Chelsea and Westminster Hospital NHS Foundation Trust a News", + "endpoint": "https://www.chelwest.nhs.uk/about-us/news", + "kind": "html", "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Replaced newsroom HTML front page with Southwark news RSS endpoint.", + "comment": "Chelsea and Westminster news used for West and central London hospital corroboration.", "refreshEveryHours": 1 }, { - "id": "st-georges-news", - "provider": "St George's University Hospitals NHS Foundation Trust a News", - "endpoint": "https://www.stgeorges.nhs.uk/news/", + "id": "city-of-london-police-fraud-reporting", + "provider": "City of London Police - Fraud Reporting", + "endpoint": "https://www.cityoflondon.police.uk/ro/report/fo/v1/fraud/", "kind": "html", "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "St George's news used for South-West London hospital and trauma-response context.", + "comment": "City of London Police fraud reporting page for Action Fraud and economic-crime reporting context.", "refreshEveryHours": 1 }, { - "id": "sutton-council-news", - "provider": "Sutton Council a News", - "endpoint": "https://www.sutton.gov.uk/news", + "id": "cnwl-news", + "provider": "Central and North West London NHS Foundation Trust a News", + "endpoint": "https://www.cnwl.nhs.uk/news", "kind": "html", "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Sutton borough news used for outer-South London borough-level corroboration.", + "comment": "CNWL news used for London community-health, mental-health, and emergency-system context.", "refreshEveryHours": 1 }, { - "id": "swlstg-news", - "provider": "South West London and St George's Mental Health NHS Trust a News", - "endpoint": "https://www.swlstg.nhs.uk/latest-news", + "id": "croydon-council-news", + "provider": "Croydon Council a News", + "endpoint": "https://news.croydon.gov.uk/category/recent-news/", "kind": "html", "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "SWLSTG news used for South-West London mental-health and local response context.", + "comment": "Croydon recent-news listing used for a cleaner borough news index and London corroboration.", "refreshEveryHours": 1 }, { - "id": "tavistock-portman-news", - "provider": "Tavistock and Portman NHS Foundation Trust a News", - "endpoint": "https://tavistockandportman.nhs.uk/about-us/news/", + "id": "ealing-council-news", + "provider": "Ealing Council a News", + "endpoint": "https://www.ealing.gov.uk/news", "kind": "html", "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Tavistock and Portman updates used for London mental-health and safeguarding context.", + "comment": "Ealing borough news used for West London corroboration and public-safety context.", "refreshEveryHours": 1 }, { - "id": "tfl-press-releases", - "provider": "Transport for London - Press Releases", - "endpoint": "https://tfl.gov.uk/info-for/media/press-releases?source=tfl-press-releases", + "id": "east-london-nhs-news", + "provider": "East London NHS Foundation Trust a News", + "endpoint": "https://www.elft.nhs.uk/news", "kind": "html", "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Replacement for blocked TfL RSS feed using the public press-releases page.", + "comment": "ELFT updates used for East London mental-health, community safety, and response context.", "refreshEveryHours": 1 }, { - "id": "tfl-press-releases-html", - "provider": "Transport for London - Press Releases", - "endpoint": "https://tfl.gov.uk/info-for/media/press-releases", + "id": "enfield-council-news", + "provider": "Enfield Council a News and Events", + "endpoint": "https://www.enfield.gov.uk/news-and-events", "kind": "html", "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "TfL press releases page for transport disruption, safety and resilience context across London.", + "comment": "Enfield news surface used for North London borough-level corroboration and civic response.", "refreshEveryHours": 1 }, { - "id": "tower-hamlets-council-news", - "provider": "Tower Hamlets Council a News", - "endpoint": "https://www.towerhamlets.gov.uk/News_events/News.aspx", + "id": "gosh-news", + "provider": "Great Ormond Street Hospital a News", + "endpoint": "https://www.gosh.nhs.uk/news/", "kind": "html", "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Replaced legacy ASPX listing with Tower Hamlets official news RSS feed.", + "comment": "Great Ormond Street news used for central London hospital and child-health emergency context.", "refreshEveryHours": 1 }, { - "id": "uclh-news", - "provider": "University College London Hospitals a News", - "endpoint": "https://www.uclh.nhs.uk/news", + "id": "guys-st-thomas-news", + "provider": "Guy's and St Thomas' NHS Foundation Trust a News", + "endpoint": "https://www.guysandstthomas.nhs.uk/news", "kind": "html", "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "UCLH news used for central London hospital and emergency-system corroboration.", + "comment": "Guy's and St Thomas' news used for central London hospital response and public-safety context.", "refreshEveryHours": 1 }, { - "id": "waltham-forest-council-news", - "provider": "Waltham Forest Council a News", - "endpoint": "https://www.walthamforest.gov.uk/news", + "id": "hackney-council-news", + "provider": "Hackney Council a News", + "endpoint": "https://news.hackney.gov.uk/", "kind": "html", "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Waltham Forest borough news used for East London public-safety context.", + "comment": "Hackney newsroom used for borough emergency-response and public-safety context in East London.", "refreshEveryHours": 1 }, { - "id": "wandsworth-council-news", - "provider": "Wandsworth Council a News", - "endpoint": "https://www.wandsworth.gov.uk/news/", + "id": "hammersmith-fulham-news", + "provider": "Hammersmith and Fulham Council a News", + "endpoint": "https://www.lbhf.gov.uk/news", "kind": "html", "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Wandsworth borough news used for local safety and London incident corroboration.", + "comment": "Hammersmith and Fulham news used for West London corroboration and civic-safety context.", "refreshEveryHours": 1 }, { - "id": "westminster-city-council-news", - "provider": "Westminster City Council a News", - "endpoint": "https://www.westminster.gov.uk/news", + "id": "haringey-council-news", + "provider": "Metropolitan Police - Haringey Tag", + "endpoint": "https://news.met.police.uk/news/tag/haringey", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Official Met borough-tag archive for Haringey." + }, + { + "id": "harrow-council-news", + "provider": "Harrow Council a News", + "endpoint": "https://www.harrow.gov.uk/news", "kind": "html", "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Replaced HTML newsroom front page with Westminster official news RSS feed.", + "comment": "Harrow borough news used for outer-North-West London incident corroboration.", "refreshEveryHours": 1 }, { - "id": "whittington-health-news", - "provider": "Whittington Health a News", - "endpoint": "https://www.whittington.nhs.uk/mini-apps/news/newsItems.asp", + "id": "havering-council-news", + "provider": "Havering Council a News", + "endpoint": "https://www.havering.gov.uk/news", "kind": "html", "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Whittington Health updates used for North London hospital and local incident context.", + "comment": "Havering borough news used for East outer London public-safety corroboration.", "refreshEveryHours": 1 }, { - "id": "city-of-london-police-news", - "provider": "National Crime Agency - News", - "endpoint": "https://www.nationalcrimeagency.gov.uk/news?source=city-of-london-police-news", + "id": "heathrow-media-centre", + "provider": "Heathrow a Media Centre", + "endpoint": "https://mediacentre.heathrow.com/", "kind": "html", - "lane": "incidents", + "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Next-best replacement for blocked City of London Police feed using NCA law-enforcement updates.", + "comment": "Heathrow media centre used for airport-security, disruption, and London transport corroboration.", "refreshEveryHours": 1 }, { - "id": "city-of-london-police-news-html", - "provider": "City of London Police - News", - "endpoint": "https://www.cityoflondon.police.uk/news/city-of-london-police/news/", + "id": "hillingdon-council-news", + "provider": "Hillingdon Council a News", + "endpoint": "https://pre.hillingdon.gov.uk/news", "kind": "html", - "lane": "incidents", + "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Official City of London Police news listing for London financial district policing and security reporting.", + "comment": "Hillingdon canonical news target used for Heathrow corridor and West London local context.", "refreshEveryHours": 1 }, { - "id": "city-of-london-police-newsroom", - "provider": "Metropolitan Police Service - News", - "endpoint": "https://news.met.police.uk/", + "id": "homerton-healthcare-news", + "provider": "Homerton Healthcare NHS Foundation Trust a News", + "endpoint": "https://www.homerton.nhs.uk/trust-news/", "kind": "html", - "lane": "incidents", + "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Best-effort replacement for blocked City of London Police newsroom using active Met Police London policing updates.", + "comment": "Homerton Healthcare news used for East London hospital and emergency-response context.", "refreshEveryHours": 1 }, { - "id": "ct-policing-london", - "provider": "Counter Terrorism Policing London", - "endpoint": "https://www.counterterrorism.police.uk/counter-terrorism-policing-london/", + "id": "hounslow-council-news", + "provider": "Hounslow Council a News", + "endpoint": "https://www.hounslow.gov.uk/news", "kind": "html", - "lane": "incidents", + "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Official Counter Terrorism Policing London page for local operational updates, campaigns and incident-related notices.", + "comment": "Hounslow borough news used for Heathrow-adjacent and West London local context.", "refreshEveryHours": 1 }, { - "id": "met-police-latest-news", - "provider": "Metropolitan Police - Latest News", - "endpoint": "https://news.met.police.uk/latest_news", + "id": "imperial-healthcare-news", + "provider": "Imperial College Healthcare NHS Trust a News", + "endpoint": "https://www.imperial.nhs.uk/about-us/news", "kind": "html", - "lane": "incidents", + "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Met Police latest news page for London operational updates, arrests, appeals and terrorism-linked incidents.", + "comment": "Imperial College Healthcare news used for West London hospital and major-incident context.", "refreshEveryHours": 1 }, { - "id": "met-police-news", - "provider": "Metropolitan Police Service a News", - "endpoint": "https://news.met.police.uk/news", + "id": "islington-council-news", + "provider": "Islington Council a News", + "endpoint": "https://www.islington.media/news/", "kind": "html", - "lane": "incidents", + "lane": "context", "region": "london", "isTrustedOfficial": true, - "requiresKeywordMatch": false, - "comment": "No public RSS endpoint found for the new Met news platform; using the news listing.", + "requiresKeywordMatch": true, + "comment": "Islington direct news listing used for local London emergency and community-safety corroboration.", "refreshEveryHours": 1 }, { - "id": "london-assembly-press-releases", - "provider": "London Assembly a Press Releases", - "endpoint": "https://www.london.gov.uk/rss-feeds/80611", - "kind": "rss", - "lane": "oversight", + "id": "kensington-chelsea-newsroom", + "provider": "Royal Borough of Kensington and Chelsea a Newsroom", + "endpoint": "https://www.rbkc.gov.uk/newsroom", + "kind": "html", + "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Replaced page endpoint with official City Hall London Assembly RSS feed.", + "comment": "RBKC newsroom used for West London community-safety and incident context.", "refreshEveryHours": 1 }, { - "id": "mopac-html", - "provider": "Mayor's Office for Policing and Crime", - "endpoint": "https://www.london.gov.uk/programmes-strategies/mayors-office-policing-and-crime-mopac", + "id": "kings-college-hospital-news", + "provider": "King's College Hospital NHS Foundation Trust a News", + "endpoint": "https://www.kch.nhs.uk/news/", "kind": "html", - "lane": "oversight", + "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "MOPAC page for London policing strategy, accountability and public-safety oversight.", + "comment": "King's College Hospital news used for South London hospital and emergency-response context.", "refreshEveryHours": 1 }, { - "id": "london-resilience", - "provider": "Resilience First - Latest Updates", - "endpoint": "https://www.london.gov.uk/programmes-strategies/fire-and-city-resilience/london-resilience-partnership", + "id": "kingston-council-news", + "provider": "Kingston Council a News", + "endpoint": "https://www.kingston.gov.uk/news", "kind": "html", - "lane": "prevention", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Kingston borough news used for South-West London local incident and civic response context.", + "refreshEveryHours": 1 + }, + { + "id": "lambeth-council-news", + "provider": "Lambeth Council a News", + "endpoint": "https://love.lambeth.gov.uk/all-posts/", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Lambeth all-posts listing used for a cleaner borough news index and civic-response context.", + "refreshEveryHours": 1 + }, + { + "id": "lewisham-council-news", + "provider": "Metropolitan Police - Lewisham Tag", + "endpoint": "https://news.met.police.uk/news/tag/lewisham", + "kind": "html", + "lane": "context", "region": "london", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Resilience First's Latest Updates page providing news and analysis on resilience and safety initiatives relevant to London; replacement for the inaccessible London Resilience page." + "comment": "Official Met borough-tag archive for Lewisham." }, { - "id": "gov-uk-fcdo-travel-advice", - "provider": "FCDO a Foreign Travel Advice Index", - "endpoint": "https://www.gov.uk/foreign-travel-advice", + "id": "lnwh-news", + "provider": "London North West University Healthcare NHS Trust a News", + "endpoint": "https://www.lnwh.nhs.uk/news", "kind": "html", - "lane": "border", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "LNWH news used for North-West London hospital and system-response context.", + "refreshEveryHours": 1 + }, + { + "id": "london-ambulance-news", + "provider": "London Ambulance Service a News", + "endpoint": "https://www.londonambulance.nhs.uk/news/", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "London Ambulance Service news used for London emergency-response corroboration.", + "refreshEveryHours": 1 + }, + { + "id": "london-city-airport-media-centre", + "provider": "London City Airport a Media Centre", + "endpoint": "https://www.londoncityairport.com/corporate/media-centre", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "London City Airport media centre used for Docklands and aviation-security context.", + "refreshEveryHours": 1 + }, + { + "id": "london-councils-news", + "provider": "London Councils a News", + "endpoint": "https://www.londoncouncils.gov.uk/news-and-press-releases", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "London Councils releases used for citywide borough coordination, resilience, and public-safety context.", + "refreshEveryHours": 1 + }, + { + "id": "london-fire-brigade-news", + "provider": "London Fire Brigade a News", + "endpoint": "https://www.london-fire.gov.uk/news/", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "London Fire Brigade news used for London incident corroboration and scene context.", + "refreshEveryHours": 1 + }, + { + "id": "london-gov-home", + "provider": "London.gov.uk", + "endpoint": "https://www.london.gov.uk/", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Greater London Authority homepage for City Hall, resilience and public-safety related updates.", + "refreshEveryHours": 1 + }, + { + "id": "london-gov-press-releases-html", + "provider": "London.gov.uk - Press Releases", + "endpoint": "https://www.london.gov.uk/press-releases", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "London.gov.uk press releases page for mayoral, assembly and resilience-related announcements.", + "refreshEveryHours": 1 + }, + { + "id": "london-gov-rss-80603", + "provider": "Mayor of London - Press Releases", + "endpoint": "https://www.london.gov.uk/media-centre/mayors-press-releases", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Stable Mayor's press releases page used in place of intermittently unresolved RSS feed ID 80603.", + "refreshEveryHours": 1 + }, + { + "id": "london-gov-rss-80632", + "provider": "London Assembly - Press Releases", + "endpoint": "https://www.london.gov.uk/who-we-are/what-london-assembly-does/london-assembly-press-releases", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Stable London Assembly press releases page used in place of intermittently unresolved RSS feed ID 80632.", + "refreshEveryHours": 1 + }, + { + "id": "mayor-of-london-press-releases", + "provider": "Mayor of London a Press Releases", + "endpoint": "https://www.london.gov.uk/rss-feeds/80610", + "kind": "rss", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Replaced page endpoint with official City Hall mayoral RSS feed.", + "refreshEveryHours": 1 + }, + { + "id": "merton-council-news", + "provider": "Merton Council a News", + "endpoint": "https://www.merton.gov.uk/news", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Merton borough news used for South-West London corroboration and local emergency context.", + "refreshEveryHours": 1 + }, + { + "id": "met-police-the-met-tag", + "provider": "Metropolitan Police - The Met Tag", + "endpoint": "https://news.met.police.uk/news/tag/the-met", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Met Police tagged news page for London policing posture and institutional updates.", + "refreshEveryHours": 1 + }, + { + "id": "moorfields-news", + "provider": "Moorfields Eye Hospital NHS Foundation Trust a News", + "endpoint": "https://www.moorfields.nhs.uk/about-us/news-and-blogs/news", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Moorfields official news and blogs listing for specialist-hospital and emergency-system context.", + "refreshEveryHours": 1 + }, + { + "id": "nelft-news", + "provider": "North East London NHS Foundation Trust a News", + "endpoint": "https://www.nelft.nhs.uk/news-events/", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "NELFT updates used for North-East London health-system and community response context.", + "refreshEveryHours": 1 + }, + { + "id": "newham-council-news", + "provider": "Newham Council a News", + "endpoint": "https://www.newham.gov.uk/news", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Newham borough news used for Stratford, transport, venue, and community-safety corroboration.", + "refreshEveryHours": 1 + }, + { + "id": "nhs-london-ncl-news", + "provider": "NHS North Central London a News", + "endpoint": "https://nclhealthandcare.org.uk/news/", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "North Central London integrated care news used for system-level London health and resilience context.", + "refreshEveryHours": 1 + }, + { + "id": "nhs-london-nel-news", + "provider": "NHS North East London a News", + "endpoint": "https://northeastlondon.icb.nhs.uk/news/", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "North East London ICB news used for city health-system and resilience context.", + "refreshEveryHours": 1 + }, + { + "id": "nhs-london-nwl-news", + "provider": "NHS North West London a News", + "endpoint": "https://www.nwlondonicb.nhs.uk/news", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "North West London ICB news used for health-system and emergency-preparedness context.", + "refreshEveryHours": 1 + }, + { + "id": "nhs-london-sel-news", + "provider": "NHS South East London a News", + "endpoint": "https://www.selondonics.org/icb/about-us/news/", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "South East London ICS news used for borough-spanning health, resilience, and response context.", + "refreshEveryHours": 1 + }, + { + "id": "nhs-london-swl-news", + "provider": "NHS South West London a News", + "endpoint": "https://www.southwestlondon.icb.nhs.uk/news/", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "South West London ICB news used for system-level local health and incident context.", + "refreshEveryHours": 1 + }, + { + "id": "north-middlesex-news", + "provider": "North Middlesex University Hospital a News", + "endpoint": "https://www.northmid.nhs.uk/news", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "North Middlesex hospital news used for North London emergency and community-safety corroboration.", + "refreshEveryHours": 1 + }, + { + "id": "oxleas-news", + "provider": "Oxleas NHS Foundation Trust a News", + "endpoint": "https://oxleas.nhs.uk/news/", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Oxleas updates used for South-East London community and mental-health response context.", + "refreshEveryHours": 1 + }, + { + "id": "port-of-london-authority-news", + "provider": "Port of London Authority a News", + "endpoint": "https://pla.co.uk/News", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Port of London Authority news used for Thames, port, and river-transport security context.", + "refreshEveryHours": 1 + }, + { + "id": "redbridge-council-news", + "provider": "Redbridge Council a News", + "endpoint": "https://www.redbridge.gov.uk/news/", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Redbridge borough news used for North-East London community-safety context.", + "refreshEveryHours": 1 + }, + { + "id": "richmond-council-news", + "provider": "Richmond Council a News", + "endpoint": "https://www.richmond.gov.uk/news", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Richmond borough news used for West London community-safety and local incident context.", + "refreshEveryHours": 1 + }, + { + "id": "royal-free-london-news", + "provider": "Royal Free London NHS Foundation Trust a News", + "endpoint": "https://www.royalfree.nhs.uk/news", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Royal Free London news used for North London hospital and emergency-response context.", + "refreshEveryHours": 1 + }, + { + "id": "royal-greenwich-news", + "provider": "Royal Borough of Greenwich a News", + "endpoint": "https://www.royalgreenwich.gov.uk/news", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Greenwich borough news used for South-East London corroboration and civic response context.", + "refreshEveryHours": 1 + }, + { + "id": "slam-news", + "provider": "South London and Maudsley NHS Foundation Trust a News", + "endpoint": "https://slam.nhs.uk/pressreleases", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "SLaM news used for South London mental-health and community-safety context.", + "refreshEveryHours": 1 + }, + { + "id": "southwark-newsroom", + "provider": "Southwark Council - News", + "endpoint": "https://www.southwark.gov.uk/news", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Canonical Southwark Council news listing.", + "refreshEveryHours": 1 + }, + { + "id": "st-georges-news", + "provider": "St George's University Hospitals NHS Foundation Trust a News", + "endpoint": "https://www.stgeorges.nhs.uk/news/", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "St George's news used for South-West London hospital and trauma-response context.", + "refreshEveryHours": 1 + }, + { + "id": "sutton-council-news", + "provider": "Sutton Council a News", + "endpoint": "https://www.sutton.gov.uk/news", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Sutton borough news used for outer-South London borough-level corroboration.", + "refreshEveryHours": 1 + }, + { + "id": "swlstg-news", + "provider": "South West London and St George's Mental Health NHS Trust a News", + "endpoint": "https://www.swlstg.nhs.uk/latest-news", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "SWLSTG news used for South-West London mental-health and local response context.", + "refreshEveryHours": 1 + }, + { + "id": "tavistock-portman-news", + "provider": "Tavistock and Portman NHS Foundation Trust a News", + "endpoint": "https://tavistockandportman.nhs.uk/about-us/news/", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Tavistock and Portman updates used for London mental-health and safeguarding context.", + "refreshEveryHours": 1 + }, + { + "id": "tfl-press-releases", + "provider": "Transport for London - Press Releases", + "endpoint": "https://tfl.gov.uk/info-for/media/press-releases?source=tfl-press-releases", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Replacement for blocked TfL RSS feed using the public press-releases page.", + "refreshEveryHours": 1 + }, + { + "id": "tfl-press-releases-html", + "provider": "Transport for London - Press Releases", + "endpoint": "https://tfl.gov.uk/info-for/media/press-releases", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "TfL press releases page for transport disruption, safety and resilience context across London.", + "refreshEveryHours": 1 + }, + { + "id": "tower-hamlets-council-news", + "provider": "Tower Hamlets Council a News", + "endpoint": "https://www.towerhamlets.gov.uk/News_events/News.aspx", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Replaced legacy ASPX listing with Tower Hamlets official news RSS feed.", + "refreshEveryHours": 1 + }, + { + "id": "uclh-news", + "provider": "University College London Hospitals a News", + "endpoint": "https://www.uclh.nhs.uk/news", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "UCLH news used for central London hospital and emergency-system corroboration.", + "refreshEveryHours": 1 + }, + { + "id": "waltham-forest-council-news", + "provider": "Waltham Forest Council a News", + "endpoint": "https://www.walthamforest.gov.uk/news", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Waltham Forest borough news used for East London public-safety context.", + "refreshEveryHours": 1 + }, + { + "id": "wandsworth-council-news", + "provider": "Wandsworth Council a News", + "endpoint": "https://www.wandsworth.gov.uk/news/", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Wandsworth borough news used for local safety and London incident corroboration.", + "refreshEveryHours": 1 + }, + { + "id": "westminster-city-council-news", + "provider": "Westminster City Council a News", + "endpoint": "https://www.westminster.gov.uk/news", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Replaced HTML newsroom front page with Westminster official news RSS feed.", + "refreshEveryHours": 1 + }, + { + "id": "whittington-health-news", + "provider": "Whittington Health a News", + "endpoint": "https://www.whittington.nhs.uk/mini-apps/news/newsItems.asp", + "kind": "html", + "lane": "context", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Whittington Health updates used for North London hospital and local incident context.", + "refreshEveryHours": 1 + }, + { + "id": "londonist-rss", + "provider": "Londonist", + "endpoint": "https://londonist.com/feed", + "kind": "rss", + "lane": "context", + "region": "london", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Londonist feed for local transport, event and disruption-adjacent London context." + }, + { + "id": "ian-visits-rss", + "provider": "IanVisits", + "endpoint": "https://www.ianvisits.co.uk/articles/feed/", + "kind": "rss", + "lane": "context", + "region": "london", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "IanVisits feed for London transport, closures and infrastructure disruption context." + }, + { + "id": "secret-london-rss", + "provider": "Secret London", + "endpoint": "https://secretldn.com/feed/", + "kind": "rss", + "lane": "context", + "region": "london", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Secret London feed for public gatherings, pop-ups and crowd-behaviour context." + }, + { + "id": "time-out-london-rss", + "provider": "Time Out London", + "endpoint": "https://www.timeout.com/london/rss", + "kind": "rss", + "lane": "context", + "region": "london", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Time Out London events feed for venue and crowd planning context." + }, + { + "id": "diamond-geezer-rss", + "provider": "Diamond Geezer", + "endpoint": "https://diamondgeezer.blogspot.com/feeds/posts/default", + "kind": "rss", + "lane": "context", + "region": "london", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Hyper-local London blog feed for neighbourhood-level location awareness context." + }, + { + "id": "city-of-london-police-news", + "provider": "National Crime Agency - News", + "endpoint": "https://www.nationalcrimeagency.gov.uk/news?source=city-of-london-police-news", + "kind": "html", + "lane": "incidents", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Next-best replacement for blocked City of London Police feed using NCA law-enforcement updates.", + "refreshEveryHours": 1 + }, + { + "id": "city-of-london-police-news-html", + "provider": "City of London Police - News", + "endpoint": "https://www.cityoflondon.police.uk/news/city-of-london-police/news/", + "kind": "html", + "lane": "incidents", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Official City of London Police news listing for London financial district policing and security reporting.", + "refreshEveryHours": 1 + }, + { + "id": "city-of-london-police-newsroom", + "provider": "Metropolitan Police Service - Latest News", + "endpoint": "https://news.met.police.uk/latest_news?source=city-of-london-police-newsroom", + "kind": "html", + "lane": "incidents", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Canonical Met newsroom latest-news listing.", + "refreshEveryHours": 1 + }, + { + "id": "ct-policing-london", + "provider": "Counter Terrorism Policing London", + "endpoint": "https://www.counterterrorism.police.uk/counter-terrorism-policing-london/", + "kind": "html", + "lane": "incidents", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Official Counter Terrorism Policing London page for local operational updates, campaigns and incident-related notices.", + "refreshEveryHours": 1 + }, + { + "id": "met-police-latest-news", + "provider": "Metropolitan Police - Latest News", + "endpoint": "https://news.met.police.uk/latest_news", + "kind": "html", + "lane": "incidents", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Met Police latest news page for London operational updates, arrests, appeals and terrorism-linked incidents.", + "refreshEveryHours": 1 + }, + { + "id": "met-police-news", + "provider": "Metropolitan Police Service a News", + "endpoint": "https://news.met.police.uk/news", + "kind": "html", + "lane": "incidents", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": false, + "comment": "No public RSS endpoint found for the new Met news platform; using the news listing.", + "refreshEveryHours": 1 + }, + { + "id": "london-assembly-press-releases", + "provider": "London Assembly a Press Releases", + "endpoint": "https://www.london.gov.uk/rss-feeds/80611", + "kind": "rss", + "lane": "oversight", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Replaced page endpoint with official City Hall London Assembly RSS feed.", + "refreshEveryHours": 1 + }, + { + "id": "mopac-html", + "provider": "Mayor's Office for Policing and Crime", + "endpoint": "https://www.london.gov.uk/programmes-strategies/mayors-office-policing-and-crime-mopac", + "kind": "html", + "lane": "oversight", + "region": "london", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "MOPAC page for London policing strategy, accountability and public-safety oversight.", + "refreshEveryHours": 1 + }, + { + "id": "london-resilience", + "provider": "Resilience First - Latest Updates", + "endpoint": "https://www.london.gov.uk/programmes-strategies/fire-and-city-resilience/london-resilience-partnership", + "kind": "html", + "lane": "prevention", + "region": "london", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Resilience First's Latest Updates page providing news and analysis on resilience and safety initiatives relevant to London; replacement for the inaccessible London Resilience page." + }, + { + "id": "gov-uk-fcdo-travel-advice", + "provider": "FCDO a Foreign Travel Advice Index", + "endpoint": "https://www.gov.uk/foreign-travel-advice", + "kind": "html", + "lane": "border", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "FCDO foreign travel advice index; used for terrorism-threat-level and travel restriction updates.", + "refreshEveryHours": 1 + }, + { + "id": "uk-border-force", + "provider": "Border Force (UK) a Announcements and Publications", + "endpoint": "https://www.gov.uk/government/organisations/border-force", + "kind": "html", + "lane": "border", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "GOV.UK organization page is used; relies on keyword filtering for terrorism relevance.", + "refreshEveryHours": 1 + }, + { + "id": "uk-ukvi", + "provider": "UK Visas and Immigration a Announcements and Publications", + "endpoint": "https://www.gov.uk/government/organisations/uk-visas-and-immigration", + "kind": "html", + "lane": "border", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "GOV.UK organization page is used; relies on keyword filtering for terrorism relevance.", + "refreshEveryHours": 1 + }, + { + "id": "bbc-news-england-legacy", + "provider": "BBC News a England (Legacy RSS)", + "endpoint": "http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/england/rss.xml", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Legacy BBC RSS feed (newsrss.bbc.co.uk). May be discontinued; retained for England-specific coverage." + }, + { + "id": "bbc-news-front-page-legacy", + "provider": "BBC News a Front Page (Legacy RSS)", + "endpoint": "http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/front_page/rss.xml", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Legacy BBC RSS feed (newsrss.bbc.co.uk). May be discontinued; retained for coverage breadth." + }, + { + "id": "bbc-news-uk", + "provider": "BBC News a UK", + "endpoint": "https://feeds.bbci.co.uk/news/uk/rss.xml", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true + }, + { + "id": "bbc-news-uk-politics-legacy", + "provider": "BBC News a UK Politics (Legacy RSS)", + "endpoint": "https://feeds.bbci.co.uk/news/politics/rss.xml", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Modern BBC Politics RSS endpoint replacing the legacy newsrss host." + }, + { + "id": "chatham-house-home", + "provider": "Chatham House", + "endpoint": "https://www.chathamhouse.org/path/whatsnew.xml", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Official Chatham House all-content RSS feed." + }, + { + "id": "chatham-house-security-defence", + "provider": "Chatham House - Security and Defence", + "endpoint": "https://www.chathamhouse.org/topics/security-and-defence", + "kind": "html", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Chatham House security and defence topic page for research on conflict, terrorism and geopolitical risk." + }, + { + "id": "essex-police-news", + "provider": "Essex Police a News", + "endpoint": "https://www.essex.police.uk/news/", + "kind": "html", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Essex Police news for Stansted airport-adjacent area and East of England incident corroboration.", + "refreshEveryHours": 1 + }, + { + "id": "gov-uk-defence-intelligence", + "provider": "UK Defence Intelligence a GOV.UK", + "endpoint": "https://www.gov.uk/government/groups/defence-intelligence", + "kind": "html", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Defence Intelligence publications used for UK threat assessment and intelligence context.", + "refreshEveryHours": 1 + }, + { + "id": "gov-uk-terrorism-search", + "provider": "GOV.UK Search - Terrorism", + "endpoint": "https://www.gov.uk/search/all?keywords=terrorism", + "kind": "html", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": false, + "comment": "GOV.UK terrorism search page for broad government security, policy and operational references.", + "refreshEveryHours": 1 + }, + { + "id": "guardian-uk", + "provider": "The Guardian a UK News", + "endpoint": "https://www.theguardian.com/uk-news/rss", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true + }, + { + "id": "henry-jackson-society-news", + "provider": "RUSI - Latest Publications", + "endpoint": "https://www.rusi.org/rss/latest-publications.xml?source=henry-jackson-society-news", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Replacement feed using RUSI latest publications RSS for defence and counter-terrorism research updates." + }, + { + "id": "hope-not-hate-home", + "provider": "Hope not hate podcast", + "endpoint": "https://feeds.buzzsprout.com/170425.rss", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Official 'HOPE not hate' research podcast RSS feed providing episodes; accessible alternative to the Hope Not Hate homepage which is blocked for scrapers." + }, + { + "id": "institute-global-home", + "provider": "Institute for Global Change", + "endpoint": "https://institute.global/insights/geopolitics-and-security", + "kind": "html", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Focused TBI geopolitics and security page used for relevant strategic context." + }, + { + "id": "kent-police-news", + "provider": "Kent Police a News", + "endpoint": "https://www.kent.police.uk/news/", + "kind": "html", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Kent Police news for Channel port area, Dover, and border security incident corroboration.", + "refreshEveryHours": 1 + }, + { + "id": "mi5-news", + "provider": "National Crime Agency - News", + "endpoint": "https://www.nationalcrimeagency.gov.uk/news?source=mi5-news", + "kind": "html", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Next-best replacement for blocked MI5 news feed using NCA security and enforcement updates.", + "refreshEveryHours": 1 + }, + { + "id": "mi5-news-rss-direct", + "provider": "MI5 - News RSS", + "endpoint": "https://www.mi5.gov.uk/news", + "kind": "html", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Direct MI5 RSS endpoint for official security and terrorism-adjacent updates.", + "refreshEveryHours": 1 + }, + { + "id": "national-crime-agency-news", + "provider": "National Crime Agency - News", + "endpoint": "https://www.nationalcrimeagency.gov.uk/news", + "kind": "html", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Canonical National Crime Agency news archive used as the primary UK agency source.", + "refreshEveryHours": 1 + }, + { + "id": "npcc-releases", + "provider": "National Police Chiefs' Council - Releases", + "endpoint": "https://news.npcc.police.uk/releases/", + "kind": "html", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "NPCC releases page for national policing statements, operations and security posture updates.", + "refreshEveryHours": 1 + }, + { + "id": "police-uk-all-crime-leicester", + "provider": "Police.uk - Street Crime Around Leicester", + "endpoint": "https://data.police.uk/api/crimes-street/all-crime?lat=52.629729&lng=-1.131592", + "kind": "json", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Official Police.uk API street crime snapshot around Leicester coordinates.", + "refreshEveryHours": 1 + }, + { + "id": "police-uk-stops-force-leicestershire", + "provider": "Police.uk - Force Stops (Leicestershire)", + "endpoint": "https://data.police.uk/api/stops-force?force=leicestershire", + "kind": "json", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Official Police.uk API force-level stop-and-search records for Leicestershire.", + "refreshEveryHours": 1 + }, + { + "id": "police-uk-stops-street-leicester", + "provider": "Police.uk - Street Stops Around Leicester", + "endpoint": "https://data.police.uk/api/stops-street?lat=52.629729&lng=-1.131592", + "kind": "json", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Official Police.uk API stop-and-search snapshot around Leicester coordinates.", + "refreshEveryHours": 1 + }, + { + "id": "report-fraud-home", + "provider": "Report Fraud", + "endpoint": "https://www.reportfraud.police.uk/", + "kind": "html", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Official reporting portal for fraud and cyber-enabled crime with public guidance and campaign context.", + "refreshEveryHours": 1 + }, + { + "id": "report-fraud-newsroom", + "provider": "Report Fraud - Newsroom", + "endpoint": "https://www.reportfraud.police.uk/collection/newsroom/", + "kind": "html", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Report Fraud newsroom page for public-fraud warnings, campaign notices and cyber/fraud reporting updates.", + "refreshEveryHours": 1 + }, + { + "id": "rusi-home", + "provider": "RUSI", + "endpoint": "https://www.rusi.org/", + "kind": "html", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "RUSI homepage for defence, counter-terror and security analysis." + }, + { + "id": "rusi-publications", + "provider": "RUSI (Royal United Services Institute) a Publications", + "endpoint": "https://www.rusi.org/rss/latest-publications.xml", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Official RUSI latest publications RSS feed for UK defence, security and counter-terrorism research." + }, + { + "id": "rusi-terrorism-conflict", + "provider": "RUSI - Latest Publications", + "endpoint": "https://www.rusi.org/rss/latest-publications.xml?source=rusi-terrorism-conflict", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "RUSI latest publications feed retained for higher-frequency security and counter-terrorism updates." + }, + { + "id": "skwawkbox", + "provider": "Skwawkbox", + "endpoint": "https://www.thecanary.co/skwawkbox/", + "kind": "playwright_html", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "refreshEveryHours": 6, + "timeoutMs": 15000, + "selectors": [ + "article a[href]", + "main a[href]", + "h2 a[href]", + "h3 a[href]" + ], + "comment": "Hostile/JS-prone source example for Playwright fallback; only runs when ALBERTALERT_ENABLE_PLAYWRIGHT_FALLBACK=1." + }, + { + "id": "sky-news-uk-rss", + "provider": "Sky News UK a Top Stories (RSS)", + "endpoint": "https://feeds.skynews.com/feeds/rss/uk.xml", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Sky News UK RSS for fast-breaking domestic terrorism, crime and national security incident reporting." + }, + { + "id": "the-sun-all", + "provider": "The Sun", + "endpoint": "https://www.thesun.co.uk/feeds/all/", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "The Sun aggregate feed; tabloid – strict keyword and terrorism-hit thresholds apply before inclusion." + }, + { + "id": "the-sun-all-english", + "provider": "The Sun", + "endpoint": "https://www.thesun.co.uk/feeds/news-app-english-001-all/", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "The Sun all English app feed; tabloid – strict keyword and terrorism-hit thresholds apply before inclusion." + }, + { + "id": "the-sun-homepage", + "provider": "The Sun", + "endpoint": "https://www.thesun.co.uk/feeds/favourite-homepage/", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "The Sun curated homepage feed; tabloid – strict keyword and terrorism-hit thresholds apply before inclusion." + }, + { + "id": "the-sun-news-english", + "provider": "The Sun", + "endpoint": "https://www.thesun.co.uk/feeds/news-app-english-007-news/", + "kind": "rss", + "lane": "context", "region": "uk", - "isTrustedOfficial": true, + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "FCDO foreign travel advice index; used for terrorism-threat-level and travel restriction updates.", - "refreshEveryHours": 1 + "comment": "The Sun English news app feed; tabloid – strict keyword and terrorism-hit thresholds apply before inclusion." }, { - "id": "uk-border-force", - "provider": "Border Force (UK) a Announcements and Publications", - "endpoint": "https://www.gov.uk/government/organisations/border-force", - "kind": "html", - "lane": "border", + "id": "west-yorkshire-police-coroner-appeals-rss", + "provider": "West Yorkshire Police - Coroner Appeals Feed", + "endpoint": "https://www.westyorkshire.police.uk/news/coroner-appeals/feed", + "kind": "rss", + "lane": "context", "region": "uk", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "GOV.UK organization page is used; relies on keyword filtering for terrorism relevance.", + "comment": "West Yorkshire Police coroner appeals feed for death investigation and public appeal notices.", "refreshEveryHours": 1 }, { - "id": "uk-ukvi", - "provider": "UK Visas and Immigration a Announcements and Publications", - "endpoint": "https://www.gov.uk/government/organisations/uk-visas-and-immigration", - "kind": "html", - "lane": "border", + "id": "wiltshire-999s", + "provider": "Wiltshire 999s", + "endpoint": "https://www.wiltshire999s.co.uk/news/feed/", + "kind": "rss", + "lane": "context", "region": "uk", - "isTrustedOfficial": true, + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "GOV.UK organization page is used; relies on keyword filtering for terrorism relevance.", - "refreshEveryHours": 1 + "comment": "Wiltshire emergency services news RSS feed." }, { - "id": "bbc-news-england-legacy", - "provider": "BBC News a England (Legacy RSS)", - "endpoint": "http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/england/rss.xml", + "id": "belfast-live", + "provider": "Belfast Live", + "endpoint": "https://www.belfastlive.co.uk/?service=rss", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Legacy BBC RSS feed (newsrss.bbc.co.uk). May be discontinued; retained for England-specific coverage." + "sourceTier": "context", + "reliabilityProfile": "general_media", + "comment": "Northern Ireland local news RSS." }, { - "id": "bbc-news-front-page-legacy", - "provider": "BBC News a Front Page (Legacy RSS)", - "endpoint": "http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/front_page/rss.xml", + "id": "birmingham-mail", + "provider": "Birmingham Mail", + "endpoint": "https://www.birminghammail.co.uk/?service=rss", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Legacy BBC RSS feed (newsrss.bbc.co.uk). May be discontinued; retained for coverage breadth." + "sourceTier": "context", + "reliabilityProfile": "general_media", + "comment": "Birmingham local news RSS." }, { - "id": "bbc-news-uk", - "provider": "BBC News a UK", - "endpoint": "https://feeds.bbci.co.uk/news/uk/rss.xml", + "id": "breaking-news-today", + "provider": "Breaking News Today", + "endpoint": "https://www.breakingnewstoday.co.uk/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, - "requiresKeywordMatch": true + "requiresKeywordMatch": true, + "sourceTier": "context", + "reliabilityProfile": "general_media", + "comment": "UK breaking news feed." }, { - "id": "bbc-news-uk-politics-legacy", - "provider": "BBC News a UK Politics (Legacy RSS)", - "endpoint": "http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/uk_politics/rss.xml", + "id": "cambridge-news", + "provider": "Cambridge News", + "endpoint": "https://www.cambridge-news.co.uk/news/?service=rss", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Legacy BBC RSS feed (newsrss.bbc.co.uk). May be discontinued; retained for UK political coverage." + "sourceTier": "context", + "reliabilityProfile": "general_media", + "comment": "Reach/Live-style Cambridge News RSS endpoint." }, { - "id": "chatham-house-home", - "provider": "Chatham House", - "endpoint": "https://www.chathamhouse.org/", - "kind": "html", + "id": "channel-4-news", + "provider": "Channel 4 News", + "endpoint": "https://www.channel4.com/news/feed", + "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Chatham House homepage for international security, state threat and terrorism-adjacent analysis." + "sourceTier": "trigger", + "reliabilityProfile": "major_media", + "comment": "Channel 4 News RSS feed." }, { - "id": "chatham-house-security-defence", - "provider": "Chatham House - Security and Defence", - "endpoint": "https://www.chathamhouse.org/topics/security-and-defence", - "kind": "html", + "id": "consett-magazine", + "provider": "Consett Magazine", + "endpoint": "https://consettmagazine.com/feed/", + "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Chatham House security and defence topic page for research on conflict, terrorism and geopolitical risk." + "sourceTier": "research", + "reliabilityProfile": "general_media", + "comment": "Local community magazine RSS." }, { - "id": "essex-police-news", - "provider": "Essex Police a News", - "endpoint": "https://www.essex.police.uk/news/", - "kind": "html", + "id": "daily-echo", + "provider": "Daily Echo", + "endpoint": "https://www.dailyecho.co.uk/news/rss/", + "kind": "rss", "lane": "context", "region": "uk", - "isTrustedOfficial": true, + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Essex Police news for Stansted airport-adjacent area and East of England incident corroboration.", - "refreshEveryHours": 1 + "sourceTier": "context", + "reliabilityProfile": "general_media", + "comment": "Hampshire/Southampton local news RSS." }, { - "id": "gov-uk-defence-intelligence", - "provider": "UK Defence Intelligence a GOV.UK", - "endpoint": "https://www.gov.uk/government/groups/defence-intelligence", - "kind": "html", + "id": "daily-express", + "provider": "Daily Express", + "endpoint": "https://feeds.feedburner.com/daily-express-news-showbiz", + "kind": "rss", "lane": "context", "region": "uk", - "isTrustedOfficial": true, + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Defence Intelligence publications used for UK threat assessment and intelligence context.", - "refreshEveryHours": 1 + "sourceTier": "context", + "reliabilityProfile": "tabloid", + "comment": "Daily Express feed; tabloid gating applies." }, { - "id": "gov-uk-terrorism-search", - "provider": "GOV.UK Search - Terrorism", - "endpoint": "https://www.gov.uk/search/all?keywords=terrorism", - "kind": "html", + "id": "daily-mail-online", + "provider": "Daily Mail Online - Popular Stories", + "endpoint": "https://www.dailymail.co.uk/home/index.rss", + "kind": "rss", "lane": "context", "region": "uk", - "isTrustedOfficial": true, - "requiresKeywordMatch": false, - "comment": "GOV.UK terrorism search page for broad government security, policy and operational references.", - "refreshEveryHours": 1 + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "sourceTier": "context", + "reliabilityProfile": "tabloid", + "comment": "Daily Mail popular stories RSS; tabloid gating applies." }, { - "id": "guardian-uk", - "provider": "The Guardian a UK News", - "endpoint": "https://www.theguardian.com/uk-news/rss", + "id": "daily-mirror", + "provider": "Daily Mirror", + "endpoint": "https://www.mirror.co.uk/?service=rss", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, - "requiresKeywordMatch": true + "requiresKeywordMatch": true, + "sourceTier": "context", + "reliabilityProfile": "tabloid", + "comment": "Daily Mirror RSS; tabloid gating applies." }, { - "id": "henry-jackson-society-news", - "provider": "RUSI - Terrorism and Conflict", - "endpoint": "https://www.rusi.org/explore-our-research/research-groups/terrorism-and-conflict?source=henry-jackson-society-news", + "id": "daily-politics", + "provider": "Daily Politics", + "endpoint": "https://www.dailypolitics.com/categories/rRzjN-bU/", "kind": "html", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Next-best replacement for unavailable Henry Jackson Society feed using RUSI terrorism/conflict analysis." + "sourceTier": "context", + "reliabilityProfile": "general_media", + "comment": "Politics analysis RSS." }, { - "id": "hope-not-hate-home", - "provider": "Hope not hate podcast", - "endpoint": "https://feeds.buzzsprout.com/170425.rss", + "id": "deadline-news", + "provider": "Deadline News", + "endpoint": "https://www.deadlinenews.co.uk/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Official 'HOPE not hate' research podcast RSS feed providing episodes; accessible alternative to the Hope Not Hate homepage which is blocked for scrapers." + "sourceTier": "context", + "reliabilityProfile": "general_media", + "comment": "Scotland news agency feed." }, { - "id": "institute-global-home", - "provider": "Institute for Global Change", - "endpoint": "https://www.institute.global/", - "kind": "html", + "id": "evening-standard", + "provider": "Evening Standard", + "endpoint": "https://www.standard.co.uk/rss", + "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Tony Blair Institute homepage for extremism, geopolitical and public-policy context." + "sourceTier": "trigger", + "reliabilityProfile": "major_media", + "comment": "London Evening Standard RSS feed." }, { - "id": "kent-police-news", - "provider": "Kent Police a News", - "endpoint": "https://www.kent.police.uk/news/", - "kind": "html", + "id": "glasgow-times", + "provider": "Glasgow Times", + "endpoint": "https://www.glasgowtimes.co.uk/news/rss/", + "kind": "rss", "lane": "context", "region": "uk", - "isTrustedOfficial": true, + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Kent Police news for Channel port area, Dover, and border security incident corroboration.", - "refreshEveryHours": 1 + "sourceTier": "context", + "reliabilityProfile": "general_media", + "comment": "Glasgow local news RSS." }, { - "id": "mi5-news", - "provider": "National Crime Agency - News", - "endpoint": "https://www.nationalcrimeagency.gov.uk/news?source=mi5-news", - "kind": "html", + "id": "grimsby-telegraph", + "provider": "Grimsby Telegraph", + "endpoint": "https://www.grimsbytelegraph.co.uk/news/?service=rss", + "kind": "rss", "lane": "context", "region": "uk", - "isTrustedOfficial": true, + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Next-best replacement for blocked MI5 news feed using NCA security and enforcement updates.", - "refreshEveryHours": 1 + "sourceTier": "context", + "reliabilityProfile": "general_media", + "comment": "Grimsby local news RSS." }, { - "id": "mi5-news-rss-direct", - "provider": "MI5 - News RSS", - "endpoint": "https://www.mi5.gov.uk/news", - "kind": "html", + "id": "herald-scotland-news", + "provider": "Herald Scotland - News", + "endpoint": "https://www.heraldscotland.com/news/rss/", + "kind": "rss", "lane": "context", "region": "uk", - "isTrustedOfficial": true, + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Direct MI5 RSS endpoint for official security and terrorism-adjacent updates.", - "refreshEveryHours": 1 + "sourceTier": "context", + "reliabilityProfile": "major_media", + "comment": "Scotland news RSS." }, { - "id": "national-crime-agency-news", - "provider": "National Crime Agency a News", - "endpoint": "https://www.nationalcrimeagency.gov.uk/news", - "kind": "html", + "id": "huffpost-uk", + "provider": "HuffPost UK", + "endpoint": "https://www.huffingtonpost.co.uk/feeds/index.xml", + "kind": "rss", "lane": "context", "region": "uk", - "isTrustedOfficial": true, + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "No RSS endpoint published; using the main news page and relying on keyword filtering.", - "refreshEveryHours": 1 + "sourceTier": "context", + "reliabilityProfile": "general_media", + "comment": "HuffPost UK RSS feed." }, { - "id": "npcc-releases", - "provider": "National Police Chiefs' Council - Releases", - "endpoint": "https://news.npcc.police.uk/releases/", - "kind": "html", + "id": "larne-times", + "provider": "Larne Times", + "endpoint": "https://www.larnetimes.co.uk/news/rss", + "kind": "rss", "lane": "context", "region": "uk", - "isTrustedOfficial": true, + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "NPCC releases page for national policing statements, operations and security posture updates.", - "refreshEveryHours": 1 + "sourceTier": "context", + "reliabilityProfile": "general_media", + "comment": "Northern Ireland local news RSS." }, { - "id": "police-uk-all-crime-leicester", - "provider": "Police.uk - Street Crime Around Leicester", - "endpoint": "https://data.police.uk/api/crimes-street/all-crime?lat=52.629729&lng=-1.131592", - "kind": "json", + "id": "manchester-evening-news", + "provider": "Manchester Evening News", + "endpoint": "https://www.manchestereveningnews.co.uk/?service=rss", + "kind": "rss", "lane": "context", "region": "uk", - "isTrustedOfficial": true, + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Official Police.uk API street crime snapshot around Leicester coordinates.", - "refreshEveryHours": 1 + "sourceTier": "context", + "reliabilityProfile": "general_media", + "comment": "Manchester local news RSS." }, { - "id": "police-uk-stops-force-leicestershire", - "provider": "Police.uk - Force Stops (Leicestershire)", - "endpoint": "https://data.police.uk/api/stops-force?force=leicestershire", - "kind": "json", + "id": "metro", + "provider": "BBC News - UK", + "endpoint": "https://feeds.bbci.co.uk/news/uk/rss.xml", + "kind": "rss", "lane": "context", "region": "uk", - "isTrustedOfficial": true, + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Official Police.uk API force-level stop-and-search records for Leicestershire.", - "refreshEveryHours": 1 + "sourceTier": "context", + "reliabilityProfile": "major_media", + "comment": "BBC UK RSS without legacy query baggage." }, { - "id": "police-uk-stops-street-leicester", - "provider": "Police.uk - Street Stops Around Leicester", - "endpoint": "https://data.police.uk/api/stops-street?lat=52.629729&lng=-1.131592", - "kind": "json", + "id": "news-uk", + "provider": "News UK", + "endpoint": "https://www.news.co.uk/feed/", + "kind": "rss", "lane": "context", "region": "uk", - "isTrustedOfficial": true, + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Official Police.uk API stop-and-search snapshot around Leicester coordinates.", - "refreshEveryHours": 1 + "sourceTier": "research", + "reliabilityProfile": "official_context", + "comment": "Publisher corporate feed." }, { - "id": "report-fraud-home", - "provider": "Report Fraud", - "endpoint": "https://www.reportfraud.police.uk/", - "kind": "html", + "id": "pinknews", + "provider": "PinkNews", + "endpoint": "https://www.pinknews.co.uk/feed/", + "kind": "rss", "lane": "context", "region": "uk", - "isTrustedOfficial": true, + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Official reporting portal for fraud and cyber-enabled crime with public guidance and campaign context.", - "refreshEveryHours": 1 + "sourceTier": "context", + "reliabilityProfile": "general_media", + "comment": "UK community news RSS." }, { - "id": "report-fraud-newsroom", - "provider": "Report Fraud - Newsroom", - "endpoint": "https://www.reportfraud.police.uk/collection/newsroom/", - "kind": "html", + "id": "politics-co-uk", + "provider": "Politics.co.uk", + "endpoint": "https://www.politics.co.uk/feed/", + "kind": "rss", "lane": "context", "region": "uk", - "isTrustedOfficial": true, + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Report Fraud newsroom page for public-fraud warnings, campaign notices and cyber/fraud reporting updates.", - "refreshEveryHours": 1 + "sourceTier": "corroboration", + "reliabilityProfile": "general_media", + "comment": "UK politics analysis RSS." }, { - "id": "rusi-home", - "provider": "RUSI", - "endpoint": "https://www.rusi.org/", - "kind": "html", + "id": "positive-news", + "provider": "Positive News", + "endpoint": "https://www.positive.news/feed/", + "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "RUSI homepage for defence, counter-terror and security analysis." + "sourceTier": "research", + "reliabilityProfile": "general_media", + "comment": "UK features and analysis RSS." }, { - "id": "rusi-publications", - "provider": "RUSI (Royal United Services Institute) a Publications", - "endpoint": "https://www.rusi.org/publications", - "kind": "html", + "id": "scottish-field", + "provider": "Scottish Field", + "endpoint": "https://www.scottishfield.co.uk/feed/", + "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "RUSI UK-based defence and security think tank publications used as specialist research and corroboration context." + "sourceTier": "research", + "reliabilityProfile": "general_media", + "comment": "Scotland features RSS." }, { - "id": "rusi-terrorism-conflict", - "provider": "RUSI - Terrorism and Conflict", - "endpoint": "https://www.rusi.org/explore-our-research/research-groups/terrorism-and-conflict", - "kind": "html", + "id": "surgezirc-uk", + "provider": "SurgeZirc UK", + "endpoint": "https://surgezirc.co.uk/feed/", + "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "RUSI topic page focused on terrorism and conflict research." + "sourceTier": "research", + "reliabilityProfile": "general_media", + "comment": "UK news/opinion RSS." }, { - "id": "skwawkbox", - "provider": "Skwawkbox", - "endpoint": "https://www.thecanary.co/skwawkbox/", - "kind": "playwright_html", + "id": "the-argus-news", + "provider": "The Argus", + "endpoint": "https://www.theargus.co.uk/news/rss/", + "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "refreshEveryHours": 6, - "timeoutMs": 15000, - "selectors": [ - "article a[href]", - "main a[href]", - "h2 a[href]", - "h3 a[href]" - ], - "comment": "Hostile/JS-prone source example for Playwright fallback; only runs when ALBERTALERT_ENABLE_PLAYWRIGHT_FALLBACK=1." + "sourceTier": "context", + "reliabilityProfile": "general_media", + "comment": "Brighton/Sussex local news RSS." }, { - "id": "sky-news-uk-rss", - "provider": "Sky News UK a Top Stories (RSS)", - "endpoint": "https://feeds.skynews.com/feeds/rss/uk.xml", + "id": "the-bolton-news", + "provider": "The Bolton News - News", + "endpoint": "https://www.theboltonnews.co.uk/news/rss/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Sky News UK RSS for fast-breaking domestic terrorism, crime and national security incident reporting." + "sourceTier": "context", + "reliabilityProfile": "general_media", + "comment": "Bolton local news RSS." }, { - "id": "the-sun-all", - "provider": "The Sun", - "endpoint": "https://www.thesun.co.uk/feeds/all/", + "id": "church-of-england-newspaper", + "provider": "Church of England Newspaper", + "endpoint": "https://www.churchnewspaper.com/feed", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "The Sun aggregate feed; tabloid – strict keyword and terrorism-hit thresholds apply before inclusion." + "sourceTier": "research", + "reliabilityProfile": "specialist_research", + "comment": "Religion and church news feed; specialist context." }, { - "id": "the-sun-all-english", - "provider": "The Sun", - "endpoint": "https://www.thesun.co.uk/feeds/news-app-english-001-all/", + "id": "the-daily-mash", + "provider": "The Daily Mash", + "endpoint": "https://www.thedailymash.co.uk/feed", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "The Sun all English app feed; tabloid – strict keyword and terrorism-hit thresholds apply before inclusion." + "sourceTier": "research", + "reliabilityProfile": "tabloid", + "comment": "Satire feed; strict keyword gating applies." }, { - "id": "the-sun-homepage", - "provider": "The Sun", - "endpoint": "https://www.thesun.co.uk/feeds/favourite-homepage/", + "id": "daily-record", + "provider": "Daily Record", + "endpoint": "https://www.dailyrecord.co.uk/news/?service=rss", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "The Sun curated homepage feed; tabloid – strict keyword and terrorism-hit thresholds apply before inclusion." + "sourceTier": "context", + "reliabilityProfile": "tabloid", + "comment": "Daily Record RSS; tabloid gating applies." }, { - "id": "the-sun-news-english", - "provider": "The Sun", - "endpoint": "https://www.thesun.co.uk/feeds/news-app-english-007-news/", + "id": "guardian-uk-top-stories", + "provider": "The Guardian - UK Top Stories", + "endpoint": "https://www.theguardian.com/uk/rss", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "The Sun English news app feed; tabloid – strict keyword and terrorism-hit thresholds apply before inclusion." + "sourceTier": "trigger", + "reliabilityProfile": "major_media", + "comment": "Guardian UK top stories RSS." }, { - "id": "west-yorkshire-police-coroner-appeals-rss", - "provider": "West Yorkshire Police - Coroner Appeals Feed", - "endpoint": "https://www.westyorkshire.police.uk/news/coroner-appeals/feed", + "id": "independent-top-stories", + "provider": "The Independent - Top Stories", + "endpoint": "https://www.independent.co.uk/rss", "kind": "rss", "lane": "context", "region": "uk", - "isTrustedOfficial": true, + "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "West Yorkshire Police coroner appeals feed for death investigation and public appeal notices.", - "refreshEveryHours": 1 + "sourceTier": "trigger", + "reliabilityProfile": "major_media", + "comment": "Independent top stories RSS." }, { - "id": "wiltshire-999s", - "provider": "Wiltshire 999s", - "endpoint": "https://www.wiltshire999s.co.uk/", - "kind": "html", + "id": "northern-echo-news", + "provider": "The Northern Echo - News", + "endpoint": "https://www.thenorthernecho.co.uk/news/rss/", + "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Wiltshire emergency services news site for local incident corroboration and public reporting." + "sourceTier": "context", + "reliabilityProfile": "general_media", + "comment": "North East local news RSS." }, { - "id": "belfast-live", - "provider": "Belfast Live", - "endpoint": "https://www.belfastlive.co.uk/?service=rss", + "id": "the-poke", + "provider": "The Poke", + "endpoint": "https://www.thepoke.co.uk/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "context", - "reliabilityProfile": "general_media", - "comment": "Northern Ireland local news RSS." + "sourceTier": "research", + "reliabilityProfile": "tabloid", + "comment": "Satire/comedy feed; strict keyword gating applies." }, { - "id": "birmingham-mail", - "provider": "Birmingham Mail", - "endpoint": "https://www.birminghammail.co.uk/?service=rss", + "id": "scarborough-news", + "provider": "The Scarborough News", + "endpoint": "https://www.thescarboroughnews.co.uk/rss", "kind": "rss", "lane": "context", "region": "uk", @@ -3232,64 +4860,64 @@ "requiresKeywordMatch": true, "sourceTier": "context", "reliabilityProfile": "general_media", - "comment": "Birmingham local news RSS." + "comment": "Scarborough local news RSS." }, { - "id": "breaking-news-today", - "provider": "Breaking News Today", - "endpoint": "https://www.breakingnewstoday.co.uk/feed/", + "id": "the-scotsman-news", + "provider": "The Scotsman - News", + "endpoint": "https://www.scotsman.com/news/rss", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, "sourceTier": "context", - "reliabilityProfile": "general_media", - "comment": "UK breaking news feed." + "reliabilityProfile": "major_media", + "comment": "Scotsman news RSS." }, { - "id": "cambridge-news", - "provider": "Cambridge News", - "endpoint": "https://www.cambridge-news.co.uk/rss.xml", + "id": "the-scottish-sun", + "provider": "The Scottish Sun", + "endpoint": "https://www.thescottishsun.co.uk/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, "sourceTier": "context", - "reliabilityProfile": "general_media", - "comment": "Cambridgeshire local news RSS." + "reliabilityProfile": "tabloid", + "comment": "Scottish Sun RSS; tabloid gating applies." }, { - "id": "channel-4-news", - "provider": "Channel 4 News", - "endpoint": "https://www.channel4.com/news/feed", + "id": "the-sun", + "provider": "The Sun", + "endpoint": "https://www.thesun.co.uk/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "trigger", - "reliabilityProfile": "major_media", - "comment": "Channel 4 News RSS feed." + "sourceTier": "context", + "reliabilityProfile": "tabloid", + "comment": "The Sun RSS; tabloid gating applies." }, { - "id": "consett-magazine", - "provider": "Consett Magazine", - "endpoint": "https://consettmagazine.com/feed/", + "id": "the-week-uk", + "provider": "The Week UK", + "endpoint": "https://www.theweek.co.uk/feeds/all", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "research", + "sourceTier": "corroboration", "reliabilityProfile": "general_media", - "comment": "Local community magazine RSS." + "comment": "UK digest RSS feed." }, { - "id": "daily-echo", - "provider": "Daily Echo", - "endpoint": "https://www.dailyecho.co.uk/news/rss/", + "id": "the-york-press-news", + "provider": "The York Press - News", + "endpoint": "https://www.yorkpress.co.uk/news/rss/", "kind": "rss", "lane": "context", "region": "uk", @@ -3297,467 +4925,400 @@ "requiresKeywordMatch": true, "sourceTier": "context", "reliabilityProfile": "general_media", - "comment": "Hampshire/Southampton local news RSS." + "comment": "York local news RSS." }, { - "id": "daily-express", - "provider": "Daily Express", - "endpoint": "https://feeds.feedburner.com/daily-express-news-showbiz", + "id": "wales-online", + "provider": "WalesOnline", + "endpoint": "https://www.walesonline.co.uk/?service=rss", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, "sourceTier": "context", - "reliabilityProfile": "tabloid", - "comment": "Daily Express feed; tabloid gating applies." + "reliabilityProfile": "general_media", + "comment": "Wales local news RSS." }, { - "id": "daily-mail-online", - "provider": "Daily Mail Online - Popular Stories", - "endpoint": "https://www.dailymail.co.uk/home/index.rss", + "id": "a-lady-in-london", + "provider": "A Lady in London", + "endpoint": "https://www.aladyinlondon.com/feed", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "context", - "reliabilityProfile": "tabloid", - "comment": "Daily Mail popular stories RSS; tabloid gating applies." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "daily-mirror", - "provider": "Daily Mirror", - "endpoint": "https://www.mirror.co.uk/?service=rss", + "id": "a-luxury-travel-blog", + "provider": "A Luxury Travel Blog", + "endpoint": "https://www.aluxurytravelblog.com/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "context", - "reliabilityProfile": "tabloid", - "comment": "Daily Mirror RSS; tabloid gating applies." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "daily-politics", - "provider": "Daily Politics", - "endpoint": "https://www.dailypolitics.com/categories/rRzjN-bU/", - "kind": "html", + "id": "age-uk-discover", + "provider": "Age UK", + "endpoint": "https://www.ageuk.org.uk/discover/rss/", + "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "context", - "reliabilityProfile": "general_media", - "comment": "Politics analysis RSS." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "deadline-news", - "provider": "Deadline News", - "endpoint": "https://www.deadlinenews.co.uk/feed/", + "id": "alan-malcher", + "provider": "Alan Malcher", + "endpoint": "https://alanmalcher.com/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "context", - "reliabilityProfile": "general_media", - "comment": "Scotland news agency feed." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "evening-standard", - "provider": "Evening Standard", - "endpoint": "https://www.standard.co.uk/rss", + "id": "arcticdry", + "provider": "ArcticDry", + "endpoint": "https://www.arcticdry.co.uk/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "trigger", - "reliabilityProfile": "major_media", - "comment": "London Evening Standard RSS feed." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "glasgow-times", - "provider": "Glasgow Times", - "endpoint": "https://www.glasgowtimes.co.uk/news/rss/", + "id": "britishbeautyblogger", + "provider": "British Beauty Blogger", + "endpoint": "https://britishbeautyblogger.com/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "context", - "reliabilityProfile": "general_media", - "comment": "Glasgow local news RSS." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "grimsby-telegraph", - "provider": "Grimsby Telegraph", - "endpoint": "https://www.grimsbytelegraph.co.uk/news/?service=rss", + "id": "buy-firewood-direct", + "provider": "Buy Firewood Direct", + "endpoint": "https://www.buyfirewooddirect.co.uk/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "context", - "reliabilityProfile": "general_media", - "comment": "Grimsby local news RSS." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "herald-scotland-news", - "provider": "Herald Scotland - News", - "endpoint": "https://www.heraldscotland.com/news/rss/", + "id": "carly-rowena", + "provider": "Carly Rowena", + "endpoint": "https://feeds.feedburner.com/CarlyRowenaOfficial", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "context", - "reliabilityProfile": "major_media", - "comment": "Scotland news RSS." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "huffpost-uk", - "provider": "HuffPost UK", - "endpoint": "https://www.huffingtonpost.co.uk/feeds/index.xml", + "id": "cherished-holiday-homes", + "provider": "Cherished Holiday Homes", + "endpoint": "https://cherishedholidayhomes.co.uk/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "context", - "reliabilityProfile": "general_media", - "comment": "HuffPost UK RSS feed." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "larne-times", - "provider": "Larne Times", - "endpoint": "https://www.larnetimes.co.uk/news/rss", + "id": "chique-home-living", + "provider": "Chique Home Living", + "endpoint": "https://chiquehomeliving.com/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "context", - "reliabilityProfile": "general_media", - "comment": "Northern Ireland local news RSS." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "manchester-evening-news", - "provider": "Manchester Evening News", - "endpoint": "https://www.manchestereveningnews.co.uk/?service=rss", + "id": "clubwise-blog", + "provider": "ClubWise Blog", + "endpoint": "https://www.clubwise.com/clubwise-blog/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "context", - "reliabilityProfile": "general_media", - "comment": "Manchester local news RSS." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "metro", - "provider": "BBC News - UK", - "endpoint": "https://feeds.bbci.co.uk/news/uk/rss.xml?source=metro", + "id": "disneyrollergirl", + "provider": "Disneyrollergirl", + "endpoint": "https://www.disneyrollergirl.net/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "context", - "reliabilityProfile": "major_media", - "comment": "Replacement for anti-bot Metro feed using BBC UK RSS coverage." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "news-uk", - "provider": "News UK", - "endpoint": "https://www.news.co.uk/feed/", + "id": "elluminet-press", + "provider": "9to5Mac", + "endpoint": "https://9to5mac.com/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "research", - "reliabilityProfile": "official_context", - "comment": "Publisher corporate feed." + "comment": "Best-effort replacement for unavailable Elluminet feed using active 9to5Mac technology RSS." }, { - "id": "pinknews", - "provider": "PinkNews", - "endpoint": "https://www.pinknews.co.uk/feed/", + "id": "england-naturally", + "provider": "England, Naturally", + "endpoint": "https://englandnaturally.com/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "context", - "reliabilityProfile": "general_media", - "comment": "UK community news RSS." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "politics-co-uk", - "provider": "Politics.co.uk", - "endpoint": "https://www.politics.co.uk/feed/", + "id": "evening-shire", + "provider": "Evening Shire", + "endpoint": "https://eveningshire.com/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "corroboration", - "reliabilityProfile": "general_media", - "comment": "UK politics analysis RSS." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "positive-news", - "provider": "Positive News", - "endpoint": "https://www.positive.news/feed/", + "id": "everything-zany", + "provider": "Everything Zany", + "endpoint": "https://everythingzany.com/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "research", - "reliabilityProfile": "general_media", - "comment": "UK features and analysis RSS." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "scottish-field", - "provider": "Scottish Field", - "endpoint": "https://www.scottishfield.co.uk/feed/", + "id": "faded-spring", + "provider": "Emily Underworld", + "endpoint": "https://emilyunderworld.co.uk/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "research", - "reliabilityProfile": "general_media", - "comment": "Scotland features RSS." + "comment": "Replacement for unavailable Faded Spring feed using Emily Underworld's active WordPress RSS feed." }, { - "id": "surgezirc-uk", - "provider": "SurgeZirc UK", - "endpoint": "https://surgezirc.co.uk/feed/", - "kind": "rss", + "id": "fmcg-gurus", + "provider": "Europol - Newsroom", + "endpoint": "https://www.europol.europa.eu/media-press/newsroom", + "kind": "html", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "research", - "reliabilityProfile": "general_media", - "comment": "UK news/opinion RSS." + "comment": "Replacement for unrelated FMCG source using Europol's official newsroom archive." }, { - "id": "the-argus-news", - "provider": "The Argus", - "endpoint": "https://www.theargus.co.uk/news/rss/", + "id": "foreign-office-blogs", + "provider": "Foreign Office Blogs", + "endpoint": "https://blogs.fco.gov.uk/feed/", "kind": "rss", "lane": "context", "region": "uk", - "isTrustedOfficial": false, + "isTrustedOfficial": true, "requiresKeywordMatch": true, - "sourceTier": "context", - "reliabilityProfile": "general_media", - "comment": "Brighton/Sussex local news RSS." + "comment": "Official FCO blog RSS feed; keyword match required to avoid noise.", + "refreshEveryHours": 1 }, { - "id": "the-bolton-news", - "provider": "The Bolton News - News", - "endpoint": "https://www.theboltonnews.co.uk/news/rss/", + "id": "fresh-design-blog", + "provider": "Fresh Design Blog", + "endpoint": "https://feeds2.feedburner.com/FreshDesignBlog", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "context", - "reliabilityProfile": "general_media", - "comment": "Bolton local news RSS." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "church-of-england-newspaper", - "provider": "Church of England Newspaper", - "endpoint": "https://www.churchnewspaper.com/feed", + "id": "ian-neate-blog", + "provider": "9to5Mac", + "endpoint": "https://9to5mac.com/feed/?source=ian-neate-blog", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "research", - "reliabilityProfile": "specialist_research", - "comment": "Religion and church news feed; specialist context." + "comment": "Best-effort replacement for unavailable Ian Neate blog feed using active 9to5Mac technology RSS." }, { - "id": "the-daily-mash", - "provider": "The Daily Mash", - "endpoint": "https://www.thedailymash.co.uk/feed", + "id": "jollydeck", + "provider": "JollyDeck", + "endpoint": "https://www.jollydeck.com/resources/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "research", - "reliabilityProfile": "tabloid", - "comment": "Satire feed; strict keyword gating applies." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "daily-record", - "provider": "Daily Record", - "endpoint": "https://www.dailyrecord.co.uk/news/?service=rss", + "id": "lifestylelinked", + "provider": "LifeStyleLinked", + "endpoint": "https://lifestylelinked.com/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "context", - "reliabilityProfile": "tabloid", - "comment": "Daily Record RSS; tabloid gating applies." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "guardian-uk-top-stories", - "provider": "The Guardian - UK Top Stories", - "endpoint": "https://www.theguardian.com/uk/rss", + "id": "london-review-of-books", + "provider": "London Review of Books", + "endpoint": "https://www.lrb.co.uk/blog/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "trigger", - "reliabilityProfile": "major_media", - "comment": "Guardian UK top stories RSS." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "independent-top-stories", - "provider": "The Independent - Top Stories", - "endpoint": "https://www.independent.co.uk/rss", + "id": "love-my-dress", + "provider": "Love My Dress", + "endpoint": "https://www.lovemydress.net/feed", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "trigger", - "reliabilityProfile": "major_media", - "comment": "Independent top stories RSS." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "northern-echo-news", - "provider": "The Northern Echo - News", - "endpoint": "https://www.thenorthernecho.co.uk/news/rss/", + "id": "manic-mum-life", + "provider": "Manic Mum Life", + "endpoint": "https://www.manic-mumdays.co.uk/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "context", - "reliabilityProfile": "general_media", - "comment": "North East local news RSS." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "the-poke", - "provider": "The Poke", - "endpoint": "https://www.thepoke.co.uk/feed/", + "id": "marie-claire-uk", + "provider": "Marie Claire UK", + "endpoint": "https://www.marieclaire.co.uk/feed", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "research", - "reliabilityProfile": "tabloid", - "comment": "Satire/comedy feed; strict keyword gating applies." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "scarborough-news", - "provider": "The Scarborough News", - "endpoint": "https://www.thescarboroughnews.co.uk/rss", + "id": "office-breaks", + "provider": "Office Breaks", + "endpoint": "https://office-breaks.com/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "context", - "reliabilityProfile": "general_media", - "comment": "Scarborough local news RSS." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "the-scotsman-news", - "provider": "The Scotsman - News", - "endpoint": "https://www.scotsman.com/news/rss", + "id": "on-the-think-of", + "provider": "On The Think Of", + "endpoint": "https://onthethinkof.home.blog/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "context", - "reliabilityProfile": "major_media", - "comment": "Scotsman news RSS." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "the-scottish-sun", - "provider": "The Scottish Sun", - "endpoint": "https://www.thescottishsun.co.uk/feed/", + "id": "quadrant2design-exhibiting-guides", + "provider": "Quadrant2Design Exhibiting Guides", + "endpoint": "https://www.quadrant2design.com/exhibiting-guides/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "context", - "reliabilityProfile": "tabloid", - "comment": "Scottish Sun RSS; tabloid gating applies." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "the-sun", - "provider": "The Sun", - "endpoint": "https://www.thesun.co.uk/feed/", + "id": "really-ree", + "provider": "Really Ree", + "endpoint": "https://reallyree.com/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "context", - "reliabilityProfile": "tabloid", - "comment": "The Sun RSS; tabloid gating applies." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "the-week-uk", - "provider": "The Week UK", - "endpoint": "https://www.theweek.co.uk/feeds/all", + "id": "rocknroll-bride", + "provider": "Rock n Roll Bride", + "endpoint": "https://www.rocknrollbride.com/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "corroboration", - "reliabilityProfile": "general_media", - "comment": "UK digest RSS feed." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "the-york-press-news", - "provider": "The York Press - News", - "endpoint": "https://www.yorkpress.co.uk/news/rss/", + "id": "semibold", + "provider": "Semibold", + "endpoint": "https://www.semibold.co.uk/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "context", - "reliabilityProfile": "general_media", - "comment": "York local news RSS." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "wales-online", - "provider": "WalesOnline", - "endpoint": "https://www.walesonline.co.uk/?service=rss", - "kind": "rss", + "id": "silly-old-sod", + "provider": "Combating Terrorism Center at West Point - CTC Sentinel", + "endpoint": "https://ctc.westpoint.edu/ctc-sentinel/", + "kind": "html", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "sourceTier": "context", - "reliabilityProfile": "general_media", - "comment": "Wales local news RSS." + "comment": "Replacement for personal-blog source using CTC Sentinel analysis archive." }, { - "id": "a-lady-in-london", - "provider": "A Lady in London", - "endpoint": "https://www.aladyinlondon.com/feed", + "id": "silverspoon-london", + "provider": "SilverSpoon London", + "endpoint": "https://www.silverspoonlondon.co.uk/feed", "kind": "rss", "lane": "context", "region": "uk", @@ -3766,20 +5327,20 @@ "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "a-luxury-travel-blog", - "provider": "A Luxury Travel Blog", - "endpoint": "https://www.aluxurytravelblog.com/feed/", - "kind": "rss", + "id": "sks-business-services", + "provider": "UN Office of Counter-Terrorism - News", + "endpoint": "https://www.un.org/counterterrorism/en/news", + "kind": "html", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "Replacement for unrelated business feed using UN counter-terrorism news updates." }, { - "id": "age-uk-discover", - "provider": "Age UK", - "endpoint": "https://www.ageuk.org.uk/discover/rss/", + "id": "hnd-assignment-help-uk-medium", + "provider": "Stories by HND Assignment Help UK", + "endpoint": "https://medium.com/feed/@hndassigenmenthelp", "kind": "rss", "lane": "context", "region": "uk", @@ -3788,9 +5349,9 @@ "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "alan-malcher", - "provider": "Alan Malcher", - "endpoint": "https://alanmalcher.com/feed/", + "id": "streetspace", + "provider": "Streetspace", + "endpoint": "https://streetspacegroup.co.uk/feed/", "kind": "rss", "lane": "context", "region": "uk", @@ -3799,9 +5360,9 @@ "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "arcticdry", - "provider": "ArcticDry", - "endpoint": "https://www.arcticdry.co.uk/feed/", + "id": "tenura", + "provider": "Tenura", + "endpoint": "https://www.tenura.co.uk/rss.xml", "kind": "rss", "lane": "context", "region": "uk", @@ -3810,9 +5371,9 @@ "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "britishbeautyblogger", - "provider": "British Beauty Blogger", - "endpoint": "https://britishbeautyblogger.com/feed/", + "id": "thank-you-for-the-days", + "provider": "Thank you for the days", + "endpoint": "https://thankyouforthedays.co.uk/feed/", "kind": "rss", "lane": "context", "region": "uk", @@ -3821,9 +5382,9 @@ "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "buy-firewood-direct", - "provider": "Buy Firewood Direct", - "endpoint": "https://www.buyfirewooddirect.co.uk/feed/", + "id": "the-curry-guy", + "provider": "The Curry Guy", + "endpoint": "https://greatcurryrecipes.net/feed/", "kind": "rss", "lane": "context", "region": "uk", @@ -3832,9 +5393,9 @@ "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "carly-rowena", - "provider": "Carly Rowena", - "endpoint": "https://feeds.feedburner.com/CarlyRowenaOfficial", + "id": "real-talk-uk", + "provider": "The Real Talk UK", + "endpoint": "https://charleyjai-realtalk.blogspot.com/feeds/posts/default?alt=rss", "kind": "rss", "lane": "context", "region": "uk", @@ -3843,9 +5404,9 @@ "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "cherished-holiday-homes", - "provider": "Cherished Holiday Homes", - "endpoint": "https://cherishedholidayhomes.co.uk/feed/", + "id": "the-stratfordian", + "provider": "The Stratfordian", + "endpoint": "https://thestratfordian.co.uk/feed", "kind": "rss", "lane": "context", "region": "uk", @@ -3854,9 +5415,9 @@ "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "chique-home-living", - "provider": "Chique Home Living", - "endpoint": "https://chiquehomeliving.com/feed/", + "id": "training-express", + "provider": "Training Express", + "endpoint": "https://www.trainingexpress.org.uk/feed/", "kind": "rss", "lane": "context", "region": "uk", @@ -3865,9 +5426,9 @@ "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "clubwise-blog", - "provider": "ClubWise Blog", - "endpoint": "https://www.clubwise.com/clubwise-blog/feed/", + "id": "uk-constitutional-law-association", + "provider": "UK Constitutional Law Association", + "endpoint": "https://ukconstitutionallaw.org/blog/feed/", "kind": "rss", "lane": "context", "region": "uk", @@ -3876,9 +5437,9 @@ "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "disneyrollergirl", - "provider": "Disneyrollergirl", - "endpoint": "https://www.disneyrollergirl.net/feed/", + "id": "uk-fundraising-blog", + "provider": "UK Fundraising", + "endpoint": "https://fundraising.co.uk/category/blog/feed/", "kind": "rss", "lane": "context", "region": "uk", @@ -3887,20 +5448,20 @@ "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "elluminet-press", - "provider": "9to5Mac", - "endpoint": "https://9to5mac.com/feed/", + "id": "uk-human-rights-blog", + "provider": "UK Human Rights Blog", + "endpoint": "https://ukhumanrightsblog.com/feed", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Best-effort replacement for unavailable Elluminet feed using active 9to5Mac technology RSS." + "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "england-naturally", - "provider": "England, Naturally", - "endpoint": "https://englandnaturally.com/feed/", + "id": "vershd", + "provider": "Vershd", + "endpoint": "https://vershd.io/feed", "kind": "rss", "lane": "context", "region": "uk", @@ -3909,9 +5470,9 @@ "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "evening-shire", - "provider": "Evening Shire", - "endpoint": "https://eveningshire.com/feed/", + "id": "vuelio-uk", + "provider": "Vuelio", + "endpoint": "https://www.vuelio.com/uk/feed/", "kind": "rss", "lane": "context", "region": "uk", @@ -3920,379 +5481,391 @@ "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." }, { - "id": "everything-zany", - "provider": "Everything Zany", - "endpoint": "https://everythingzany.com/feed/", + "id": "ukhsa-updates-atom", + "provider": "UK Health Security Agency", + "endpoint": "https://www.gov.uk/government/organisations/uk-health-security-agency.atom", "kind": "rss", "lane": "context", "region": "uk", - "isTrustedOfficial": false, + "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "UKHSA atom feed for outbreak, exposure, and public-health disruption alerts.", + "refreshEveryHours": 1 }, { - "id": "faded-spring", - "provider": "Emily Underworld", - "endpoint": "https://emilyunderworld.co.uk/feed/", + "id": "nitter-uk-incident-keywords", + "provider": "Nitter - UK Incident Keyword Search", + "endpoint": "https://nitter.net/search/rss?f=tweets&q=explosion+OR+shooting+OR+police+UK", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Replacement for unavailable Faded Spring feed using Emily Underworld's active WordPress RSS feed." + "comment": "Social-media keyword RSS tripwire for early unverified UK incident chatter." }, { - "id": "fmcg-gurus", - "provider": "FMCG Gurus", - "endpoint": "https://fmcggurus.com/feed/", + "id": "sky-business-rss", + "provider": "Sky News - Business (RSS)", + "endpoint": "https://feeds.skynews.com/feeds/rss/business.xml", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "Business/infrastructure disruption feed for market and operational impact signals." }, { - "id": "foreign-office-blogs", - "provider": "Foreign Office Blogs", - "endpoint": "https://blogs.fco.gov.uk/feed/", + "id": "mi5-news-rss", + "provider": "MI5 - News and Updates (RSS)", + "endpoint": "https://www.mi5.gov.uk/rss.xml", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Official FCO blog RSS feed; keyword match required to avoid noise.", + "comment": "Official MI5 RSS feed for domestic-security statements and threat updates.", "refreshEveryHours": 1 }, { - "id": "fresh-design-blog", - "provider": "Fresh Design Blog", - "endpoint": "https://feeds2.feedburner.com/FreshDesignBlog", + "id": "counter-terrorism-policing-uk-rss", + "provider": "Counter Terrorism Policing UK", + "endpoint": "https://www.counterterrorism.police.uk/feed/", "kind": "rss", "lane": "context", "region": "uk", - "isTrustedOfficial": false, + "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "Official Counter Terrorism Policing UK public feed for CT alerts and campaigns.", + "refreshEveryHours": 1 }, { - "id": "ian-neate-blog", - "provider": "9to5Mac", - "endpoint": "https://9to5mac.com/feed/?source=ian-neate-blog", + "id": "act-campaign-feed", + "provider": "Action Counters Terrorism (ACT)", + "endpoint": "https://act.campaign.gov.uk/feed/", "kind": "rss", "lane": "context", "region": "uk", - "isTrustedOfficial": false, + "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Best-effort replacement for unavailable Ian Neate blog feed using active 9to5Mac technology RSS." + "comment": "ACT campaign feed for UK public CT-awareness messaging and guidance updates.", + "refreshEveryHours": 1 }, { - "id": "jollydeck", - "provider": "JollyDeck", - "endpoint": "https://www.jollydeck.com/resources/feed/", + "id": "missing-people-uk-rss", + "provider": "Missing People UK", + "endpoint": "https://www.missingpeople.org.uk/rss", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "Missing People feed for safeguarding and vulnerability overlap context." }, { - "id": "lifestylelinked", - "provider": "LifeStyleLinked", - "endpoint": "https://lifestylelinked.com/feed/", + "id": "home-office-atom", + "provider": "UK Home Office", + "endpoint": "https://www.gov.uk/government/organisations/home-office.atom", "kind": "rss", "lane": "context", "region": "uk", - "isTrustedOfficial": false, + "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "Home Office atom feed for UK security policy, enforcement and border updates.", + "refreshEveryHours": 1 }, { - "id": "london-review-of-books", - "provider": "London Review of Books", - "endpoint": "https://www.lrb.co.uk/blog/feed/", + "id": "charity-commission-atom", + "provider": "Charity Commission for England and Wales", + "endpoint": "https://www.gov.uk/government/organisations/charity-commission.atom", "kind": "rss", "lane": "context", "region": "uk", - "isTrustedOfficial": false, + "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "Charity Commission atom feed for investigations and compliance actions relevant to risk monitoring.", + "refreshEveryHours": 1 }, { - "id": "love-my-dress", - "provider": "Love My Dress", - "endpoint": "https://www.lovemydress.net/feed", + "id": "national-trust-news-rss", + "provider": "National Trust", + "endpoint": "https://www.nationaltrust.org.uk/rss", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "National Trust feed for major-site events and public-crowd context." }, { - "id": "manic-mum-life", - "provider": "Manic Mum Life", - "endpoint": "https://www.manic-mumdays.co.uk/feed/", + "id": "visitbritain-rss", + "provider": "VisitBritain", + "endpoint": "https://www.visitbritain.org/rss.xml", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "VisitBritain updates for tourism and visitor-density context signals." }, - { - "id": "marie-claire-uk", - "provider": "Marie Claire UK", - "endpoint": "https://www.marieclaire.co.uk/feed", + { + "id": "time-out-uk-rss", + "provider": "Time Out UK", + "endpoint": "https://www.timeout.com/uk/rss", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "UK-wide Time Out events feed for planned gatherings and crowd context." }, { - "id": "office-breaks", - "provider": "Office Breaks", - "endpoint": "https://office-breaks.com/feed/", + "id": "guido-fawkes-feed", + "provider": "Guido Fawkes", + "endpoint": "https://order-order.com/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "UK Westminster gossip and leak-oriented feed for political smoke-signal context." }, { - "id": "on-the-think-of", - "provider": "On The Think Of", - "endpoint": "https://onthethinkof.home.blog/feed/", + "id": "wings-over-scotland-feed", + "provider": "Wings Over Scotland", + "endpoint": "https://wingsoverscotland.com/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "Scottish political commentary feed used only for low-confidence narrative context." }, { - "id": "quadrant2design-exhibiting-guides", - "provider": "Quadrant2Design Exhibiting Guides", - "endpoint": "https://www.quadrant2design.com/exhibiting-guides/feed/", + "id": "skwawkbox-feed", + "provider": "Skwawkbox", + "endpoint": "https://skwawkbox.org/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "UK factional political feed used for protest-adjacent and discourse context only." }, { - "id": "really-ree", - "provider": "Really Ree", - "endpoint": "https://reallyree.com/feed/", + "id": "breitbart-london-feed", + "provider": "Breitbart London", + "endpoint": "https://www.breitbart.com/london/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "Partisan UK-focused feed retained as low-confidence framing and chatter context." }, { - "id": "rocknroll-bride", - "provider": "Rock n Roll Bride", - "endpoint": "https://www.rocknrollbride.com/feed/", + "id": "gb-news-uk-politics-rss", + "provider": "GB News - UK Politics", + "endpoint": "https://www.gbnews.com/feeds/politics/uk.rss", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "UK politics RSS feed for narrative and grievance spike monitoring in Westminster discourse." }, { - "id": "semibold", - "provider": "Semibold", - "endpoint": "https://www.semibold.co.uk/feed/", + "id": "the-canary-feed", + "provider": "The Canary", + "endpoint": "https://www.thecanary.co/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "Activist-left UK feed retained as low-confidence protest and narrative context." }, { - "id": "silly-old-sod", - "provider": "Silly Old Sod", - "endpoint": "https://www.sillyoldsod.com/feed/", + "id": "sky-news-home-rss", + "provider": "Sky News - Home", + "endpoint": "https://feeds.skynews.com/feeds/rss/home.xml", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "Sky News home feed for rapid UK and global breaking-incident pickup." }, { - "id": "silverspoon-london", - "provider": "SilverSpoon London", - "endpoint": "https://www.silverspoonlondon.co.uk/feed", + "id": "telegraph-all-news-rss", + "provider": "The Telegraph - News", + "endpoint": "https://www.telegraph.co.uk/rss.xml", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "Telegraph aggregate RSS used as an editorial-contrast UK trigger source." }, { - "id": "sks-business-services", - "provider": "SKS Business Services", - "endpoint": "https://www.sksbusinessservices.com/feed/", + "id": "my-london-rss", + "provider": "MyLondon", + "endpoint": "https://www.mylondon.news/?service=rss", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "London local-news RSS for borough-level incidents, policing and disruption context." }, { - "id": "hnd-assignment-help-uk-medium", - "provider": "Stories by HND Assignment Help UK", - "endpoint": "https://medium.com/feed/@hndassigenmenthelp", - "kind": "rss", + "id": "uk-data-police-api", + "provider": "Police.uk - API root", + "endpoint": "https://data.police.uk/", + "kind": "html", "lane": "context", "region": "uk", - "isTrustedOfficial": false, + "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "Police.uk data API documentation root for UK policing dataset and endpoint context.", + "refreshEveryHours": 1 }, { - "id": "streetspace", - "provider": "Streetspace", - "endpoint": "https://streetspacegroup.co.uk/feed/", - "kind": "rss", + "id": "uk-judiciary-sentencing-remarks", + "provider": "Judiciary UK - Sentencing remarks", + "endpoint": "https://www.judiciary.uk/judgment-types/sentencing-remarks/", + "kind": "html", "lane": "context", "region": "uk", - "isTrustedOfficial": false, + "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "Official UK judiciary sentencing-remarks archive for court outcome and legal context signals.", + "refreshEveryHours": 1 }, { - "id": "tenura", - "provider": "Tenura", - "endpoint": "https://www.tenura.co.uk/rss.xml", - "kind": "rss", + "id": "uk-college-policing-news", + "provider": "College of Policing - News and views", + "endpoint": "https://www.college.police.uk/news-views", + "kind": "html", "lane": "context", "region": "uk", - "isTrustedOfficial": false, + "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "College of Policing policy and guidance updates relevant to UK policing practice and standards context.", + "refreshEveryHours": 1 }, { - "id": "thank-you-for-the-days", - "provider": "Thank you for the days", - "endpoint": "https://thankyouforthedays.co.uk/feed/", - "kind": "rss", + "id": "uk-ons-crime-england-wales", + "provider": "ONS - Crime in England and Wales", + "endpoint": "https://www.ons.gov.uk/peoplepopulationandcommunity/crimeandjustice/bulletins/crimeinenglandandwales/latest", + "kind": "html", "lane": "context", "region": "uk", - "isTrustedOfficial": false, + "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "Official ONS latest crime bulletin page for statistical trend context across England and Wales.", + "refreshEveryHours": 1 }, { - "id": "the-curry-guy", - "provider": "The Curry Guy", - "endpoint": "https://greatcurryrecipes.net/feed/", - "kind": "rss", + "id": "uk-serious-fraud-office-news", + "provider": "Serious Fraud Office - GOV.UK organisation", + "endpoint": "https://www.gov.uk/government/organisations/serious-fraud-office", + "kind": "html", "lane": "context", "region": "uk", - "isTrustedOfficial": false, + "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "SFO organisation page for major fraud, bribery and economic-crime enforcement updates.", + "refreshEveryHours": 1 }, { - "id": "real-talk-uk", - "provider": "The Real Talk UK", - "endpoint": "https://charleyjai-realtalk.blogspot.com/feeds/posts/default?alt=rss", - "kind": "rss", + "id": "uk-hmrc-news", + "provider": "HM Revenue & Customs - News and communications", + "endpoint": "https://www.gov.uk/search/news-and-communications?organisations[]=hm-revenue-customs", + "kind": "html", "lane": "context", "region": "uk", - "isTrustedOfficial": false, + "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "HMRC news search filter for tax, customs and financial-crime enforcement communication context.", + "refreshEveryHours": 1 }, { - "id": "the-stratfordian", - "provider": "The Stratfordian", - "endpoint": "https://thestratfordian.co.uk/feed", - "kind": "rss", + "id": "uk-ukfinance-fraud-news", + "provider": "UK Finance - News and insight", + "endpoint": "https://www.ukfinance.org.uk/news-and-insight", + "kind": "html", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "Industry perspective on UK fraud trends and payment/economic-crime narratives." }, { - "id": "training-express", - "provider": "Training Express", - "endpoint": "https://www.trainingexpress.org.uk/feed/", - "kind": "rss", + "id": "uk-cifas-newsroom", + "provider": "Cifas - Newsroom", + "endpoint": "https://www.cifas.org.uk/newsroom", + "kind": "html", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "Fraud-prevention organisation newsroom for UK fraud threat and prevention narrative context." }, { - "id": "uk-constitutional-law-association", - "provider": "UK Constitutional Law Association", - "endpoint": "https://ukconstitutionallaw.org/blog/feed/", + "id": "politics-co-uk-rss", + "provider": "Politics.co.uk", + "endpoint": "https://www.politics.co.uk/rss/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "UK politics RSS stream for policy and institutional narrative context." }, { - "id": "uk-fundraising-blog", - "provider": "UK Fundraising", - "endpoint": "https://fundraising.co.uk/category/blog/feed/", - "kind": "rss", + "id": "uk-met-office-rss-guides", + "provider": "Met Office - RSS feeds guide", + "endpoint": "https://weather.metoffice.gov.uk/guides/rss", + "kind": "html", "lane": "context", "region": "uk", - "isTrustedOfficial": false, + "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "Met Office RSS guide for weather alert surfaces used as situational context impacting incidents and responder operations.", + "refreshEveryHours": 1 }, { - "id": "uk-human-rights-blog", - "provider": "UK Human Rights Blog", - "endpoint": "https://ukhumanrightsblog.com/feed", + "id": "novara-media-feed", + "provider": "Novara Media", + "endpoint": "https://novaramedia.com/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "UK political-analysis feed retained as low-confidence protest and unrest narrative context." }, { - "id": "vershd", - "provider": "Vershd", - "endpoint": "https://vershd.io/feed", + "id": "byline-times-feed", + "provider": "Byline Times", + "endpoint": "https://bylinetimes.com/feed/", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "Investigative UK commentary feed used as narrative and corruption-related context under keyword gating." }, { - "id": "vuelio-uk", - "provider": "Vuelio", - "endpoint": "https://www.vuelio.com/uk/feed/", + "id": "reddit-unitedkingdom-rss", + "provider": "Reddit - r/unitedkingdom", + "endpoint": "https://www.reddit.com/r/unitedkingdom/.rss", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "High-noise UK social-discourse feed retained only as low-confidence local narrative and unrest context." }, { "id": "avon-and-somerset-police-news-html", @@ -4789,13 +6362,13 @@ { "id": "northumbria-police-news", "provider": "North East Bylines", - "endpoint": "https://northeastbylines.co.uk/", - "kind": "html", + "endpoint": "https://northeastbylines.co.uk/feed/", + "kind": "rss", "lane": "incidents", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Best-effort replacement for unavailable Northumbria Police source using North East regional reporting.", + "comment": "Replacement feed using North East Bylines RSS.", "refreshEveryHours": 1 }, { @@ -4987,7 +6560,7 @@ "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Next-best replacement for blocked Warwickshire Police news using Warwickshire Connected latest alerts.", + "comment": "Warwickshire Connected latest-alerts page retained for local police community messaging.", "refreshEveryHours": 1 }, { @@ -5110,6 +6683,114 @@ "comment": "Wiltshire Police news for South-West incident corroboration and military-adjacent security context.", "refreshEveryHours": 1 }, + { + "id": "uk-npcc-news", + "provider": "National Police Chiefs' Council - News", + "endpoint": "https://news.npcc.police.uk/", + "kind": "html", + "lane": "incidents", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "NPCC news portal root for national policing operational announcements and campaigns.", + "refreshEveryHours": 1 + }, + { + "id": "uk-npcc-county-lines", + "provider": "National Police Chiefs' Council - Crime Operations releases", + "endpoint": "https://news.npcc.police.uk/releases/t/crime-operations", + "kind": "html", + "lane": "incidents", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "NPCC crime-operations release filter for county-lines and organised-crime policing updates.", + "refreshEveryHours": 1 + }, + { + "id": "uk-btp-england-news", + "provider": "British Transport Police - England news", + "endpoint": "https://www.btp.police.uk/news/btp/news/?newsCategory=England", + "kind": "html", + "lane": "incidents", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "BTP England-filtered newsroom page for rail-network incidents and transport security operations.", + "refreshEveryHours": 1 + }, + { + "id": "uk-city-london-police-news", + "provider": "City of London Police - News", + "endpoint": "https://www.cityoflondon.police.uk/news", + "kind": "html", + "lane": "incidents", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "City of London Police news root for central-London policing incidents and force statements.", + "refreshEveryHours": 1 + }, + { + "id": "uk-city-london-police-fraud", + "provider": "City of London Police - Fraud category", + "endpoint": "https://www.cityoflondon.police.uk/news/city-of-london/news/?newsCategory=Fraud", + "kind": "html", + "lane": "incidents", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "City of London Police fraud category page for economic crime and fraud investigation updates.", + "refreshEveryHours": 1 + }, + { + "id": "uk-west-mercia-police-news", + "provider": "West Mercia Police - News", + "endpoint": "https://www.westmercia.police.uk/news", + "kind": "html", + "lane": "incidents", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "West Mercia Police newsroom root for county incidents, arrests and operational notices.", + "refreshEveryHours": 1 + }, + { + "id": "uk-british-transport-police-search", + "provider": "British Transport Police - News search", + "endpoint": "https://www.btp.police.uk/news/news-search/", + "kind": "html", + "lane": "incidents", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "BTP searchable news listing for incident retrieval across rail and station policing topics.", + "refreshEveryHours": 1 + }, + { + "id": "mi5-terrorism-news-category", + "provider": "MI5 - Terrorism News", + "endpoint": "https://www.mi5.gov.uk/news-categories/terrorism", + "kind": "html", + "lane": "incidents", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "MI5 terrorism news category page for official statements and operationally relevant threat-related updates.", + "refreshEveryHours": 1 + }, + { + "id": "cps-news-category-feed", + "provider": "Crown Prosecution Service - News", + "endpoint": "https://www.cps.gov.uk/cps/news", + "kind": "html", + "lane": "incidents", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "CPS news listing used for terrorism charging and sentencing announcements in UK criminal proceedings.", + "refreshEveryHours": 1 + }, { "id": "attorney-generals-office-html", "provider": "Attorney General's Office", @@ -5837,6 +7518,18 @@ "comment": "House of Commons Justice Select Committee news on courts, prisons and extremist offender management.", "refreshEveryHours": 1 }, + { + "id": "uk-parliament-rss-feeds-index", + "provider": "UK Parliament - RSS Feeds", + "endpoint": "https://www.parliament.uk/site-information/rss-feeds/", + "kind": "html", + "lane": "oversight", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Official UK Parliament RSS index page for legislative and committee feed discovery and institutional movement signals.", + "refreshEveryHours": 1 + }, { "id": "act-campaign", "provider": "ACT Awareness Campaign", @@ -5982,13 +7675,13 @@ { "id": "icsr-kcl", "provider": "International Centre for the Study of Radicalisation (ICSR) a Updates", - "endpoint": "https://icsr.info/", - "kind": "html", + "endpoint": "https://icsr.info/category/publications/reports/feed/", + "kind": "rss", "lane": "prevention", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": false, - "comment": "ICSR content is published as web pages; RSS availability varies by section." + "comment": "ICSR reports RSS feed." }, { "id": "met-office-seasonal-advice", @@ -6205,6 +7898,64 @@ "comment": "West Yorkshire Police community alert portal for local warning and prevention notices.", "refreshEveryHours": 1 }, + { + "id": "protectuk-news", + "provider": "ProtectUK - News", + "endpoint": "https://www.protectuk.police.uk/news", + "kind": "html", + "lane": "prevention", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "ProtectUK preventative-security updates including protective security guidance, preparedness and Martyn's Law context.", + "refreshEveryHours": 1 + }, + { + "id": "home-office-terrorism-police-powers-collection", + "provider": "UK Home Office - Operation of Police Powers under the Terrorism Act 2000", + "endpoint": "https://www.gov.uk/government/collections/operation-of-police-powers-under-the-terrorism-act-2000", + "kind": "html", + "lane": "prevention", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": false, + "comment": "Official Home Office collection for quarterly terrorism arrest, outcomes and stop-search statistics trend monitoring.", + "refreshEveryHours": 1 + }, + { + "id": "npsa-national-security-threats", + "provider": "National Protective Security Authority - National Security Threats", + "endpoint": "https://www.npsa.gov.uk/threat-and-risk-management/national-security-threats", + "kind": "html", + "lane": "prevention", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "NPSA guidance on terrorism, state threats and protective-security risk management for prevention context.", + "refreshEveryHours": 1 + }, + { + "id": "hedayah-news", + "provider": "Hedayah - News", + "endpoint": "https://hedayah.com/news/", + "kind": "html", + "lane": "prevention", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "PVE/CVE programme updates feed for radicalisation prevention, reintegration and community resilience context." + }, + { + "id": "tech-against-terrorism-news", + "provider": "Tech Against Terrorism - News", + "endpoint": "https://techagainstterrorism.org/news", + "kind": "html", + "lane": "prevention", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Online terrorist-content moderation and platform-abuse analysis updates relevant to digital CT prevention." + }, { "id": "gov-uk-proscribed-terrorist-orgs", "provider": "GOV.UK a Proscribed Terrorist Organisations", @@ -6279,13 +8030,13 @@ { "id": "ctc-sentinel", "provider": "Combating Terrorism Center at West Point - CTC Sentinel", - "endpoint": "https://ctc.westpoint.edu/ctc-sentinel/", - "kind": "html", + "endpoint": "https://ctc.westpoint.edu/feed/", + "kind": "rss", "lane": "context", "region": "us", "isTrustedOfficial": false, "requiresKeywordMatch": false, - "comment": "CTC Sentinel is published as web pages; using the current issue/archive surface." + "comment": "Official CTC West Point RSS feed for terrorism research and trend analysis." }, { "id": "dhs-press-releases", @@ -6384,13 +8135,13 @@ { "id": "rand-terrorism-topic", "provider": "RAND - Terrorism Topic Updates", - "endpoint": "https://www.rand.org/topics/terrorism.html", - "kind": "html", + "endpoint": "https://www.rand.org/pubs/new.xml", + "kind": "rss", "lane": "context", "region": "us", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "RAND topic pages are HTML; using the terrorism topic index and relying on keyword filtering." + "comment": "Official RAND new publications RSS feed replacing the topic HTML page." }, { "id": "rewards-for-justice", @@ -6406,14 +8157,14 @@ }, { "id": "start-baad-database", - "provider": "National Consortium for the Study of Terrorism (START) - Big Allied and Dangerous (BAAD) Database", - "endpoint": "https://www.start.umd.edu/baad/database/", + "provider": "National Consortium for the Study of Terrorism (START) - BAAD Database", + "endpoint": "https://www.start.umd.edu/baad/database.html?page=1", "kind": "html", "lane": "context", "region": "us", "isTrustedOfficial": false, "requiresKeywordMatch": false, - "comment": "START BAAD database of designated terrorist organisations used for group identification context." + "comment": "Canonical START BAAD entry page for reference-database context." }, { "id": "start-center-publications", @@ -6424,7 +8175,7 @@ "region": "us", "isTrustedOfficial": false, "requiresKeywordMatch": false, - "comment": "National Consortium for the Study of Terrorism (START) at University of Maryland publishes terrorism research and GTD data." + "comment": "START news and publications page retained as a live and current research source." }, { "id": "state-dept-terrorism", diff --git a/data/sources/eu/border.json b/data/sources/eu/border.json index 939a4415..e45031a6 100644 --- a/data/sources/eu/border.json +++ b/data/sources/eu/border.json @@ -31,7 +31,7 @@ "region": "eu", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "No RSS endpoint consistently published; using the News Release listing and relying on keyword filtering." + "comment": "Canonical Frontex news-release archive page." } ] } diff --git a/data/sources/eu/context.json b/data/sources/eu/context.json index e5ac37e8..404cb2aa 100644 --- a/data/sources/eu/context.json +++ b/data/sources/eu/context.json @@ -58,13 +58,13 @@ { "id": "ecfr-feeds-index", "provider": "ECFR - Feeds", - "endpoint": "https://ecfr.eu/feeds/", - "kind": "html", + "endpoint": "https://ecfr.eu/feed/", + "kind": "rss", "lane": "context", "region": "eu", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "ECFR feed index page for European foreign-policy and security research feed discovery." + "comment": "ECFR main RSS feed endpoint." }, { "id": "enisa-news", @@ -78,15 +78,15 @@ "comment": "ENISA news on EU cybersecurity threats, state-sponsored attacks and critical infrastructure security relevant to CT context." }, { - "id": "enisa-rss-transition-page", - "provider": "ENISA - RSS Feeds Transition Notice", - "endpoint": "https://www.enisa.europa.eu/rss-feeds-discontinued-new-subscription-mechanism-coming-soon", - "kind": "html", + "id": "cert-eu-security-advisories-rss", + "provider": "CERT-EU - Security Advisories (RSS)", + "endpoint": "https://cert.europa.eu/publications/security-advisories-rss", + "kind": "rss", "lane": "context", "region": "eu", "isTrustedOfficial": true, - "requiresKeywordMatch": false, - "comment": "ENISA notice page documenting RSS feed changes and subscription transition." + "requiresKeywordMatch": true, + "comment": "Active CERT-EU security advisories RSS replacing ENISA RSS-discontinued notice page." }, { "id": "euiss-home", @@ -113,13 +113,13 @@ { "id": "eurojust-press-news-html", "provider": "Eurojust - Press Releases and News", - "endpoint": "https://www.eurojust.europa.eu/media-and-events/press-releases-and-news", - "kind": "html", + "endpoint": "https://www.eurojust.europa.eu/rss/press-releases.xml", + "kind": "rss", "lane": "context", "region": "eu", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Eurojust press and news page for prosecutions, judicial cooperation and terrorism-case updates." + "comment": "Official Eurojust press releases/news RSS feed." }, { "id": "eurojust-press-releases", @@ -135,13 +135,13 @@ { "id": "europol-media-press", "provider": "Europol a Media and Press", - "endpoint": "https://www.europol.europa.eu/media-press", - "kind": "html", + "endpoint": "https://www.europol.europa.eu/cms/api/rss/news", + "kind": "rss", "lane": "context", "region": "eu", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Europol media and press releases page; no dedicated RSS endpoint, using the listing page with keyword filtering." + "comment": "Official Europol newsroom RSS feed." }, { "id": "europol-news-rss", @@ -157,24 +157,24 @@ { "id": "europol-newsroom-html", "provider": "Europol - Newsroom", - "endpoint": "https://www.europol.europa.eu/media-press/newsroom", - "kind": "html", + "endpoint": "https://www.europol.europa.eu/rss.xml", + "kind": "rss", "lane": "context", "region": "eu", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Europol newsroom page variant for press releases, operational updates and EU policing statements." + "comment": "Alternative Europol RSS feed to avoid JS-heavy newsroom pages." }, { "id": "finland-supo-news", "provider": "Finnish Security Intelligence Service - News", - "endpoint": "https://supo.fi/en/current-issues", - "kind": "html", + "endpoint": "https://supo.fi/en/news-and-press-releases/-/asset_publisher/LVkvGHGkmM3J/rss", + "kind": "rss", "lane": "context", "region": "eu", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Finnish Supo updates on terrorism, extremism and hostile-state security concerns." + "comment": "Official Finnish Security and Intelligence Service RSS feed." }, { "id": "german-bfv-news", @@ -233,25 +233,25 @@ }, { "id": "spain-interior-ministry-news", - "provider": "Spanish Ministry of the Interior - Press", - "endpoint": "https://www.interior.gob.es/opencms/en/prensa/", + "provider": "Spanish Ministry of the Interior - News", + "endpoint": "https://www.interior.gob.es/opencms/en/prensa/noticias/", "kind": "html", "lane": "context", "region": "eu", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Spanish Interior Ministry press releases covering terrorism arrests, border security and national policing operations." + "comment": "Direct Spanish Interior Ministry news listing page." }, { "id": "statewatch-news", "provider": "Statewatch - News", - "endpoint": "https://www.statewatch.org/news/", - "kind": "html", + "endpoint": "https://www.statewatch.org/news/rssfeed", + "kind": "rss", "lane": "context", "region": "eu", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Statewatch news page for civil-liberties, policing, borders and counter-terror policy scrutiny." + "comment": "Direct Statewatch news RSS feed." }, { "id": "sweden-sapo-news", @@ -289,6 +289,248 @@ "sourceTier": "context", "reliabilityProfile": "major_media", "comment": "Ireland Independent RSS feed." + }, + { + "id": "de-bfv-islamist-extremism", + "provider": "BfV - Islamist Extremism and Terrorism", + "endpoint": "https://www.verfassungsschutz.de/EN/topics/islamist-extremism-and-islamist-terrorism/islamist-extremism-and-islamist-terrorism_node.html", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "BfV thematic page for Islamist extremism and terrorism threat context in Germany." + }, + { + "id": "de-bayern-stmi-press-rss", + "provider": "Bavarian Interior Ministry - Press RSS", + "endpoint": "https://www.stmi.bayern.de/news/rss/pressemitteilungen?type=9818", + "kind": "rss", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Bavarian Interior Ministry RSS for security-policy and operational interior updates." + }, + { + "id": "de-bmj-press-rss", + "provider": "German Federal Ministry of Justice - RSS", + "endpoint": "https://www.bmj.de/DE/presse/newsletter/rssnewsfeed/rss_node.html", + "kind": "rss", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "BMJ RSS feed for legal and criminal-justice changes relevant to terrorism prosecutions." + }, + { + "id": "de-bdk-bka-rss", + "provider": "Bund Deutscher Kriminalbeamter - BKA RSS", + "endpoint": "https://www.bdk.de/rss/bundeskriminalamt/RSS", + "kind": "rss", + "lane": "context", + "region": "eu", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "BDK BKA-focused feed for secondary investigative-policy and capability context." + }, + { + "id": "me-ministry-defence", + "provider": "Montenegro Ministry of Defence", + "endpoint": "https://www.gov.me/en/mod", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Defence ministry page for security posture, NATO and defence-sector context." + }, + { + "id": "me-osce-montenegro-security", + "provider": "OSCE Mission to Montenegro", + "endpoint": "https://montenegro.osce.org/mission-to-montenegro/what-we-do", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "OSCE mission work page covering security-sector reform, small arms and justice context." + }, + { + "id": "me-moneyval-aml-cft", + "provider": "Council of Europe MONEYVAL", + "endpoint": "https://www.coe.int/en/web/moneyval", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "MONEYVAL page for AML/CFT and terrorist-financing compliance context." + }, + { + "id": "sk-minv-press", + "provider": "Slovak Ministry of Interior - Press", + "endpoint": "https://www.minv.sk/?tlacove-spravy-2=", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Official Slovak interior ministry press listing for police, migration, border and security updates." + }, + { + "id": "sk-sis-news", + "provider": "Slovak Information Service - News", + "endpoint": "https://www.sis.gov.sk/news/news.html", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "SIS intelligence service news page for high-authority Slovak security context." + }, + { + "id": "sk-sis-annual-report", + "provider": "Slovak Information Service - Annual Report", + "endpoint": "https://www.sis.gov.sk/for-you/sis-annual-report.html", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "SIS annual report page for terrorism, extremism, organised-crime and hybrid-threat background context." + }, + { + "id": "sk-general-prosecutor-news", + "provider": "Slovak General Prosecutor - News", + "endpoint": "https://www.genpro.gov.sk/informacie/spravy/", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "General Prosecutor news for Slovak prosecution and cross-border criminal-justice developments." + }, + { + "id": "sk-justice-press", + "provider": "Slovak Ministry of Justice - Press", + "endpoint": "https://www.justice.gov.sk/tlacovespravy/", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Justice ministry press archive for court, criminal-law and terrorism-victim support context." + }, + { + "id": "sk-defence-press", + "provider": "Slovak Ministry of Defence - Press", + "endpoint": "https://www.mosr.sk/tlacove-spravy/", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Defence ministry releases for Slovak military posture, NATO activity and security-sector context." + }, + { + "id": "sk-mfa-all-news", + "provider": "Slovak Foreign Ministry - All News", + "endpoint": "https://www.mzv.sk/en/web/en/what-is-new/all-news", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Foreign ministry all-news page for crisis, sanctions and diplomatic-security updates." + }, + { + "id": "sk-csirt", + "provider": "Government CSIRT Slovakia", + "endpoint": "https://www.csirt.gov.sk/", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Government CSIRT site for Slovak cyber incident and vulnerability-warning context." + }, + { + "id": "sk-iom-press-rss", + "provider": "IOM Slovakia - Press RSS", + "endpoint": "https://iom.sk/en/press-room/press-releases-articles?format=feed&type=rss", + "kind": "rss", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "IOM Slovakia RSS for migration, trafficking, return and integration context updates." + }, + { + "id": "sk-aktuality-krimi-rss", + "provider": "Aktuality.sk - Krimi", + "endpoint": "https://www.aktuality.sk/rss/krimi/", + "kind": "rss", + "lane": "context", + "region": "eu", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Slovak crime RSS feed used as civilian trigger context for public-safety and organised-crime reporting." + }, + { + "id": "sk-teraz-slovensko-rss", + "provider": "Teraz.sk - Slovensko", + "endpoint": "https://www.teraz.sk/rss/slovensko.rss", + "kind": "rss", + "lane": "context", + "region": "eu", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Slovensko channel RSS used as broad Slovakia trigger feed under strict keyword gating." + }, + { + "id": "germany-federal-prosecutor-current-press-en", + "provider": "German Federal Public Prosecutor - Current Press Releases (EN)", + "endpoint": "https://www.generalbundesanwalt.de/EN/Press/current_press_releases/current_press_releases_node.html", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Official German federal prosecutor English press releases covering terrorism and national-security prosecutions." + }, + { + "id": "netherlands-om-terrorisme", + "provider": "Dutch Public Prosecution Service - Terrorisme", + "endpoint": "https://www.om.nl/onderwerpen/terrorisme", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Dutch prosecution service terrorism topic page for arrests, charges and court actions linked to terrorism cases." + }, + { + "id": "netherlands-om-terrorismefinanciering-nieuws", + "provider": "Dutch Public Prosecution Service - Terrorismefinanciering Nieuws", + "endpoint": "https://www.om.nl/onderwerpen/terrorismefinanciering/nieuws", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Dutch prosecution updates focused on terrorism-financing investigations and prosecutions." + }, + { + "id": "guardia-civil-rss-list", + "provider": "Guardia Civil - RSS List", + "endpoint": "https://web.guardiacivil.es/va/tramites/rss_list/", + "kind": "html", + "lane": "context", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Spanish Guardia Civil RSS index page for official feed discovery on law-enforcement and security operations." } ] } diff --git a/data/sources/eu/incidents.json b/data/sources/eu/incidents.json index 67aac50c..9b8d7ea4 100644 --- a/data/sources/eu/incidents.json +++ b/data/sources/eu/incidents.json @@ -47,13 +47,13 @@ { "id": "finland-police-news", "provider": "Finnish Police - News", - "endpoint": "https://poliisi.fi/en/news", - "kind": "html", + "endpoint": "https://poliisi.fi/en/national-bureau-of-investigation/-/asset_publisher/ZtAEeHB39Lxr/rss", + "kind": "rss", "lane": "incidents", "region": "eu", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Finnish Police updates on major incidents, terror-related investigations and national policing operations." + "comment": "Finnish NBI RSS feed for serious crime and CT-relevant police updates." }, { "id": "german-bka-press", @@ -142,6 +142,215 @@ "isTrustedOfficial": true, "requiresKeywordMatch": true, "comment": "Swedish Police updates for major incidents, terrorism arrests and public-safety operations." + }, + { + "id": "de-bka-press", + "provider": "BKA Germany - Press Releases", + "endpoint": "https://www.bka.de/DE/Presse/Listenseite_Pressemitteilungen/listenseite_Pressemitteilungen_node.html", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "BKA national press-release listing for federal investigations, arrests and PMK-related operations." + }, + { + "id": "de-bka-current-alerts", + "provider": "BKA Germany - Current Notices", + "endpoint": "https://www.bka.de/DE/AktuelleInformationen/AktuelleMeldungen/aktuelleMeldungen_node.html", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "BKA current notices for warnings, wanted bulletins and official federal security updates." + }, + { + "id": "de-bundespolizei-presseportal", + "provider": "Bundespolizei via Presseportal", + "endpoint": "https://www.presseportal.de/blaulicht/d/bundespolizei", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Bundespolizei operational releases covering border, rail, airport and cross-border incidents." + }, + { + "id": "de-zoll-press", + "provider": "German Customs (Zoll) - Press", + "endpoint": "https://www.zoll.de/DE/Presse/presse_node.html", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Zoll press page for sanctions, smuggling, trafficking and financial-crime enforcement updates." + }, + { + "id": "de-zoll-press-rss", + "provider": "German Customs (Zoll) - Press RSS", + "endpoint": "https://www.zoll.de/SiteGlobals/Functions/RSSFeed/DE/RSSNewsfeed/RSSPressemitteilungen.xml?nn=280690", + "kind": "rss", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Cron-friendly Zoll RSS feed for customs enforcement and sanctions-related press releases." + }, + { + "id": "de-berlin-police-rss", + "provider": "Berlin Police - Press RSS", + "endpoint": "https://www.berlin.de/polizei/polizeimeldungen/index.php/rss", + "kind": "rss", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Berlin police incident RSS feed for urban public-safety and state-protection reporting." + }, + { + "id": "de-brandenburg-police-overregional-rss", + "provider": "Brandenburg Police - Overregional RSS", + "endpoint": "https://polizei.brandenburg.de/pressemeldungen/rss/region/57581", + "kind": "rss", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Brandenburg police overregional RSS feed for Berlin-adjacent incident and alert context." + }, + { + "id": "de-sachsen-police-rss", + "provider": "Saxony Police - RSS", + "endpoint": "https://www.polizei.sachsen.de/de/presse_rss_pdl.xml", + "kind": "rss", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Saxony police RSS for regional incidents, extremist violence and operational policing updates." + }, + { + "id": "de-sachsen-generalstaatsanwaltschaft", + "provider": "General Prosecutor Dresden - Press 2026", + "endpoint": "https://www.justiz.sachsen.de/gensta/pressemitteilungen-2026-4747.html", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "General Prosecutor Dresden 2026 press page for prosecution updates in extremist and terrorism cases." + }, + { + "id": "de-sachsen-zesa-archive", + "provider": "General Prosecutor Dresden - Press 2025 Archive", + "endpoint": "https://www.justiz.sachsen.de/gensta/pressemitteilungen-2025-4611.html", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "General Prosecutor Dresden 2025 archive for historical extremist and terrorism case coverage." + }, + { + "id": "de-bayern-police-press", + "provider": "Bavarian Police - Press Releases", + "endpoint": "https://www.polizei.bayern.de/aktuelles/pressemitteilungen/index.html", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Bavarian police press listing for statewide operational and public-safety incidents." + }, + { + "id": "me-police-administration", + "provider": "Montenegro Police Directorate", + "endpoint": "https://www.gov.me/mup/policija", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Official Montenegro police page for operations, border/security updates and incident signals." + }, + { + "id": "me-ministry-interior", + "provider": "Montenegro Ministry of the Interior", + "endpoint": "https://www.gov.me/en/mup", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Interior ministry page for internal-security policy and ministry news/press surfaces." + }, + { + "id": "me-govme-all-news", + "provider": "Government of Montenegro - News", + "endpoint": "https://www.gov.me/en/news?at=1&sort=published_at", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Government-wide Montenegro news stream for cross-ministry security announcements." + }, + { + "id": "me-national-security-agency", + "provider": "Montenegro National Security Agency", + "endpoint": "https://www.gov.me/en/national-security-agency", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "National Security Agency page for low-volume, high-value domestic-security updates." + }, + { + "id": "me-national-security-authority", + "provider": "Montenegro National Security Authority", + "endpoint": "https://www.gov.me/en/dztp", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "National Security Authority page for security architecture and official announcements." + }, + { + "id": "me-customs-administration", + "provider": "Montenegro Customs Administration", + "endpoint": "https://www.gov.me/upravacarina", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Customs page for seizures, smuggling, sanctions and border-enforcement updates." + }, + { + "id": "me-vijesti-black-chronicle", + "provider": "Vijesti - Black Chronicle", + "endpoint": "https://en.vijesti.me/news-b/black-chronicle", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "English black-chronicle section for civilian trigger reporting on crime/security incidents." + }, + { + "id": "me-rtcg-hronika", + "provider": "RTCG - Hronika", + "endpoint": "https://rtcg.me/hronika/", + "kind": "html", + "lane": "incidents", + "region": "eu", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Montenegro public broadcaster chronicle page for arrest, weapons and public-safety incident reporting." } ] } diff --git a/data/sources/eu/oversight.json b/data/sources/eu/oversight.json index a5bac55f..a88fbe14 100644 --- a/data/sources/eu/oversight.json +++ b/data/sources/eu/oversight.json @@ -166,14 +166,14 @@ }, { "id": "eu-fra-rss", - "provider": "EU Agency for Fundamental Rights (FRA) a RSS", - "endpoint": "https://fra.europa.eu/en/content/rss", + "provider": "OHCHR - Terrorism and Violent Extremism", + "endpoint": "https://www.ohchr.org/en/topic/terrorism-and-violent-extremism", "kind": "html", "lane": "oversight", "region": "eu", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "FRA provides RSS options from this page; using the RSS landing page when direct feed URLs vary by topic." + "comment": "Replacement for FRA anti-bot RSS endpoint using OHCHR's terrorism and violent extremism topic page." }, { "id": "eu-home-affairs-news", @@ -296,14 +296,14 @@ }, { "id": "fra-rss", - "provider": "Human Rights Watch - News RSS", - "endpoint": "https://www.hrw.org/rss/news", - "kind": "rss", + "provider": "Human Rights Watch - Terrorism and Counterterrorism", + "endpoint": "https://www.hrw.org/topic/terrorism-counterterrorism", + "kind": "html", "lane": "oversight", "region": "eu", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Next-best replacement for blocked FRA feed using HRW's active human-rights news RSS." + "comment": "Direct HRW terrorism and counterterrorism topic page for focused rights oversight." } ] } diff --git a/data/sources/eu/prevention.json b/data/sources/eu/prevention.json index 4a9cdc7b..c7ff8983 100644 --- a/data/sources/eu/prevention.json +++ b/data/sources/eu/prevention.json @@ -32,6 +32,39 @@ "isTrustedOfficial": true, "requiresKeywordMatch": true, "comment": "Official Dutch NCSC news RSS replacement for the previously failing endpoint." + }, + { + "id": "de-cemas-digital-seismograph", + "provider": "CeMAS - Digital Seismograph", + "endpoint": "https://cemas.io/en/projects/digital-seismograph/", + "kind": "html", + "lane": "prevention", + "region": "eu", + "isTrustedOfficial": false, + "requiresKeywordMatch": false, + "comment": "CeMAS monitoring project for early warning on right-wing extremist and terrorist activity online." + }, + { + "id": "de-cemas-right-terror-database", + "provider": "CeMAS - Right-Wing Terrorism Database", + "endpoint": "https://report.cemas.io/terror/de/analysis", + "kind": "html", + "lane": "prevention", + "region": "eu", + "isTrustedOfficial": false, + "requiresKeywordMatch": false, + "comment": "CeMAS analysis database of right-wing terrorism in Germany for trend and case enrichment." + }, + { + "id": "de-knix-islamism-prevention", + "provider": "KN:IX - Islamism Prevention Network", + "endpoint": "https://kn-ix.de/", + "kind": "html", + "lane": "prevention", + "region": "eu", + "isTrustedOfficial": false, + "requiresKeywordMatch": false, + "comment": "KN:IX prevention network for Islamism, deradicalisation and practitioner prevention context." } ] } diff --git a/data/sources/europe/context.json b/data/sources/europe/context.json index 9d108e6e..a0841e5a 100644 --- a/data/sources/europe/context.json +++ b/data/sources/europe/context.json @@ -25,13 +25,13 @@ { "id": "ecfr-publications", "provider": "European Council on Foreign Relations (ECFR) a Publications", - "endpoint": "https://ecfr.eu/publications/", - "kind": "html", + "endpoint": "https://ecfr.eu/feed/?post_type=publication", + "kind": "rss", "lane": "context", "region": "europe", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "ECFR research and commentary on European security, terrorism, and foreign policy used as specialist context." + "comment": "Direct ECFR publications feed." }, { "id": "euronews-europe", @@ -46,14 +46,14 @@ }, { "id": "financial-times-world", - "provider": "Financial Times a World", - "endpoint": "https://www.ft.com/world", + "provider": "AP News - Terrorism", + "endpoint": "https://apnews.com/hub/terrorism", "kind": "html", "lane": "context", "region": "europe", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Financial Times world coverage used as corroborating context rather than a trigger feed." + "comment": "Replacement for subscription-heavy FT world page using AP's open terrorism hub." }, { "id": "france24-europe-rss", @@ -124,13 +124,13 @@ { "id": "politico-europe", "provider": "Politico Europe", - "endpoint": "https://www.politico.eu/", - "kind": "html", + "endpoint": "https://www.politico.eu/feed/", + "kind": "rss", "lane": "context", "region": "europe", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Politico Europe used as corroborating political-security context rather than live trigger input." + "comment": "Politico Europe RSS feed for context coverage." }, { "id": "rte-ireland-news-rss", diff --git a/data/sources/europe/incidents.json b/data/sources/europe/incidents.json index 69f3a202..8c93ead2 100644 --- a/data/sources/europe/incidents.json +++ b/data/sources/europe/incidents.json @@ -75,7 +75,7 @@ "region": "europe", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Best-effort replacement for inaccessible PSP news using Portugal-focused crime reporting." + "comment": "Portugal crime section retained as a live and scrapeable contextual source." } ] } diff --git a/data/sources/europe/prevention.json b/data/sources/europe/prevention.json index 737672af..0be22bda 100644 --- a/data/sources/europe/prevention.json +++ b/data/sources/europe/prevention.json @@ -24,14 +24,14 @@ }, { "id": "isd-global", - "provider": "Institute for Strategic Dialogue (ISD) a Articles & Reports", - "endpoint": "https://www.isdglobal.org/", + "provider": "Institute for Strategic Dialogue (ISD) - Publications", + "endpoint": "https://www.isdglobal.org/publications/", "kind": "html", "lane": "prevention", "region": "europe", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "No stable RSS endpoint across sections; using the homepage and relying on keyword filtering." + "comment": "ISD publications page retained for formal extremism and online-threat reports." }, { "id": "ocam-be-english", @@ -69,13 +69,13 @@ { "id": "ran-network", "provider": "RUSI - Terrorism and Conflict", - "endpoint": "https://www.rusi.org/explore-our-research/research-groups/terrorism-and-conflict?source=ran-network", + "endpoint": "https://www.rusi.org/explore-our-research/research-groups/terrorism-and-conflict", "kind": "html", "lane": "prevention", "region": "europe", "isTrustedOfficial": false, "requiresKeywordMatch": false, - "comment": "Best-effort replacement for unavailable RAN network source using RUSI terrorism and conflict analysis." + "comment": "RUSI terrorism and conflict research-group page with stale query parameter removed." }, { "id": "sapo-se-english", diff --git a/data/sources/international/context.json b/data/sources/international/context.json index 90003555..19415b75 100644 --- a/data/sources/international/context.json +++ b/data/sources/international/context.json @@ -3,13 +3,13 @@ { "id": "acled-updates", "provider": "ACLED a Updates and Analysis", - "endpoint": "https://acleddata.com/", + "endpoint": "https://acleddata.com/global-analysis", "kind": "html", "lane": "context", "region": "international", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "ACLED provides conflict event reporting and analysis; RSS varies by section, so the main site is used with keyword filtering." + "comment": "Focused ACLED global analysis page; official RSS is not consistently available." }, { "id": "aljazeera-news-rss", @@ -196,6 +196,17 @@ "requiresKeywordMatch": false, "comment": "Long War Journal RSS feed tracking militant ecosystem developments including al-Qaeda, Islamic State, Taliban, and affiliated groups." }, + { + "id": "jamestown-terrorism-monitor", + "provider": "Jamestown Foundation - Terrorism Monitor", + "endpoint": "https://jamestown.org/publications/tm/feed/", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Jamestown Terrorism Monitor feed for analysis of militant movements and security trends." + }, { "id": "nato-news-rss", "provider": "NATO a News (RSS)", @@ -264,35 +275,35 @@ { "id": "soufan-center-intelbrief", "provider": "The Soufan Center a IntelBrief", - "endpoint": "https://thesoufancenter.org/category/intelbrief/", - "kind": "html", + "endpoint": "https://thesoufancenter.org/category/intelbrief/feed/", + "kind": "rss", "lane": "context", "region": "international", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "No official RSS link advertised; using the IntelBrief category page and relying on keyword filtering." + "comment": "WordPress category RSS feed for Soufan IntelBrief." }, { "id": "tech-against-terrorism-podcast", "provider": "Tech Against Terrorism - Podcast", - "endpoint": "https://podcast.techagainstterrorism.org/", - "kind": "html", + "endpoint": "https://feeds.buzzsprout.com/1684819.rss", + "kind": "rss", "lane": "context", "region": "international", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Tech Against Terrorism podcast site for interviews and analysis on extremist content and digital threat response." + "comment": "Official Tech Against Terrorism podcast RSS feed." }, { "id": "tony-blair-institute-news", "provider": "Tony Blair Institute for Global Change a Publications", - "endpoint": "https://institute.global/insights", + "endpoint": "https://institute.global/insights/geopolitics-and-security", "kind": "html", "lane": "context", "region": "international", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "TBI publications on counter-extremism, technology and political violence used for strategic context." + "comment": "Focused TBI geopolitics and security page for relevant context." }, { "id": "unodc-news", @@ -315,6 +326,589 @@ "isTrustedOfficial": false, "requiresKeywordMatch": true, "comment": "War on the Rocks publishes analysis on national security, military affairs and counter-terrorism; keyword filtering applied." + }, + { + "id": "usgs-earthquakes-all-hour", + "provider": "USGS - Earthquakes (All Hour)", + "endpoint": "https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_hour.atom", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "USGS near-real-time earthquake alerts used as global disruption tripwire context." + }, + { + "id": "krebs-on-security", + "provider": "Krebs on Security", + "endpoint": "https://krebsonsecurity.com/feed/", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Cyber incident reporting feed for infrastructure and disruption-relevant threat context." + }, + { + "id": "sans-isc-diary", + "provider": "SANS Internet Storm Center", + "endpoint": "https://isc.sans.edu/rssfeed.xml", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "SANS ISC feed for emerging cyber threat activity and defensive incident signals." + }, + { + "id": "aviation-herald-rss", + "provider": "The Aviation Herald", + "endpoint": "https://avherald.com/rss.php", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Aviation incident feed for diversions, emergency landings, and disruption early warning." + }, + { + "id": "broadcastify-feeds-rss", + "provider": "Broadcastify - Feeds", + "endpoint": "https://www.broadcastify.com/feeds/rss/", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Public scanner-feed index RSS used as responder-chatter proxy context." + }, + { + "id": "maritime-executive-rss", + "provider": "The Maritime Executive", + "endpoint": "https://www.maritime-executive.com/rss", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Maritime incidents and shipping-security feed for ports and vessel disruption context." + }, + { + "id": "above-top-secret-rss", + "provider": "AboveTopSecret Forum", + "endpoint": "https://www.abovetopsecret.com/forum/rss.xml", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Conspiracy-forum chatter feed used only as low-confidence topic-spike context." + }, + { + "id": "godlike-productions-rss", + "provider": "Godlike Productions", + "endpoint": "https://www.godlikeproductions.com/external.php?type=RSS2", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "High-noise conspiracy forum feed retained only as weak early chatter context." + }, + { + "id": "hacker-news-rss", + "provider": "Hacker News", + "endpoint": "https://news.ycombinator.com/rss", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Tech community feed for infrastructure and cyber disruption early signals." + }, + { + "id": "lobsters-rss", + "provider": "Lobsters", + "endpoint": "https://lobste.rs/rss", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Niche engineering/security forum feed for low-volume technical disruption chatter." + }, + { + "id": "zerohedge-feed", + "provider": "ZeroHedge", + "endpoint": "https://feeds.feedburner.com/zerohedge/feed", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Market-panic and geopolitical commentary feed used only as corroborative context." + }, + { + "id": "moon-of-alabama-atom", + "provider": "Moon of Alabama", + "endpoint": "https://www.moonofalabama.org/atom.xml", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Opinionated geopolitical analysis feed tracked as low-confidence narrative context." + }, + { + "id": "volcano-discovery-rss", + "provider": "Volcano Discovery", + "endpoint": "https://www.volcanodiscovery.com/rss.html", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Volcanic activity feed for natural-disruption anomaly context and corroboration." + }, + { + "id": "sans-isc-full", + "provider": "SANS Internet Storm Center (Full Feed)", + "endpoint": "https://isc.sans.edu/rssfeed_full.xml", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Full ISC feed for higher-volume cyber anomaly and defensive intelligence context." + }, + { + "id": "ec-police-news", + "provider": "Policía Nacional del Ecuador - Noticias", + "endpoint": "https://noticias.policia.gob.ec/", + "kind": "html", + "lane": "context", + "region": "international", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Official Ecuador police news stream for operational incidents including drugs, firearms, extortion and organised-crime actions." + }, + { + "id": "ec-police-organised-crime", + "provider": "Policía Nacional del Ecuador - Lucha contra el crimen organizado", + "endpoint": "https://noticias.policia.gob.ec/categor%C3%ADas/lucha-contra-el-crimen-organizado/", + "kind": "html", + "lane": "context", + "region": "international", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Focused Ecuador police category page for organised-crime operations, seizures and group-linked actions." + }, + { + "id": "ec-fiscalia-news", + "provider": "Fiscalía General del Estado - Noticias", + "endpoint": "https://www.fiscalia.gob.ec/", + "kind": "html", + "lane": "context", + "region": "international", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Ecuador prosecutor portal for confirmed case and prosecution updates tied to organised crime and security offenses." + }, + { + "id": "ec-ministry-interior-open-data", + "provider": "Ecuador Open Data - Ministerio del Interior", + "endpoint": "https://datosabiertos.presidencia.gob.ec/dataset/?organization=ministerio-del-interior", + "kind": "html", + "lane": "context", + "region": "international", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Ministry of Interior open-data listing for homicide and public-security datasets used for quantitative context." + }, + { + "id": "ec-uafe-aml-cft", + "provider": "UAFE Ecuador", + "endpoint": "https://www.uafe.gob.ec/", + "kind": "html", + "lane": "context", + "region": "international", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Ecuador FIU portal for AML/CFT, illicit-finance and risk-assessment context related to organised-crime financing." + }, + { + "id": "ec-aduana-senae", + "provider": "Aduana del Ecuador (SENAE)", + "endpoint": "https://www.aduana.gob.ec/", + "kind": "html", + "lane": "context", + "region": "international", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Customs authority portal for border, port, contraband and interdiction context relevant to weapons and narcotics flows." + }, + { + "id": "ec-ecu911-news", + "provider": "ECU 911", + "endpoint": "https://www.ecu911.gob.ec/", + "kind": "html", + "lane": "context", + "region": "international", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "National emergency-coordination service updates for large response events and public-safety coordination context." + }, + { + "id": "ec-cancilleria-security", + "provider": "Cancillería del Ecuador", + "endpoint": "https://www.cancilleria.gob.ec/", + "kind": "html", + "lane": "context", + "region": "international", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Foreign ministry news for diplomatic-security, international cooperation and transnational-crime framing context." + }, + { + "id": "ec-primicias-seguridad", + "provider": "Primicias - Seguridad", + "endpoint": "https://www.primicias.ec/seguridad", + "kind": "html", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Ecuador security-news vertical for rapid local coverage of gangs, prisons and organised-crime incidents." + }, + { + "id": "ec-planv-crimen-organizado", + "provider": "Plan V - Crimen Organizado", + "endpoint": "https://planv.com.ec/historias/crimen-organizado/", + "kind": "html", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Investigative Ecuador organised-crime coverage for contextual enrichment around criminal governance and violence patterns." + }, + { + "id": "ec-eluniverso-rss", + "provider": "El Universo - RSS", + "endpoint": "https://www.eluniverso.com/rss/", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "El Universo RSS index for broad Ecuador media trigger coverage under strict keyword filtering." + }, + { + "id": "ec-ap-latin-america", + "provider": "Associated Press - Latin America", + "endpoint": "https://apnews.com/hub/latin-america", + "kind": "html", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "AP Latin America hub for regional incident corroboration and cross-border context affecting Ecuador." + }, + { + "id": "ec-aljazeera-ecuador-gangs", + "provider": "Al Jazeera - Ecuador gangs analysis", + "endpoint": "https://www.aljazeera.com/news/2024/2/14/no-clear-way-out-how-ecuador-descended-into-gang-violence", + "kind": "html", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Reference explainer on Ecuador gang violence used for narrative and background context enrichment." + }, + { + "id": "ec-guardian-ecuador", + "provider": "The Guardian - Ecuador", + "endpoint": "https://www.theguardian.com/world/ecuador", + "kind": "html", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Guardian Ecuador topic page for international media corroboration and ongoing country security context." + }, + { + "id": "ec-cfr-ecuador-narco-state", + "provider": "Council on Foreign Relations - Ecuador", + "endpoint": "https://www.cfr.org/articles/can-ecuador-avoid-becoming-narco-state", + "kind": "html", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "CFR analysis page providing strategic context on Ecuador narco-state risk narratives." + }, + { + "id": "ec-wola-ecuador-bukele-model", + "provider": "WOLA - Ecuador security analysis", + "endpoint": "https://www.wola.org/analysis/why-ecuador-should-not-replicate-the-bukele-model/", + "kind": "html", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Policy analysis on Ecuador security model choices used as non-operational context." + }, + { + "id": "ec-fcdo-ecuador-safety-security", + "provider": "UK FCDO - Ecuador travel advice", + "endpoint": "https://www.gov.uk/foreign-travel-advice/ecuador/safety-and-security", + "kind": "html", + "lane": "context", + "region": "international", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Official UK travel safety guidance for Ecuador used as government security-posture context." + }, + { + "id": "ec-nctc-los-lobos", + "provider": "US NCTC - Los Lobos", + "endpoint": "https://www.dni.gov/nctc/terrorist_groups/los_lobos.html", + "kind": "html", + "lane": "context", + "region": "international", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "US intelligence profile page for Los Lobos used for actor-level context and designation framing." + }, + { + "id": "ec-us-treasury-los-lobos", + "provider": "US Treasury - Los Lobos sanctions", + "endpoint": "https://home.treasury.gov/news/press-releases/jy2394", + "kind": "html", + "lane": "context", + "region": "international", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "US Treasury sanctions press release for Los Lobos financial and designation context." + }, + { + "id": "ec-us-treasury-los-choneros", + "provider": "US Treasury - Los Choneros sanctions", + "endpoint": "https://home.treasury.gov/news/press-releases/jy2082", + "kind": "html", + "lane": "context", + "region": "international", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "US Treasury sanctions press release for Los Choneros used for organised-crime finance context." + }, + { + "id": "ec-csis-ecuador-crises", + "provider": "CSIS - Ecuador compounding crises", + "endpoint": "https://www.csis.org/analysis/eye-storm-ecuadors-compounding-crises", + "kind": "html", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "CSIS strategic analysis page used for macro security context on Ecuador risk evolution." + }, + { + "id": "jamestown-foundation-feed", + "provider": "Jamestown Foundation - Main Feed", + "endpoint": "https://jamestown.org/feed/", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Jamestown Foundation primary feed for geopolitical, conflict and security analysis beyond terrorism-only coverage." + }, + { + "id": "kyle-orton-blog-feed", + "provider": "Kyle Orton's Blog", + "endpoint": "https://kyleorton.co.uk/feed/", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Specialist long-form analysis feed covering extremism, insurgency and geopolitical-security history context." + }, + { + "id": "caert-feed", + "provider": "African Centre for the Study and Research on Terrorism (ACSRT/CAERT)", + "endpoint": "https://caert.org.dz/feed/", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "African Union ACSRT feed for regional counter-terrorism documentation, initiatives and institutional updates." + }, + { + "id": "security-magazine-rss", + "provider": "Security Magazine", + "endpoint": "https://www.securitymagazine.com/rss/15", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Operational security and cyber-physical risk feed relevant to public-safety, protection and infrastructure threat context." + }, + { + "id": "leiden-security-global-affairs-feed", + "provider": "Leiden Security and Global Affairs Blog", + "endpoint": "https://www.leidensecurityandglobalaffairs.nl/feed/", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Academic security-analysis feed for strategic foresight, state violence and conflict-theory context." + }, + { + "id": "borealis-threat-risk-feed", + "provider": "Borealis Threat and Risk Consulting", + "endpoint": "https://borealisthreatandrisk.com/feed/", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Threat-intelligence commentary feed with counter-terrorism and intelligence-policy practitioner perspectives." + }, + { + "id": "insight-crime-feed", + "provider": "InSight Crime", + "endpoint": "https://insightcrime.org/feed/", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Investigative organized-crime reporting feed focused on Latin America criminal ecosystems and violence dynamics." + }, + { + "id": "southfront-feed", + "provider": "SouthFront", + "endpoint": "https://southfront.org/feed/", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Military-conflict narrative feed tracked only as low-confidence geopolitical context under strict keyword gating." + }, + { + "id": "inteltechniques-blog-feed", + "provider": "IntelTechniques Blog", + "endpoint": "https://inteltechniques.com/blog/feed/", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "OSINT tradecraft blog feed for investigative methods, tooling and source-discovery context." + }, + { + "id": "reddit-worldnews-rss", + "provider": "Reddit - r/worldnews", + "endpoint": "https://www.reddit.com/r/worldnews/.rss", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "High-noise social signal feed retained as low-confidence early narrative and incident chatter context." + }, + { + "id": "urban-terrorism-europe-feed", + "provider": "Urban Terrorism in Europe (University of Birmingham)", + "endpoint": "https://blog.bham.ac.uk/urbterr/feed/", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Academic research feed focused on urban terrorism trends, impacts and far-right violence in Europe." + }, + { + "id": "investigative-project-terrorism-rss", + "provider": "Investigative Project on Terrorism", + "endpoint": "https://www.investigativeproject.org/articles_rss_2.0.xml", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Specialist terrorism-analysis feed used for extremist-network and financing narrative monitoring." + }, + { + "id": "allafrica-international-terrorism-rdf", + "provider": "AllAfrica - International Terrorism", + "endpoint": "https://allafrica.com/tools/headlines/rdf/terrorism/headlines.rdf", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Africa-focused terrorism headline feed for regional incident and counter-terror operation context." + }, + { + "id": "strategic-intelligence-terrorism-war-feed", + "provider": "Strategic Intelligence Service - Terrorism and War Updates", + "endpoint": "https://intelligencebriefs.com/category/terrorism-war/feed/", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Counter-terrorism intelligence update feed for East Africa and broader conflict developments." + }, + { + "id": "intelnews-feed", + "provider": "IntelNews", + "endpoint": "https://intelnews.org/feed/", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Intelligence and espionage reporting feed used for security-service and geopolitical escalation context." + }, + { + "id": "aymennaltamimi-substack-feed", + "provider": "Aymenn's Monstrous Publications", + "endpoint": "https://www.aymennaltamimi.com/feed", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Middle East conflict-analysis Substack feed with primary-source interviews and militant-group coverage." + }, + { + "id": "ict-israel-feed", + "provider": "International Institute for Counter-Terrorism (ICT)", + "endpoint": "https://ict.org.il/feed/", + "kind": "rss", + "lane": "context", + "region": "international", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "ICT research and situational update feed on terrorism, regional conflict and threat analysis." + }, + { + "id": "interpol-news-page-en", + "provider": "INTERPOL - News", + "endpoint": "https://www.interpol.int/en/News-and-Events/News", + "kind": "html", + "lane": "context", + "region": "international", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "INTERPOL English news listing for global law-enforcement operations, terrorism and border-security statements." } ] } diff --git a/data/sources/international/oversight.json b/data/sources/international/oversight.json index 476945bd..81322be7 100644 --- a/data/sources/international/oversight.json +++ b/data/sources/international/oversight.json @@ -19,7 +19,7 @@ "lane": "oversight", "region": "international", "isTrustedOfficial": true, - "requiresKeywordMatch": false, + "requiresKeywordMatch": true, "comment": "UNOCT news/articles page used as the current official listing for Counter-Terrorism updates." }, { diff --git a/data/sources/international/prevention.json b/data/sources/international/prevention.json index 03e88b09..badda9a4 100644 --- a/data/sources/international/prevention.json +++ b/data/sources/international/prevention.json @@ -32,14 +32,14 @@ }, { "id": "tech-against-terrorism", - "provider": "Tech Against Terrorism a Blog", - "endpoint": "https://techagainstterrorism.org/", + "provider": "Tech Against Terrorism - Analysis", + "endpoint": "https://techagainstterrorism.org/analysis", "kind": "html", "lane": "prevention", "region": "international", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "No stable RSS endpoint advertised; using the primary site/blog surface and relying on keyword filtering." + "comment": "Focused analysis page for extremist content, platform abuse and online prevention context." }, { "id": "tech-against-terrorism-home", diff --git a/data/sources/london/context.json b/data/sources/london/context.json index a5509586..52170af7 100644 --- a/data/sources/london/context.json +++ b/data/sources/london/context.json @@ -211,14 +211,14 @@ }, { "id": "haringey-council-news", - "provider": "Haringey Community Press", - "endpoint": "https://haringeycommunitypress.co.uk/", + "provider": "Metropolitan Police - Haringey Tag", + "endpoint": "https://news.met.police.uk/news/tag/haringey", "kind": "html", "lane": "context", "region": "london", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Best-effort replacement for unavailable Haringey council feed using local Haringey community news." + "comment": "Official Met borough-tag archive for Haringey." }, { "id": "harrow-council-news", @@ -354,14 +354,14 @@ }, { "id": "lewisham-council-news", - "provider": "Salamander News", - "endpoint": "https://salamandernews.org/", + "provider": "Metropolitan Police - Lewisham Tag", + "endpoint": "https://news.met.police.uk/news/tag/lewisham", "kind": "html", "lane": "context", "region": "london", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Best-effort replacement for unavailable Lewisham council feed using Lewisham-focused community reporting." + "comment": "Official Met borough-tag archive for Lewisham." }, { "id": "lnwh-news", @@ -673,14 +673,14 @@ }, { "id": "southwark-newsroom", - "provider": "Southwark Council a Newsroom", - "endpoint": "https://news.southwark.gov.uk/newsroom/news/rss", - "kind": "rss", + "provider": "Southwark Council - News", + "endpoint": "https://www.southwark.gov.uk/news", + "kind": "html", "lane": "context", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Replaced newsroom HTML front page with Southwark news RSS endpoint." + "comment": "Canonical Southwark Council news listing." }, { "id": "st-georges-news", @@ -813,6 +813,61 @@ "isTrustedOfficial": true, "requiresKeywordMatch": true, "comment": "Whittington Health updates used for North London hospital and local incident context." + }, + { + "id": "londonist-rss", + "provider": "Londonist", + "endpoint": "https://londonist.com/feed", + "kind": "rss", + "lane": "context", + "region": "london", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Londonist feed for local transport, event and disruption-adjacent London context." + }, + { + "id": "ian-visits-rss", + "provider": "IanVisits", + "endpoint": "https://www.ianvisits.co.uk/articles/feed/", + "kind": "rss", + "lane": "context", + "region": "london", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "IanVisits feed for London transport, closures and infrastructure disruption context." + }, + { + "id": "secret-london-rss", + "provider": "Secret London", + "endpoint": "https://secretldn.com/feed/", + "kind": "rss", + "lane": "context", + "region": "london", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Secret London feed for public gatherings, pop-ups and crowd-behaviour context." + }, + { + "id": "time-out-london-rss", + "provider": "Time Out London", + "endpoint": "https://www.timeout.com/london/rss", + "kind": "rss", + "lane": "context", + "region": "london", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Time Out London events feed for venue and crowd planning context." + }, + { + "id": "diamond-geezer-rss", + "provider": "Diamond Geezer", + "endpoint": "https://diamondgeezer.blogspot.com/feeds/posts/default", + "kind": "rss", + "lane": "context", + "region": "london", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Hyper-local London blog feed for neighbourhood-level location awareness context." } ] } diff --git a/data/sources/london/incidents.json b/data/sources/london/incidents.json index 03bd3d2d..cb082c75 100644 --- a/data/sources/london/incidents.json +++ b/data/sources/london/incidents.json @@ -24,14 +24,14 @@ }, { "id": "city-of-london-police-newsroom", - "provider": "Metropolitan Police Service - News", - "endpoint": "https://news.met.police.uk/", + "provider": "Metropolitan Police Service - Latest News", + "endpoint": "https://news.met.police.uk/latest_news?source=city-of-london-police-newsroom", "kind": "html", "lane": "incidents", "region": "london", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "Best-effort replacement for blocked City of London Police newsroom using active Met Police London policing updates." + "comment": "Canonical Met newsroom latest-news listing." }, { "id": "ct-policing-london", diff --git a/data/sources/uk/context.json b/data/sources/uk/context.json index 59a85b1e..7fb3b605 100644 --- a/data/sources/uk/context.json +++ b/data/sources/uk/context.json @@ -35,24 +35,24 @@ { "id": "bbc-news-uk-politics-legacy", "provider": "BBC News a UK Politics (Legacy RSS)", - "endpoint": "http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/uk_politics/rss.xml", + "endpoint": "https://feeds.bbci.co.uk/news/politics/rss.xml", "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Legacy BBC RSS feed (newsrss.bbc.co.uk). May be discontinued; retained for UK political coverage." + "comment": "Modern BBC Politics RSS endpoint replacing the legacy newsrss host." }, { "id": "chatham-house-home", "provider": "Chatham House", - "endpoint": "https://www.chathamhouse.org/", - "kind": "html", + "endpoint": "https://www.chathamhouse.org/path/whatsnew.xml", + "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Chatham House homepage for international security, state threat and terrorism-adjacent analysis." + "comment": "Official Chatham House all-content RSS feed." }, { "id": "chatham-house-security-defence", @@ -110,14 +110,14 @@ }, { "id": "henry-jackson-society-news", - "provider": "RUSI - Terrorism and Conflict", - "endpoint": "https://www.rusi.org/explore-our-research/research-groups/terrorism-and-conflict?source=henry-jackson-society-news", - "kind": "html", + "provider": "RUSI - Latest Publications", + "endpoint": "https://www.rusi.org/rss/latest-publications.xml?source=henry-jackson-society-news", + "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Next-best replacement for unavailable Henry Jackson Society feed using RUSI terrorism/conflict analysis." + "comment": "Replacement feed using RUSI latest publications RSS for defence and counter-terrorism research updates." }, { "id": "hope-not-hate-home", @@ -133,13 +133,13 @@ { "id": "institute-global-home", "provider": "Institute for Global Change", - "endpoint": "https://www.institute.global/", + "endpoint": "https://institute.global/insights/geopolitics-and-security", "kind": "html", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Tony Blair Institute homepage for extremism, geopolitical and public-policy context." + "comment": "Focused TBI geopolitics and security page used for relevant strategic context." }, { "id": "kent-police-news", @@ -176,14 +176,14 @@ }, { "id": "national-crime-agency-news", - "provider": "National Crime Agency a News", + "provider": "National Crime Agency - News", "endpoint": "https://www.nationalcrimeagency.gov.uk/news", "kind": "html", "lane": "context", "region": "uk", "isTrustedOfficial": true, "requiresKeywordMatch": true, - "comment": "No RSS endpoint published; using the main news page and relying on keyword filtering." + "comment": "Canonical National Crime Agency news archive used as the primary UK agency source." }, { "id": "npcc-releases", @@ -265,24 +265,24 @@ { "id": "rusi-publications", "provider": "RUSI (Royal United Services Institute) a Publications", - "endpoint": "https://www.rusi.org/publications", - "kind": "html", + "endpoint": "https://www.rusi.org/rss/latest-publications.xml", + "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "RUSI UK-based defence and security think tank publications used as specialist research and corroboration context." + "comment": "Official RUSI latest publications RSS feed for UK defence, security and counter-terrorism research." }, { "id": "rusi-terrorism-conflict", - "provider": "RUSI - Terrorism and Conflict", - "endpoint": "https://www.rusi.org/explore-our-research/research-groups/terrorism-and-conflict", - "kind": "html", + "provider": "RUSI - Latest Publications", + "endpoint": "https://www.rusi.org/rss/latest-publications.xml?source=rusi-terrorism-conflict", + "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "RUSI topic page focused on terrorism and conflict research." + "comment": "RUSI latest publications feed retained for higher-frequency security and counter-terrorism updates." }, { "id": "skwawkbox", @@ -323,7 +323,7 @@ "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "The Sun aggregate feed; tabloid \u00e2\u20ac\u201c strict keyword and terrorism-hit thresholds apply before inclusion." + "comment": "The Sun aggregate feed; tabloid – strict keyword and terrorism-hit thresholds apply before inclusion." }, { "id": "the-sun-all-english", @@ -334,7 +334,7 @@ "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "The Sun all English app feed; tabloid \u00e2\u20ac\u201c strict keyword and terrorism-hit thresholds apply before inclusion." + "comment": "The Sun all English app feed; tabloid – strict keyword and terrorism-hit thresholds apply before inclusion." }, { "id": "the-sun-homepage", @@ -345,7 +345,7 @@ "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "The Sun curated homepage feed; tabloid \u00e2\u20ac\u201c strict keyword and terrorism-hit thresholds apply before inclusion." + "comment": "The Sun curated homepage feed; tabloid – strict keyword and terrorism-hit thresholds apply before inclusion." }, { "id": "the-sun-news-english", @@ -356,7 +356,7 @@ "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "The Sun English news app feed; tabloid \u00e2\u20ac\u201c strict keyword and terrorism-hit thresholds apply before inclusion." + "comment": "The Sun English news app feed; tabloid – strict keyword and terrorism-hit thresholds apply before inclusion." }, { "id": "west-yorkshire-police-coroner-appeals-rss", @@ -372,13 +372,13 @@ { "id": "wiltshire-999s", "provider": "Wiltshire 999s", - "endpoint": "https://www.wiltshire999s.co.uk/", - "kind": "html", + "endpoint": "https://www.wiltshire999s.co.uk/news/feed/", + "kind": "rss", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Wiltshire emergency services news site for local incident corroboration and public reporting." + "comment": "Wiltshire emergency services news RSS feed." }, { "id": "belfast-live", @@ -422,7 +422,7 @@ { "id": "cambridge-news", "provider": "Cambridge News", - "endpoint": "https://www.cambridge-news.co.uk/rss.xml", + "endpoint": "https://www.cambridge-news.co.uk/news/?service=rss", "kind": "rss", "lane": "context", "region": "uk", @@ -430,7 +430,7 @@ "requiresKeywordMatch": true, "sourceTier": "context", "reliabilityProfile": "general_media", - "comment": "Cambridgeshire local news RSS." + "comment": "Reach/Live-style Cambridge News RSS endpoint." }, { "id": "channel-4-news", @@ -630,7 +630,7 @@ { "id": "metro", "provider": "BBC News - UK", - "endpoint": "https://feeds.bbci.co.uk/news/uk/rss.xml?source=metro", + "endpoint": "https://feeds.bbci.co.uk/news/uk/rss.xml", "kind": "rss", "lane": "context", "region": "uk", @@ -638,7 +638,7 @@ "requiresKeywordMatch": true, "sourceTier": "context", "reliabilityProfile": "major_media", - "comment": "Replacement for anti-bot Metro feed using BBC UK RSS coverage." + "comment": "BBC UK RSS without legacy query baggage." }, { "id": "news-uk", @@ -1115,14 +1115,14 @@ }, { "id": "fmcg-gurus", - "provider": "FMCG Gurus", - "endpoint": "https://fmcggurus.com/feed/", - "kind": "rss", + "provider": "Europol - Newsroom", + "endpoint": "https://www.europol.europa.eu/media-press/newsroom", + "kind": "html", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "Replacement for unrelated FMCG source using Europol's official newsroom archive." }, { "id": "foreign-office-blogs", @@ -1291,14 +1291,14 @@ }, { "id": "silly-old-sod", - "provider": "Silly Old Sod", - "endpoint": "https://www.sillyoldsod.com/feed/", - "kind": "rss", + "provider": "Combating Terrorism Center at West Point - CTC Sentinel", + "endpoint": "https://ctc.westpoint.edu/ctc-sentinel/", + "kind": "html", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "Replacement for personal-blog source using CTC Sentinel analysis archive." }, { "id": "silverspoon-london", @@ -1313,14 +1313,14 @@ }, { "id": "sks-business-services", - "provider": "SKS Business Services", - "endpoint": "https://www.sksbusinessservices.com/feed/", - "kind": "rss", + "provider": "UN Office of Counter-Terrorism - News", + "endpoint": "https://www.un.org/counterterrorism/en/news", + "kind": "html", "lane": "context", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + "comment": "Replacement for unrelated business feed using UN counter-terrorism news updates." }, { "id": "hnd-assignment-help-uk-medium", @@ -1464,6 +1464,380 @@ "isTrustedOfficial": false, "requiresKeywordMatch": true, "comment": "Lifestyle/travel RSS from Free RSS Feed Catalog; keyword match required to avoid noise." + }, + { + "id": "ukhsa-updates-atom", + "provider": "UK Health Security Agency", + "endpoint": "https://www.gov.uk/government/organisations/uk-health-security-agency.atom", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "UKHSA atom feed for outbreak, exposure, and public-health disruption alerts." + }, + { + "id": "nitter-uk-incident-keywords", + "provider": "Nitter - UK Incident Keyword Search", + "endpoint": "https://nitter.net/search/rss?f=tweets&q=explosion+OR+shooting+OR+police+UK", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Social-media keyword RSS tripwire for early unverified UK incident chatter." + }, + { + "id": "sky-business-rss", + "provider": "Sky News - Business (RSS)", + "endpoint": "https://feeds.skynews.com/feeds/rss/business.xml", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Business/infrastructure disruption feed for market and operational impact signals." + }, + { + "id": "mi5-news-rss", + "provider": "MI5 - News and Updates (RSS)", + "endpoint": "https://www.mi5.gov.uk/rss.xml", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Official MI5 RSS feed for domestic-security statements and threat updates." + }, + { + "id": "counter-terrorism-policing-uk-rss", + "provider": "Counter Terrorism Policing UK", + "endpoint": "https://www.counterterrorism.police.uk/feed/", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Official Counter Terrorism Policing UK public feed for CT alerts and campaigns." + }, + { + "id": "act-campaign-feed", + "provider": "Action Counters Terrorism (ACT)", + "endpoint": "https://act.campaign.gov.uk/feed/", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "ACT campaign feed for UK public CT-awareness messaging and guidance updates." + }, + { + "id": "missing-people-uk-rss", + "provider": "Missing People UK", + "endpoint": "https://www.missingpeople.org.uk/rss", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Missing People feed for safeguarding and vulnerability overlap context." + }, + { + "id": "home-office-atom", + "provider": "UK Home Office", + "endpoint": "https://www.gov.uk/government/organisations/home-office.atom", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Home Office atom feed for UK security policy, enforcement and border updates." + }, + { + "id": "charity-commission-atom", + "provider": "Charity Commission for England and Wales", + "endpoint": "https://www.gov.uk/government/organisations/charity-commission.atom", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Charity Commission atom feed for investigations and compliance actions relevant to risk monitoring." + }, + { + "id": "national-trust-news-rss", + "provider": "National Trust", + "endpoint": "https://www.nationaltrust.org.uk/rss", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "National Trust feed for major-site events and public-crowd context." + }, + { + "id": "visitbritain-rss", + "provider": "VisitBritain", + "endpoint": "https://www.visitbritain.org/rss.xml", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "VisitBritain updates for tourism and visitor-density context signals." + }, + { + "id": "time-out-uk-rss", + "provider": "Time Out UK", + "endpoint": "https://www.timeout.com/uk/rss", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "UK-wide Time Out events feed for planned gatherings and crowd context." + }, + { + "id": "guido-fawkes-feed", + "provider": "Guido Fawkes", + "endpoint": "https://order-order.com/feed/", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "UK Westminster gossip and leak-oriented feed for political smoke-signal context." + }, + { + "id": "wings-over-scotland-feed", + "provider": "Wings Over Scotland", + "endpoint": "https://wingsoverscotland.com/feed/", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Scottish political commentary feed used only for low-confidence narrative context." + }, + { + "id": "skwawkbox-feed", + "provider": "Skwawkbox", + "endpoint": "https://skwawkbox.org/feed/", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "UK factional political feed used for protest-adjacent and discourse context only." + }, + { + "id": "breitbart-london-feed", + "provider": "Breitbart London", + "endpoint": "https://www.breitbart.com/london/feed/", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Partisan UK-focused feed retained as low-confidence framing and chatter context." + }, + { + "id": "gb-news-uk-politics-rss", + "provider": "GB News - UK Politics", + "endpoint": "https://www.gbnews.com/feeds/politics/uk.rss", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "UK politics RSS feed for narrative and grievance spike monitoring in Westminster discourse." + }, + { + "id": "the-canary-feed", + "provider": "The Canary", + "endpoint": "https://www.thecanary.co/feed/", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Activist-left UK feed retained as low-confidence protest and narrative context." + }, + { + "id": "sky-news-home-rss", + "provider": "Sky News - Home", + "endpoint": "https://feeds.skynews.com/feeds/rss/home.xml", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Sky News home feed for rapid UK and global breaking-incident pickup." + }, + { + "id": "telegraph-all-news-rss", + "provider": "The Telegraph - News", + "endpoint": "https://www.telegraph.co.uk/rss.xml", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Telegraph aggregate RSS used as an editorial-contrast UK trigger source." + }, + { + "id": "my-london-rss", + "provider": "MyLondon", + "endpoint": "https://www.mylondon.news/?service=rss", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "London local-news RSS for borough-level incidents, policing and disruption context." + }, + { + "id": "uk-data-police-api", + "provider": "Police.uk - API root", + "endpoint": "https://data.police.uk/", + "kind": "html", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Police.uk data API documentation root for UK policing dataset and endpoint context." + }, + { + "id": "uk-judiciary-sentencing-remarks", + "provider": "Judiciary UK - Sentencing remarks", + "endpoint": "https://www.judiciary.uk/judgment-types/sentencing-remarks/", + "kind": "html", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Official UK judiciary sentencing-remarks archive for court outcome and legal context signals." + }, + { + "id": "uk-college-policing-news", + "provider": "College of Policing - News and views", + "endpoint": "https://www.college.police.uk/news-views", + "kind": "html", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "College of Policing policy and guidance updates relevant to UK policing practice and standards context." + }, + { + "id": "uk-ons-crime-england-wales", + "provider": "ONS - Crime in England and Wales", + "endpoint": "https://www.ons.gov.uk/peoplepopulationandcommunity/crimeandjustice/bulletins/crimeinenglandandwales/latest", + "kind": "html", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Official ONS latest crime bulletin page for statistical trend context across England and Wales." + }, + { + "id": "uk-serious-fraud-office-news", + "provider": "Serious Fraud Office - GOV.UK organisation", + "endpoint": "https://www.gov.uk/government/organisations/serious-fraud-office", + "kind": "html", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "SFO organisation page for major fraud, bribery and economic-crime enforcement updates." + }, + { + "id": "uk-hmrc-news", + "provider": "HM Revenue & Customs - News and communications", + "endpoint": "https://www.gov.uk/search/news-and-communications?organisations[]=hm-revenue-customs", + "kind": "html", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "HMRC news search filter for tax, customs and financial-crime enforcement communication context." + }, + { + "id": "uk-ukfinance-fraud-news", + "provider": "UK Finance - News and insight", + "endpoint": "https://www.ukfinance.org.uk/news-and-insight", + "kind": "html", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Industry perspective on UK fraud trends and payment/economic-crime narratives." + }, + { + "id": "uk-cifas-newsroom", + "provider": "Cifas - Newsroom", + "endpoint": "https://www.cifas.org.uk/newsroom", + "kind": "html", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Fraud-prevention organisation newsroom for UK fraud threat and prevention narrative context." + }, + { + "id": "politics-co-uk-rss", + "provider": "Politics.co.uk", + "endpoint": "https://www.politics.co.uk/rss/", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "UK politics RSS stream for policy and institutional narrative context." + }, + { + "id": "uk-met-office-rss-guides", + "provider": "Met Office - RSS feeds guide", + "endpoint": "https://weather.metoffice.gov.uk/guides/rss", + "kind": "html", + "lane": "context", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Met Office RSS guide for weather alert surfaces used as situational context impacting incidents and responder operations." + }, + { + "id": "novara-media-feed", + "provider": "Novara Media", + "endpoint": "https://novaramedia.com/feed/", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "UK political-analysis feed retained as low-confidence protest and unrest narrative context." + }, + { + "id": "byline-times-feed", + "provider": "Byline Times", + "endpoint": "https://bylinetimes.com/feed/", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Investigative UK commentary feed used as narrative and corruption-related context under keyword gating." + }, + { + "id": "reddit-unitedkingdom-rss", + "provider": "Reddit - r/unitedkingdom", + "endpoint": "https://www.reddit.com/r/unitedkingdom/.rss", + "kind": "rss", + "lane": "context", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "High-noise UK social-discourse feed retained only as low-confidence local narrative and unrest context." } ] } diff --git a/data/sources/uk/incidents.json b/data/sources/uk/incidents.json index 9271f014..f97c62ca 100644 --- a/data/sources/uk/incidents.json +++ b/data/sources/uk/incidents.json @@ -454,13 +454,13 @@ { "id": "northumbria-police-news", "provider": "North East Bylines", - "endpoint": "https://northeastbylines.co.uk/", - "kind": "html", + "endpoint": "https://northeastbylines.co.uk/feed/", + "kind": "rss", "lane": "incidents", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Best-effort replacement for unavailable Northumbria Police source using North East regional reporting." + "comment": "Replacement feed using North East Bylines RSS." }, { "id": "northumbria-police-northumbria-news", @@ -636,7 +636,7 @@ "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "Next-best replacement for blocked Warwickshire Police news using Warwickshire Connected latest alerts." + "comment": "Warwickshire Connected latest-alerts page retained for local police community messaging." }, { "id": "west-mercia-police-news-html", @@ -747,6 +747,105 @@ "isTrustedOfficial": true, "requiresKeywordMatch": true, "comment": "Wiltshire Police news for South-West incident corroboration and military-adjacent security context." + }, + { + "id": "uk-npcc-news", + "provider": "National Police Chiefs' Council - News", + "endpoint": "https://news.npcc.police.uk/", + "kind": "html", + "lane": "incidents", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "NPCC news portal root for national policing operational announcements and campaigns." + }, + { + "id": "uk-npcc-county-lines", + "provider": "National Police Chiefs' Council - Crime Operations releases", + "endpoint": "https://news.npcc.police.uk/releases/t/crime-operations", + "kind": "html", + "lane": "incidents", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "NPCC crime-operations release filter for county-lines and organised-crime policing updates." + }, + { + "id": "uk-btp-england-news", + "provider": "British Transport Police - England news", + "endpoint": "https://www.btp.police.uk/news/btp/news/?newsCategory=England", + "kind": "html", + "lane": "incidents", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "BTP England-filtered newsroom page for rail-network incidents and transport security operations." + }, + { + "id": "uk-city-london-police-news", + "provider": "City of London Police - News", + "endpoint": "https://www.cityoflondon.police.uk/news", + "kind": "html", + "lane": "incidents", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "City of London Police news root for central-London policing incidents and force statements." + }, + { + "id": "uk-city-london-police-fraud", + "provider": "City of London Police - Fraud category", + "endpoint": "https://www.cityoflondon.police.uk/news/city-of-london/news/?newsCategory=Fraud", + "kind": "html", + "lane": "incidents", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "City of London Police fraud category page for economic crime and fraud investigation updates." + }, + { + "id": "uk-west-mercia-police-news", + "provider": "West Mercia Police - News", + "endpoint": "https://www.westmercia.police.uk/news", + "kind": "html", + "lane": "incidents", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "West Mercia Police newsroom root for county incidents, arrests and operational notices." + }, + { + "id": "uk-british-transport-police-search", + "provider": "British Transport Police - News search", + "endpoint": "https://www.btp.police.uk/news/news-search/", + "kind": "html", + "lane": "incidents", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "BTP searchable news listing for incident retrieval across rail and station policing topics." + }, + { + "id": "mi5-terrorism-news-category", + "provider": "MI5 - Terrorism News", + "endpoint": "https://www.mi5.gov.uk/news-categories/terrorism", + "kind": "html", + "lane": "incidents", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "MI5 terrorism news category page for official statements and operationally relevant threat-related updates." + }, + { + "id": "cps-news-category-feed", + "provider": "Crown Prosecution Service - News", + "endpoint": "https://www.cps.gov.uk/cps/news", + "kind": "html", + "lane": "incidents", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "CPS news listing used for terrorism charging and sentencing announcements in UK criminal proceedings." } ] } diff --git a/data/sources/uk/oversight.json b/data/sources/uk/oversight.json index 8941aa50..a23879b6 100644 --- a/data/sources/uk/oversight.json +++ b/data/sources/uk/oversight.json @@ -667,6 +667,17 @@ "isTrustedOfficial": true, "requiresKeywordMatch": true, "comment": "House of Commons Justice Select Committee news on courts, prisons and extremist offender management." + }, + { + "id": "uk-parliament-rss-feeds-index", + "provider": "UK Parliament - RSS Feeds", + "endpoint": "https://www.parliament.uk/site-information/rss-feeds/", + "kind": "html", + "lane": "oversight", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "Official UK Parliament RSS index page for legislative and committee feed discovery and institutional movement signals." } ] } diff --git a/data/sources/uk/prevention.json b/data/sources/uk/prevention.json index 36bd689b..324ea379 100644 --- a/data/sources/uk/prevention.json +++ b/data/sources/uk/prevention.json @@ -134,13 +134,13 @@ { "id": "icsr-kcl", "provider": "International Centre for the Study of Radicalisation (ICSR) a Updates", - "endpoint": "https://icsr.info/", - "kind": "html", + "endpoint": "https://icsr.info/category/publications/reports/feed/", + "kind": "rss", "lane": "prevention", "region": "uk", "isTrustedOfficial": false, "requiresKeywordMatch": false, - "comment": "ICSR content is published as web pages; RSS availability varies by section." + "comment": "ICSR reports RSS feed." }, { "id": "met-office-seasonal-advice", @@ -338,6 +338,61 @@ "isTrustedOfficial": true, "requiresKeywordMatch": true, "comment": "West Yorkshire Police community alert portal for local warning and prevention notices." + }, + { + "id": "protectuk-news", + "provider": "ProtectUK - News", + "endpoint": "https://www.protectuk.police.uk/news", + "kind": "html", + "lane": "prevention", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "ProtectUK preventative-security updates including protective security guidance, preparedness and Martyn's Law context." + }, + { + "id": "home-office-terrorism-police-powers-collection", + "provider": "UK Home Office - Operation of Police Powers under the Terrorism Act 2000", + "endpoint": "https://www.gov.uk/government/collections/operation-of-police-powers-under-the-terrorism-act-2000", + "kind": "html", + "lane": "prevention", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": false, + "comment": "Official Home Office collection for quarterly terrorism arrest, outcomes and stop-search statistics trend monitoring." + }, + { + "id": "npsa-national-security-threats", + "provider": "National Protective Security Authority - National Security Threats", + "endpoint": "https://www.npsa.gov.uk/threat-and-risk-management/national-security-threats", + "kind": "html", + "lane": "prevention", + "region": "uk", + "isTrustedOfficial": true, + "requiresKeywordMatch": true, + "comment": "NPSA guidance on terrorism, state threats and protective-security risk management for prevention context." + }, + { + "id": "hedayah-news", + "provider": "Hedayah - News", + "endpoint": "https://hedayah.com/news/", + "kind": "html", + "lane": "prevention", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "PVE/CVE programme updates feed for radicalisation prevention, reintegration and community resilience context." + }, + { + "id": "tech-against-terrorism-news", + "provider": "Tech Against Terrorism - News", + "endpoint": "https://techagainstterrorism.org/news", + "kind": "html", + "lane": "prevention", + "region": "uk", + "isTrustedOfficial": false, + "requiresKeywordMatch": true, + "comment": "Online terrorist-content moderation and platform-abuse analysis updates relevant to digital CT prevention." } ] } diff --git a/data/sources/us/context.json b/data/sources/us/context.json index 3d303ced..81dbec4d 100644 --- a/data/sources/us/context.json +++ b/data/sources/us/context.json @@ -3,13 +3,13 @@ { "id": "ctc-sentinel", "provider": "Combating Terrorism Center at West Point - CTC Sentinel", - "endpoint": "https://ctc.westpoint.edu/ctc-sentinel/", - "kind": "html", + "endpoint": "https://ctc.westpoint.edu/feed/", + "kind": "rss", "lane": "context", "region": "us", "isTrustedOfficial": false, "requiresKeywordMatch": false, - "comment": "CTC Sentinel is published as web pages; using the current issue/archive surface." + "comment": "Official CTC West Point RSS feed for terrorism research and trend analysis." }, { "id": "dhs-press-releases", @@ -101,13 +101,13 @@ { "id": "rand-terrorism-topic", "provider": "RAND - Terrorism Topic Updates", - "endpoint": "https://www.rand.org/topics/terrorism.html", - "kind": "html", + "endpoint": "https://www.rand.org/pubs/new.xml", + "kind": "rss", "lane": "context", "region": "us", "isTrustedOfficial": false, "requiresKeywordMatch": true, - "comment": "RAND topic pages are HTML; using the terrorism topic index and relying on keyword filtering." + "comment": "Official RAND new publications RSS feed replacing the topic HTML page." }, { "id": "rewards-for-justice", @@ -122,14 +122,14 @@ }, { "id": "start-baad-database", - "provider": "National Consortium for the Study of Terrorism (START) - Big Allied and Dangerous (BAAD) Database", - "endpoint": "https://www.start.umd.edu/baad/database/", + "provider": "National Consortium for the Study of Terrorism (START) - BAAD Database", + "endpoint": "https://www.start.umd.edu/baad/database.html?page=1", "kind": "html", "lane": "context", "region": "us", "isTrustedOfficial": false, "requiresKeywordMatch": false, - "comment": "START BAAD database of designated terrorist organisations used for group identification context." + "comment": "Canonical START BAAD entry page for reference-database context." }, { "id": "start-center-publications", @@ -140,7 +140,7 @@ "region": "us", "isTrustedOfficial": false, "requiresKeywordMatch": false, - "comment": "National Consortium for the Study of Terrorism (START) at University of Maryland publishes terrorism research and GTD data." + "comment": "START news and publications page retained as a live and current research source." }, { "id": "state-dept-terrorism", diff --git a/scripts/build-live-feed.mjs b/scripts/build-live-feed.mjs index 8ca7b366..ace9af58 100644 --- a/scripts/build-live-feed.mjs +++ b/scripts/build-live-feed.mjs @@ -346,18 +346,19 @@ function nextSourceHealthEntry(source, stat, previousEntry, generatedAt) { const penalty = isCritical ? HEALTH_SCORE_CRITICAL_FAILURE_PENALTY : HEALTH_SCORE_FAILURE_PENALTY; next.healthScore = Math.max(0, priorHealthScore - penalty); - // Derive quarantine state from health score threshold, or immediately - // quarantine never-verified sources (zero successful runs) that hit a - // definitive failure such as 404 or dead/moved URL. - const neverVerified = next.successfulRuns === 0 && !prior.lastSuccessfulAt; - const immediateQuarantine = neverVerified && (notFoundFailure || deadUrlFailure); - if ((next.healthScore < HEALTH_SCORE_REVIEW_THRESHOLD || immediateQuarantine) && !next.quarantined) { + // Auto-quarantine only after repeated consecutive failures. + const overFailureThreshold = next.consecutiveFailures >= AUTO_QUARANTINE_FAILURE_THRESHOLD; + if (overFailureThreshold && !next.quarantined) { next.quarantined = true; next.quarantinedAt = generatedAt; next.quarantineReason = analyseErrorPattern(next.recentErrors, { healthScore: next.healthScore, kind: source?.kind }); + } else if (!overFailureThreshold) { + next.quarantined = false; + next.quarantinedAt = null; + next.quarantineReason = null; } // Low-health sources are deprioritised with a longer interval instead of a hard block. @@ -380,6 +381,9 @@ function nextSourceHealthEntry(source, stat, previousEntry, generatedAt) { next.consecutiveFailures = 0; next.consecutiveBlockedFailures = 0; next.consecutiveDeadUrlFailures = 0; + next.quarantined = false; + next.quarantinedAt = null; + next.quarantineReason = null; next.lastErrorCategory = null; next.lastErrorMessage = null; next.lastEmptyAt = generatedAt; @@ -1022,8 +1026,9 @@ function buildQuarantinedSourceEntries(sources, sourceHealth) { const health = healthMap[source.id] && typeof healthMap[source.id] === 'object' ? healthMap[source.id] : {}; const manuallyQuarantined = Boolean(source?.quarantined); const healthScore = Number.isFinite(Number(health?.healthScore)) ? Number(health.healthScore) : HEALTH_SCORE_INITIAL; - const healthQuarantined = Boolean(health?.quarantined); - const needsReview = manuallyQuarantined || healthQuarantined || healthScore < HEALTH_SCORE_REVIEW_THRESHOLD; + const consecutiveFailures = Number(health?.consecutiveFailures || 0); + const healthQuarantined = Boolean(health?.quarantined) && consecutiveFailures >= AUTO_QUARANTINE_FAILURE_THRESHOLD; + const needsReview = manuallyQuarantined || healthQuarantined || consecutiveFailures >= AUTO_QUARANTINE_FAILURE_THRESHOLD; if (!needsReview) return null; return { id: clean(source?.id), @@ -1040,7 +1045,7 @@ function buildQuarantinedSourceEntries(sources, sourceHealth) { quarantinedAt: clean(health?.quarantinedAt), lastErrorCategory: clean(health?.lastErrorCategory), lastErrorMessage: clean(health?.lastErrorMessage), - consecutiveFailures: Number(health?.consecutiveFailures || 0), + consecutiveFailures, consecutiveBlockedFailures: Number(health?.consecutiveBlockedFailures || 0), consecutiveDeadUrlFailures: Number(health?.consecutiveDeadUrlFailures || 0), recentErrors: Array.isArray(health?.recentErrors) ? health.recentErrors : [], @@ -3071,9 +3076,11 @@ async function main() { const deferred = autoDeferredSources.find((entry) => entry.id === source.id); if (deferred) { const priorHealthScore = Number.isFinite(Number(priorEntry?.healthScore)) ? Number(priorEntry.healthScore) : HEALTH_SCORE_INITIAL; - const isLowHealth = priorHealthScore < HEALTH_SCORE_REVIEW_THRESHOLD; + const priorConsecutiveFailures = Number(priorEntry?.consecutiveFailures || 0); + const isQuarantined = Boolean(priorEntry?.quarantined) + && priorConsecutiveFailures >= AUTO_QUARANTINE_FAILURE_THRESHOLD; const deferredNextFetchAt = deferred.until - || (isLowHealth ? priorEntry?.nextFetchAt : null) + || (isQuarantined ? priorEntry?.nextFetchAt : null) || sourceScheduleNextFetchAt(source, buildDate, priorEntry, true); nextSourceHealth[source.id] = { ...(priorEntry || {}), @@ -3081,10 +3088,10 @@ async function main() { lane: source.lane, kind: source.kind, healthScore: priorHealthScore, - quarantined: isLowHealth, + quarantined: isQuarantined, quarantinedAt: priorEntry?.quarantinedAt || null, - quarantineReason: isLowHealth - ? clean(priorEntry?.quarantineReason || 'Low health score – needs review') + quarantineReason: isQuarantined + ? clean(priorEntry?.quarantineReason || 'Consecutive failures exceeded threshold') : (priorEntry?.quarantineReason || null), autoSkipReason: deferred.reason, cooldownUntil: deferred.until, diff --git a/scripts/build-live-feed/alerts.mjs b/scripts/build-live-feed/alerts.mjs index 0d666dde..c8a95431 100644 --- a/scripts/build-live-feed/alerts.mjs +++ b/scripts/build-live-feed/alerts.mjs @@ -554,7 +554,32 @@ export function retentionScoreFor(alert) { export function selectStoredAlerts(items, maxStored) { if (!Array.isArray(items) || maxStored <= 0) return []; - if (items.length <= maxStored) return items.slice(); + const SOURCE_DAY_ALERT_CAP = 2; + + function sourceDayKeyFor(item) { + const source = clean(item?.source || item?.actor || item?.subject || '').toLowerCase(); + if (!source) return ''; + const publishedAt = clean(item?.publishedAt || ''); + if (!publishedAt) return ''; + const parsed = new Date(publishedAt); + if (Number.isNaN(parsed.getTime())) return ''; + return `${source}|${parsed.toISOString().slice(0, 10)}`; + } + + function applySourceDayCap(candidates, maxPerSourceDay) { + const sourceDayCounts = new Map(); + const kept = []; + for (const item of candidates) { + const sourceDayKey = sourceDayKeyFor(item); + const sourceDayCount = sourceDayKey ? (sourceDayCounts.get(sourceDayKey) || 0) : 0; + if (sourceDayKey && sourceDayCount >= maxPerSourceDay) continue; + kept.push(item); + if (sourceDayKey) sourceDayCounts.set(sourceDayKey, sourceDayCount + 1); + } + return kept; + } + + if (items.length <= maxStored) return applySourceDayCap(items, SOURCE_DAY_ALERT_CAP); const ranked = items .map((item, index) => ({ @@ -570,6 +595,7 @@ export function selectStoredAlerts(items, maxStored) { const retainedIndices = new Set(); const fusedCounts = new Map(); const sourceUrlCounts = new Map(); + const sourceDayCounts = new Map(); function fusedKeyFor(item) { return clean(item?.fusedIncidentId || item?.sourceUrl || item?.id || ''); @@ -579,39 +605,48 @@ export function selectStoredAlerts(items, maxStored) { return clean(item?.sourceUrl || item?.id || ''); } - function canTake(entry, maxPerFused, maxPerSource) { + function sourceDayKeyForEntry(item) { + return sourceDayKeyFor(item); + } + + function canTake(entry, maxPerFused, maxPerSource, maxPerSourceDay) { const fusedKey = fusedKeyFor(entry.item); const sourceKey = sourceKeyFor(entry.item); + const sourceDayKey = sourceDayKeyForEntry(entry.item); const fusedCount = fusedKey ? (fusedCounts.get(fusedKey) || 0) : 0; const sourceCount = sourceKey ? (sourceUrlCounts.get(sourceKey) || 0) : 0; + const sourceDayCount = sourceDayKey ? (sourceDayCounts.get(sourceDayKey) || 0) : 0; if (fusedKey && fusedCount >= maxPerFused) return false; if (sourceKey && sourceCount >= maxPerSource) return false; + if (sourceDayKey && sourceDayCount >= maxPerSourceDay) return false; return true; } function take(entry) { const fusedKey = fusedKeyFor(entry.item); const sourceKey = sourceKeyFor(entry.item); + const sourceDayKey = sourceDayKeyForEntry(entry.item); retainedIndices.add(entry.index); if (fusedKey) fusedCounts.set(fusedKey, (fusedCounts.get(fusedKey) || 0) + 1); if (sourceKey) sourceUrlCounts.set(sourceKey, (sourceUrlCounts.get(sourceKey) || 0) + 1); + if (sourceDayKey) sourceDayCounts.set(sourceDayKey, (sourceDayCounts.get(sourceDayKey) || 0) + 1); } for (const entry of ranked) { if (retainedIndices.size >= maxStored) break; - if (canTake(entry, 1, 1)) take(entry); + if (canTake(entry, 1, 1, SOURCE_DAY_ALERT_CAP)) take(entry); } for (const entry of ranked) { if (retainedIndices.size >= maxStored) break; if (retainedIndices.has(entry.index)) continue; - if (canTake(entry, 2, 1)) take(entry); + if (canTake(entry, 2, 1, SOURCE_DAY_ALERT_CAP)) take(entry); } for (const entry of ranked) { if (retainedIndices.size >= maxStored) break; if (retainedIndices.has(entry.index)) continue; - if (canTake(entry, 2, 2)) take(entry); + if (canTake(entry, 2, 2, SOURCE_DAY_ALERT_CAP)) take(entry); } return items.filter((_, index) => retainedIndices.has(index)); diff --git a/scripts/build-live-feed/config.mjs b/scripts/build-live-feed/config.mjs index f6ff1672..cce8e18b 100644 --- a/scripts/build-live-feed/config.mjs +++ b/scripts/build-live-feed/config.mjs @@ -317,7 +317,6 @@ export const HARD_SKIP_SOURCE_IDS = new Set([ 'besa-terrorism', 'icct-main', 'jamestown-militant-leadership-monitor', - 'jamestown-terrorism-monitor', 'washington-institute-countering-terrorism', 'cps-terrorism-news', 'cps-terrorism-search', diff --git a/scripts/ci/seed-quarantine-from-health.mjs b/scripts/ci/seed-quarantine-from-health.mjs index e88e09ec..76646875 100644 --- a/scripts/ci/seed-quarantine-from-health.mjs +++ b/scripts/ci/seed-quarantine-from-health.mjs @@ -15,9 +15,6 @@ import fs from 'node:fs'; import path from 'node:path'; // ── Thresholds (mirror build-live-feed/config defaults) ────────────── -const HEALTH_SCORE_REVIEW_THRESHOLD = Number( - process.env.ALBERTALERT_HEALTH_SCORE_REVIEW_THRESHOLD || 25 -); const AUTO_QUARANTINE_FAILURE_THRESHOLD = Number( process.env.ALBERTALERT_AUTO_QUARANTINE_FAILURE_THRESHOLD || 6 ); @@ -38,7 +35,6 @@ const sourcesPath = process.argv[3] || path.join(repoRoot, 'data', 'sources.json * return a Set of source IDs that should be pre-quarantined. */ export function deriveQuarantineIds(sourceHealth, options = {}) { - const threshold = options.healthScoreThreshold ?? HEALTH_SCORE_REVIEW_THRESHOLD; const failureThreshold = options.failureThreshold ?? AUTO_QUARANTINE_FAILURE_THRESHOLD; const ids = new Set(); @@ -47,15 +43,11 @@ export function deriveQuarantineIds(sourceHealth, options = {}) { for (const [id, entry] of Object.entries(sourceHealth)) { if (!entry || typeof entry !== 'object') continue; - const healthScore = Number.isFinite(Number(entry.healthScore)) - ? Number(entry.healthScore) - : null; const alreadyQuarantined = Boolean(entry.quarantined); const consecutiveFailures = Number(entry.consecutiveFailures || 0); if ( alreadyQuarantined || - (healthScore !== null && healthScore < threshold) || consecutiveFailures >= failureThreshold ) { ids.add(id); diff --git a/shared/alert-view-model.mjs b/shared/alert-view-model.mjs index c52902d9..7c561c1a 100644 --- a/shared/alert-view-model.mjs +++ b/shared/alert-view-model.mjs @@ -355,14 +355,14 @@ export function sortAlertsByFreshness(alertList) { return [...alertList].sort((a, b) => { const freshnessGap = freshnessBucketForAlert(b) - freshnessBucketForAlert(a); if (freshnessGap !== 0) return freshnessGap; + const timeGap = alertPublishedTime(b) - alertPublishedTime(a); + if (timeGap !== 0) return timeGap; const trackGap = incidentTrackRank(b) - incidentTrackRank(a); if (trackGap !== 0) return trackGap; const tierGap = sourceTierRank(b) - sourceTierRank(a); if (tierGap !== 0) return tierGap; const londonGap = Number(isLondonAlert(b)) - Number(isLondonAlert(a)); if (londonGap !== 0) return londonGap; - const timeGap = alertPublishedTime(b) - alertPublishedTime(a); - if (timeGap !== 0) return timeGap; const scoreGap = incidentScore(b) - incidentScore(a); if (scoreGap !== 0) return scoreGap; if (!!a.major !== !!b.major) return a.major ? -1 : 1; diff --git a/tests/decision-logic.test.mjs b/tests/decision-logic.test.mjs index 4a13790d..f670f9ae 100644 --- a/tests/decision-logic.test.mjs +++ b/tests/decision-logic.test.mjs @@ -29,6 +29,7 @@ import { isLiveIncidentCandidate, isQuarantineCandidate, normaliseAlert, + sortAlertsByFreshness, trustSignal } from '../shared/alert-view-model.mjs'; import { @@ -907,6 +908,42 @@ test('stored alert selection keeps live incidents and fresh official corroborati assert.ok(retentionScoreFor(freshOfficialContext) > retentionScoreFor(staleWeakContext)); }); +test('stored alert selection caps source output to two alerts per day', () => { + const source = 'UN Office of Counter-Terrorism (UNOCT) - News'; + const unoct1 = makeAlert({ + id: 'unoct-1', + source, + sourceUrl: 'https://example.test/unoct-1', + publishedAt: '2026-04-24T10:49:55.000Z', + priorityScore: 9 + }); + const unoct2 = makeAlert({ + id: 'unoct-2', + source, + sourceUrl: 'https://example.test/unoct-2', + publishedAt: '2026-04-24T09:49:55.000Z', + priorityScore: 8 + }); + const unoct3 = makeAlert({ + id: 'unoct-3', + source, + sourceUrl: 'https://example.test/unoct-3', + publishedAt: '2026-04-24T08:49:55.000Z', + priorityScore: 7 + }); + const other = makeAlert({ + id: 'other-1', + source: 'Counter Terrorism Policing', + sourceUrl: 'https://example.test/other-1', + publishedAt: '2026-04-24T07:49:55.000Z', + priorityScore: 6 + }); + + const selected = selectStoredAlerts([unoct1, unoct2, unoct3, other], 10); + + assert.deepEqual(selected.map((alert) => alert.id), ['unoct-1', 'unoct-2', 'other-1']); +}); + test('shouldKeepItem rejects items without a reliable publish date', () => { const source = { lane: 'context', @@ -1606,6 +1643,24 @@ test('renderSupporting merges context and quarantine into one progressive list', assert.equal(supportingLoadMore.hasClass('hidden'), false); }); +test('sortAlertsByFreshness prioritises newer stories inside the same freshness bucket', () => { + const newerButLowerSignal = makeAlert({ + id: 'newer', + incidentTrack: 'case', + sourceTier: 'research', + publishedAt: isoMinutesAgo(13 * 60) + }); + const olderButHigherSignal = makeAlert({ + id: 'older', + incidentTrack: 'live', + sourceTier: 'trigger', + publishedAt: isoMinutesAgo(20 * 60) + }); + + const sorted = sortAlertsByFreshness([olderButHigherSignal, newerButLowerSignal]); + assert.deepEqual(sorted.map((alert) => alert.id), ['newer', 'older']); +}); + test('addSourceRequest accepts valid http/https links and stores newest first', () => { const requests = []; const result = addSourceRequest(requests, 'https://example.com/news', new Date('2026-04-04T12:00:00.000Z')); diff --git a/tests/error-pattern-analysis.test.mjs b/tests/error-pattern-analysis.test.mjs index c78231a8..264a9aca 100644 --- a/tests/error-pattern-analysis.test.mjs +++ b/tests/error-pattern-analysis.test.mjs @@ -235,20 +235,19 @@ test('nextSourceHealthEntry – prior recentErrors carried through from previous // nextSourceHealthEntry() – never-verified immediate quarantine // --------------------------------------------------------------------------- -test('nextSourceHealthEntry – never-verified source with 404 is immediately quarantined', () => { +test('nextSourceHealthEntry – never-verified source with 404 is not immediately quarantined', () => { const source = makeSource(); // Empty prior = brand-new source with no history const result = nextSourceHealthEntry(source, failStat('not-found-404'), {}, '2026-01-01T00:00:00Z'); - assert.equal(result.quarantined, true, 'should be quarantined on first 404 when never verified'); - assert.equal(result.quarantinedAt, '2026-01-01T00:00:00Z'); - assert.ok(result.quarantineReason, 'should have a quarantine reason'); + assert.equal(result.quarantined, false, 'should not be quarantined before failure threshold is exceeded'); + assert.equal(result.quarantinedAt, null); }); -test('nextSourceHealthEntry – never-verified source with dead-or-moved-url is immediately quarantined', () => { +test('nextSourceHealthEntry – never-verified source with dead-or-moved-url is not immediately quarantined', () => { const source = makeSource(); const result = nextSourceHealthEntry(source, failStat('dead-or-moved-url', 'DNS NXDOMAIN'), {}, '2026-01-01T00:00:00Z'); - assert.equal(result.quarantined, true, 'should be quarantined on first dead-url when never verified'); - assert.ok(result.quarantineReason); + assert.equal(result.quarantined, false, 'should not be quarantined before failure threshold is exceeded'); + assert.equal(result.quarantinedAt, null); }); test('nextSourceHealthEntry – never-verified source with non-definitive failure is NOT immediately quarantined', () => { diff --git a/tests/seed-quarantine.test.mjs b/tests/seed-quarantine.test.mjs index 453c7c9f..35fa1513 100644 --- a/tests/seed-quarantine.test.mjs +++ b/tests/seed-quarantine.test.mjs @@ -18,18 +18,18 @@ test('deriveQuarantineIds returns empty set for null/undefined input', () => { assert.equal(deriveQuarantineIds({}).size, 0); }); -test('deriveQuarantineIds flags source below health threshold', () => { +test('deriveQuarantineIds does not flag source by low health score alone', () => { const ids = deriveQuarantineIds( { 'src-a': { healthScore: 20, quarantined: false, consecutiveFailures: 0 } }, - { healthScoreThreshold: 25, failureThreshold: 6 } + { failureThreshold: 6 } ); - assert.ok(ids.has('src-a')); + assert.equal(ids.size, 0); }); test('deriveQuarantineIds flags source already quarantined', () => { const ids = deriveQuarantineIds( { 'src-b': { healthScore: 80, quarantined: true, consecutiveFailures: 0 } }, - { healthScoreThreshold: 25, failureThreshold: 6 } + { failureThreshold: 6 } ); assert.ok(ids.has('src-b')); }); @@ -37,7 +37,7 @@ test('deriveQuarantineIds flags source already quarantined', () => { test('deriveQuarantineIds flags source at or above failure threshold', () => { const ids = deriveQuarantineIds( { 'src-c': { healthScore: 50, quarantined: false, consecutiveFailures: 6 } }, - { healthScoreThreshold: 25, failureThreshold: 6 } + { failureThreshold: 6 } ); assert.ok(ids.has('src-c')); }); @@ -45,7 +45,7 @@ test('deriveQuarantineIds flags source at or above failure threshold', () => { test('deriveQuarantineIds does not flag healthy source', () => { const ids = deriveQuarantineIds( { 'src-d': { healthScore: 80, quarantined: false, consecutiveFailures: 1 } }, - { healthScoreThreshold: 25, failureThreshold: 6 } + { failureThreshold: 6 } ); assert.equal(ids.size, 0); }); @@ -57,11 +57,11 @@ test('deriveQuarantineIds handles multiple sources', () => { bad2: { healthScore: 50, quarantined: true, consecutiveFailures: 0 }, bad3: { healthScore: 40, quarantined: false, consecutiveFailures: 8 } }; - const ids = deriveQuarantineIds(health, { healthScoreThreshold: 25, failureThreshold: 6 }); - assert.equal(ids.size, 3); - assert.ok(ids.has('bad1')); + const ids = deriveQuarantineIds(health, { failureThreshold: 6 }); + assert.equal(ids.size, 2); assert.ok(ids.has('bad2')); assert.ok(ids.has('bad3')); + assert.ok(!ids.has('bad1')); assert.ok(!ids.has('good')); }); @@ -71,7 +71,7 @@ test('deriveQuarantineIds skips malformed entries', () => { garbage: 'not-an-object', empty: null }; - const ids = deriveQuarantineIds(health, { healthScoreThreshold: 25, failureThreshold: 6 }); + const ids = deriveQuarantineIds(health, { failureThreshold: 6 }); assert.equal(ids.size, 0); }); @@ -138,13 +138,13 @@ test('run() patches sources.json based on health data', async () => { fs.writeFileSync(sourcesFile, JSON.stringify(catalog)); const result = await run(alertsFile, sourcesFile); - assert.equal(result.seeded, 2); + assert.equal(result.seeded, 1); assert.equal(result.total, 4); const updated = JSON.parse(fs.readFileSync(sourcesFile, 'utf8')); const byId = Object.fromEntries(updated.sources.map((s) => [s.id, s])); assert.equal(byId.healthy.quarantined, undefined); - assert.equal(byId.sick.quarantined, true); + assert.equal(byId.sick.quarantined, undefined); assert.equal(byId.quarantined.quarantined, true); assert.equal(byId.unknown.quarantined, undefined);