<?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: Ujjwal Gupta</title>
    <description>The latest articles on DEV Community by Ujjwal Gupta (@ujjwalgupta2021).</description>
    <link>https://dev.to/ujjwalgupta2021</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F952154%2F985a5c8c-29d8-4ca3-90cb-5440bf1be996.jpeg</url>
      <title>DEV Community: Ujjwal Gupta</title>
      <link>https://dev.to/ujjwalgupta2021</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ujjwalgupta2021"/>
    <language>en</language>
    <item>
      <title>StudyBuddy — Pomodoro, Flashcards &amp; Quiz in One Beautiful App 🦉</title>
      <dc:creator>Ujjwal Gupta</dc:creator>
      <pubDate>Sun, 04 Oct 2026 19:43:31 +0000</pubDate>
      <link>https://dev.to/ujjwalgupta2021/studybuddy-pomodoro-flashcards-quiz-in-one-beautiful-app-1kjc</link>
      <guid>https://dev.to/ujjwalgupta2021/studybuddy-pomodoro-flashcards-quiz-in-one-beautiful-app-1kjc</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;StudyBuddy&lt;/strong&gt; is a browser-based productivity + learning app I built for my friend — a college student who was juggling exam prep across three different tools: a phone timer for Pomodoro, a notes app for flashcards, and a Google Form quiz a teacher shared. Every session, they'd context-switch between apps, lose focus, and end up doomscrolling between switches.&lt;/p&gt;

&lt;p&gt;StudyBuddy collapses all three into one beautiful, distraction-free dark-mode app that lives entirely in the browser — no login, no account, no backend.&lt;/p&gt;

&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;h4&gt;
  
  
  ⏱️ Pomodoro Timer
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Animated circular ring timer with a gradient stroke that depletes in real time&lt;/li&gt;
&lt;li&gt;Three modes: &lt;strong&gt;Focus&lt;/strong&gt;, &lt;strong&gt;Short Break&lt;/strong&gt;, &lt;strong&gt;Long Break&lt;/strong&gt; — fully configurable&lt;/li&gt;
&lt;li&gt;Session dot tracker (dots turn green as sessions complete)&lt;/li&gt;
&lt;li&gt;Sound alerts via the Web Audio API — no external files&lt;/li&gt;
&lt;li&gt;Auto-start next session toggle&lt;/li&gt;
&lt;li&gt;Keyboard shortcuts: &lt;code&gt;Space&lt;/code&gt; to start/pause, &lt;code&gt;R&lt;/code&gt; to reset&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  🃏 Flashcards
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Create cards with a &lt;strong&gt;question&lt;/strong&gt; (front) and &lt;strong&gt;answer&lt;/strong&gt; (back)&lt;/li&gt;
&lt;li&gt;Silky smooth &lt;strong&gt;3D flip animation&lt;/strong&gt; on click or &lt;code&gt;Space&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Navigate with arrow buttons or &lt;code&gt;← →&lt;/code&gt; keys&lt;/li&gt;
&lt;li&gt;Optional &lt;strong&gt;deck/tag&lt;/strong&gt; label per card&lt;/li&gt;
&lt;li&gt;After flipping: rate each card as &lt;strong&gt;Hard / OK / Easy&lt;/strong&gt; for self-paced spaced repetition&lt;/li&gt;
&lt;li&gt;Full card list with per-card delete; all data persists via &lt;code&gt;localStorage&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  🧠 Quiz Mode
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Build custom &lt;strong&gt;multiple-choice questions&lt;/strong&gt; (up to 4 options each)&lt;/li&gt;
&lt;li&gt;Mark the correct answer with a ✓ toggle right in the builder&lt;/li&gt;
&lt;li&gt;Per-question &lt;strong&gt;countdown timer&lt;/strong&gt; (configurable 5–300 s) with urgent pulsing at ≤5 s&lt;/li&gt;
&lt;li&gt;Shuffle toggle for randomised question order&lt;/li&gt;
&lt;li&gt;Live score counter during the quiz&lt;/li&gt;
&lt;li&gt;Results screen: animated progress bar, score %, emoji feedback, and a full per-question review showing what you got wrong and what the right answer was&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Who it's for
&lt;/h3&gt;

&lt;p&gt;Friends who were burning hours every week just managing study tools. Now they open one tab, set a 25-minute Pomodoro, reviews flashcards during the break, and takes a self-quiz at the end. Zero friction, zero context switching.&lt;/p&gt;




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

&lt;p&gt;🔗 &lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://ujjwalgupta2021.github.io/StudyBuddy/" rel="noopener noreferrer"&gt;ujjwalgupta2021.github.io/StudyBuddy/&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To run locally: clone the repo and open &lt;code&gt;index.html&lt;/code&gt; directly in your browser — no build step, no &lt;code&gt;npm install&lt;/code&gt;, no server required.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/ujjwalgupta2021/StudyBuddy.git
&lt;span class="nb"&gt;cd &lt;/span&gt;StudyBuddy
&lt;span class="c"&gt;# Open index.html in your browser&lt;/span&gt;
start index.html        &lt;span class="c"&gt;# Windows&lt;/span&gt;
open index.html         &lt;span class="c"&gt;# macOS&lt;/span&gt;
xdg-open index.html     &lt;span class="c"&gt;# Linux&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/ujjwalgupta2021/StudyBuddy" rel="noopener noreferrer"&gt;github.com/ujjwalgupta2021/StudyBuddy&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is &lt;strong&gt;vanilla HTML + CSS + JS&lt;/strong&gt; — three files, zero dependencies, zero build tooling.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;index.html&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Semantic structure, ARIA labels, all three tab panels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;style.css&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dark glassmorphism design system — custom tokens, animations, responsive grid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;app.js&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All logic: timer engine, flashcard state, quiz engine, localStorage persistence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Architecture
&lt;/h3&gt;



&lt;pre data-lang="mermaid"&gt;&lt;code&gt;graph TD
    A["index.html\nStructure + ARIA"] --&amp;gt; B["app.js\nAll Logic"]
    B --&amp;gt; C["Pomodoro Engine\nsetInterval + Web Audio"]
    B --&amp;gt; D["Flashcard Manager\nlocalStorage CRUD"]
    B --&amp;gt; E["Quiz Engine\nTimer + Scoring"]
    A --&amp;gt; F["style.css\nDesign System"]
    F --&amp;gt; G["CSS Custom Properties\nDark theme tokens"]
    F --&amp;gt; H["CSS Grid Layouts\nPomodoro · FC · Quiz"]
    B --&amp;gt; I["localStorage\nPersists sessions, cards, score"]&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  Highlights worth looking at
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Circular timer ring&lt;/strong&gt; — pure SVG with a &lt;code&gt;stroke-dashoffset&lt;/code&gt; that ticks down in sync with &lt;code&gt;setInterval&lt;/code&gt;:&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;CIRCUMFERENCE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PI&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;98&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 615.75px&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;updateRing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fraction&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;offset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;CIRCUMFERENCE&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;fraction&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ring-fill&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;strokeDashoffset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;offset&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;3D card flip&lt;/strong&gt; — CSS &lt;code&gt;perspective&lt;/code&gt; + &lt;code&gt;rotateY&lt;/code&gt; with &lt;code&gt;backface-visibility: hidden&lt;/code&gt;, zero JS for the animation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.fc-inner&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;transform-style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;preserve-3d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt; &lt;span class="m"&gt;0.55s&lt;/span&gt; &lt;span class="n"&gt;cubic-bezier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.fc-inner.flipped&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rotateY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;180deg&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;Sound alerts with no audio files&lt;/strong&gt; — Web Audio API oscillator, generated on the fly:&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;function&lt;/span&gt; &lt;span class="nf"&gt;playBeep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;freq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;vol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dur&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;osc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;audioCtx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createOscillator&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;gain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;audioCtx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createGain&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;osc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;gain&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;gain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;audioCtx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;destination&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;osc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;frequency&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;freq&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;gain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exponentialRampToValueAtTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.001&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;audioCtx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentTime&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;dur&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;osc&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="nx"&gt;osc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;audioCtx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentTime&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;dur&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 I Built It
&lt;/h2&gt;

&lt;p&gt;I built StudyBuddy with &lt;strong&gt;&lt;a href="https://antigravity.dev" rel="noopener noreferrer"&gt;Antigravity IDE&lt;/a&gt;&lt;/strong&gt; — an open agentic coding assistant powered by &lt;strong&gt;Google DeepMind's Gemini&lt;/strong&gt; models. The entire session was a dialogue: I described features, the agent scaffolded the HTML, generated the CSS design system, wrote the JavaScript logic modules, and I reviewed and iterated in real time.&lt;/p&gt;

&lt;p&gt;The workflow was:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Described the three feature areas&lt;/strong&gt; — the agent planned the tab structure and data model&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design pass&lt;/strong&gt; — prompted for a dark glassmorphism aesthetic; the agent authored the full CSS custom-property token system&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feature implementation&lt;/strong&gt; — timer engine, flashcard CRUD, quiz state machine — all built iteratively with me reviewing and adjusting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polish&lt;/strong&gt; — fixed layout gaps (the Pomodoro right-side empty space issue), resolved CSS linter warnings (&lt;code&gt;appearance&lt;/code&gt; vendor prefix compatibility), tuned responsive breakpoints&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The agent also caught and fixed a real CSS issue mid-session: &lt;code&gt;-moz-appearance: textfield&lt;/code&gt; without the standard &lt;code&gt;appearance: textfield&lt;/code&gt; companion — a cross-browser compatibility gap that linters flag.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open-source AI stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🤖 &lt;strong&gt;Antigravity IDE&lt;/strong&gt; — agentic coding assistant (Google DeepMind / Gemini)&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Google Fonts&lt;/strong&gt; (Outfit typeface) — the only external resource&lt;/li&gt;
&lt;li&gt;🔊 &lt;strong&gt;Web Audio API&lt;/strong&gt; — browser-native, no library&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;StudyBuddy is intentionally &lt;strong&gt;dependency-free&lt;/strong&gt;. No React, no bundler, no CDN-hosted UI kit. That was only possible because an open AI agent understood my constraints ("pure HTML/CSS/JS, runs by opening a file") and worked within them — rather than defaulting to whatever popular framework its training data skewed toward.&lt;/p&gt;

&lt;p&gt;A closed, black-box API can generate code, but it can't be audited, customised, or run offline. With an open-weight model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No data leaves the machine&lt;/strong&gt; — flashcard content and study patterns stay private&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No account walls&lt;/strong&gt; — the app works offline, on any device, forever&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No forced upgrades&lt;/strong&gt; — the code I ship today still works in ten years, no deprecated API keys&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open innovation made it possible to build a tool that is genuinely &lt;em&gt;for a person&lt;/em&gt;, not a product for a company. That difference matters when you're building for a friend rather than for a market.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;The full pair-programming session with the Antigravity agent — including the design decisions, the Pomodoro layout fix, and the CSS compatibility conversation — was conducted live in the IDE. Key moments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chose &lt;code&gt;stroke-dashoffset&lt;/code&gt; SVG ring over &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt; for better CSS composability&lt;/li&gt;
&lt;li&gt;Debated &lt;code&gt;max-width&lt;/code&gt; constraints vs. CSS Grid for the Pomodoro layout (Grid won — no empty right-side space)&lt;/li&gt;
&lt;li&gt;The agent proactively flagged the &lt;code&gt;-moz-appearance&lt;/code&gt; / &lt;code&gt;appearance&lt;/code&gt; cross-browser issue without being asked&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🏆 &lt;strong&gt;Hacktoberfest Weekend Challenge&lt;/strong&gt; — Build for a Friend&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Open Source&lt;/strong&gt; — zero-dependency, MIT-licensed, pure web standards&lt;/li&gt;
&lt;li&gt;🎨 &lt;strong&gt;Best Design / UI&lt;/strong&gt; — dark glassmorphism, micro-animations, 3D card flip, animated ring timer&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built with ❤️ for anyone who wants to ace their exams.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>hacktoberfest2026</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
