<?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: Anupam Thakur </title>
    <description>The latest articles on DEV Community by Anupam Thakur  (@anupam058).</description>
    <link>https://dev.to/anupam058</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%2F1439318%2Fe0c0f500-0be6-4492-848f-72514e8c12bc.jpg</url>
      <title>DEV Community: Anupam Thakur </title>
      <link>https://dev.to/anupam058</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anupam058"/>
    <language>en</language>
    <item>
      <title>404: The Page That Gets Worse</title>
      <dc:creator>Anupam Thakur </dc:creator>
      <pubDate>Fri, 03 Apr 2026 12:24:53 +0000</pubDate>
      <link>https://dev.to/anupam058/404-the-page-that-gets-worse-4l5</link>
      <guid>https://dev.to/anupam058/404-the-page-that-gets-worse-4l5</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/aprilfools-2026"&gt;DEV April Fools Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I built a 404 page that gets worse the more you use it.&lt;/p&gt;

&lt;p&gt;Most 404 pages try to help you get back.&lt;br&gt;
This one does the opposite.&lt;/p&gt;

&lt;p&gt;The more you visit, the more it changes its personality:&lt;/p&gt;

&lt;p&gt;🎀 Random pink mode appears&lt;br&gt;
💘 A romantic theme shows up unexpectedly&lt;br&gt;
🧠 "Try turning yourself off and on?" button&lt;br&gt;
🌀 Inception messages after repeated visits&lt;br&gt;
🔊 Completely unnecessary sound effects&lt;br&gt;
🤡 Buttons that proudly do nothing&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://anupamthakur-dev.github.io/page_404/" rel="noopener noreferrer"&gt;Live Site&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Screenshots
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;first visit&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.amazonaws.com%2Fuploads%2Farticles%2Fg1ki4qp8yshb0bzja3i1.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%2Fg1ki4qp8yshb0bzja3i1.png" alt="The normal 404 page" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three magical number visit&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.amazonaws.com%2Fuploads%2Farticles%2Frd1v28aghuhka0u4tzz9.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%2Frd1v28aghuhka0u4tzz9.png" alt="fall in love" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In between visit&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.amazonaws.com%2Fuploads%2Farticles%2Fhcegnt518fg7h362db9q.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%2Fhcegnt518fg7h362db9q.png" alt="why are coming back again and again" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The time wasted visit&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.amazonaws.com%2Fuploads%2Farticles%2F9x9f4gegbi5hvitnb7m0.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%2F9x9f4gegbi5hvitnb7m0.png" alt="The OG Thousand" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;If you're curious:&lt;/p&gt;

&lt;p&gt;Review the code&lt;br&gt;
Star it if it made you smile&lt;br&gt;
Fork it and make it even more useless&lt;br&gt;
Or improve it… if you dare&lt;/p&gt;

&lt;p&gt;Fair warning though…&lt;br&gt;
Exploring this code might be a waste of time.&lt;br&gt;
But then again… so is this entire project.&lt;br&gt;
&lt;a href="https://github.com/anupamthakur-dev/page_404" rel="noopener noreferrer"&gt;view code&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How I Built a 404 Page That Gets Worse Over Time
&lt;/h2&gt;

&lt;p&gt;This project started as a normal 404 page.&lt;br&gt;
Then I asked a simple question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if a 404 page remembered you… and reacted accordingly?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That idea turned into a useless but fun experiment.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Track Visits
&lt;/h3&gt;

&lt;p&gt;I used &lt;code&gt;localStorage&lt;/code&gt; to track how many times someone visits the 404 page.&lt;/p&gt;

&lt;p&gt;Each visit increases a counter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First visit → Normal 404&lt;/li&gt;
&lt;li&gt;Few visits → UI changes&lt;/li&gt;
&lt;li&gt;Many visits → Things get… strange&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The page slowly evolves based on visit count.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2: Theme System
&lt;/h3&gt;

&lt;p&gt;I created a simple theme system using &lt;code&gt;data-theme&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Instead of hardcoding styles, I switch themes dynamically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Default theme&lt;/li&gt;
&lt;li&gt;Romantic theme&lt;/li&gt;
&lt;li&gt;Flicker theme&lt;/li&gt;
&lt;li&gt;Random surprises&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This made it easy to add new personalities to the page.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 3: Random Chaos
&lt;/h3&gt;

&lt;p&gt;To make the page unpredictable, I added:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Random messages&lt;/li&gt;
&lt;li&gt;Weird buttons&lt;/li&gt;
&lt;li&gt;Unexpected UI changes&lt;/li&gt;
&lt;li&gt;Sound effects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not every visit behaves the same.&lt;br&gt;
And that’s where the fun begins.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 4: Progressive Weirdness
&lt;/h3&gt;

&lt;p&gt;The key idea was &lt;strong&gt;gradual escalation&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First few visits feel normal&lt;/li&gt;
&lt;li&gt;Then subtle changes&lt;/li&gt;
&lt;li&gt;Then the page starts acting… unusual&lt;/li&gt;
&lt;li&gt;Eventually it becomes completely useless&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;CSS (theme system with &lt;code&gt;data-theme&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;JavaScript (localStorage + logic)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Why I Built This
&lt;/h3&gt;

&lt;p&gt;Because not every project needs to solve a problem.&lt;br&gt;
Some can just exist to make the internet a little more interesting.&lt;/p&gt;

&lt;p&gt;And honestly…&lt;br&gt;
The more I built it, the more it built itself.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prize Category
&lt;/h2&gt;

&lt;p&gt;submission is not specific to a prize category.&lt;/p&gt;
&lt;h2&gt;
  
  
  Anti-value
&lt;/h2&gt;

&lt;p&gt;This project does not solve any problem.&lt;br&gt;
It wastes time.&lt;br&gt;
It adds confusion.&lt;br&gt;
It becomes increasingly useless.&lt;/p&gt;

&lt;p&gt;Really, it’s fun to build something useless 😂&lt;br&gt;
Why always make something useful? Sometimes it’s better to just go with the flow and build for the fun of it.&lt;/p&gt;

&lt;p&gt;Not every project needs to solve a problem.&lt;br&gt;
Sometimes, it's enough that it made the process enjoyable.&lt;/p&gt;

&lt;p&gt;And honestly, this one was just fun to build. 🚀  &lt;/p&gt;

&lt;p&gt;Ok thanks and BYE BYE, see you later or you can now below (click it) &lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__1439318"&gt;
    &lt;a href="/anupam058" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1439318%2Fe0c0f500-0be6-4492-848f-72514e8c12bc.jpg" alt="anupam058 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/anupam058"&gt;Anupam Thakur &lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/anupam058"&gt;On a journey of becoming frontend developer.&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>devchallenge</category>
      <category>418challenge</category>
      <category>showdev</category>
    </item>
    <item>
      <title>JOBSFILE</title>
      <dc:creator>Anupam Thakur </dc:creator>
      <pubDate>Mon, 02 Mar 2026 08:00:41 +0000</pubDate>
      <link>https://dev.to/anupam058/jobsfile-2nng</link>
      <guid>https://dev.to/anupam058/jobsfile-2nng</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/weekend-2026-02-28"&gt;DEV Weekend Challenge: Community&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Community
&lt;/h2&gt;

&lt;p&gt;JobsFile is built for job seekers — especially students, fresh graduates, and early-career developers — who actively apply to multiple roles and struggle to keep everything organized.&lt;/p&gt;

&lt;p&gt;This community regularly deals with scattered job descriptions, lost follow-up dates, repeated cold emails, and the mental overhead of remembering where, when, and how they applied. Spreadsheets break quickly. Notes apps don’t scale. Existing tools feel bloated or impersonal.&lt;/p&gt;

&lt;p&gt;As a job seeker myself, I built JobsFile from firsthand frustration. It reflects the real workflow of applying, tracking, following up, and refining outreach — not just storing job titles. The goal is simple: reduce cognitive load, improve follow-up consistency, and help candidates stay confident and in control during a stressful process.&lt;/p&gt;

&lt;h2&gt;
  
  
  🗂️ JobsFile
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Track jobs. Remember context. Follow up better.&lt;/strong&gt;&lt;/p&gt;




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

&lt;p&gt;While applying to multiple jobs, I kept running into the same problems again and again:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I forgot job descriptions after a few days
&lt;/li&gt;
&lt;li&gt;I wasn’t sure when or how to follow up
&lt;/li&gt;
&lt;li&gt;Writing follow-up or cold emails meant repeatedly copy-pasting job details
&lt;/li&gt;
&lt;li&gt;Tracking applications across spreadsheets and notes became messy and stressful
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a job-seeking developer myself, I felt this pain firsthand.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;JobsFile was built to solve that exact problem.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;github &lt;a href="https://github.com/anupamthakur-dev/jobsfile" rel="noopener noreferrer"&gt;source code &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;app &lt;a href="https://jobsfile.vercel.app/" rel="noopener noreferrer"&gt;live url&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 What it does
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;JobsFile&lt;/strong&gt; is a lightweight job application tracker that treats the &lt;strong&gt;job description as first-class data&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It allows users to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Save and organize every job they apply to&lt;/li&gt;
&lt;li&gt;Store the full job description once and revisit it anytime&lt;/li&gt;
&lt;li&gt;Track application status (Saved, Applied, Interview, Rejected)&lt;/li&gt;
&lt;li&gt;Maintain follow-up notes and reminders&lt;/li&gt;
&lt;li&gt;Generate personalized follow-up and cold emails using saved job context&lt;/li&gt;
&lt;li&gt;Clearly see which applications need attention today&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of just tracking &lt;em&gt;where&lt;/em&gt; you applied, JobsFile helps you remember &lt;em&gt;what&lt;/em&gt; you applied for and act on it confidently.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 How it’s different
&lt;/h2&gt;

&lt;p&gt;Most job trackers focus only on status columns and deadlines.&lt;br&gt;&lt;br&gt;
JobsFile focuses on &lt;strong&gt;context&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Job descriptions are preserved and easily accessible&lt;/li&gt;
&lt;li&gt;Follow-ups are contextual, not generic&lt;/li&gt;
&lt;li&gt;The UI is optimized for clarity and speed, not clutter&lt;/li&gt;
&lt;li&gt;Built specifically for individuals, not recruiters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It feels more like a &lt;strong&gt;personal job memory system&lt;/strong&gt; than a spreadsheet.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ How we built it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React + TypeScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Styling:&lt;/strong&gt; Tailwind CSS (v4) with OKLCH-based theming&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI Components:&lt;/strong&gt; shadcn/ui&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State Management:&lt;/strong&gt; React Context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture:&lt;/strong&gt; SPA (Serverless-friendly)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design Focus:&lt;/strong&gt; Clean, minimal, distraction-free&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project was structured with scalability in mind, keeping components reusable and logic well-isolated.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ Challenges we ran into
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Designing a workflow that stays simple while handling many job states&lt;/li&gt;
&lt;li&gt;Structuring job data so descriptions remain usable for follow-ups&lt;/li&gt;
&lt;li&gt;Avoiding feature bloat while keeping the app genuinely helpful&lt;/li&gt;
&lt;li&gt;Making the UI feel fast and intuitive without overwhelming users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each challenge pushed the project toward better UX decisions.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏆 Accomplishments that I’m proud of
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Turning a real personal problem into a practical product&lt;/li&gt;
&lt;li&gt;Building a clean, scalable frontend architecture&lt;/li&gt;
&lt;li&gt;Creating a job tracker that actually improves follow-up quality&lt;/li&gt;
&lt;li&gt;Designing a UI that feels calm during a stressful job hunt&lt;/li&gt;
&lt;/ul&gt;




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

&lt;ul&gt;
&lt;li&gt;How important &lt;strong&gt;context preservation&lt;/strong&gt; is in productivity tools&lt;/li&gt;
&lt;li&gt;Better state modeling for real-world workflows&lt;/li&gt;
&lt;li&gt;Practical UI/UX tradeoffs in personal tools&lt;/li&gt;
&lt;li&gt;How small features, done right, can have a big impact&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔮 What’s next for JobsFile
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;AI-powered follow-up and cold email suggestions&lt;/li&gt;
&lt;li&gt;Smart reminders based on application age&lt;/li&gt;
&lt;li&gt;Resume-to-job matching insights&lt;/li&gt;
&lt;li&gt;Export and analytics for job search patterns&lt;/li&gt;
&lt;li&gt;Authentication and cloud sync&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🙌 Built by
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Anupam&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Frontend Developer&lt;br&gt;&lt;br&gt;
Built with empathy for job seekers and love for clean UI.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Interview Quest : an AI Interviewer</title>
      <dc:creator>Anupam Thakur </dc:creator>
      <pubDate>Mon, 16 Feb 2026 08:03:22 +0000</pubDate>
      <link>https://dev.to/anupam058/interview-quest-an-ai-interviewer-4efo</link>
      <guid>https://dev.to/anupam058/interview-quest-an-ai-interviewer-4efo</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-01-21"&gt;GitHub Copilot CLI Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  🎮 InterviewQuest: Level Up Your Interview Skills in the Terminal
&lt;/h1&gt;

&lt;p&gt;Ever wished you could practice coding interviews without leaving your terminal? Meet &lt;strong&gt;InterviewQuest&lt;/strong&gt; - a gamified, terminal-based interview simulator that makes practicing technical interviews actually fun!&lt;/p&gt;

&lt;h2&gt;
  
  
  🌟 What is InterviewQuest?
&lt;/h2&gt;

&lt;p&gt;InterviewQuest is a production-quality CLI application that helps developers practice technical interview questions in a gamified environment. Think of it as a terminal game meets interview prep - with lives, streaks, and adaptive difficulty!&lt;/p&gt;

&lt;h3&gt;
  
  
  ✨ Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🎯 &lt;strong&gt;Guess the Output Mode&lt;/strong&gt; - Analyze code snippets and predict their output&lt;/li&gt;
&lt;li&gt;💝 &lt;strong&gt;Lives System&lt;/strong&gt; - Start with 3 hearts, lose one on wrong answers&lt;/li&gt;
&lt;li&gt;🔥 &lt;strong&gt;Streak Bonuses&lt;/strong&gt; - Get 3 correct in a row to level up difficulty&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Score Tracking&lt;/strong&gt; - Track your progress and accuracy&lt;/li&gt;
&lt;li&gt;🧠 &lt;strong&gt;Adaptive Difficulty&lt;/strong&gt; - Automatically adjusts based on your performance&lt;/li&gt;
&lt;li&gt;🎨 &lt;strong&gt;Beautiful UI&lt;/strong&gt; - Centered, colorful terminal interface with animations&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;Zero Dependencies&lt;/strong&gt; - Minimal, fast, and reliable&lt;/li&gt;
&lt;li&gt;🤖 &lt;strong&gt;AI Integration&lt;/strong&gt; - Optional GitHub Copilot support for evaluation&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;iframe src="https://player.vimeo.com/video/1165298209" width="710" height="399"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  📋 Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before you start, make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js&lt;/strong&gt; &amp;gt;= 18&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terminal&lt;/strong&gt; with minimum size 60x20&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚀 Installation &amp;amp; Setup
&lt;/h2&gt;

&lt;p&gt;Since the app isn't published on npm yet, you can run it directly from the GitHub repository:&lt;/p&gt;

&lt;h3&gt;
  
  
  Method 1: Clone and Run (Recommended)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone the repository&lt;/span&gt;
git clone https://github.com/anupamthakur-dev/interview-quest.git

&lt;span class="c"&gt;# Navigate to the directory&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;interview-quest

&lt;span class="c"&gt;# Install dependencies&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Build the project&lt;/span&gt;
npm run build

&lt;span class="c"&gt;# Run the game (default mode - no AI)&lt;/span&gt;
npm start

&lt;span class="c"&gt;# Or run with AI features enabled&lt;/span&gt;
npm run start:ai

&lt;span class="c"&gt;# Alternative: direct command with AI&lt;/span&gt;
node dist/bin/interviewquest.js &lt;span class="nt"&gt;--ai&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; In local development, AI is &lt;strong&gt;disabled by default&lt;/strong&gt;. Use &lt;code&gt;npm run start:ai&lt;/code&gt; or add the &lt;code&gt;--ai&lt;/code&gt; flag to enable GitHub Copilot features.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Method 2: Install Globally (Local Development)
&lt;/h3&gt;

&lt;p&gt;(not yet published on npm)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone and navigate&lt;/span&gt;
git clone https://github.com/anupamthakur-dev/interview-quest.git
&lt;span class="nb"&gt;cd &lt;/span&gt;interview-quest

&lt;span class="c"&gt;# Install dependencies and build&lt;/span&gt;
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run build

&lt;span class="c"&gt;# Link globally&lt;/span&gt;
npm &lt;span class="nb"&gt;link&lt;/span&gt;

&lt;span class="c"&gt;# Now you can run it from anywhere!&lt;/span&gt;
interviewquest

&lt;span class="c"&gt;# Or with AI features&lt;/span&gt;
interviewquest &lt;span class="nt"&gt;--ai&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To unlink later:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;unlink&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; interviewquest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; When installed globally via npm (after publishing), AI features will be &lt;strong&gt;enabled by default&lt;/strong&gt;. In local development, use the &lt;code&gt;--ai&lt;/code&gt; flag to enable them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🎮 How to Play
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Starting the Game
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Game Modes
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Guess the Output 🎯
&lt;/h4&gt;

&lt;p&gt;The main game mode where you:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;View a code snippet&lt;/li&gt;
&lt;li&gt;Predict what it will output&lt;/li&gt;
&lt;li&gt;Submit your guess (multi-line supported!)&lt;/li&gt;
&lt;li&gt;Get instant feedback&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Lives System:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start with 3 hearts ❤️ ❤️ ❤️&lt;/li&gt;
&lt;li&gt;Lose one on wrong answer&lt;/li&gt;
&lt;li&gt;Game over when you run out!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Streak Bonuses:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get 3 correct in a row 🔥🔥🔥&lt;/li&gt;
&lt;li&gt;Difficulty automatically increases&lt;/li&gt;
&lt;li&gt;Earn bonus points!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Difficulty Levels:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🟢 &lt;strong&gt;Easy&lt;/strong&gt; - Basic concepts&lt;/li&gt;
&lt;li&gt;🟡 &lt;strong&gt;Medium&lt;/strong&gt; - Practical applications
&lt;/li&gt;
&lt;li&gt;🔴 &lt;strong&gt;Hard&lt;/strong&gt; - Advanced concepts&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Interview Mode 🎤 (Coming Soon)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Realistic interview simulation&lt;/li&gt;
&lt;li&gt;Timed challenges&lt;/li&gt;
&lt;li&gt;AI evaluation with detailed feedback&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. Practice Grounds 📚 (Coming Soon)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Unlimited practice&lt;/li&gt;
&lt;li&gt;No time pressure&lt;/li&gt;
&lt;li&gt;Learn at your own pace&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⌨️ Controls
&lt;/h2&gt;

&lt;h3&gt;
  
  
  In-Game Controls
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Guess the Output:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Type your answer&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Enter&lt;/code&gt; for new line&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Ctrl+S&lt;/code&gt; to submit&lt;/li&gt;
&lt;li&gt;Use arrow keys to navigate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Menus:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;↑&lt;/code&gt; &lt;code&gt;↓&lt;/code&gt; arrow keys to navigate&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Enter&lt;/code&gt; to select&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Esc&lt;/code&gt; or &lt;code&gt;Ctrl+C&lt;/code&gt; to exit&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🛠️ Tech Stack
&lt;/h2&gt;

&lt;p&gt;Built with modern, minimal dependencies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript&lt;/strong&gt; - Type-safe development&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node.js&lt;/strong&gt; - Runtime environment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chalk&lt;/strong&gt; - Terminal styling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Figlet&lt;/strong&gt; - ASCII art headers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Terminal Wrapper&lt;/strong&gt; - Responsive, centered UI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Architecture:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modular, scalable structure&lt;/li&gt;
&lt;li&gt;Custom animations (no heavy libraries!)&lt;/li&gt;
&lt;li&gt;Native readline for input&lt;/li&gt;
&lt;li&gt;Clean separation of concerns&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📁 Project Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interview-quest/
├── bin/
│   └── interviewquest.ts        # Entry point
├── src/
│   ├── app/                     # App initialization
│   ├── ui/                      # Terminal UI components
│   ├── game/                    # Game logic &amp;amp; modes
│   ├── questions/               # Question bank
│   ├── evaluation/              # Answer evaluation
│   └── utils/                   # Utilities
└── dist/                        # Compiled output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🎨 Screenshots
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Intro page
&lt;/h3&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%2F5rakce3fc2gkllnq97b0.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%2F5rakce3fc2gkllnq97b0.png" alt=" " width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Main Menu
&lt;/h3&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%2Fmntynwqjgfvctctmi6g6.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%2Fmntynwqjgfvctctmi6g6.png" alt=" " width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Gameplay
&lt;/h3&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%2F85f0tlavllkox0pqfxzb.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%2F85f0tlavllkox0pqfxzb.png" alt=" " width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Results
&lt;/h3&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%2Fhtyvkx3s6ufd4jmzduug.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%2Fhtyvkx3s6ufd4jmzduug.png" alt=" " width="800" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ Configuration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Default Mode (No Setup Required)
&lt;/h3&gt;

&lt;p&gt;The app runs in &lt;strong&gt;default mode&lt;/strong&gt; with built-in questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Works immediately after installation&lt;/li&gt;
&lt;li&gt;✅ No external dependencies required&lt;/li&gt;
&lt;li&gt;✅ Perfect for getting started!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Just run and play:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm start
&lt;span class="c"&gt;# or if linked globally&lt;/span&gt;
interviewquest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Enable AI Features (Optional)
&lt;/h3&gt;

&lt;p&gt;Want AI-powered code generation and evaluation? Use the &lt;code&gt;--ai&lt;/code&gt; flag:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;GitHub CLI installed: &lt;code&gt;gh --version&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Copilot extension: &lt;code&gt;gh extension install github/gh-copilot&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Authenticated: &lt;code&gt;gh auth login&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;GitHub Copilot subscription&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Local Development:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Using npm scripts&lt;/span&gt;
npm run start:ai
npm run dev:ai

&lt;span class="c"&gt;# Or with flag&lt;/span&gt;
interviewquest &lt;span class="nt"&gt;--ai&lt;/span&gt;
node dist/bin/interviewquest.js &lt;span class="nt"&gt;--ai&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After Publishing (Production):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# AI enabled by default!&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; interviewquest
interviewquest  &lt;span class="c"&gt;# AI already enabled&lt;/span&gt;

&lt;span class="c"&gt;# Disable if needed&lt;/span&gt;
interviewquest &lt;span class="nt"&gt;--no-ai&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Available Flags:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;interviewquest &lt;span class="nt"&gt;--help&lt;/span&gt;        &lt;span class="c"&gt;# Show help&lt;/span&gt;
interviewquest &lt;span class="nt"&gt;--version&lt;/span&gt;     &lt;span class="c"&gt;# Show version&lt;/span&gt;
interviewquest &lt;span class="nt"&gt;--ai&lt;/span&gt;          &lt;span class="c"&gt;# Enable AI features&lt;/span&gt;
interviewquest &lt;span class="nt"&gt;--copilot&lt;/span&gt;     &lt;span class="c"&gt;# Same as --ai&lt;/span&gt;
interviewquest &lt;span class="nt"&gt;-c&lt;/span&gt;            &lt;span class="c"&gt;# Short form&lt;/span&gt;
interviewquest &lt;span class="nt"&gt;--no-ai&lt;/span&gt;       &lt;span class="c"&gt;# Disable AI (production)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What you get with AI:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🤖 AI-generated code challenges&lt;/li&gt;
&lt;li&gt;💡 Smarter answer evaluation&lt;/li&gt;
&lt;li&gt;📝 Detailed feedback and explanations&lt;/li&gt;
&lt;li&gt;🎯 More varied question types&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Environment Behavior:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🏠 &lt;strong&gt;Local Development:&lt;/strong&gt; AI disabled by default (use &lt;code&gt;--ai&lt;/code&gt; to enable)&lt;/li&gt;
&lt;li&gt;🚀 &lt;strong&gt;Production:&lt;/strong&gt; AI enabled by default (use &lt;code&gt;--no-ai&lt;/code&gt; to disable)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🤝 Contributing
&lt;/h2&gt;

&lt;p&gt;Contributions are welcome! Here's how you can help:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Fork the repository&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create a feature branch&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; feature/amazing-feature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Make your changes&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commit with clear messages&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add amazing feature"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Push to your fork&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   git push origin feature/amazing-feature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Open a Pull Request&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Development Setup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone your fork&lt;/span&gt;
git clone https://github.com/YOUR_USERNAME/interview-quest.git
&lt;span class="nb"&gt;cd &lt;/span&gt;interview-quest

&lt;span class="c"&gt;# Install dependencies&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Start development mode&lt;/span&gt;
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🗺️ Roadmap
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Current Features ✅
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[x] Guess the Output mode&lt;/li&gt;
&lt;li&gt;[x] Lives system&lt;/li&gt;
&lt;li&gt;[x] Streak bonuses&lt;/li&gt;
&lt;li&gt;[x] Adaptive difficulty&lt;/li&gt;
&lt;li&gt;[x] Score tracking&lt;/li&gt;
&lt;li&gt;[x] Multi-line input support&lt;/li&gt;
&lt;li&gt;[x] Beautiful terminal UI&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Coming Soon 🚀
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Interview Mode with AI evaluation&lt;/li&gt;
&lt;li&gt;[ ] Practice Grounds (unlimited practice)&lt;/li&gt;
&lt;li&gt;[ ] More question categories&lt;/li&gt;
&lt;li&gt;[ ] Session persistence&lt;/li&gt;
&lt;li&gt;[ ] Leaderboard system&lt;/li&gt;
&lt;li&gt;[ ] Custom themes&lt;/li&gt;
&lt;li&gt;[ ] Question of the day&lt;/li&gt;
&lt;li&gt;[ ] Multiplayer mode (?)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📊 Stats
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Package Size:&lt;/strong&gt; ~70 KB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependencies:&lt;/strong&gt; 3 (minimal!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lines of Code:&lt;/strong&gt; ~5,000+&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supported Languages:&lt;/strong&gt; JavaScript, TypeScript, DSA, System Design&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Question Bank:&lt;/strong&gt; Growing weekly!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🐛 Known Issues
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Terminal must be at least 60x20 for best experience&lt;/li&gt;
&lt;li&gt;Some emojis may not render correctly on older terminals&lt;/li&gt;
&lt;li&gt;Windows CMD has limited color support (use PowerShell or Windows Terminal)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💡 Tips for Best Experience
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use a modern terminal:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows: Windows Terminal or PowerShell&lt;/li&gt;
&lt;li&gt;Mac: iTerm2 or default Terminal&lt;/li&gt;
&lt;li&gt;Linux: gnome-terminal, konsole, or similar&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Recommended terminal size:&lt;/strong&gt; 80x24 or larger&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enable cursor blinking&lt;/strong&gt; for better input visibility&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use dark theme&lt;/strong&gt; for optimal color contrast&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🙏 Acknowledgments
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Built with love for the developer community&lt;/li&gt;
&lt;li&gt;Inspired by the need for better interview practice tools&lt;/li&gt;
&lt;li&gt;Thanks to all contributors and testers!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📬 Contact &amp;amp; Support
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/anupamthakur-dev/interview-quest" rel="noopener noreferrer"&gt;https://github.com/anupamthakur-dev/interview-quest&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issues:&lt;/strong&gt; &lt;a href="https://github.com/anupamthakur-dev/interview-quest/issues" rel="noopener noreferrer"&gt;https://github.com/anupamthakur-dev/interview-quest/issues&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Author:&lt;/strong&gt; Anupam Thakur&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎯 Quick Start Summary
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Clone the repo&lt;/span&gt;
git clone https://github.com/anupamthakur-dev/interview-quest.git

&lt;span class="c"&gt;# 2. Install &amp;amp; build&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;interview-quest
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run build

&lt;span class="c"&gt;# 3. Start playing!&lt;/span&gt;
npm start              &lt;span class="c"&gt;# Default mode (no AI)&lt;/span&gt;
npm run start:ai       &lt;span class="c"&gt;# With AI features&lt;/span&gt;

&lt;span class="c"&gt;# 4. Optional: Install globally&lt;/span&gt;
npm &lt;span class="nb"&gt;link
&lt;/span&gt;interviewquest         &lt;span class="c"&gt;# Run from anywhere&lt;/span&gt;
interviewquest &lt;span class="nt"&gt;--ai&lt;/span&gt;    &lt;span class="c"&gt;# With AI features&lt;/span&gt;

&lt;span class="c"&gt;# When published via npm (coming soon!)&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; interviewquest
interviewquest         &lt;span class="c"&gt;# AI enabled by default&lt;/span&gt;
interviewquest &lt;span class="nt"&gt;--no-ai&lt;/span&gt; &lt;span class="c"&gt;# Disable AI if needed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Quick Commands:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;interviewquest&lt;/code&gt; - Run the game&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;interviewquest --ai&lt;/code&gt; - Enable AI features (local dev)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;interviewquest --no-ai&lt;/code&gt; - Disable AI (production)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;interviewquest --help&lt;/code&gt; - Show all options&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;interviewquest --version&lt;/code&gt; - Show version&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Works immediately&lt;/strong&gt; with built-in questions! No setup required.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Want AI features?&lt;/strong&gt; Add &lt;code&gt;--ai&lt;/code&gt; flag in local dev, or AI is enabled by default in production.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Star the repo ⭐ if you find it helpful!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Happy coding, and may your interviews be ever in your favor! 🚀&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have questions or suggestions? Drop them in the comments below!&lt;/em&gt; 👇&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>cli</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>Why Pub/Sub Is the Architecture Trick Every Developer Should Know</title>
      <dc:creator>Anupam Thakur </dc:creator>
      <pubDate>Tue, 25 Nov 2025 18:21:57 +0000</pubDate>
      <link>https://dev.to/anupam058/why-pubsub-is-the-architecture-trick-every-developer-should-know-1i8k</link>
      <guid>https://dev.to/anupam058/why-pubsub-is-the-architecture-trick-every-developer-should-know-1i8k</guid>
      <description>&lt;p&gt;Did you ever run into a situation where an event or specific action happens in your code, and you want other components to react — maybe update the UI, trigger a toast, refresh some data — but you end up creating a mess of callback functions just to make things talk to each other? One function calling another, that one calling a third, and suddenly your code looks like a bowl of tightly coupled spaghetti🍝.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&gt;

&lt;p&gt;Component A fires an event, so you directly call a function in Component B. Then B needs to inform C, so you pass another callback. And eventually C needs data from A, so you pass props up and callbacks down. It works… but it becomes fragile, painful to maintain, and every new requirement feels like refactoring your entire app.&lt;/p&gt;

&lt;h4&gt;
  
  
  Now compare that chaos with using Pub/Sub:
&lt;/h4&gt;

&lt;p&gt;Component A simply publishes an event like user:login, and whoever cares — Component B, C, or D — just subscribes to it. No direct dependencies, no tangled wiring, no callback chains. A doesn’t know who’s listening, and listeners don’t care who triggered it.&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="c1"&gt;// Component A&lt;/span&gt;
&lt;span class="nx"&gt;pubsub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user:login&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Component B&lt;/span&gt;
&lt;span class="nx"&gt;pubsub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user:login&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;updateHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// Component C&lt;/span&gt;
&lt;span class="nx"&gt;pubsub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user:login&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;refreshDashboard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// Component D&lt;/span&gt;
&lt;span class="nx"&gt;pubsub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user:login&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;showToast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Welcome back!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your code suddenly becomes modular, clean, and beautifully predictable. Ok , now lets dive deep into what is and how to do pub/sub.&lt;/p&gt;

&lt;h2&gt;
  
  
  Publish-Subscribe ( pub/sub )
&lt;/h2&gt;

&lt;p&gt;Pub/sub is a simple messaging pattern where one part of your code announces that something happened, and other parts of your code listen for those announcements.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The part that announces is called the &lt;strong&gt;publisher&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The parts that listen are called the &lt;strong&gt;subscribers&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They never talk to each other directly.&lt;br&gt;
They only communicate through a &lt;strong&gt;middle system&lt;/strong&gt; (the “event channel”).&lt;/p&gt;

&lt;p&gt;It’s like saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Hey, event happened!”&lt;br&gt;
and whoever cares will react — without the publisher knowing who they &lt;br&gt;
are.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Super simple example:
&lt;/h3&gt;

&lt;p&gt;Imagine a Youtube channel&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You publish a video&lt;/li&gt;
&lt;li&gt;Whoever subscribed the channel get automatically notified.&lt;/li&gt;
&lt;li&gt;You don't have to message each subcriber.&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.amazonaws.com%2Fuploads%2Farticles%2F4m0bi2ia86msxhdp4fvq.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.amazonaws.com%2Fuploads%2Farticles%2F4m0bi2ia86msxhdp4fvq.jpg" alt="subscribers gets notification of new video uploaded" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🧩 Let’s Build a Simple Pub/Sub System from Scratch
&lt;/h2&gt;

&lt;p&gt;To understand Pub/Sub, imagine breaking the system into three simple parts — each with a very clear job :&lt;/p&gt;
&lt;h3&gt;
  
  
  1. The Publisher (🔊The speaker)
&lt;/h3&gt;

&lt;p&gt;This part of your code creates an event. And publish events with optional data. Its doesn't know about :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;who will listen&lt;/li&gt;
&lt;li&gt;how many listners are&lt;/li&gt;
&lt;li&gt;and what will it do
It just says &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Hey! an event happened, i am publishing it.&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt; &lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;events&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;events&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&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;h3&gt;
  
  
  2. The Subscriber (👂The Listener)
&lt;/h3&gt;

&lt;p&gt;This part of your code subscribe the Listeners and responsible to receive messages for subscribed events.&lt;/p&gt;

&lt;p&gt;And subscribes dont know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;who trigger the events&lt;/li&gt;
&lt;li&gt;why the event happens
They only care &lt;strong&gt;when&lt;/strong&gt; it happens.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;This is a method which returns a function which is used to unsubscribe from event works as a clean-up function.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;subcribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 

 &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;events&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="nx"&gt;events&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

 &lt;span class="nx"&gt;events&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

 &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;events&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;callback&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;h3&gt;
  
  
  3. Event Channel (🙎‍♂️The Middleman)
&lt;/h3&gt;

&lt;p&gt;This is the hub where everything connects.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stores all events and thier listeners&lt;/li&gt;
&lt;li&gt;links publishers and subscribers&lt;/li&gt;
&lt;li&gt;decides which subscribers to notify when an event occurs
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// stores event and listeners in Set&lt;/span&gt;
&lt;span class="c1"&gt;// like&lt;/span&gt;
 &lt;span class="nx"&gt;events&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;event-name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;listener1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;listener2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...],&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;event-name1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;listener1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;listener2&lt;/span&gt;&lt;span class="p"&gt;,&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;h3&gt;
  
  
  💻 Full code example
&lt;/h3&gt;

&lt;p&gt;Below is the full code that we used to explain the concepts above;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pubsub&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;

  &lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;events&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;events&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;events&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;events&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)};&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;events&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;events&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;));&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;h2&gt;
  
  
  🛠️ How to use
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ Subscribe to an event
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;unsubscribe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pubsub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;task:completed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;A task was completed:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
 &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// call unsubscribe function&lt;/span&gt;
&lt;span class="c1"&gt;// when you doesn't want to get notify&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2️⃣ Publish an event
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pubsub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;task:completed&lt;/span&gt;&lt;span class="dl"&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Learn Pub/Sub&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When publish runs, the subscriber automatically gets triggered&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Done
&lt;/h3&gt;

&lt;p&gt;Congrats, now your code ready to yell to listners that the event is happen whenever publish runs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// output  &lt;/span&gt;
&lt;span class="nx"&gt;Event&lt;/span&gt; &lt;span class="nx"&gt;received&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;completed&lt;/span&gt;
&lt;span class="nx"&gt;Payload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Learn Pub/Sub&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Clean&lt;/strong&gt;, &lt;strong&gt;readable&lt;/strong&gt;, &lt;strong&gt;maintainable&lt;/strong&gt; and &lt;strong&gt;scalable&lt;/strong&gt; instead &lt;strong&gt;callbacks hell&lt;/strong&gt;. It’s a practical weapon for cleaner, more flexible code — especially in interactive apps, real-time features, and systems that grow over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 How I Discovered Pub/Sub While Fighting My Own Code Chaos
&lt;/h2&gt;

&lt;p&gt;The first i know about Pub/Sub and used in my code, when i was working on my project &lt;strong&gt;Pomodoro Timer&lt;/strong&gt;. Where i need to keep the track of remaining time to update UI, and switch between modes (focus, short-break and long-break) on every timer hits zero.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EventEmitter as pub/sub system&lt;/strong&gt;&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;class&lt;/span&gt; &lt;span class="nc"&gt;EventEmitter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;_events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Listener&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="p"&gt;{};&lt;/span&gt;

    &lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;eventName&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="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;Listener&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_events&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_events&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_events&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_events&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;eventName&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="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;[]){&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_events&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_events&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;l&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;));&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;&lt;strong&gt;Pomodoro core structure&lt;/strong&gt;&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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pomodoro&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;_emitter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;EventEmitter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;eventName&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="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Listener&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;Unsubscribe&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_emitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_interval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tick&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_isTicking&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;// publisher emiting timer status on every start method call&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_emitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isTicking&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;tick&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_second&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_minute&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_isTicking&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tryCallback&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_minute&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_second&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_second&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// another publisher&lt;/span&gt;
&lt;span class="c1"&gt;// publish tick event and data on every second&lt;/span&gt;

    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_emitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tick&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;&lt;span class="na"&gt;min&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;minute&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="na"&gt;sec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;second&lt;/span&gt;&lt;span class="p"&gt;});&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;And that’s pub/sub helped me, Now i can add as many as subscribers without touching the core code structure just need to call subcribe method and &lt;strong&gt;booyah!!!&lt;/strong&gt; its done and unsubscribe the event when i don't need.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌟Benefits of Using Pub/Sub
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Decoupled code&lt;/strong&gt; : components don’t know (or care) about each other; they just react to events.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cleaner structure&lt;/strong&gt; : no callback hell, no prop drilling, no tangled chains.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scales easily&lt;/strong&gt; : add new behaviors without touching existing code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reusable events&lt;/strong&gt; : one event can trigger actions in multiple places.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Readable flow&lt;/strong&gt; : publishers feel like actions, subscribers feel like reactions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Central control&lt;/strong&gt; : log, throttle, filter, or queue events from one spot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easier testing&lt;/strong&gt; : test events without mocking entire components.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the end, Pub/Sub isn’t just a pattern — it’s a mindset. When your app grows, you’ll quickly realize that tightly connecting everything together only traps you later. Pub/Sub gives you the freedom to build features without breaking old ones, experiment without fear, and write code that feels calm instead of chaotic.&lt;/p&gt;

&lt;p&gt;If you’re just starting out, mastering this pattern early will save you countless headaches down the road. Keep your components independent, let events do the talking, and your future self will ✨thank you for choosing the cleaner path.&lt;/p&gt;

&lt;h2&gt;
  
  
  🙋‍♂️👋 Thanks for Reading
&lt;/h2&gt;

&lt;p&gt;Alright, wrapping this up — this is something I learned the hard way, and I felt it’s worth sharing so other developers can discover this pattern earlier than I did. Keep learning, keep exploring, keep growing… and yes, work smart so you can land that dream job (because let’s be honest — passion is great, but the paycheck💰 definitely helps).&lt;/p&gt;

&lt;p&gt;Thanks for reading! I’ll see you in the next blog. If you’ve got questions or thoughts, drop them in the comments. And if this helped you even a little, don’t forget to like and share it with your fellow developers.🙌&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>productivity</category>
    </item>
    <item>
      <title>✨IntergrationHub</title>
      <dc:creator>Anupam Thakur </dc:creator>
      <pubDate>Mon, 27 Oct 2025 14:51:41 +0000</pubDate>
      <link>https://dev.to/anupam058/intergrationhub-4me7</link>
      <guid>https://dev.to/anupam058/intergrationhub-4me7</guid>
      <description>&lt;h1&gt;
  
  
  🚀 IntegrationHub – Your Central Command for AI-Agent Integrations
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;This is a submission for the Auth0 for AI Agents Challenge&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 What I Built
&lt;/h2&gt;

&lt;p&gt;IntegrationHub is a lightweight but powerful platform that allows users to securely connect multiple third-party services (Google Gmail, Calendar, Drive, and more coming soon) into an AI Agent ecosystem.&lt;/p&gt;

&lt;p&gt;Users can grant specific OAuth scopes to agents &lt;strong&gt;on-demand&lt;/strong&gt;, meaning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You decide which agent can access which service.&lt;/li&gt;
&lt;li&gt;No over-permissions.&lt;/li&gt;
&lt;li&gt;No creepy “why do you need &lt;em&gt;that&lt;/em&gt; scope?” moments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It solves a huge problem: AI agents are becoming smarter, but enabling them to access real services &lt;strong&gt;securely&lt;/strong&gt; without storing raw tokens is difficult. With IntegrationHub + Auth0 for AI Agents Token Vault:&lt;br&gt;
✅ No token leaks&lt;br&gt;
✅ Secure scoped access&lt;br&gt;
✅ Unified integration management&lt;/p&gt;

&lt;p&gt;Think of it like… “Zapier, but your AI agent drives.”&lt;/p&gt;


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

&lt;p&gt;Repository: (Add your GitHub link here)&lt;/p&gt;

&lt;p&gt;Here’s how it works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The dashboard lists all available service integrations&lt;/li&gt;
&lt;li&gt;Each integration has a &lt;strong&gt;Connect&lt;/strong&gt; button&lt;/li&gt;
&lt;li&gt;Click → authorize → select scopes → done!&lt;/li&gt;
&lt;li&gt;Agent can then request access from the Token Vault securely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some screenshots you can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integration dashboard UI&lt;/li&gt;
&lt;li&gt;Scope selection UI&lt;/li&gt;
&lt;li&gt;Token Vault usage flow&lt;/li&gt;
&lt;li&gt;Realtime logs / agent permission introspection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;(Add GIFs/videos for extra ✨)&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  🔐 How I Used Auth0 for AI Agents
&lt;/h2&gt;

&lt;p&gt;Auth0 is the secret sauce.&lt;/p&gt;
&lt;h3&gt;
  
  
  🔑 1. Token Vault
&lt;/h3&gt;

&lt;p&gt;Instead of storing plain OAuth tokens in my database like an amateur hacker villain…&lt;/p&gt;

&lt;p&gt;I:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store &lt;strong&gt;encrypted&lt;/strong&gt; user provider credentials in Auth0’s Token Vault&lt;/li&gt;
&lt;li&gt;Access them only when agent executes relevant tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tokens are never exposed to:&lt;br&gt;
❌ Frontend&lt;br&gt;
❌ Logs&lt;br&gt;
❌ Developer console&lt;/p&gt;
&lt;h3&gt;
  
  
  ⚙️ 2. Agent Authentication
&lt;/h3&gt;

&lt;p&gt;Agents that need access must request it through:&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="nf"&gt;withGoogleConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myTool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="cm"&gt;/* scoped permissions */&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Auth0’s built-in permission prompts ensure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users can deny suspicious requests&lt;/li&gt;
&lt;li&gt;Agents get only what they asked for&lt;/li&gt;
&lt;li&gt;Audit trails remain clean&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🛡️ 3. Scoped Access
&lt;/h3&gt;

&lt;p&gt;Only allowed scopes can be used. No &lt;code&gt;drive.read&lt;/code&gt; unless user clicked it. Permission granularity 🧂&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Architecture
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js&lt;/strong&gt; frontend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React&lt;/strong&gt; component for integration dashboard&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auth0 AI Tools&lt;/strong&gt; for secure OAuth flows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Express backend&lt;/strong&gt; to pipe agent streams&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google API&lt;/strong&gt; for Calendar/Gmail actions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Minimal server logic = maximum peace of mind.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Lessons Learned and Takeaways
&lt;/h2&gt;

&lt;p&gt;I came. I coded. I cried. I learned.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Token management is deceptively tricky
&lt;/h3&gt;

&lt;p&gt;OAuth tokens expire. Refresh tokens get revoked. Token Vault solves it cleanly.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Agent permissions must be explicit
&lt;/h3&gt;

&lt;p&gt;AI shouldn’t randomly read your emails at 3AM.&lt;br&gt;
Scoped consent flows = safety.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Tool abstraction matters
&lt;/h3&gt;

&lt;p&gt;Designing agent tools where scope selection happens upfront improves UX and security.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Less backend = happier dev
&lt;/h3&gt;

&lt;p&gt;Serverless-ish = simpler deployments, fewer tears.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧪 Advice for other devs:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Start with minimal scopes&lt;/li&gt;
&lt;li&gt;Don’t assume permissions&lt;/li&gt;
&lt;li&gt;Log everything (securely)&lt;/li&gt;
&lt;li&gt;Read Auth0 docs. Read them twice.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;AI Agents are only as useful as the APIs they can safely interact with.&lt;/p&gt;

&lt;p&gt;IntegrationHub proves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Secure AI integrations don’t have to be complicated&lt;/li&gt;
&lt;li&gt;Consent flows can be elegant&lt;/li&gt;
&lt;li&gt;Tokens can remain safe&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What’s next?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drive file management&lt;/li&gt;
&lt;li&gt;Slack &amp;amp; Discord integrations&lt;/li&gt;
&lt;li&gt;Real-time notifications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you like futuristic automation with real-world utility… this is just the beginning. 😎&lt;/p&gt;




&lt;p&gt;Thanks for reading!&lt;br&gt;
Happy hacking 🤖💙&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>auth0challenge</category>
      <category>ai</category>
      <category>authentication</category>
    </item>
    <item>
      <title>ComicGen : AI Powered Comic making</title>
      <dc:creator>Anupam Thakur </dc:creator>
      <pubDate>Mon, 15 Sep 2025 07:23:58 +0000</pubDate>
      <link>https://dev.to/anupam058/comicgen-ai-powered-comic-making-53h3</link>
      <guid>https://dev.to/anupam058/comicgen-ai-powered-comic-making-53h3</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/google-ai-studio-2025-09-03"&gt;Google AI Studio Multimodal Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;h1&gt;
  
  
  ComicGen: Your AI-Powered Comic Creation Studio
&lt;/h1&gt;

&lt;h3&gt;
  
  
  1. Introduction
&lt;/h3&gt;

&lt;p&gt;ComicGen is a revolutionary, browser-based application that redefines comic creation. It leverages the immense power of Google's Gemini API to transform your ideas into fully illustrated, professional-quality comic book pages in minutes.&lt;br&gt;
Forget the steep learning curve of complex design software and the need for advanced artistic skills. With ComicGen, if you can describe a scene, you can create a comic. It acts as your creative co-pilot, handling everything from character design and storyboarding to dialogue writing and final illustration. This modern, minimalist tool is designed for storytellers, writers, marketers, educators, and anyone with a story to tell, making the art of comic creation accessible to all.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. The Power of Gemini: Your Creative Partner
&lt;/h3&gt;

&lt;p&gt;At the heart of ComicGen lies Google Gemini, one of the most advanced and capable AI models in the world. Its integration is not just a feature; it is the engine that drives the entire creative process. Here’s how Gemini makes ComicGen extraordinary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Modal Brilliance:&lt;/strong&gt; ComicGen seamlessly orchestrates multiple state-of-the-art models. It uses gemini-2.5-flash for its incredible speed and language understanding to generate story structures, character profiles, witty dialogue, and detailed artistic directions. It then hands those directions to the imagen-4.0-generate-001 model, a world-class image generator, to create stunning, consistent artwork.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;From Concept to Comic in Seconds:&lt;/strong&gt; The speed is breathtaking. A user can write a single sentence describing a scene and watch as Gemini builds a complete, multi-panel page with dialogue and illustrations in under a minute. This dramatically accelerates the creative workflow from hours or days to mere moments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured Creativity:&lt;/strong&gt; A key innovation in ComicGen is how it guides Gemini's creativity. By providing the AI with a strict JSON schema, we ensure its imaginative output is always perfectly structured and ready for the application to render. This eliminates errors and provides a reliable, predictable user experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solving Character Consistency:&lt;/strong&gt; One of the biggest challenges in AI art is maintaining a character's appearance. ComicGen solves this by using Gemini to first generate a detailed "visual prompt" for each character. This prompt acts as an artistic DNA, ensuring that every image of that character—whether happy, surprised, or in action—is visually consistent.
### 3. Core Features
#### Character Creation Studio&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-Powered Profiles:&lt;/strong&gt; Simply provide a name and a few personality traits. Gemini will generate a humorous, sitcom-style introduction and a detailed visual prompt to define their look.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reference Image Support:&lt;/strong&gt; Optionally upload an image to guide the AI in creating the character's visual style.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic Emotion Sprites:&lt;/strong&gt; Upon creation, Gemini automatically generates a set of key emotion images (happy, sad, angry, surprised) for each character against a green screen, which the app then makes transparent, ready for immediate use.
#### AI Story &amp;amp; Page Generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple Prompting:&lt;/strong&gt; Describe what happens next in your story.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scene Casting:&lt;/strong&gt; Select which of your created characters are in the scene and briefly describe their actions or feelings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intelligent Layout:&lt;/strong&gt; Gemini analyzes your prompt and generates a complete comic page, including 2-4 panels arranged logically, witty dialogue in speech bubbles, narration boxes, and detailed art prompts for each panel.
#### Infinite Canvas Editor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limitless Space:&lt;/strong&gt; An intuitive, infinite canvas where you can pan and zoom with ease.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Freeform Layout:&lt;/strong&gt; Arrange your comic pages anywhere you like.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic Arrangement:&lt;/strong&gt; With a single click, automatically "gather" all pages into a neat vertical strip or "scatter" them across the canvas in columns for a bird's-eye view of your story.
#### Professional-Grade Tooling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Layers Panel:&lt;/strong&gt; A familiar, powerful layers system displays your entire comic's structure. Drag and drop to reorder elements, group items together, or even move elements between pages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contextual Properties Panel:&lt;/strong&gt; Select any item on the canvas—a panel, a speech bubble, or a page—and instantly edit all its properties, from size and color to text content and font style.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Character Browser:&lt;/strong&gt; Your cast is always accessible in the editor's sidebar. Drag and drop character emotions directly onto the canvas to instantly add them to your scene.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-Destructive Workflow:&lt;/strong&gt; An integrated history system with unlimited undo and redo means you can experiment freely without fear of losing your work.
High-Quality Export&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple Formats:&lt;/strong&gt; Export your creations as high-resolution PNG, JPG, or PDF files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible Selection:&lt;/strong&gt; Export your entire comic, a single page, or even just a few selected panels.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bind-Up to PDF:&lt;/strong&gt; The "Bind up Full Comic" feature automatically sequences all your pages and compiles them into a single, multi-page PDF, perfect for printing or digital distribution.
### 4.  How It Works: A Look Under the Hood
ComicGen is a cutting-edge frontend application built with React, TypeScript, and Tailwind CSS. It runs entirely in the browser, communicating directly with the Google GenAI API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Character Creation:&lt;/strong&gt; The user's input (name, personality) is sent to gemini-2.5-flash. The model returns a JSON object containing the character's introduction and a consistent visualPrompt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avatar &amp;amp; Emotion Generation:&lt;/strong&gt; The visualPrompt is then sent to imagen-4.0-generate-001 multiple times to create the avatar and emotion images. Crucially, the prompt instructs the AI to use a vibrant green screen background.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client-Side Magic:&lt;/strong&gt; Using the HTML Canvas API, the application programmatically removes the green background from the emotion images, creating transparent assets on the fly without any server-side processing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Page Generation:&lt;/strong&gt; The user's story suggestion is combined with character data and sent to gemini-2.5-flash with a responseSchema. The model returns a perfectly structured JSON object describing the entire page layout, panels, dialogue, and unique imagePrompt for each panel.&lt;/li&gt;
&lt;li&gt;** Panel Illustration:** The app iterates through the generated panel data, sending each imagePrompt to imagen-4.0-generate-001 to create the final artwork.
Rendering: The structured data and generated images are rendered onto the interactive canvas, where the user can refine and edit every aspect of their new comic page.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://aistudio.google.com/apps/drive/1sXnrLYoGVFzXb7xLE9S4DWJC2uElSyVF?showPreview=true&amp;amp;showAssistant=true" rel="noopener noreferrer"&gt;Applet link&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Video
&lt;/h2&gt;

&lt;p&gt;Sorry for the images,my image generation limit exceeds and im not able to shoot before.&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://player.vimeo.com/video/1118652174" width="710" height="399"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Images
&lt;/h2&gt;

&lt;p&gt;Below are image that i created and download from my applet&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.amazonaws.com%2Fuploads%2Farticles%2Fd3m8g5z95sl7egt78tzs.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%2Fd3m8g5z95sl7egt78tzs.png" alt=" "&gt;&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2Fxtcu61j91g3x0geavir4.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%2Fxtcu61j91g3x0geavir4.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This challenge was a fantastic exploration of how generative AI can be a powerful co-pilot in creative fields. The Gemini API, especially with its structured JSON output, felt less like a black box and more like a true, programmable partner. ComicGen is a proof-of-concept, but it demonstrates a future where anyone can bring their stories to life, regardless of their drawing ability.&lt;br&gt;
Thanks for reading! Happy coding&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>googleaichallenge</category>
      <category>ai</category>
      <category>gemini</category>
    </item>
  </channel>
</rss>
