π‘ Idea 2: AI News Page β ainews.aguidetocloud.com¶
| Field | Detail |
|---|---|
| Priority | π Important |
| Status | β Complete |
| Category | π¬ Content / π Learning Project |
| Date added | 2026-03-28 |
| Completed | 2026-03-28 |
| To-Do link | I2 on To-Do List |
The Original Idea¶
The Problem¶
AI is moving incredibly fast β new models, tools, and platforms launch almost daily. Without a dedicated news source, it's easy to miss important developments (e.g., missed OpenClaw for days until stumbling on it in a session). Manually reading news sites isn't sustainable.
The Idea¶
Build an automated AI news page at ainews.aguidetocloud.com that:
- Runs every night β an AI agent searches, researches, and summarises the latest AI news
- Categorises by provider β Microsoft, OpenAI, Google, Meta, Anthropic, open-source, etc.
- Short blurb for each item β quick summary so you can scan in 2 minutes
- Source links β click through to read the full article if interested
- Zero manual work β fully automated, just check the page each morning
Key Questions We Had¶
- How to fetch news? β RSS feeds, news APIs (NewsAPI, Bing News API), or web scraping?
- How to summarise? β Use Azure OpenAI / GPT to generate short blurbs from full articles
- Where to host? β Azure Static Web Apps (like the learning portal) with a custom subdomain
- How to automate? β Azure Functions (timer trigger), GitHub Actions (scheduled workflow), or a Logic App?
- How to avoid stale/duplicate content? β Dedupe by URL or headline, keep only last 48 hours
- Cost? β API calls for news + AI summarisation + hosting β estimate monthly cost
- Design β Clean, scannable layout β maybe cards per category, or a timeline view
Potential Benefits¶
- Never miss important AI developments again
- Quick morning scan instead of browsing 10+ different sites
- Great content source for YouTube videos ("This week in AI" format)
- Showcases Azure AI + automation skills β a practical demo for customers
- Could become a public resource for the aguidetocloud.com audience
β Project Documentation¶
This idea is complete! Full project documentation below.
Live Links¶
URL: ainews.aguidetocloud.com
Repo: github.com/susanthgit/-ainews
Built: March 2026 using GitHub Copilot CLI (Opus 4.6)
What Is It?¶
An automated AI news page that runs every night, fetches the latest AI news from multiple sources, generates short AI summaries, and publishes a slick retro-neon dashboard β all with zero manual work.
Check it every morning with your coffee β and catch up on everything that happened in AI while you slept.
Architecture¶
RSS Feeds βββ
ββββΆ fetch_news.py βββΆ summarise.py βββΆ generate_page.py βββΆ index.html
NewsAPI βββββ (articles) (GPT-4o mini) (retro HTML) (deployed)
GitHub Actions runs this pipeline nightly β commits output β deploys to Azure Static Web App
How It Works (Step by Step)¶
| Step | Script | What it does |
|---|---|---|
| 1οΈβ£ | fetch_news.py |
Fetches articles from 15 RSS feeds + NewsAPI, deduplicates, filters last 48 hours |
| 2οΈβ£ | summarise.py |
Sends each article to GPT-4o mini (via GitHub Models) for a 2-3 sentence summary |
| 3οΈβ£ | generate_page.py |
Renders a static HTML page with retro neon theme, sidebar nav, and category cards |
Tech Stack¶
| Component | Tool | Cost |
|---|---|---|
| News source 1 | RSS feeds (Microsoft, OpenAI, Google, Anthropic, Meta, Hugging Face blogs) | π Free |
| News source 2 | NewsAPI.org (free tier, 100 requests/day) | π Free |
| AI summarisation | GitHub Models β GPT-4o mini | π Free (150 req/day on free plan) |
| Automation | GitHub Actions (nightly cron at midnight NZT) | π Free |
| Hosting | Azure Static Web Apps (free tier) | π Free |
| Custom domain | ainews.aguidetocloud.com (CNAME to SWA) | π Free |
Total estimated cost: under $2/month
The only potential cost is if you exceed GitHub Models free limits β which is unlikely with ~125 articles/day.
News Categories¶
The page is organised into 12 categories, with Microsoft getting dedicated sub-categories:
| # | Category | What's Covered |
|---|---|---|
| 1 | π₯ Top Stories | Biggest AI headlines from TechCrunch, The Verge, Ars Technica |
| 2 | π£οΈ Rumours & Gossip | Leaks, speculation, "reportedly" stories |
| 3 | π¦ Microsoft | Copilot, Azure AI, Foundry, Windows AI |
| 4 | β¨ M365 Copilot | Microsoft 365 Copilot features, updates, roadmap |
| 5 | π οΈ Copilot Studio | Copilot Studio, declarative agents, extensibility |
| 6 | π AI Foundry | Azure AI Foundry, Azure OpenAI, model catalog, prompt flow |
| 7 | π© OpenAI | GPT models, ChatGPT, API updates |
| 8 | π₯ Google | Gemini, DeepMind, Vertex AI |
| 9 | πͺ Meta | Llama, open-source AI |
| 10 | π§ Anthropic | Claude, MCP protocol |
| 11 | β¬ Open Source | Hugging Face, community models, frameworks |
| 12 | π΅ Industry | Regulations, funding, trends, startups |
Page Features¶
π Daily / Weekly / Monthly Views¶
Not everyone checks every day, so the page generates three views:
| View | What it shows | URL |
|---|---|---|
| Today | Latest daily news | /index.html |
| This Week | Top stories from last 7 days | /weekly/latest.html |
| This Month | All stories from current month | /monthly/latest.html |
A navigation bar at the top lets you jump between views and browse previous days.
π¨ Retro Neon Theme¶
The design uses a dark, neon-glowing aesthetic matching the learning portal's style:
- Left sidebar β clickable category navigation with article counts
- Right sidebar β quick stats, trending topics, quick links, update info
- Cards β each article is a hoverable card with title, AI summary, source, and timestamp
- Responsive β sidebars hide on mobile, cards stack vertically
Azure Resources¶
All project resources live in a dedicated resource group:
| Resource | Type | Location | Tier |
|---|---|---|---|
aiNews-RG |
Resource Group | Australia East | β |
ainews-site |
Static Web App | East Asia | Free |
Why no Azure OpenAI?
We originally planned to use Azure OpenAI for AI summaries, but the lab subscription's security policy blocks API keys. We switched to GitHub Models instead β free, no key hassles, and the GITHUB_TOKEN in GitHub Actions just works.
GitHub Actions Workflow¶
The nightly pipeline (.github/workflows/nightly-news.yml) runs automatically:
| Setting | Value |
|---|---|
| Schedule | 0 11 * * * (11:00 UTC = midnight NZT) |
| Trigger | Also supports manual trigger via "Run workflow" button |
| Runtime | Ubuntu, Python 3.12 |
| Secrets needed | NEWSAPI_KEY, AZURE_STATIC_WEB_APPS_API_TOKEN |
What Each Step Does¶
π₯ Checkout repo
π Set up Python 3.12
π¦ Install dependencies (feedparser, openai, jinja2, etc.)
π‘ Fetch news from RSS + NewsAPI
π€ Summarise articles with GPT-4o mini
π¨ Generate HTML pages (daily + weekly + monthly)
πΎ Commit generated files to repo
π Deploy to Azure Static Web Apps
Key Files¶
ainews/
βββ .github/workflows/
β βββ nightly-news.yml # Nightly GitHub Actions workflow
βββ scripts/
β βββ feeds.json # RSS feed URLs + categories config
β βββ fetch_news.py # Step 1: fetch from RSS + NewsAPI
β βββ summarise.py # Step 2: AI summarisation via GitHub Models
β βββ generate_page.py # Step 3: render HTML + archive + digests
βββ templates/
β βββ cards.html.j2 # Retro neon card layout (main design)
β βββ timeline.html.j2 # Alternative timeline layout
βββ site/ # Generated output (auto-committed)
β βββ index.html # Today's page
β βββ archive/YYYY-MM-DD/ # Daily archives
β βββ weekly/latest.html # Weekly digest
β βββ monthly/latest.html # Monthly digest
β βββ data/YYYY-MM-DD.json # Archived article data
βββ requirements.txt
βββ README.md
What I Learned Building This¶
Key takeaways
- RSS feeds are underrated β most AI companies publish RSS. Free, reliable, no API key needed.
- GitHub Models is a hidden gem β free GPT-4o mini access with your GitHub token. Perfect for personal projects.
- Azure Static Web Apps free tier is generous β custom domain, SSL, and hosting for $0.
- GitHub Actions as a cron job β you don't need Azure Functions or Logic Apps for simple scheduled tasks.
- Bing News API is dead β retired August 2025. Replacement costs $35/1000 queries. RSS + NewsAPI is the way to go.
How to Add/Remove News Sources¶
Edit scripts/feeds.json in the repo. Each category has a list of RSS feeds and keywords:
{
"id": "microsoft",
"name": "Microsoft",
"emoji": "π¦",
"feeds": [
{ "name": "Microsoft AI Blog", "url": "https://blogs.microsoft.com/ai/feed/" }
],
"keywords": ["Microsoft Copilot", "Azure AI"]
}
Push the change β the nightly job picks it up automatically.
Future Enhancements (Remaining)¶
- [ ] Email digest subscription β weekly summary in your inbox (Buttondown free tier)
- [ ] "This Week in AI" YouTube video script β auto-generated from weekly.json
- [ ] Social media auto-posting β top 3 headlines to LinkedIn/X on publish
- [ ] ~~Trending topics word cloud visualisation~~ β β Done (trending bar on weekly tab)
- [ ] ~~Favourite/bookmark articles~~ β Deferred
- [ ] ~~Dark/light theme toggle~~ β Skipped (dark-only per brand)
π V2 Improvements (April 2026)¶
Status: In Progress
After the initial build, we researched how to make the AI News page better by studying popular news aggregation sites. Below is everything we learned and the improvements being implemented.
Why V2?¶
The v1 page was a great start β fully automated, zero manual work, slick design. But after using it daily and comparing to professional news aggregators, we identified key gaps:
- Wall of cards β everything looks the same priority. No hierarchy.
- No actionability β summaries say what happened but not why you should care.
- No visual differentiation β headlines and minor updates get identical treatment.
- Missing polish β no favicons, no loading states, no "last updated" indicator.
Competitor Research¶
We studied 8 popular news aggregation sites to identify what makes them successful:
| Site | Readers | Best Feature | Key Takeaway |
|---|---|---|---|
| TLDR AI | 920K | 3-tier structure: Headlines β Deep Dives β Quick Links | Readers self-select depth; scannable in 2 mins |
| The Rundown AI | 2M | "Why it matters" + "How to apply it" per story | Actionable, not just informational |
| Techmeme | β | River-of-news + clustered related stories | Shows multiple perspectives on the same story |
| The Hacker News | β | Thumbnail images + bold headlines + time badges | Visual scanning is instant |
| AIBase | β | High-frequency updates (hourly), image-heavy cards | Feels alive and current |
| daily.dev | β | Personalised feed based on tech stack | Relevance > volume |
| AI Tool Report | 400K | Categorised by role (Ops, HR, Marketing, Product) | Audience-specific framing |
| Ben's Bites | β | Newsletter-first, curated voice | Personal curation builds trust |
The #1 Pattern Across All Successful Sites
Tiered content β every successful aggregator separates "must read" from "nice to know". TLDR does it with Headers/Deep Dives/Quick Links. The Rundown does it with lead story vs. supporting stories. This is the single biggest improvement to make.
Architecture Changes (V1 β V2)¶
V1 Architecture¶
RSS Feeds βββ
ββββΆ fetch_news.py βββΆ summarise.py βββΆ generate_page.py βββΆ index.html
NewsAPI βββββ (articles) (summaries) (flat cards)
V2 Architecture¶
RSS Feeds βββ
ββββΆ fetch_news.py βββΆ summarise.py βββΆ generate_page.py βββΆ index.html
NewsAPI βββββ (articles) (summaries + (3-tier layout)
tier ranking +
why_it_matters)
The key change is in summarise.py β the GPT prompt now does three things instead of one:
flowchart LR
A[Article] --> B[GPT-4o mini]
B --> C[Summary<br/>2-3 sentences]
B --> D[Why It Matters<br/>1 punchy sentence]
B --> E[Tier Classification<br/>headline / deep_dive / quick]
What Changed in Each File¶
| File | V1 | V2 Change |
|---|---|---|
summarise.py |
Returns {summary} |
Returns {summary, why_it_matters, tier} + wraps output in metadata object with generated_at timestamp |
ainews.js |
Flat grid of identical cards | 3-tier rendering: π₯ Hero cards β π§ Deep Dive cards β β‘ Quick Link rows |
ainews.js |
No source branding | Source favicons via Google Favicon API |
ainews.js |
"Loading..." text | Shows "Updated Xh ago" from generated_at |
generate_page.py |
Reads bare JSON array | Handles both old format (array) and new format (object with articles key) |
New JSON Data Format¶
V1 output (summaries.json) was a bare array:
V2 output wraps it with metadata:
{
"generated_at": "2026-04-01T11:00:00+00:00",
"total_articles": 85,
"summarised": 82,
"articles": [
{
"title": "...",
"ai_summary": "OpenAI raised $122B at an $852B valuation...",
"why_it_matters": "Sets a new record for private funding, signalling massive confidence in AI infrastructure.",
"tier": "headline",
"category_id": "openai",
"source": "TechCrunch AI"
}
]
}
The 3-Tier Layout (TLDR-style)¶
Inspired by TLDR AI's proven format:
βββββββββββββββββββββββββββββββββββββββββββββββ
β π₯ HEADLINES (3-5 stories) β
β βββββββββββββββββββββββββββββββββββββββ β
β β Big hero card with full summary β β
β β + "Why it matters:" callout β β
β β π° TechCrunch Β· 3h ago β β
β βββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββ€
β π§ DEEP DIVES (~50% of articles) β
β ββββββββββββββββ ββββββββββββββββ β
β β Regular card β β Regular cardβ β
β β + summary β β + summary β β
β β + why β β + why β β
β ββββββββββββββββ ββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββ€
β β‘ QUICK LINKS (~30% of articles) β
β β’ Minor update title β why it matters 3h β
β β’ Routine announcement β context 5h β
β β’ Niche topic β one-liner 12h β
βββββββββββββββββββββββββββββββββββββββββββββββ
Updated GPT Prompt¶
The summarisation prompt was upgraded from a simple "summarise this" to a multi-output classification prompt:
| Output Field | Purpose | Constraint |
|---|---|---|
summary |
2-3 sentence factual summary | Under 80 words |
why_it_matters |
Single punchy impact sentence | Under 25 words, starts with a verb |
tier |
Article importance classification | headline (20%), deep_dive (50%), quick (30%) |
Updated Tech Stack¶
| Component | V1 | V2 |
|---|---|---|
| AI summarisation | GitHub Models β GPT-4o mini | Azure OpenAI β GPT-4o mini (Azure AD auth, no API keys) |
| AI output | Summary only | Summary + Why It Matters + Tier classification |
| Frontend rendering | Flat card grid by category | 3-tier layout (Headlines β Deep Dives β Quick Links) |
| Source branding | Text-only source name | Favicons via Google Favicon API |
| Freshness indicator | None | "Updated Xh ago" with green/amber/red pulsing dot |
| Data format | Bare JSON array | Wrapped JSON object with metadata |
| Deployment | Standalone SWA only | Main site only β legacy SWA deploy removed |
| Schedule | Once daily | 4x daily (every 6 hours β 6AM, 12PM, 6PM, 12AM NZT) |
| Categories | 12 | 15 (added Apple, NVIDIA, Amazon) |
| RSS feeds | ~20 | 31 (added Wired, MIT Tech Review, The Register, ZDNet + vendor feeds) |
| Deduplication | URL+title hash only | Fuzzy title matching (Jaccard similarity >75%) |
| Error handling | None | GitHub issue auto-created on pipeline failure |
Why we switched from GitHub Models to Azure OpenAI
The original build used GitHub Models (free GPT-4o mini with GITHUB_TOKEN). V2 switched to Azure OpenAI with Azure AD token authentication β more reliable, no rate limit surprises, and the lab subscription's security policy now supports it via OIDC federated login from GitHub Actions. No API keys stored anywhere.
Full Improvement Tracker¶
All improvements are tracked and will be implemented incrementally:
π’ Quick Wins (Low effort, high impact)¶
| # | Improvement | Status | Description |
|---|---|---|---|
| 1 | 3-tier TLDR-style layout | β Done | Split into Headlines β Deep Dives β Quick Links |
| 2 | "Why it matters" line | β Done | Punchy one-liner per article β label in tier colour, detail in white |
| 3 | Top 3 hero stories | β Done | Neon magenta glow on hover, full card grid |
| 4 | Source favicons | β Done | Google Favicon API next to source names |
| 5 | Last updated timestamp | β Done | "Updated Xh ago" from generated_at |
| 6 | Reading time estimates | β Done | "X min read" badge on all cards |
π‘ Medium Effort (Good ROI)¶
| # | Improvement | Status | Description |
|---|---|---|---|
| 7 | Article thumbnails (OG images) | β Done | Extracted from RSS media tags + NewsAPI urlToImage, shown as card headers |
| 8 | Distinct Rumours & Gossip style | β Done | Dashed purple border, italic titles, purple hover glow |
| 9 | Article search/filter box | β Done | Real-time text search across all articles |
| 10 | Email digest sign-up | β Done | RSS feed CTA at bottom of page with subscribe button |
π΄ Bigger Projects (High impact, more work)¶
| # | Improvement | Status | Description |
|---|---|---|---|
| 11 | Twice-daily updates | β Done | Runs at midnight + noon NZT |
| 12 | Trending topics bar | β Done | Top 12 keywords extracted from titles, shown as cyan pills |
| 13 | Story clustering | β Done | GPT assigns cluster labels to group related articles, shown as purple badges |
| 14 | Skeleton loading animation | β Done | Shimmer animation with 6 placeholder cards |
| 15 | RSS feed output | β Done | feed.xml with top 50 articles at /data/ainews/feed.xml |
| 16 | Colourful category pill buttons | β Done | Colour dots + emoji per category matching feeds.json |
π¨ Design Polish (Added during implementation)¶
| # | Improvement | Status | Description |
|---|---|---|---|
| 17 | OIDC auth (no expiring credentials) | β Done | Switched from SP secret to federated OIDC β never expires |
| 18 | Neon glow on hover only | β Done | Clean cards at rest, per-tier neon glow on hover (magenta/cyan/gold) |
| 19 | Per-tier colour scheme | β Done | Headlines=magenta, Deep Dives=cyan, Quick Links=gold |
| 20 | Custom OG social share banner | β Done | Custom WebP banner shown when sharing AI News URL on social media |
| 21 | M365 Copilot / Copilot Studio always visible | β Done | Category filters always show even with 0 articles |
| 22 | Full-width layout | β Done | Removed width cap, fits 4+ columns on wide screens |
| 23 | White bold tier descriptions | β Done | One-line explainer under each tier header |
π Pipeline & Coverage Expansion (7 April 2026)¶
| # | Improvement | Status | Description |
|---|---|---|---|
| 31 | Remove legacy SWA deploy | β Done | Removed failing standalone SWA deploy step (was always erroring with continue-on-error) |
| 32 | Node.js 24 migration | β Done | Set FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true ahead of June 2026 deprecation |
| 33 | Pipeline failure notification | β Done | New notify-on-failure job creates GitHub issue when pipeline fails |
| 34 | 4x daily schedule | β Done | Increased from 2x to 4x daily (6AM, 12PM, 6PM, 12AM NZT) for better freshness |
| 35 | Apple category | β Done | π Apple Intelligence β Apple ML Research blog + keywords |
| 36 | NVIDIA category | β Done | π NVIDIA β NVIDIA Blog + AI/GPU keywords |
| 37 | Amazon category | β Done | π¦ Amazon β AWS ML Blog + Amazon Science feeds |
| 38 | More Top Stories feeds | β Done | Added Wired AI, MIT Technology Review, The Register |
| 39 | Industry feed expansion | β Done | Added ZDNet AI feed |
| 40 | Rumours category feeds | β Done | Added TechCrunch + The Verge feeds (was empty, keyword-only) |
| 41 | Fuzzy title deduplication | β Done | Jaccard word-overlap similarity (>75%) catches same story from different sources |
| 42 | Live freshness badge | β Done | "Updated Xh ago" with green/amber/red pulsing dot on AI News page |
| 43 | New category JS support | β Done | Apple, NVIDIA, Amazon added to category order, metadata, and AI keywords in ainews.js |
Progress: 23 + 7 mobile + 13 pipeline = 43 total improvements β
Categories: 12 β 15 (added Apple, NVIDIA, Amazon)
Feeds: ~20 β 31 RSS sources
Schedule: 2x β 4x daily
π± Mobile UX & Layout Cleanup (2 April 2026)¶
Changes made to the AI News page on the main site (aguidetocloud.com/ai-news/) to improve the mobile experience and simplify the layout.
| # | Change | Reason | Files Changed |
|---|---|---|---|
| 24 | Compact mobile header | Description + large padding pushed articles ~550px down on phones β users had to scroll 2 full screens before seeing any content. Hidden description, reduced hero padding on mobile only. | style.css, list.html |
| 25 | Horizontal scrollable category filters | 12 category pills were wrapping into 3-4 rows on mobile (~160px). Changed to a single horizontal swipeable strip (like Instagram stories). | style.css |
| 26 | Removed description text | "Daily AI news digest β curated headlines..." was redundant β the title "π° AI News" is self-explanatory. Saves vertical space. | list.html |
| 27 | Removed "Today's AI News" header + stats | The tab already says "Today" and the "All (68)" filter shows the count. The header/stats line was duplicating information. | list.html, ainews.js |
| 28 | Removed trending topics section | The 12 trending keywords (e.g., "Microsoft", "Copilot") were generic and not useful β they matched the category names. Removed to reduce clutter. | ainews.js |
| 29 | Categories moved below search bar | New order: Title β Tabs β Search β Categories β Articles. Search is the primary action, categories are secondary filtering. | ainews.js |
| 30 | JS cache-busting | Browser was serving stale JS after changes, causing "data not available" errors. Added ?v={{ now.Unix }} Hugo timestamp to script tag β auto-updates every build. |
list.html |
Scoping note
All mobile changes are inside @media (max-width: 768px) β desktop layout is untouched. The .ainews-page-hero class was added to scope hero changes to the AI News page only (other pages like Blog also use .page-hero).
What I Learned from the Research¶
Key Takeaways from Studying News Aggregators
- Tiered content is the #1 pattern β TLDR (920K readers), The Rundown (2M readers), Techmeme all separate "must read" from "nice to know". It respects the reader's time.
- "Why it matters" is what turns news into intelligence β Raw summaries say what happened. Adding why you should care makes it actionable. The Rundown and TLDR nail this.
- Visual hierarchy > more content β 3 well-styled hero cards have more impact than 30 identical cards. Hacker News and AIBase prove this with thumbnails and bold headlines.
- Freshness indicators build trust β "Updated 3h ago" tells visitors the page is alive. Without it, they wonder if it's stale.
- Source favicons are a tiny change with outsized impact β A 16Γ16 pixel logo next to the source name makes scanning 3Γ faster because our brains recognise logos faster than text.
- AI can do the curation, not just the summarisation β The GPT prompt can classify article importance, not just summarise. This is the key insight that enables the 3-tier layout without manual curation.
- Newsletter-first sites dominate because of distribution β TLDR, The Rundown, and Ben's Bites all started as email newsletters. The website is secondary. Consider adding email sign-up.
- Cost stays near zero β All improvements are client-side (JS/CSS) or prompt tweaks. No new Azure resources needed. The only cost increase is slightly more tokens per article for the enriched prompt.
π§ V3 β Mega Upgrade (10 April 2026)¶
Status: Complete β 27 items shipped in one session
Triggered by a spot check that found missing Anthropic news (Project Glasswing). Investigation revealed 6 broken RSS feeds, which led to a comprehensive audit and complete overhaul of feeds, architecture, SEO, security, performance, and code quality.
What Triggered V3¶
While testing the site, we noticed Anthropic's Project Glasswing and other major vendor news were missing. Investigation revealed:
- 6 RSS feeds were silently failing (404/403 errors) β Anthropic, OpenAI, Meta, Azure Blog, M365 Blog, M365 Roadmap
- Weekly/Monthly tabs showed same content as Daily (architectural bug)
- No feed health monitoring β broken feeds went undetected for weeks
This discovery led to a full audit covering health, SEO, performance, security, and code quality.
V3 Improvements β Full List¶
π‘ Feed Fixes & Expansion¶
| # | Change | Details |
|---|---|---|
| 44 | Fix 6 broken RSS feeds | Anthropic (404), OpenAI (403), Meta (404), Azure Blog (timeout), M365 Blog (403), M365 Roadmap (403) β all replaced with working URLs |
| 45 | Add 5 new vendor categories | DeepSeek π¨π³, Mistral πͺπΊ, xAI β‘, Perplexity π β with feeds where available, keyword re-categorization where not |
| 46 | Dual Anthropic proxy feeds | Two GitHub-hosted RSS proxies (taobojlen + 0xSMW) for redundancy |
| 47 | xAI proxy feed | 0xSMW GitHub-hosted feed (28 articles) |
| 48 | Mistral proxy feed | 0xSMW GitHub-hosted feed (32 articles) |
| 49 | Meta Research feed | Added research.facebook.com/feed/ as second Meta source |
| 50 | Enriched vendor keywords | All vendors now have expanded keyword lists with product names, people, events (Glasswing, Mythos, Sam Altman, Jensen Huang, Gemma, AlphaFold, etc.) |
| 51 | Increased lookback window | 48h β 72h to catch delayed proxy feed articles |
| 52 | Remove duplicate feeds | TechCrunch + Verge removed from Rumours (duplicated Top Stories) |
| 53 | Feed health monitoring | Pipeline auto-creates GitHub Issue when feeds return errors β never silently fail again |
π Architecture β Weekly/Monthly Fix¶
| # | Change | Details |
|---|---|---|
| 54 | Weekly/Monthly JSON export | generate_page.py now outputs weekly.json and monthly.json alongside HTML |
| 55 | Workflow copies all 3 JSONs | Pipeline pushes latest.json + weekly.json + monthly.json to main site |
| 56 | JS loads correct file per tab | Daily β latest.json, Weekly β weekly.json, Monthly β monthly.json |
| 57 | Keyword re-categorization | New recategorize_by_keywords() in fetch_news.py β TechCrunch article about DeepSeek automatically moves to DeepSeek category |
| 58 | Breaking news detection | detect_breaking_news() in generate_page.py β stories in 3+ sources auto-promoted to headline tier |
π― SEO¶
| # | Change | Details |
|---|---|---|
| 59 | 13 category landing pages | /ai-news/microsoft/, /ai-news/openai/, etc. β each ranks independently for vendor-specific searches |
| 60 | Long-tail keyword titles | e.g., "OpenAI News β ChatGPT, GPT Models, Sora, API Updates & Sam Altman" |
| 61 | JSON-LD structured data | CollectionPage + BreadcrumbList schema on every category page |
| 62 | Visual breadcrumbs | Home βΊ AI News βΊ Microsoft AI News navigation |
| 63 | Crawlable intro text | Each page has a visible paragraph with keywords (not hidden behind JS) |
| 64 | Internal cross-links | "See also:" links between related vendor pages for link equity |
| 65 | SEO meta descriptions | Category-specific, keyword-rich, include "Updated 4x daily" freshness signal |
π Security¶
| # | Change | Details |
|---|---|---|
| 66 | Content-Security-Policy header | Added CSP in staticwebapp.config.json β allowlists scripts (Clarity, GTM), images (YouTube, Google, Clearbit), frames (YouTube) |
| 67 | feedparser timeout | Replaced feedparser.parse(url) with requests.get(url, timeout=15) β parse content β prevents pipeline hangs |
β‘ Performance¶
| # | Change | Details |
|---|---|---|
| 68 | sessionStorage cache | JSON data cached in browser β tab switches and category pages don't re-fetch |
| 69 | Parallel fetch (Promise.allSettled) | Category pages fetch monthly/weekly/daily in parallel instead of sequential |
| 70 | Lazy-load thumbnails | Replaced background-image:url() with <img loading="lazy"> for native lazy loading |
| 71 | Remove MutationObserver | Share button now initialised directly in DOMContentLoaded (tabs always in DOM) |
π Bug Fixes (from comprehensive audit)¶
| # | Bug | Fix |
|---|---|---|
| 72 | RSS <pubDate> used ISO 8601 instead of RFC 822 |
Convert to RFC 822 using email.utils.format_datetime() |
| 73 | Batch summary mapped by position, not AI index field |
Map by returned index with positional fallback |
| 74 | Top Stories colour mismatch (feeds.json vs JS) | Aligned to #FF6B35 |
| 75 | Open Source colour mismatch | Aligned to #333333 |
| 76 | Breaking news counter mixed clusters + articles | Use unique story set |
| 77 | Dead "azure ai" in JS MICROSOFT_CATS |
Removed |
| 78 | import re inside function body (repeated) |
Moved to top-level |
| 79 | Bad title scraping ("Company" from nav text) | Skip titles <5 chars or generic nav words |
π¨ UX Enhancements¶
| # | Change | Details |
|---|---|---|
| 80 | Tab article counts | "π Today (42) Β· π This Week (187) Β· π This Month (580)" |
| 81 | "NEW" badges | Highlights articles published since your last visit (localStorage) |
| 82 | Share button | π€ Copy link to clipboard |
| 83 | Trending This Week bar | Appears on weekly tab β shows hot topics as pills |
| 84 | Consolidated render functions | 3 card renderers refactored to shared helpers (getArticleVars, buildThumbHtml, buildClickAttr) |
| 85 | Click analytics | Tracks category/article clicks via Microsoft Clarity custom events |
| 86 | PWA manifest | manifest.json β installable on phone home screen |
| 87 | Browse by Vendor nav | Links bar on main AI News page to all 13 category pages |
Updated Stats¶
V1 (March 2026) β V2 (April 7) β V3 (April 10)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
12 categories β 15 categories β 20 categories
~20 RSS feeds β 31 RSS feeds β 33 RSS feeds
Once daily β 4x daily β 4x daily
No monitoring β Failure alerts β Failure + feed health alerts
No SEO β No SEO β 13 category pages + JSON-LD
No caching β No caching β sessionStorage cache
No CSP β No CSP β Full CSP header
6 broken feeds β 6 broken feeds β 0 broken feeds β
Files Changed in V3¶
| Repo | File | Changes |
|---|---|---|
| ainews | scripts/feeds.json |
+5 categories, fixed URLs, enriched keywords, removed dupes |
| ainews | scripts/fetch_news.py |
Timeout, title filter, keyword re-categorization, 72h lookback, import cleanup |
| ainews | scripts/summarise.py |
Index-based batch mapping |
| ainews | scripts/generate_page.py |
RFC 822 dates, weekly/monthly JSON export, breaking news detection, trending topics |
| ainews | .github/workflows/nightly-news.yml |
Feed health check step, copy weekly/monthly JSON to main site |
| main | static/js/ainews.js |
sessionStorage cache, parallel fetch, tab counts, NEW badges, share button, consolidated renders, lazy thumbs, 5 new vendor categories |
| main | static/css/style.css |
New badge, share button, thumb-wrap/thumb-img for lazy loading |
| main | static/staticwebapp.config.json |
CSP header |
| main | static/manifest.json |
PWA manifest (new file) |
| main | layouts/ai-news-category/list.html |
Category page template with JSON-LD, breadcrumbs, intro text |
| main | content/ai-news/*/\_index.md |
13 category content pages with SEO titles, descriptions, cross-links |