Built with AI · Part 2

Fresh News: An AI-Built Aggregator for Canadian News

March 9, 20256 min read
Built with AIAI-assisted devNext.jsRSSNews aggregatorClaude Code
Fresh News: An AI-Built Aggregator for Canadian News

How it started

Fresh News goes back years. The original version was a PHP project I built with Roy Pereira, inspired by FreshNews.org. My initial concept was a straightforward Canadian copy of that site, but Roy pushed it in a better direction. He suggested leaning hard into the Canadian news angle specifically, making it a tool for finding and consuming Canadian media in one place. That reframing gave the project its identity.

After the PHP version, I ran Fresh News on a WordPress theme for several years. It worked, but it always felt like I was fighting the platform to get the experience I wanted. When I started exploring AI-assisted development, I decided to rebuild from scratch. The new version was one of my first projects using Next.js, and I developed it entirely with Claude Code. No WordPress, no templates, just a clean codebase I actually understood and could iterate on.

It's become a site I genuinely use every day to stay on top of what's happening across the country.

What I built

Fresh News pulls headlines from over 75 Canadian media outlets. English and French. It organizes them by topic (politics, business, tech, environment, sports, and more) and links directly to the original publisher. Every link takes you straight to the source. Fresh News never copies article content, never republishes text, and never attempts to bypass paywalls. If an outlet has a paywall, you see the headline and you hit the paywall when you click through. That's by design.

I think it's important to support Canadian media. The industry is under real pressure, and the last thing it needs is another platform scraping content and keeping readers from the publishers who did the actual reporting. Fresh News is a discovery tool, not a replacement for reading the real thing.

The stack is Next.js with server-side rendering, deployed on Vercel. The RSS parsing runs on a schedule, normalizing feeds from outlets that all structure their data differently.

The AI process

This was actually my first real Next.js project, so Claude Code was pulling double duty: teaching me the framework while helping me build the product. The RSS normalization was where AI saved the most time.

Every news outlet structures their RSS feed slightly differently. Some use content:encoded, some use description, some put the full article in the feed, some put a sentence. Date formats vary. Categories vary. Character encoding varies. It's the kind of work where you're writing the same pattern fifty times with minor tweaks for each source.

Claude Code was perfect for this. I'd set up the pattern for one outlet, then say "now do the same for these ten, here are their feed URLs and here's how their XML differs." Grunt work that would have taken days compressed into hours.

Where it got more interesting was the topic classification. I wanted articles tagged by topic without relying on each outlet's own categories (which are wildly inconsistent). Claude Code helped me build a keyword-based classifier that's simple but effective. Not ML, just smart pattern matching against a curated list of topic indicators.

Where experience beat AI suggestions

Claude Code kept suggesting I add AI-powered features. Summarize articles with GPT. Rank stories by importance. Generate briefings. Every suggestion was technically sound and would have been wrong for this product.

The whole point of Fresh News is that it doesn't editorialize. The moment you add AI summaries, you're a publisher, not an aggregator. The moment you rank stories, you're making editorial decisions. I wanted the opposite: give people the raw firehose, organized clearly, and let them decide what matters.

This is where experience matters. A less experienced builder might have chased the shiny AI features because they're impressive. But I've watched enough products fail by adding complexity that serves the builder's interests over the user's. Fresh News works because it does one thing and does it cleanly.

Playing fair with publishers

Fresh News respects every outlet's robots.txt rules. If a publisher's robots.txt says don't crawl, we don't crawl. If any media site requests removal, they get removed. No questions, no pushback. The goal is to send readers to publishers, not to take anything from them.

This isn't just a policy, it's the whole point. Canadian journalism is worth supporting. If Fresh News can help someone discover a regional outlet they wouldn't have found otherwise and that outlet gets a reader out of it, that's the best possible outcome.

The editorial problem

The hardest part wasn't technical at all. It was deciding which outlets to include. You can't build a news aggregator without making editorial choices about source quality. Include everything and you dilute trust. Curate too aggressively and you become the gatekeeper you're trying to avoid.

I landed on a simple heuristic: established outlets with professional editorial standards. No blogs, no opinion-only sites, no outlets that have been flagged by media watchdogs. It's not perfect, and I revisit the list regularly, but it gave me a defensible starting point.

What I learned

Building Fresh News reinforced something I keep coming back to: AI is phenomenal at the known patterns and terrible at the judgment calls. The RSS parsing was a known pattern. The topic classification was a known pattern. But "should this source be included?" and "should we add AI summaries?" were judgment calls that required understanding the product's reason for existing.

The gap between what AI can build and what you should build is where product experience lives. And that gap isn't getting smaller. If anything, as AI makes more things possible, the "should we?" question becomes more important, not less.

What's next

Fresh News is live at freshnews.ca and I'm actively expanding the source list. The big opportunity is broader categories and more languages. Canada has vibrant media communities publishing in Mandarin, Punjabi, Arabic, and more, and right now Fresh News doesn't surface any of that. Fixing that feels like the right next step. I'd also like to add more niche categories beyond the current topic set to better reflect the range of what Canadian outlets actually cover.

Colin Smillie

Colin Smillie

Most recently VP Technology at YMCA Canada. Building and shipping real products with AI-assisted development. More about Colin's advisory and executive work at colinsmillie.com.