<?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: Ganga Ponnu</title>
    <description>The latest articles on DEV Community by Ganga Ponnu (@randomtyms).</description>
    <link>https://dev.to/randomtyms</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4043774%2F416e8d49-4433-41ea-9980-833bcd81af66.webp</url>
      <title>DEV Community: Ganga Ponnu</title>
      <link>https://dev.to/randomtyms</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/randomtyms"/>
    <language>en</language>
    <item>
      <title>Building a Zero-Scroll, Interactive Classroom Quiz Widget with Targeted Mistake Retakes</title>
      <dc:creator>Ganga Ponnu</dc:creator>
      <pubDate>Mon, 24 Aug 2026 17:40:45 +0000</pubDate>
      <link>https://dev.to/randomtyms/building-a-zero-scroll-interactive-classroom-quiz-widget-with-targeted-mistake-retakes-13b8</link>
      <guid>https://dev.to/randomtyms/building-a-zero-scroll-interactive-classroom-quiz-widget-with-targeted-mistake-retakes-13b8</guid>
      <description>&lt;p&gt;​When designing educational web widgets for classrooms, responsive design goes far beyond making things look presentable on a standard smartphone. A modern classroom app might run on an older Android device, an iPad in split view, a school Chromebook, or a massive 4K interactive smartboard.&lt;/p&gt;

&lt;p&gt;​Here is a breakdown of how we refactored the RandomTyms AI Quiz Generator into a zero-scroll, high-engagement classroom engine complete with instant mistake tracking and targeted practice loops.&lt;/p&gt;

&lt;h2&gt;
  
  
  ​The Pedagogical Goals
&lt;/h2&gt;

&lt;p&gt;​Active Learning Feedback Loop: Moving beyond a flat percentage score to show students exactly where their understanding slipped, providing an immediate pathway to drill only those specific gaps..&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;​Zero-Scroll, Fit-to-Screen UI: *&lt;/em&gt;&lt;br&gt;
Ensuring the question stem, four options, progress indicators, and feedback modal fit within the active viewport across mobile phones, tablets, laptops, and smartboards without vertical scrolling or browser zooming.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;​Lightweight Architecture:&lt;/strong&gt; &lt;br&gt;
Delivering a pure, framework-free browser experience with built-in clipboard helpers for AI prompts and structured schema metadata for discoverability.&lt;/p&gt;

&lt;h2&gt;
  
  
  ​Key Upgrades &amp;amp; Architectural Enhancements
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;​1. The Targeted Mistake Review &amp;amp; Retry Engine&lt;/strong&gt;&lt;br&gt;
​Dynamic Mistake Logging: While a student plays, incorrect selections are captured with their full context—recording the original question stem, the chosen distractor, and the verified correct answer.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;​Contextual Review Panel: *&lt;/em&gt;&lt;br&gt;
Upon completing a quiz with mistakes, students receive a scrollable review section displaying each missed item with color-coded tags distinguishing their incorrect choice from the correct answer.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;​Targeted Practice Mode: *&lt;/em&gt;&lt;br&gt;
Alongside the standard full-quiz restart, a dedicated retake button launches a focused practice round featuring only the missed questions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;​2. Eliminating Vertical Overflow for Smartboards &amp;amp; Screens&lt;/strong&gt;&lt;br&gt;
​Fluid Viewport Sizing: Replaced rigid pixel values with responsive clamp calculations tied to viewport height and width, keeping fonts, touch targets, and gaps proportional to available space.&lt;/p&gt;

&lt;p&gt;**​Dynamic Viewport Height Limits: **Bounded modal overlays and quiz containers to dynamic viewport heights (dvh) so bottom navigation bars on mobile browsers and classroom displays never push buttons off-screen.&lt;/p&gt;

&lt;p&gt;**​Adaptive 2×2 Smartboard Grid: **Switched the 4-option vertical stack to an automatic 2×2 grid layout on wider aspect ratios, cutting vertical screen usage in half on interactive whiteboards and desktop screens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;​3. Dual AI Prompt Integration&lt;/strong&gt;&lt;br&gt;
​Integrated dedicated prompt cards to streamline content creation with large language models like Gemini—supporting direct CSV file creation for small batches as well as raw structured extraction for large textbook scans.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Designed for seamless deployment across standard web pages, blogs, and classroom learning portals without third-party dependencies.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>staticwebapps</category>
    </item>
    <item>
      <title>How I Fixed My PWA's YouTube Feed for Free (Without Building a Server)</title>
      <dc:creator>Ganga Ponnu</dc:creator>
      <pubDate>Wed, 12 Aug 2026 15:07:17 +0000</pubDate>
      <link>https://dev.to/randomtyms/how-i-fixed-my-pwas-youtube-feed-for-free-without-building-a-server-3kcn</link>
      <guid>https://dev.to/randomtyms/how-i-fixed-my-pwas-youtube-feed-for-free-without-building-a-server-3kcn</guid>
      <description>&lt;p&gt;When building my Progressive Web App (PWA), I wanted a clean section showing my channel's latest YouTube uploads.&lt;/p&gt;

&lt;p&gt;​It sounded simple at first, but I quickly hit a classic web development wall: the dreaded CORS error.&lt;/p&gt;

&lt;p&gt;​Every time the app tried to read YouTube's feed directly inside the browser, security rules blocked it, resulting in a frustrating error message: "Couldn't load latest videos."&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxodi42dsfd922jyd5dj4.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxodi42dsfd922jyd5dj4.jpg" alt="PWA - Couldn't load latest videos." width="799" height="544"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;​Instead of setting up a paid backend server or messing with complex API keys, I found a zero-cost trick using GitHub Actions as a background helper.&lt;/p&gt;

&lt;p&gt;​Here is how I solved it using logic instead of extra infrastructure.&lt;/p&gt;

&lt;p&gt;​&lt;strong&gt;💡 The Lightbulb Moment&lt;/strong&gt;&lt;br&gt;
​Why force the user's phone to do the heavy lifting every single time they open the app?&lt;/p&gt;

&lt;p&gt;​Instead of asking the app to fetch data from YouTube directly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;​A background script runs automatically every 3 hours inside GitHub.&lt;/li&gt;
&lt;li&gt;​It fetches the YouTube feed behind the scenes and saves a simple videos.json file inside my project.&lt;/li&gt;
&lt;li&gt;​My app simply reads that ready-made videos.json file locally—instantly, smoothly, and with zero security errors.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;🛠️ How It Works in 3 Simple Steps&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Scheduled Helper&lt;/strong&gt;: I set up a simple GitHub Action workflow. Think of it like setting an alarm clock on your phone—every 3 hours, GitHub wakes up, grabs the latest 5 videos from YouTube, and formats them into a neat text list (videos.json).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Auto-Publisher&lt;/strong&gt;: Once the file is updated, GitHub Pages automatically deploys the updated app files to the web.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The App Fetch&lt;/strong&gt;: Inside my app, reading the list takes just a single line of standard JavaScript. No security blocks, no API limits, and no delay for the user!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;⚠️ 3 Lessons I Learned Along the Way&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you try a similar setup for your own app, here are three quick gotchas to watch out for:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Watch out for "invisible" build blocks&lt;/strong&gt;: GitHub Pages uses a tool called Jekyll by default, which can sometimes ignore .json files. Creating a blank file named .nojekyll in your root folder fixes this instantly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Beware of aggressive caching&lt;/strong&gt;: PWAs love saving old files so they work offline. Adding a tiny timestamp rule when reading your JSON ensures users always see the freshest videos instead of an old saved copy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Check the green checkmark&lt;/strong&gt;: If your app still shows an error, check the Actions tab in GitHub. A single red ❌ on the deploy step means GitHub hasn't published your new file to the live site yet—a simple "Re-run" usually fixes it!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;🚀 The Result&lt;/strong&gt;&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbicwx11u2x6is3uokm58.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbicwx11u2x6is3uokm58.png" alt="Clean section showing RandomTyms's latest YouTube uploads" width="800" height="1778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;100% Free &amp;amp; Automatic&lt;/strong&gt;: Updates every 3 hours without me lifting a finger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lightning Fast&lt;/strong&gt;: The app loads instant static text instead of waiting for external websites.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No Server Maintenance&lt;/strong&gt;: No monthly hosting bills, no databases, and no servers to manage.&lt;/p&gt;

&lt;p&gt;Have you ever used clever static tricks or background tools to bypass backend headaches? I'd love to hear how you solved it in the comments!&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>pwa</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Building a Sticker &amp; GIF Engine for Mobile Keyboards (Tenor Partner, Gboard &amp; Web Integration)</title>
      <dc:creator>Ganga Ponnu</dc:creator>
      <pubDate>Wed, 12 Aug 2026 09:11:30 +0000</pubDate>
      <link>https://dev.to/randomtyms/building-a-sticker-gif-engine-for-mobile-keyboards-tenor-partner-gboard-web-integration-4l62</link>
      <guid>https://dev.to/randomtyms/building-a-sticker-gif-engine-for-mobile-keyboards-tenor-partner-gboard-web-integration-4l62</guid>
      <description>&lt;h2&gt;
  
  
  canonical_url: &lt;a href="https://lokeshvarsha.blogspot.com/p/lokesh-varsha-stickers-gifs.html" rel="noopener noreferrer"&gt;https://lokeshvarsha.blogspot.com/p/lokesh-varsha-stickers-gifs.html&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;As developers and digital creators, we often spend endless hours building rich front-end experiences or backend APIs—only to face the real challenge: &lt;strong&gt;distribution&lt;/strong&gt;. How do you take original animated assets and put them directly where users communicate every second of the day (WhatsApp, Gboard, Telegram, and Twitter/X)?&lt;/p&gt;

&lt;p&gt;In this post, I want to share the architecture and integration process behind the &lt;strong&gt;RandomTyms&lt;/strong&gt; sticker engine featuring &lt;strong&gt;Lokesh &amp;amp; Varsha&lt;/strong&gt; (original AI-animated characters), from setting up an official Tenor Partner endpoint to embedding responsive media into web applications.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ The Architecture: From Animation to Global Keyboards
&lt;/h2&gt;

&lt;p&gt;To make animated media searchable across millions of mobile devices, relying on standalone image hosts isn't enough. The assets need to flow through the major keyboard APIs.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F067yr4tvci4ikvxtssvh.gif" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F067yr4tvci4ikvxtssvh.gif" alt="India Independence Day 80 celebration Gif" width="498" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Tenor API Integration &amp;amp; Tagging Strategy
&lt;/h3&gt;

&lt;p&gt;Tenor (owned by Google) powers the primary GIF search engine across &lt;strong&gt;Gboard&lt;/strong&gt;, &lt;strong&gt;Discord&lt;/strong&gt;, &lt;strong&gt;LinkedIn&lt;/strong&gt;, and &lt;strong&gt;Twitter/X&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Getting verified as an &lt;strong&gt;Official Tenor Partner&lt;/strong&gt; unlocked direct indexing for our brand tags (&lt;code&gt;#randomtyms&lt;/code&gt;, &lt;code&gt;#lokesh&lt;/code&gt;, &lt;code&gt;#varsha&lt;/code&gt;). However, ranking on keyboard searches requires optimizing metadata for conversational intent rather than just asset titles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reaction-Based Tagging:&lt;/strong&gt; &lt;code&gt;#mass&lt;/code&gt;, &lt;code&gt;#ennadhu&lt;/code&gt;, &lt;code&gt;#thinking&lt;/code&gt;, &lt;code&gt;#happy_news&lt;/code&gt;, &lt;code&gt;#vanakkam&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contextual Queries:&lt;/strong&gt; &lt;code&gt;#smart_english&lt;/code&gt;, &lt;code&gt;#cbse&lt;/code&gt;, &lt;code&gt;#learning_fun&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 You can view the live partner integration here: &lt;a href="https://tenor.com/en-IN/official/randomtyms" rel="noopener noreferrer"&gt;Tenor Official - RandomTyms Profile&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🌐 Web Integration: Building a Media Hub
&lt;/h2&gt;

&lt;p&gt;While API distribution covers messaging platforms, a dedicated web destination is essential for SEO indexing, deep linking, and embedding interactive widgets.&lt;/p&gt;

&lt;p&gt;We built a central hub page hosting the sticker library and search guidelines:&lt;br&gt;
📍 &lt;strong&gt;Live Page:&lt;/strong&gt; &lt;a href="https://lokeshvarsha.blogspot.com/p/lokesh-varsha-stickers-gifs.html" rel="noopener noreferrer"&gt;Lokesh &amp;amp; Varsha Stickers &amp;amp; GIFs Hub&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Key Technical Considerations for Animated Media Hubs:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Format Optimization:&lt;/strong&gt; Standard GIFs can quickly exceed 5MB–10MB per loop. Converting non-transparent loops to &lt;strong&gt;Animated WebP&lt;/strong&gt; reduces payload by ~60% while maintaining crisp 60fps renders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lazy Loading Media:&lt;/strong&gt; Using &lt;code&gt;loading="lazy"&lt;/code&gt; on sticker galleries prevents layout shift (CLS) and conserves mobile data when rendering 20+ animated assets simultaneously.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Platform Embedding:&lt;/strong&gt; Providing clean HTML embed snippets allowing educators and bloggers to drop assets directly into slides and articles.&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  🎮 Gamifying the Media (Interactive Web App)
&lt;/h2&gt;

&lt;p&gt;Beyond keyboard distribution, we linked these animated assets into an interactive web application—the &lt;strong&gt;Emoji Idioms Treasure Hunt&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;It combines JavaScript-driven wheel physics, audio cues, and state management where players decode emoji combinations into idioms, triggering specific animated reactions:&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://lokeshvarsha.blogspot.com/2026/08/emoji-idioms-treasure-hunt.html" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblogger.googleusercontent.com%2Fimg%2Fb%2FR29vZ2xl%2FAVvXsEjdy-H1kEcdRDTrH8iGKC-A70cRrB7zZNxvfUBinPX7pZbMo0x3JVysxBw_-FxqPuvrjSsfUNdooxaxDEF0XKNUE4UbVN2WvmGSpcBEadFxuEVteftEJfmkdpvL2QxEheMem6c9Lmcep_TDLoBuPk5iivH3csl1Cq-c4k_ntenTtzugiA%2Fw1200-h630-p-k-no-nu%2Fimage1786387165" height="480" class="m-0" width="480"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://lokeshvarsha.blogspot.com/2026/08/emoji-idioms-treasure-hunt.html" rel="noopener noreferrer" class="c-link"&gt;
            Spin the Wheel &amp;amp; Guess the Emoji Idioms! 🎡 Treasure Hunt Game with Lokesh &amp;amp; Varsha
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Can you decode 20 fun emoji clues to reveal hidden English idioms? Join Lokesh &amp;amp; Varsha in this interactive spin-the-wheel treasure hunt game.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flokeshvarsha.blogspot.com%2Ffavicon.ico" width="48" height="48"&gt;
          lokeshvarsha.blogspot.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  💡 Key Takeaways for Developers &amp;amp; Creators
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Leverage Existing Distribution Channels:&lt;/strong&gt; Don't try to build a custom messaging app just to share stickers. Integrate with Tenor/GIPHY to instantly tap into Gboard and WhatsApp ecosystems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structure Metadata for Search:&lt;/strong&gt; Algorithmic search on keyboard engines relies heavily on emotional and conversational tags rather than literal descriptions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep Your Web Hub Lean:&lt;/strong&gt; Ensure your media hosting page uses proper canonical tags, structured JSON-LD, and lazy-loaded assets to maintain strong performance scores.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Have you built custom integrations with Tenor, GIPHY, or keyboard APIs? Let's discuss in the comments below! 👇&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>socialmedia</category>
      <category>design</category>
      <category>api</category>
    </item>
    <item>
      <title>Building an AI Quiz Pipeline without using an AI API</title>
      <dc:creator>Ganga Ponnu</dc:creator>
      <pubDate>Mon, 27 Jul 2026 06:57:39 +0000</pubDate>
      <link>https://dev.to/randomtyms/building-an-ai-quiz-pipeline-without-using-an-ai-api-56an</link>
      <guid>https://dev.to/randomtyms/building-an-ai-quiz-pipeline-without-using-an-ai-api-56an</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Sometimes the most valuable software isn't another AI model—it's the workflow around it.&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The internet is full of AI quiz generators. Upload some content - click a button - a quiz appears.&lt;/p&gt;

&lt;p&gt;So why did I build something that doesn't generate quizzes directly?&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiowfikzdx8f80ory1wsp.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiowfikzdx8f80ory1wsp.jpg" alt="Pixar-style 3D animated boy with glasses pointing forward against a dark blue background with text reading: 'I Didn't Build Another AI Quiz Generator. I Built the Missing Piece.'" width="800" height="1422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Gemini (and other LLMs) are already very good at reading textbook pages.&lt;/p&gt;

&lt;p&gt;But asking an LLM:&lt;br&gt;
"Generate a quiz from this chapter."&lt;br&gt;
rarely gives you production-ready output.&lt;/p&gt;

&lt;p&gt;Some common issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inconsistent formatting&lt;/li&gt;
&lt;li&gt;incomplete coverage of the chapter&lt;/li&gt;
&lt;li&gt;questions in random order&lt;/li&gt;
&lt;li&gt;difficult to import into another application&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a teacher, this means spending more time cleaning the output than actually teaching.&lt;/p&gt;
&lt;h2&gt;
  
  
  My Approach
&lt;/h2&gt;

&lt;p&gt;Instead of building another AI wrapper, I built a workflow.&lt;br&gt;
Textbook Images&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
Optimized Prompt&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
Gemini&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
Structured Quiz Data&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
CSV File&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
RandomTyms Quiz Player&lt;/p&gt;

&lt;p&gt;The AI does what it's good at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;understanding content&lt;/li&gt;
&lt;li&gt;extracting knowledge&lt;/li&gt;
&lt;li&gt;generating questions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My application does what it is good at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;enforcing structure&lt;/li&gt;
&lt;li&gt;creating a reusable quiz format&lt;/li&gt;
&lt;li&gt;powering an interactive quiz interface&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Why CSV?
&lt;/h2&gt;

&lt;p&gt;This is probably the first question developers ask.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Why not just return JSON?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Why involve CSV at all?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because my users aren't developers. They're teachers.&lt;/p&gt;

&lt;p&gt;CSV has some surprisingly practical advantages.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Opens in Excel.&lt;/li&gt;
&lt;li&gt;Can be edited without technical knowledge.&lt;/li&gt;
&lt;li&gt;Easy to archive.&lt;/li&gt;
&lt;li&gt;Easy to share.&lt;/li&gt;
&lt;li&gt;Works offline.&lt;/li&gt;
&lt;li&gt;Can be imported into the quiz player.
A quiz becomes a file that belongs to the teacher—not another conversation trapped inside an AI chat.&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb5xiprlpxzzmowb94bkp.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb5xiprlpxzzmowb94bkp.png" alt="Infographic titled 'Auto-Generate Quiz Files with AI' showing a 3-step guide for teachers to copy a Gemini prompt, upload textbook images, and save as a CSV file, featuring a 3D animated girl character holding a notebook." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Prompt Engineering Is Part of the Product
&lt;/h2&gt;

&lt;p&gt;One thing I learned while building this is that prompt engineering isn't just an implementation detail.&lt;/p&gt;

&lt;p&gt;It's product design.&lt;/p&gt;

&lt;p&gt;Instead of expecting teachers to write prompts like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Generate 40 multiple-choice questions covering every important concept...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;they simply copy a pre-built prompt.&lt;/p&gt;

&lt;p&gt;That prompt tells the AI to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;analyse every uploaded textbook page&lt;/li&gt;
&lt;li&gt;cover all major concepts&lt;/li&gt;
&lt;li&gt;include definitions and key facts&lt;/li&gt;
&lt;li&gt;produce output in a predictable structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The complexity stays hidden. The workflow stays simple.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Didn't Use an AI API
&lt;/h2&gt;

&lt;p&gt;At first glance, that seems like extra work. But there were reasons behind it.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwvmham5ftdkcuvsgxloy.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwvmham5ftdkcuvsgxloy.png" alt="RandomTyms AI Quiz Generator interface featuring 3D animated characters Lokesh and Varsha alongside a upload card to choose a quiz file or paste a CSV link to start a quiz." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;1. Zero backend AI costs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No API billing.&lt;/li&gt;
&lt;li&gt;No token management.&lt;/li&gt;
&lt;li&gt;No rate limiting. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Users benefit from better models automatically&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When Gemini improves, the workflow improves and I don't need to deploy a new backend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Human review&lt;/strong&gt;&lt;br&gt;
Teachers naturally review the generated questions before importing them.&lt;/p&gt;

&lt;h2&gt;
  
  
  In education, that small review step is often a feature—not a bug.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Trade-offs
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;This approach isn't perfect.&lt;/li&gt;
&lt;li&gt;There is a manual copy-paste step.&lt;/li&gt;
&lt;li&gt;That's friction.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But it's also where teachers can fix mistakes, remove unsuitable questions, or add their own.&lt;/p&gt;

&lt;p&gt;For educational content, I think that's a worthwhile trade-off.&lt;/p&gt;

&lt;p&gt;Not every workflow needs to be fully automated.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsdj1t6m7g6znd938gk88.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsdj1t6m7g6znd938gk88.png" alt="Wide promo banner for RandomTyms AI Quiz Generator featuring vibrant 3D animated siblings Lokesh and Varsha with feature icons for Any Subject, AI Quiz Magic, Instant Results, and Download Options." width="799" height="273"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>edtech</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How I Built an AI Quiz Generator, a PWA Hub, and an Animated Kids' Brand — All on One Phone</title>
      <dc:creator>Ganga Ponnu</dc:creator>
      <pubDate>Thu, 23 Jul 2026 12:13:45 +0000</pubDate>
      <link>https://dev.to/randomtyms/how-i-built-an-ai-quiz-generator-a-pwa-hub-and-an-animated-kids-brand-all-on-one-phone-4kh5</link>
      <guid>https://dev.to/randomtyms/how-i-built-an-ai-quiz-generator-a-pwa-hub-and-an-animated-kids-brand-all-on-one-phone-4kh5</guid>
      <description>&lt;p&gt;I don't have a studio. I don't have a team. What I have is a smartphone — and that single constraint ended up shaping every decision behind RandomTyms, an AI-animated Tamil-English educational brand built around two characters, Lokesh and Varsha, and now a small suite of free learning apps.&lt;/p&gt;

&lt;p&gt;This post is about the "how" — not the brand story, but the actual technical build: a PWA hub, an AI-powered quiz generator, and the scrappy fixes that come with building mobile-only.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I ended up shipping
&lt;/h2&gt;

&lt;p&gt;The core of it is a Progressive Web App hosted on GitHub Pages: randomtyms.github.io. It bundles together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AI Textbook Quiz Generator
&lt;/h2&gt;

&lt;p&gt;— generates quizzes from textbook content using Google Gemini, with OMR-style answer bubbles and score-tiered feedback&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Spinner Wheel
&lt;/h2&gt;

&lt;p&gt;— a simple randomizer for classroom use&lt;br&gt;
Multiplication Practice — quick-fire drills for kids&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Symmetry Detective
&lt;/h2&gt;

&lt;p&gt;— an interactive shape-recognition tool&lt;br&gt;
All free. No sign-up, no ads, no tracking.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Building the PWA hub
&lt;/h2&gt;

&lt;p&gt;The hub itself is a manifest + service worker setup, which sounds simple until you're debugging it entirely from a phone browser's dev tools.&lt;/p&gt;

&lt;p&gt;A few specific things that took longer than expected:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live content feeds:&lt;/strong&gt; the Blog tab pulls from a live Blogger JSONP feed, and the Shorts tab runs through an RSS-to-JSON proxy — no dashboard, just feeds updating automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;YouTube thumbnails silently failing:&lt;/strong&gt; this one took a while to track down. Shorts-style RSS links didn't match the video ID regex I was using, so thumbnails just wouldn't render for some videos. Fixed it by adding /shorts/ pattern matching plus a fallback to the guid field.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the quiz generator
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fawy7zy6unyb2zxbhz086.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fawy7zy6unyb2zxbhz086.png" alt="RandomTyms Textbook to AI Quiz Generator" width="800" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the piece with the most moving parts. It's not just "call an API and show the output" — the widget needed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Prompt engineering tuned so Gemini reliably hits a minimum question count (it would sometimes shortchange this)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CSV export handling — cleaning up BOM characters and CRLF line endings that were quietly corrupting downloads&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OMR-style answer bubbles and score-tiered feedback, built as a reusable embeddable component (rt-quiz-embed.html) and a full standalone version (rt-quiz-full.html)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basic security hardening on the widget itself&lt;/p&gt;

&lt;h2&gt;
  
  
  One unexpected debugging detour:
&lt;/h2&gt;

&lt;p&gt;Google Safe Browsing flagged the blog at one point. After digging in, the likely trigger wasn't the quiz code — it was the instructional pattern &lt;/p&gt;

&lt;p&gt;&lt;code&gt;"copy this prompt → open Gemini → paste → send"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;reading as suspicious to automated scanners. Worth knowing if you're building anything that walks users through copy-pasting into another AI tool.&lt;/p&gt;

&lt;p&gt;Making the repo actually discoverable&lt;br&gt;
Shipping the apps was only half the job — a live PWA with no polish around it just doesn't get found. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recent cleanup included:&lt;/strong&gt;&lt;br&gt;
A`` proper README.md with screenshots of each app, not just a text description&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;MIT license added (code only — the characters and brand art stay separately owned)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;GitHub topics (education, pwa, kids-learning, quiz-app) so it surfaces in topic search&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A pinned profile repo and a real profile picture instead of the default identicon&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Small things, but they add up to a repo that looks maintained rather than abandoned.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;More apps are in active development on the hub. If you're curious about building AI-powered tools without a team or a dev environment beyond a phone, happy to answer questions in the comments — this whole thing has been one long lesson in working within constraints rather than around them.&lt;/p&gt;

&lt;p&gt;🔗 Try the apps: randomtyms.github.io&lt;br&gt;
📖 Follow the blog: lokeshvarsha.blogspot.com&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>buildinpublic</category>
      <category>deved</category>
    </item>
  </channel>
</rss>
