Skip to content

πŸ’‘ 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

  1. How to fetch news? β€” RSS feeds, news APIs (NewsAPI, Bing News API), or web scraping?
  2. How to summarise? β€” Use Azure OpenAI / GPT to generate short blurbs from full articles
  3. Where to host? β€” Azure Static Web Apps (like the learning portal) with a custom subdomain
  4. How to automate? β€” Azure Functions (timer trigger), GitHub Actions (scheduled workflow), or a Logic App?
  5. How to avoid stale/duplicate content? β€” Dedupe by URL or headline, keep only last 48 hours
  6. Cost? β€” API calls for news + AI summarisation + hosting β€” estimate monthly cost
  7. 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.

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

  1. RSS feeds are underrated β€” most AI companies publish RSS. Free, reliable, no API key needed.
  2. GitHub Models is a hidden gem β€” free GPT-4o mini access with your GitHub token. Perfect for personal projects.
  3. Azure Static Web Apps free tier is generous β€” custom domain, SSL, and hosting for $0.
  4. GitHub Actions as a cron job β€” you don't need Azure Functions or Logic Apps for simple scheduled tasks.
  5. 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:

[
  { "title": "...", "ai_summary": "...", "category_id": "..." }
]

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

  1. 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.
  2. "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.
  3. 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.
  4. Freshness indicators build trust β€” "Updated 3h ago" tells visitors the page is alive. Without it, they wonder if it's stale.
  5. 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.
  6. 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.
  7. 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.
  8. 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