<?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: Naman Dhakad</title>
    <description>The latest articles on DEV Community by Naman Dhakad (@naman_dhakad).</description>
    <link>https://dev.to/naman_dhakad</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3803074%2Ffa660fda-157a-4983-bb0b-2c5140811f26.gif</url>
      <title>DEV Community: Naman Dhakad</title>
      <link>https://dev.to/naman_dhakad</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/naman_dhakad"/>
    <language>en</language>
    <item>
      <title>Tonkotsu ramen in CSS</title>
      <dc:creator>Naman Dhakad</dc:creator>
      <pubDate>Sun, 02 Aug 2026 17:08:22 +0000</pubDate>
      <link>https://dev.to/naman_dhakad/tonkotsu-ramen-in-css-3081</link>
      <guid>https://dev.to/naman_dhakad/tonkotsu-ramen-in-css-3081</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend-2026-07-29"&gt;Frontend Challenge - Comfort Food Edition, CSS Art&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspiration
&lt;/h2&gt;

&lt;p&gt;Tonkotsu ramen. It's the bowl I want when nothing else will do — slow-simmered pork-bone broth turned milky and opaque, a jammy marinated egg, soft rolled chashu, scallions, menma, a clean nori sheet, and that iconic pink narutomaki spiral. The whole thing is comfort in liquid form: rich, warm, and steaming.&lt;/p&gt;

&lt;p&gt;I wanted to see if that &lt;em&gt;feeling&lt;/em&gt; — not just the look of food, but the mood of a quiet late-night ramen-ya — could come through with CSS as the main ingredient. So this isn't just a bowl on a page; it's a composed table scene: warm wooden grain under an overhead light, a bamboo trivet, chopsticks resting on a ceramic hashioki, a small dish of pickled ginger, and a stamped order ticket.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;I built it as a single self-contained HTML file (HTML + CSS + a light sprinkle of JavaScript). It's live here:&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/editor/andy712/embed/019fc354-f50a-7279-8f70-ffcf9ffcc419?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; hover the ajitama egg, and move your cursor around — the steam and the overhead light shift with a gentle parallax. (Everything still works and stays still if you prefer reduced motion.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;p&gt;The star of the show is CSS, as the prompt asks. JavaScript is deliberately light — only two small, purposeful things: nudging the steam's rhythm so it never loops like a metronome, and a soft pointer-parallax for depth. Here's what the CSS is doing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Broth&lt;/strong&gt; — layered &lt;code&gt;radial-gradient&lt;/code&gt;s for the milky tonkotsu surface, with floating chili-oil droplets and sesame specks stacked via tiny &lt;code&gt;radial-gradient&lt;/code&gt;s in &lt;code&gt;mix-blend-mode: screen&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Narutomaki swirl&lt;/strong&gt; — the pink spiral is a &lt;code&gt;conic-gradient&lt;/code&gt; cut into rings with a &lt;code&gt;radial-gradient&lt;/code&gt; &lt;code&gt;mask&lt;/code&gt;, so you get the real "pinwheel" cross-section instead of a flat disc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chashu&lt;/strong&gt; — rolled pork viewed from above: a &lt;code&gt;repeating-radial-gradient&lt;/code&gt; renders the concentric spiral of the meat roll, with faint fat layers and a glaze highlight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Noodles&lt;/strong&gt; — &lt;code&gt;repeating-radial-gradient&lt;/code&gt; tangles peeking out from under the toppings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ceramic bowl&lt;/strong&gt; — the depth is all &lt;code&gt;box-shadow&lt;/code&gt;: inset lights on the rim, inset darkness inside, and a cast shadow below, plus a curved specular highlight on the flank.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Steam&lt;/strong&gt; — blurred, semi-transparent puffs rising on &lt;code&gt;@keyframes&lt;/code&gt; with randomized durations and three drift variants (&lt;code&gt;rise&lt;/code&gt;, &lt;code&gt;riseL&lt;/code&gt;, &lt;code&gt;riseR&lt;/code&gt;) so the plume feels organic rather than mechanical.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typography &amp;amp; mood&lt;/strong&gt; — a Noto Serif JP + Cormorant Garamond title block (&lt;code&gt;ラーメン / Tonkotsu Ramen&lt;/code&gt;), a torn-edge order ticket with a red 味 &lt;em&gt;hanko&lt;/em&gt; stamp, and a warm color grade to push the "I want to eat this" psychology.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A real bug worth calling out: at one point the wood-grain background was rendering &lt;em&gt;on top&lt;/em&gt; of the bowl, burning dark stripes across the broth, chopsticks, and ticket. The culprit was a &lt;code&gt;mix-blend-mode: multiply&lt;/code&gt; &lt;code&gt;::after&lt;/code&gt; layer painting above the scene. The fix was giving the scene &lt;code&gt;z-index&lt;/code&gt; + &lt;code&gt;isolation: isolate&lt;/code&gt; so all the internal blend modes stay contained — a good reminder that stacking context, not just z-index, decides what wins.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I'm proud of:&lt;/strong&gt; the narutomaki mask trick and the steam randomization — both are small but they sell the "alive" feeling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's next:&lt;/strong&gt; a pour-and-stir animation on click, and a dark/light "shop sign" toggle.&lt;/p&gt;

&lt;p&gt;This work is licensed under the &lt;a href="https://opensource.org/licenses/MIT" rel="noopener noreferrer"&gt;MIT License&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>css</category>
      <category>frontendchallenge</category>
      <category>devchallenge</category>
      <category>design</category>
    </item>
    <item>
      <title>A better mailto fallback with JavaScript</title>
      <dc:creator>Naman Dhakad</dc:creator>
      <pubDate>Tue, 28 Jul 2026 16:06:09 +0000</pubDate>
      <link>https://dev.to/naman_dhakad/a-better-mailto-fallback-with-javascript-eo7</link>
      <guid>https://dev.to/naman_dhakad/a-better-mailto-fallback-with-javascript-eo7</guid>
      <description>&lt;p&gt;A normal &lt;code&gt;mailto:&lt;/code&gt; link is still the simplest way to put an email address behind a Contact button. The rough edge is what happens after the click.&lt;/p&gt;

&lt;p&gt;The visitor's browser may open a desktop app they do not use. It may have no useful mail handler configured. Meanwhile, the visitor may already be signed in to Gmail, Outlook, Proton Mail, or another webmail service.&lt;/p&gt;

&lt;p&gt;You can keep the ordinary link and add a better choice on top of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Keep the mailto link
&lt;/h2&gt;

&lt;p&gt;Start with the HTML you already have:&lt;br&gt;
&lt;a href="mailto:hello@example.com?subject=Project%20question"&gt;&lt;br&gt;
  Email us&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This matters because the anchor remains useful without the library. If JavaScript is unavailable, the browser still sees a normal &lt;code&gt;mailto:&lt;/code&gt; URL and can hand it to the visitor's configured mail app.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Install smart-mailto
&lt;/h2&gt;

&lt;p&gt;Install the framework-agnostic core package:&lt;br&gt;
npm install @smart-mailto/core&lt;/p&gt;

&lt;p&gt;The package has no runtime dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Initialize it once
&lt;/h2&gt;

&lt;p&gt;Put the import in your browser entry file and call the initializer once:&lt;br&gt;
import { initSmartMailto } from '@smart-mailto/core';&lt;/p&gt;

&lt;p&gt;initSmartMailto();&lt;/p&gt;

&lt;p&gt;That is the full migration. You do not have to replace each anchor with a custom component.&lt;/p&gt;

&lt;p&gt;smart-mailto uses one delegated click listener for valid &lt;code&gt;mailto:&lt;/code&gt; anchors, including links added later. When a visitor clicks one, the library opens a provider picker instead of sending them straight to the operating system's default mail app.&lt;/p&gt;

&lt;p&gt;The recipient and existing subject or body values stay with the email intent. Exact prefill support varies by provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fallback paths
&lt;/h2&gt;

&lt;p&gt;The picker does not assume that every visitor wants one of the suggested webmail services.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Copy Address&lt;/strong&gt; is included by default, so the visitor can copy the recipient and continue in any mail service.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Default Mail App&lt;/strong&gt; is included on mobile by default. If you want to show that option on desktop too, initialize with &lt;code&gt;initSmartMailto({ includeNative: true })&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If the picker cannot load, smart-mailto returns to the original &lt;code&gt;mailto:&lt;/code&gt; URL.&lt;/li&gt;
&lt;li&gt;If the recipient is empty or invalid, the library leaves the click alone and lets the browser handle it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The original anchor stays the safety net throughout.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changes for the visitor
&lt;/h2&gt;

&lt;p&gt;Before:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the email link.&lt;/li&gt;
&lt;li&gt;Hope the browser opens the right app.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the same email link.&lt;/li&gt;
&lt;li&gt;Choose a webmail provider, use the default mail app, or copy the address.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your HTML stays familiar, while the visitor gets a route that matches how they actually send email.&lt;/p&gt;

&lt;p&gt;For the complete walkthrough, see the &lt;a href="https://smart-mailto.vercel.app/guides/replace-mailto" rel="noopener noreferrer"&gt;practical smart-mailto guide&lt;/a&gt;. The &lt;a href="https://github.com/namandhakad712/smart-mailto" rel="noopener noreferrer"&gt;smart-mailto repository&lt;/a&gt; contains the source, package documentation, and configuration reference.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>html</category>
      <category>opensource</category>
    </item>
    <item>
      <title>🚀 From Paper to Pixels: How I Built an AI-Powered Exam Platform with Google Gemini</title>
      <dc:creator>Naman Dhakad</dc:creator>
      <pubDate>Tue, 03 Mar 2026 05:53:05 +0000</pubDate>
      <link>https://dev.to/naman_dhakad/from-paper-to-pixels-how-i-built-an-ai-powered-exam-platform-with-google-gemini-46mh</link>
      <guid>https://dev.to/naman_dhakad/from-paper-to-pixels-how-i-built-an-ai-powered-exam-platform-with-google-gemini-46mh</guid>
      <description>&lt;p&gt;&lt;code&gt;Transforming PDF question papers into interactive CBT experiences - a journey through hackathons, AI, and building for millions of students&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Spark ✨
&lt;/h2&gt;

&lt;p&gt;It was 2 AM in the hostel room. My friend was frustrated—again. He'd solved a 180-question JEE mock test on paper, only to realize he'd made a calculation error on question #45 that threw off his entire ranking. No instant results. No analytics. No way to know his weak areas.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If only there was a way to just... upload the PDF and take it like the real exam."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question changed everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 What I Built: Rankify
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Rankify&lt;/strong&gt; is an AI-powered platform that transforms any PDF question paper into a fully interactive computer-based test (CBT). No more paper. No more manual checking. Just upload, practice, and analyze.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Magic Flow ✨
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph LR
    A[📄 PDF Upload] --&amp;gt; B[🤖 AI Extraction]
    B --&amp;gt; C[👁️ Review &amp;amp; Edit]
    C --&amp;gt; D[⚙️ Configure Test]
    D --&amp;gt; E[🎮 Take the Test]
    E --&amp;gt; F[📊 Analyze Results]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Features That Actually Matter 🎮
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;Why It Matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI Extraction&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gemini reads your PDF and extracts questions&lt;/td&gt;
&lt;td&gt;No manual typing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Confidence Scores&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Each question gets a 1-5 confidence rating&lt;/td&gt;
&lt;td&gt;Know what to review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Diagram Detection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI finds and maps diagrams to questions&lt;/td&gt;
&lt;td&gt;Visual questions handled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-PDF Batch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Process 10 PDFs at once&lt;/td&gt;
&lt;td&gt;Save time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Offline Mode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Works without internet&lt;/td&gt;
&lt;td&gt;Study anywhere&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧠 The Hackathon Journey
&lt;/h2&gt;

&lt;p&gt;This wasn't a weekend project. It started at an MLH hackathon where I had &lt;strong&gt;24 hours&lt;/strong&gt; to prove the concept worked.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 1: The Chaos 🌪️
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Me at 6 PM: "I'll use Gemini to extract questions from PDFs!"
Me at 8 PM: *Reading Gemini documentation*
Me at 10 PM: *Making API calls that fail*
Me at midnight: *First successful extraction! 🎉*
Me at 2 AM: *It works but the JSON is garbage*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Day 2: The Pivot 🔄
&lt;/h3&gt;

&lt;p&gt;I realized the hard way: &lt;strong&gt;JSON output from LLMs is unpredictable&lt;/strong&gt;. So I built:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Zero-tolerance prompts&lt;/strong&gt; - Instructions so strict Gemini had no choice but to behave&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallback chains&lt;/strong&gt; - If one model fails, automatically try the next&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confidence scoring&lt;/strong&gt; - A multi-factor algorithm to rate extraction quality
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// The fallback chain that saved my hackathon&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;modelFallback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;// Best quality&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gemini-2.5-flash-lite&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Quality + speed  &lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gemini-2.0-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;// Reliable backup&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gemini-2.0-flash-lite&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;  &lt;span class="c1"&gt;// Last resort&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Result? 🏆
&lt;/h3&gt;

&lt;p&gt;A working prototype that extracted 85 questions from a JEE sample paper in 3 minutes. Not perfect—but proof it was possible.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔥 What I Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Technical Wins 💻
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gemini's Vision API is underutilized&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Most people use it for images. But PDFs? That's where the magic happens for educational tech.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Prompt engineering &amp;gt; Fine-tuning&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I spent zero dollars on training. Just better prompts.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Client-side AI is viable&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Privacy-first architecture actually became a selling point.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The Hard Lessons 😵
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Rate limits&lt;/td&gt;
&lt;td&gt;Implemented exponential backoff + model fallback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PDF parsing issues&lt;/td&gt;
&lt;td&gt;Added pdf.js preprocessing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSON hallucinations&lt;/td&gt;
&lt;td&gt;Built a validation layer with confidence scores&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost tracking&lt;/td&gt;
&lt;td&gt;Created real-time usage dashboard&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Soft Skills That Stuck 🎯
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MVP-first thinking&lt;/strong&gt;: Ship fast, iterate faster&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User empathy&lt;/strong&gt;: Students don't care about AI—they care about results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failure tolerance&lt;/strong&gt;: 70% of my experiments failed. That's okay.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📝 My Google Gemini Feedback: The Good, The Bad, The Ugly
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ What Worked Brilliantly
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multi-modal = Game changer&lt;/strong&gt; 🎨&lt;br&gt;
Processing text + images together meant diagrams weren't a separate problem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Context caching&lt;/strong&gt; 💾&lt;br&gt;
Reduced costs by 60%. Essential for production apps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Large context windows&lt;/strong&gt; 📏&lt;br&gt;
1M tokens = entire question papers in one go. Unreal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JSON mode&lt;/strong&gt; 📋&lt;br&gt;
Structured output without post-processing. So good.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚠️ Where Google Could Improve
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PDF parsing is inconsistent&lt;/strong&gt;&lt;br&gt;
Rotated pages, watermarks, and scanned docs still cause headaches.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rate limits are tight&lt;/strong&gt;&lt;br&gt;
For a free tier, it's restrictive. I had to build a queuing system.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Error messages are cryptic&lt;/strong&gt;&lt;br&gt;
"Internal error" tells me nothing. Help us help you!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cost visibility&lt;/strong&gt;&lt;br&gt;
Real-time spend tracking would prevent surprises.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  😬 The Ugly Truth
&lt;/h3&gt;

&lt;p&gt;Sometimes Gemini &lt;strong&gt;hallucinates&lt;/strong&gt;. It sees a question it can't parse and just... makes up options. That's why confidence scoring exists now.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Where I'm Going Next
&lt;/h2&gt;

&lt;p&gt;The journey continues:&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 1: Cloud Run Deployment
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gcloud run deploy rankify-ai \
  --source . \
  --region us-central1 \
  --no-allow-unauthenticated \
  --labels dev-tutorial=blog-devcommunity2026
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Phase 2: Agent Development Kit (ADK)
&lt;/h3&gt;

&lt;p&gt;Building specialized agents for different subjects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Physics Agent 🧪&lt;/li&gt;
&lt;li&gt;Chemistry Agent ⚗️&lt;/li&gt;
&lt;li&gt;Math Agent 📐&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 3: A2A Protocol
&lt;/h3&gt;

&lt;p&gt;Agent-to-agent communication for complex multi-step reasoning&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 To Anyone Building with Gemini
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start with Vision&lt;/strong&gt; - It's more mature than you think&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build for failure&lt;/strong&gt; - Every API call can fail&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hide the AI&lt;/strong&gt; - Users want results, not technology&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trust but verify&lt;/strong&gt; - Confidence scores are your friend&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🎤 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Building Rankify taught me that AI isn't about replacing humans—it's about amplifying. A what we can do student in a small town with a cracked phone can now practice with the same quality as someone with expensive coaching.&lt;/p&gt;

&lt;p&gt;That's what keeps me building.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Thanks for reading! If you want to try Rankify, check out the live demo. And if you're entering the Built with Google Gemini: Writing Challenge—good luck! 🎉&lt;/em&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  MLH #DEVChallenge #GoogleGemini #Vue #Nuxt #AI #WebDev
&lt;/h1&gt;

</description>
      <category>vue</category>
      <category>nuxt</category>
      <category>javascript</category>
      <category>gemini</category>
    </item>
  </channel>
</rss>
