<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: AIDeepSignal</title>
    <description>The latest articles on DEV Community by AIDeepSignal (@jacob_chen_6b44c7aa03f8fc).</description>
    <link>https://dev.to/jacob_chen_6b44c7aa03f8fc</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3949953%2F5c451e54-c1e0-46ca-bbbd-ba61bb2ad56a.png</url>
      <title>DEV Community: AIDeepSignal</title>
      <link>https://dev.to/jacob_chen_6b44c7aa03f8fc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jacob_chen_6b44c7aa03f8fc"/>
    <language>en</language>
    <item>
      <title>How I Built an AI News Brief with Next.js, Supabase, Vercel, and GPT-4o-mini</title>
      <dc:creator>AIDeepSignal</dc:creator>
      <pubDate>Mon, 25 May 2026 05:36:47 +0000</pubDate>
      <link>https://dev.to/jacob_chen_6b44c7aa03f8fc/how-i-built-an-ai-news-brief-with-nextjs-supabase-vercel-and-gpt-4o-mini-2ad5</link>
      <guid>https://dev.to/jacob_chen_6b44c7aa03f8fc/how-i-built-an-ai-news-brief-with-nextjs-supabase-vercel-and-gpt-4o-mini-2ad5</guid>
      <description>&lt;p&gt;Over the past few months, I have been building a small AI news brief called &lt;strong&gt;&lt;a href="https://ai-deep-signal.com/weekly?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=build_log" rel="noopener noreferrer"&gt;DeepSignal&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The idea started from a simple personal frustration:&lt;/p&gt;

&lt;p&gt;I was reading X, Hacker News, arXiv, OpenAI and Anthropic blogs, product launch pages, newsletters, and company updates every day, but still felt like I was either missing important AI news or wasting time on low-signal updates.&lt;/p&gt;

&lt;p&gt;So I built a small system that does three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Collects AI-related updates from multiple sources&lt;/li&gt;
&lt;li&gt;Scores each story with a transparent 0–100 signal score&lt;/li&gt;
&lt;li&gt;Publishes a daily and weekly brief&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The product is not technically complex, but the workflow taught me a lot about building AI-assisted content products, SEO for dynamic sites, and the difference between summarizing information and filtering information.&lt;/p&gt;

&lt;p&gt;This is a breakdown of the stack, architecture, and lessons learned.&lt;/p&gt;




&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;p&gt;The current stack is intentionally simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Frontend: Next.js 15
Database: Supabase
Hosting: Vercel
AI processing: GPT-4o-mini
Content model: Articles, sources, tags, guides, weekly briefs
SEO: sitemap, canonical URLs, RSS, structured pages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I wanted to keep the system cheap and easy to maintain because this is a solo project.&lt;/p&gt;

&lt;p&gt;The rough monthly cost is still low. Vercel handles deployment and hosting, Supabase handles the database, and GPT-4o-mini is used for scoring and classification rather than heavy generation.&lt;/p&gt;

&lt;p&gt;The main goal was not to build a complicated AI pipeline.&lt;/p&gt;

&lt;p&gt;The goal was to build a reliable workflow that could turn noisy inputs into useful outputs.&lt;/p&gt;




&lt;h2&gt;
  
  
  The basic architecture
&lt;/h2&gt;

&lt;p&gt;The system has a simple flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sources
   ↓
Fetch / import
   ↓
Normalize article data
   ↓
AI relevance check
   ↓
Signal scoring
   ↓
Tagging and categorization
   ↓
Publish article pages
   ↓
Generate daily / weekly briefs
   ↓
Expose guides, RSS, sitemap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At a high level, each story becomes a structured object:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Article&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;publishedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;aiRelevanceScore&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;signalScore&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="nl"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;canonicalUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;isIndexable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The most important field is not the summary.&lt;/p&gt;

&lt;p&gt;It is &lt;code&gt;isIndexable&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That one field ended up being more important than I expected.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why filtering matters more than summarizing
&lt;/h2&gt;

&lt;p&gt;At first, I thought the main problem was summarization.&lt;/p&gt;

&lt;p&gt;Take a long article, summarize it, and users save time.&lt;/p&gt;

&lt;p&gt;But after building the first version, I realized summarization alone does not solve the real problem.&lt;/p&gt;

&lt;p&gt;A summary tells you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What does this article say?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But users usually need to know:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Should I care?
Why does this matter?
Is this actually about AI?
Is this a durable signal or just a temporary headline?
Is this more important than the other 50 updates today?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That changed the product direction.&lt;/p&gt;

&lt;p&gt;Instead of only generating summaries, the system needed to decide what should be included, ranked, grouped, and excluded.&lt;/p&gt;

&lt;p&gt;For an AI news product, filtering is not a minor feature.&lt;/p&gt;

&lt;p&gt;Filtering is the product.&lt;/p&gt;




&lt;h2&gt;
  
  
  The signal score
&lt;/h2&gt;

&lt;p&gt;Each story gets a 0–100 signal score.&lt;/p&gt;

&lt;p&gt;The score is not meant to be perfect. It is a transparent ranking system that helps explain why a story may matter.&lt;/p&gt;

&lt;p&gt;A story can score higher based on signals like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- source quality
- AI relevance
- novelty
- technical depth
- business impact
- research importance
- company importance
- cross-source confirmation
- relevance to builders, researchers, or operators
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A simplified scoring idea looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ScoreInput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;sourceWeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;aiRelevance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;novelty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;technicalDepth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;marketImpact&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;researchValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;companyImportance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateSignalScore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ScoreInput&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sourceWeight&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.15&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;aiRelevance&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;novelty&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.15&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;technicalDepth&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.15&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;marketImpact&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;researchValue&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;companyImportance&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact formula can change, but the principle matters:&lt;/p&gt;

&lt;p&gt;I wanted users to feel that the ranking had a visible logic, not just a black-box AI label.&lt;/p&gt;

&lt;p&gt;That was one of the biggest lessons:&lt;/p&gt;

&lt;p&gt;A simple transparent scoring system can be more trustworthy than a more complex but invisible AI ranking.&lt;/p&gt;




&lt;h2&gt;
  
  
  Using GPT-4o-mini
&lt;/h2&gt;

&lt;p&gt;I use GPT-4o-mini mostly for classification, scoring support, and short summaries.&lt;/p&gt;

&lt;p&gt;The AI tasks are intentionally narrow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Is this article actually AI-related?
- What category does it belong to?
- What are the key takeaways?
- Is the story relevant to models, agents, research, hardware, infrastructure, regulation, or adoption?
- What tags should it receive?
- What score explanation should be shown?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I try not to use AI as a generic content generator.&lt;/p&gt;

&lt;p&gt;Instead, I use it as a structured processing layer.&lt;/p&gt;

&lt;p&gt;A simplified prompt pattern looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are classifying an AI industry news article.

Return JSON only.

Evaluate:
1. AI relevance from 0 to 100
2. Signal strength from 0 to 100
3. Primary category
4. 3 to 5 tags
5. One-sentence reason why this story matters
6. Whether this story should be indexable for search

Article:
Title: ...
Source: ...
Excerpt: ...
URL: ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is forcing structured output.&lt;/p&gt;

&lt;p&gt;For this kind of workflow, predictable JSON is more useful than beautifully written prose.&lt;/p&gt;




&lt;h2&gt;
  
  
  Supabase data model
&lt;/h2&gt;

&lt;p&gt;The database is simple.&lt;/p&gt;

&lt;p&gt;Core tables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;articles
sources
tags
article_tags
daily_briefs
weekly_briefs
guides
guide_articles
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;articles&lt;/code&gt; table stores the normalized content.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;sources&lt;/code&gt; table stores source metadata and source quality.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;tags&lt;/code&gt; table keeps topic structure clean.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;guides&lt;/code&gt; table is for evergreen topic pages, such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI agents
AI coding tools
AI research papers
OpenAI updates
Anthropic Claude updates
NVIDIA AI chips
AI hardware
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This guide layer became important later for SEO.&lt;/p&gt;

&lt;p&gt;A chronological feed is useful for freshness, but guide pages are better for long-term search and topic authority.&lt;/p&gt;




&lt;h2&gt;
  
  
  Next.js page structure
&lt;/h2&gt;

&lt;p&gt;The site uses a few main page types:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/
Homepage

/articles/[slug]
Individual article pages

/guides
Guide index

/guides/[slug]
Evergreen topic pages

/weekly
Weekly AI brief

/tags/[slug]
Core topic pages

/sources/[slug]
Selected source pages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not every page deserves to be indexed.&lt;/p&gt;

&lt;p&gt;That became one of the most important SEO decisions.&lt;/p&gt;




&lt;h2&gt;
  
  
  SEO lesson: not every page should be in the sitemap
&lt;/h2&gt;

&lt;p&gt;Early on, I made the mistake of thinking more indexed pages would be better.&lt;/p&gt;

&lt;p&gt;It was not.&lt;/p&gt;

&lt;p&gt;When a site has too many low-quality, thin, duplicate, or off-topic pages, search engines can get confused about what the site is actually about.&lt;/p&gt;

&lt;p&gt;For an AI news site, this matters a lot because source feeds can easily include AI-adjacent but irrelevant content.&lt;/p&gt;

&lt;p&gt;So I added stricter sitemap rules.&lt;/p&gt;

&lt;p&gt;The sitemap should include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- homepage
- about page
- guides
- high-quality guide pages
- weekly brief
- selected high-quality article pages
- selected core tag pages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The sitemap should not include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- saved pages
- subscribe pages
- internal API routes
- search result pages
- parameter URLs
- low-quality tag pages
- non-AI articles
- thin source pages
- duplicate daily feed pages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The rule I use now is simple:&lt;/p&gt;

&lt;p&gt;Only put a URL in the sitemap if it is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- canonical
- indexable
- useful as a search landing page
- relevant to the core AI topic
- not thin or duplicated
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helped clean up the site’s search profile.&lt;/p&gt;




&lt;h2&gt;
  
  
  Canonical URLs and UTM links
&lt;/h2&gt;

&lt;p&gt;For promotion, I use UTM links like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://ai-deep-signal.com/weekly?utm_source=x&amp;amp;utm_medium=social&amp;amp;utm_campaign=weekly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://ai-deep-signal.com/?utm_source=reddit&amp;amp;utm_medium=social&amp;amp;utm_campaign=launch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the canonical URL must always point to the clean version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://ai-deep-signal.com/weekly
https://ai-deep-signal.com/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That avoids turning campaign URLs into duplicate SEO pages.&lt;/p&gt;

&lt;p&gt;For a dynamic site, this is easy to overlook.&lt;/p&gt;

&lt;p&gt;Tracking URLs are for analytics.&lt;br&gt;&lt;br&gt;
Canonical URLs are for search engines.&lt;/p&gt;

&lt;p&gt;They should not be mixed.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why I added guides and weekly briefs
&lt;/h2&gt;

&lt;p&gt;The first version of the site was mostly a feed.&lt;/p&gt;

&lt;p&gt;That worked, but it had a problem:&lt;/p&gt;

&lt;p&gt;Feeds are good for browsing.&lt;br&gt;&lt;br&gt;
Guides are better for understanding.&lt;/p&gt;

&lt;p&gt;So I added topic-based guides and a weekly brief.&lt;/p&gt;

&lt;p&gt;The weekly page is for people who want a quick summary of what mattered this week.&lt;/p&gt;

&lt;p&gt;The guide pages are for evergreen themes that should grow over time.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/guides/what-are-ai-agents
/guides/best-ai-coding-agents
/guides/ai-research-papers-this-week
/guides/nvidia-ai-chip-news
/guides/openai-news
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives the site a more stable structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Homepage
  ↓
Guides
  ↓
Topic pages
  ↓
Related articles
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That structure is much better than only having a reverse-chronological feed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Deployment on Vercel
&lt;/h2&gt;

&lt;p&gt;Vercel is a good fit for this kind of project because most of the site is content-oriented.&lt;/p&gt;

&lt;p&gt;The project benefits from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- fast deployments
- preview deployments
- automatic HTTPS
- good Next.js support
- serverless functions for lightweight API work
- ISR / caching options
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But I avoid using Vercel for heavy background work.&lt;/p&gt;

&lt;p&gt;If the project grows, I would move heavier jobs to a separate worker or queue system.&lt;/p&gt;

&lt;p&gt;For now, Vercel + Supabase is enough.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I would improve next
&lt;/h2&gt;

&lt;p&gt;There are still many things I would improve.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better deduplication
&lt;/h3&gt;

&lt;p&gt;AI news often appears in multiple places. The same story can show up as a company blog post, a tweet thread, a newsletter item, and a Hacker News discussion.&lt;/p&gt;

&lt;p&gt;Better clustering would make the brief cleaner.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better source weighting
&lt;/h3&gt;

&lt;p&gt;Not all sources should have equal authority. A research paper, company announcement, social post, and rewritten news article should be weighted differently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better guide pages
&lt;/h3&gt;

&lt;p&gt;The guide pages should become more like living topic trackers, not just lists of related articles.&lt;/p&gt;

&lt;p&gt;Each guide should eventually include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- topic explanation
- latest updates
- important companies
- relevant research
- key risks
- related stories
- last updated date
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Better scoring explanations
&lt;/h3&gt;

&lt;p&gt;A score is only useful if users understand it.&lt;/p&gt;

&lt;p&gt;I want each article to explain not just the score, but the reason behind the score.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;A few lessons stood out.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Filtering is harder than summarizing
&lt;/h3&gt;

&lt;p&gt;Summarization is relatively easy now. Deciding what deserves attention is much harder.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. SEO quality matters more than SEO volume
&lt;/h3&gt;

&lt;p&gt;More pages are not always better. Cleaner, more relevant pages are better.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Topic pages are more durable than feeds
&lt;/h3&gt;

&lt;p&gt;Feeds create freshness. Guides create long-term value.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Transparent AI systems feel more trustworthy
&lt;/h3&gt;

&lt;p&gt;Users do not need a perfect score, but they do need to understand why a score exists.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. The workflow around the model is the real product
&lt;/h3&gt;

&lt;p&gt;The AI model is only one part. The source selection, scoring rules, publishing flow, SEO structure, and user experience matter just as much.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;This project started as a small personal tool because I was tired of reading too many AI sources every morning.&lt;/p&gt;

&lt;p&gt;But it turned into a useful lesson:&lt;/p&gt;

&lt;p&gt;AI products do not always need to generate more content.&lt;/p&gt;

&lt;p&gt;Sometimes the better product is the one that helps people ignore more content.&lt;/p&gt;

&lt;p&gt;That is what I am trying to build with &lt;a href="https://ai-deep-signal.com/weekly?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=build_log" rel="noopener noreferrer"&gt;DeepSignal&lt;/a&gt;: a cleaner way to follow AI news, research, agents, models, and infrastructure without the daily noise.&lt;/p&gt;

&lt;p&gt;The site is here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://ai-deep-signal.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=build_log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The weekly brief is here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://ai-deep-signal.com/weekly?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=build_log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I would love feedback from other developers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Would you trust a transparent signal score for news ranking?
Or would you rather see a purely editorial brief without scoring?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3yybdvro6k3dtvtroox.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3yybdvro6k3dtvtroox.png" alt=" " width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>nextjs</category>
      <category>supabase</category>
      <category>seo</category>
    </item>
  </channel>
</rss>
