<?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: GuideBook</title>
    <description>The latest articles on DEV Community by GuideBook (@yege).</description>
    <link>https://dev.to/yege</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%2F3756881%2F0a4cc9f3-59a4-44f8-ba25-90e2a643212a.png</url>
      <title>DEV Community: GuideBook</title>
      <link>https://dev.to/yege</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yege"/>
    <language>en</language>
    <item>
      <title>I Built a YouTube Dislike Viewer with Next.js 16 — Here's How</title>
      <dc:creator>GuideBook</dc:creator>
      <pubDate>Sun, 08 Feb 2026 06:17:47 +0000</pubDate>
      <link>https://dev.to/yege/i-built-a-youtube-dislike-viewer-with-nextjs-16-heres-how-a0b</link>
      <guid>https://dev.to/yege/i-built-a-youtube-dislike-viewer-with-nextjs-16-heres-how-a0b</guid>
      <description>&lt;p&gt;I Built a YouTube Dislike Viewer with Next.js 16&lt;/p&gt;

&lt;p&gt;Ever since YouTube removed the public dislike count, it's been harder to judge video quality at a glance. So I built a&lt;br&gt;
   simple tool to bring it back.&lt;/p&gt;

&lt;p&gt;Live site: &lt;a href="https://www.youtubedislikeviewer.shop" rel="noopener noreferrer"&gt;https://www.youtubedislikeviewer.shop&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What It Does&lt;/p&gt;

&lt;p&gt;Paste any YouTube URL or video ID, and instantly see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;👍 Likes &amp;amp; 👎 Dislikes&lt;/li&gt;
&lt;li&gt;📊 Like/Dislike ratio bar&lt;/li&gt;
&lt;li&gt;👁 View count &amp;amp; rating&lt;/li&gt;
&lt;li&gt;🕐 Search history (stored locally)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tech Stack&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js 16 (App Router + Turbopack)&lt;/li&gt;
&lt;li&gt;React 19 + TypeScript 5.9&lt;/li&gt;
&lt;li&gt;Tailwind CSS 4&lt;/li&gt;
&lt;li&gt;Return YouTube Dislike API (community-driven dislike data)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Key Design Decisions&lt;/p&gt;

&lt;p&gt;API Proxy with Caching&lt;/p&gt;

&lt;p&gt;Instead of calling the dislike API directly from the client, I set up a server-side proxy route at /api/dislike. This&lt;br&gt;
  lets me add cache headers (s-maxage=300, stale-while-revalidate=600) so repeated lookups for the same video are fast&lt;br&gt;
  and cheap.&lt;/p&gt;

&lt;p&gt;// app/api/dislike/route.ts (simplified)&lt;br&gt;
  export async function GET(request: Request) {&lt;br&gt;
    const videoId = new URL(request.url).searchParams.get('videoId');&lt;br&gt;
    const res = await fetch(&lt;br&gt;
      &lt;code&gt;https://returnyoutubedislikeapi.com/votes?videoId=${videoId}&lt;/code&gt;&lt;br&gt;
    );&lt;br&gt;
    const data = await res.json();&lt;br&gt;
    return Response.json(data, {&lt;br&gt;
      headers: {&lt;br&gt;
        'Cache-Control': 'public, s-maxage=300, stale-while-revalidate=600',&lt;br&gt;
      },&lt;br&gt;
    });&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;Robust URL Parsing&lt;/p&gt;

&lt;p&gt;YouTube URLs come in many flavors — youtube.com/watch?v=, youtu.be/, /embed/, or just a raw 11-character ID. A single&lt;br&gt;
  extraction function handles all of them with regex.&lt;/p&gt;

&lt;p&gt;Thumbnail Fallback&lt;/p&gt;

&lt;p&gt;Not every video has a maxresdefault thumbnail. The component tries the highest quality first and falls back to&lt;br&gt;
  hqdefault on error — no broken images.&lt;/p&gt;

&lt;p&gt;What I Learned&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Next.js 16 App Router is mature and pleasant to work with. The server/client component split feels natural once you
get used to it.&lt;/li&gt;
&lt;li&gt;Caching at the edge with simple Cache-Control headers goes a long way — no Redis needed for a project this size.&lt;/li&gt;
&lt;li&gt;localStorage is still a perfectly fine solution for lightweight client-side persistence like search history.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Try It Out&lt;/p&gt;

&lt;p&gt;Check it out at &lt;a href="https://www.youtubedislikeviewer.shop" rel="noopener noreferrer"&gt;https://www.youtubedislikeviewer.shop&lt;/a&gt; and let me know what you think!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
    </item>
  </channel>
</rss>
