<?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: Judexify</title>
    <description>The latest articles on DEV Community by Judexify (@judexify).</description>
    <link>https://dev.to/judexify</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%2F2498329%2F4e8382bc-6cfe-47b9-a5a7-4754344c3fe4.jpg</url>
      <title>DEV Community: Judexify</title>
      <link>https://dev.to/judexify</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/judexify"/>
    <language>en</language>
    <item>
      <title>Evergreen Sentinel : Know Your Waste Laws Before You Toss It</title>
      <dc:creator>Judexify</dc:creator>
      <pubDate>Sun, 19 Apr 2026 15:52:07 +0000</pubDate>
      <link>https://dev.to/judexify/evergreen-sentinel-know-your-waste-laws-before-you-toss-it-2fok</link>
      <guid>https://dev.to/judexify/evergreen-sentinel-know-your-waste-laws-before-you-toss-it-2fok</guid>
      <description>&lt;h1&gt;
  
  
  🌿 Evergreen Sentinel — AI Sustainability Auditor
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-04-16"&gt;Weekend Challenge: Earth Day Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Describe any item — a plastic bottle, leftover food, an old t-shirt — and Evergreen Sentinel tells you exactly what to do with it based on your &lt;strong&gt;local 2026 waste laws&lt;/strong&gt; and &lt;strong&gt;current weather conditions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every audit returns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;category&lt;/strong&gt; — Fabric, Food, or Materials&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Comfort/Spoilage&lt;/strong&gt; assessment based on live local weather&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Circular Action&lt;/strong&gt; grounded in your city's actual waste regulations&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;🔗 &lt;a href="https://evergreen-sentinel.vercel.app" rel="noopener noreferrer"&gt;Live App&lt;/a&gt;  &lt;/p&gt;

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

&lt;p&gt;(&lt;a href="https://github.com/judexify/evergreen-sentinel" rel="noopener noreferrer"&gt;https://github.com/judexify/evergreen-sentinel&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; React + Vite, Supabase and backboard (auth + persistent state), Groq/LLaMA 3.3 (reasoning), Tavily (real-time search)&lt;/p&gt;

&lt;p&gt;On every audit, Tavily fetches live weather and 2026 waste laws for the user's city. Both are injected as context into a Groq prompt which returns a structured JSON audit. All results are saved per user in Supabase with RLS  full isolation between accounts.&lt;/p&gt;

&lt;p&gt;The key insight: sustainability advice shouldn't be generic. What you do with plastic in Lagos is different from Berlin. The app fetches real, location-specific context every time.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Backboard&lt;/strong&gt; — user memory (location, eco score, audit history) managed through a &lt;code&gt;getMemory&lt;/code&gt;/&lt;code&gt;setMemory&lt;/code&gt; interface backed by Supabase&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
    </item>
    <item>
      <title>Kettly — A Fully Functional Dashboard Where the Only Navigation Is a Teapot</title>
      <dc:creator>Judexify</dc:creator>
      <pubDate>Fri, 03 Apr 2026 00:53:53 +0000</pubDate>
      <link>https://dev.to/judexify/kettly-a-fully-functional-dashboard-where-the-only-navigation-is-a-teapot-325c</link>
      <guid>https://dev.to/judexify/kettly-a-fully-functional-dashboard-where-the-only-navigation-is-a-teapot-325c</guid>
      <description>&lt;p&gt;This is a submission for the DEV April Fools Challenge&lt;br&gt;
What I Built&lt;br&gt;
I built a SaaS dashboard.&lt;br&gt;
A real one. Sidebar. Analytics page. Reports page.&lt;br&gt;
A status bar that logs everything in monospace like it means business.&lt;br&gt;
The kind of thing you'd see in a YC pitch deck under "Product Screenshots."&lt;br&gt;
Then I built it again. In 1998.&lt;br&gt;
Kettly ships in two versions — a clean modern SaaS interface and a pixel-perfect 90s recreation styled after early eBay: gray tables, white background, Times New Roman, a hit counter, and a disclaimer that it is best viewed in Netscape Navigator 4.0 at 800×600. Both versions are linked. Switching between them is the second most disorienting thing about this app.&lt;br&gt;
The first is the navigation.&lt;br&gt;
There is one problem with both versions.&lt;br&gt;
The sidebar does nothing. Every single link — Overview, Analytics, Reports — returns 418 I'm a Teapot (RFC 2324). The only way to actually navigate is by holding down a GIF of a kettle for one second. While you hold it, tea pours from the spout. The page changes.&lt;br&gt;
That is the entire navigation system. A kettle. That you hold.&lt;br&gt;
Short-clicking the kettle causes chaos — characters explode across the screen and the status bar says "SHORT CLICK — HTCPCP BREW refused — 418 I'm a Teapot — hold longer." There is no way to stop it. There was never a way to stop it.&lt;br&gt;
When you finally visit all three pages, the UI fades and an 418 I'm a Teapot modal appears. On the 90s version it looks like a Windows 98 dialog box. The OK button does nothing. This was always the plan.&lt;br&gt;
Kettly solves zero real-world problems. It brews nothing.&lt;br&gt;
It is, technically, RFC 2324 compliant. It ships to production anyway.&lt;/p&gt;

&lt;p&gt;Demo&lt;br&gt;
The entry screen behaves normally. For exactly four characters.&lt;/p&gt;

&lt;p&gt;Type 1–3 characters → nothing happens. Clean. Professional.&lt;br&gt;
Type 4 characters → a Login button appears. You feel safe.&lt;br&gt;
Type a 5th → it falls off the screen into the kettle below&lt;br&gt;
The extra letters keep falling. You cannot stop them.&lt;br&gt;
Click Login → you're in. The voice says "I am a teapot." Immediately. No warning.&lt;/p&gt;

&lt;p&gt;The dashboard looks fine. It is not fine.&lt;/p&gt;

&lt;p&gt;Status bar boots: BREW / HTCPCP/1.0 → 200 OK&lt;br&gt;
Click any sidebar link → GET /overview → 418 I'm a Teapot (RFC 2324)&lt;br&gt;
Short click the kettle → chaos&lt;br&gt;
Hold the kettle 1 second → tea pours, page changes&lt;br&gt;
Visit all three pages → UI fades, 418 modal appears&lt;br&gt;
Bottom right corner → switch between the 90s and modern version at any time&lt;/p&gt;

&lt;p&gt;The 90s version stays frozen at 800px wide, refuses to be responsive, and renders exactly as it would have in 1998. The chaos is authentic.&lt;br&gt;
The modern version redirects you back to the 90s version on reload. You cannot escape the past.&lt;/p&gt;

&lt;p&gt;DEMO&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://judexify.github.io/kettly/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;judexify.github.io&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Code&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/judexify" rel="noopener noreferrer"&gt;
        judexify
      &lt;/a&gt; / &lt;a href="https://github.com/judexify/kettly" rel="noopener noreferrer"&gt;
        kettly
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A professional SaaS dashboard that can only be navigated by a kettle. Returns 418. Brews nothing. RFC 2324 compliant. for the Dev.to challange
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Kettly — Enterprise Brewing Solutions&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;RFC 2324 compliant. Brews nothing. Ships to production.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What is this?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Kettly is a fully functional SaaS dashboard that secretly makes no sense.&lt;/p&gt;
&lt;p&gt;It looks like a real product. It has a sidebar, analytics, reports, and a status bar that boots with system logs. But the sidebar does nothing. The only way to navigate is by holding down a kettle. Short-clicking it causes chaos. The app ends with an HTTP 418 error and a brief history of why that exists.&lt;/p&gt;
&lt;p&gt;Built for the &lt;strong&gt;DEV April Fools Challenge 2025&lt;/strong&gt; — prompt: &lt;code&gt;HTCPCP IYKYK&lt;/code&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The Joke&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;On 1 April 1998, Larry Masinter published RFC 2324 — the Hyper Text Coffee Pot Control Protocol — as an April Fools' joke. Buried inside was HTTP status code &lt;strong&gt;418: I'm a Teapot&lt;/strong&gt;, returned when a teapot is asked to brew coffee.&lt;/p&gt;
&lt;p&gt;In 2017, someone tried to delete it…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/judexify/kettly" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;How I Built It&lt;br&gt;
Pure HTML, CSS, and Vanilla JavaScript. No frameworks. No libraries.&lt;br&gt;
No build tools. No backend. No real functionality whatsoever.&lt;br&gt;
Two separate HTML files. One deliberately modern, one deliberately stuck in 1998. Linked to each other at the bottom right of every screen including the entry screens, because the joke starts before you log in.&lt;br&gt;
The hardest part of building deliberately bad software is that it still has to work. The dysfunction has to be functional.&lt;/p&gt;

&lt;p&gt;The long press — telling a short click from a long press required a setTimeout of 1 second and an isLongPress flag checked on both mouseup and touchend for mobile support. Short press fires chaos. Long press fires the brew sequence and the page cycle. On mobile, the browser's native long-press context menu kept hijacking the interaction — fixed by cancelling contextmenu events and stripping pointer-events from the image element so the browser stops treating it as a pressable asset.&lt;br&gt;
The input — every character beyond 4 is animated falling off the screen via CSS keyframes, then stripped from the input value in JS. The field stays at 4. The chaos around it does not stop. The user did this to themselves.&lt;br&gt;
The 90s version has no media queries. This is intentional. A 90s website was never responsive — it broke on every screen and that was just life. The broken layout on mobile is not a bug. It is the most historically accurate decision in the entire project.&lt;br&gt;
The version switch — the modern version redirects to the 90s version on direct load or reload using document.referrer. You always land in 1998 first. Getting to the modern version requires actively choosing it.&lt;br&gt;
The voice — Web Speech API reads "I am a teapot" the moment you enter the dashboard. No audio files. No libraries. One line of JavaScript. RFC 2324 compliant.&lt;/p&gt;

&lt;p&gt;Prize Category&lt;br&gt;
Best Ode to Larry Masinter&lt;br&gt;
On 1 April 1998, Larry Masinter published RFC 2324 — the Hyper Text Coffee Pot Control Protocol — as an April Fools' joke. Inside it was one line: if you ask a teapot to brew coffee, it must return 418 I'm a Teapot. A joke. Nobody thought it would last.&lt;br&gt;
In 2017, someone tried to delete it. The internet revolted.&lt;br&gt;
Thousands protested on GitHub. A website — save418.com — launched in its defence. 418 survived. It is now permanently reserved. Forever.&lt;br&gt;
Kettly exists entirely in his honour.&lt;br&gt;
The app is named after a kettle. The only navigation is a kettle. Every sidebar link returns 418. The status bar opens with BREW / HTCPCP/1.0 → 200 OK. The 90s version is set in the exact year he published the RFC — 1998 — and the copyright footer never changes.&lt;br&gt;
The voice says "I am a teapot" because he wrote a teapot into internet law.&lt;br&gt;
The 90s version exists because he published it in 1998 and the internet never really moved on.&lt;br&gt;
Larry Masinter hid a punchline inside internet infrastructure, watched the world argue about it for 27 years, and won.&lt;br&gt;
Kettly is the least we could do.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>418challenge</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Stop DoomScrolling! I Built the Tab I Actually Want to Open.. - Focus.radio</title>
      <dc:creator>Judexify</dc:creator>
      <pubDate>Sun, 01 Mar 2026 21:12:11 +0000</pubDate>
      <link>https://dev.to/judexify/stop-doomscrolling-i-built-the-tab-i-actually-want-to-open-55df</link>
      <guid>https://dev.to/judexify/stop-doomscrolling-i-built-the-tab-i-actually-want-to-open-55df</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;I know the type because I am the type. I open a new tab to "just focus for an hour" and twenty minutes later I'm deep in a YouTube spiral I didn't ask for. I've got three Spotify tabs open, a lo-fi playlist I've heard so many times it's basically silence, and a deadline that keeps getting closer. &lt;/p&gt;

&lt;p&gt;I'm a student pulling late-night study sessions with cold coffee and too many browser windows. I've been the solo developer learning and coding into the midnight. The writer who needs forty-five uninterrupted minutes just to get one good paragraph out and get my thoughts together, I and 4 others most times context-switching between tasks and forgetting what we were actually supposed to be doing.&lt;/p&gt;

&lt;p&gt;We have the same problem everyone in my study group at school and developer learning community too . Focus is hard, the internet is everywhere, nothing built for productivity actually feels good to use except the one you build. I needed something that felt like a place. Something I'd actually want to open.&lt;/p&gt;

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

&lt;p&gt;focus.radio : a lo-fi focus app built around the way I actually work. I open it and there's music already a lo-fi stream running quietly in the background, a dark ambient interface, a GIF playing behind ,I set an intention before each session. I breathe for a moment. Then I lock in. When the timer ends, I reflect on what I did. Over time it becomes a journal. A record of every late night, every locked-in hour, every project I showed up for. But the feature I keep coming back to is the plant. There's a small SVG plant that lives at the bottom of the app. It starts as a seed. It grows sprout to seedling to young plant to branches to a full flower  based on how many sessions I complete. If my streak breaks, it wilts. One session brings it back. Just a quiet little thing that reflects my consistency back at me. My consistency is its water.&lt;br&gt;
Everything it does:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; 24/7 lo-fi stream with an offline audio drone fallback so silence never catches me&lt;/li&gt;
&lt;li&gt;Independent ambient mixer — rain, café, white noise, hearth — runs with or without the radio&lt;/li&gt;
&lt;li&gt; Focus timer with Deep, Focus and Drift modes&lt;/li&gt;
&lt;li&gt; Custom durations from 25 minutes all the way to 6 hours for the really long nights&lt;/li&gt;
&lt;li&gt; Custom session colors — changes the ring, the page gradient, every accent&lt;/li&gt;
&lt;li&gt; Work journal with intent and reflection logged per session&lt;/li&gt;
&lt;li&gt; Work stats  time tracked per project, "locked in" badge when I keep showing up&lt;/li&gt;
&lt;li&gt; The plant&lt;/li&gt;
&lt;li&gt; Snake + Dino Run for breaks, with a stretch reminder at 5 minutes&lt;/li&gt;
&lt;li&gt; Timer survives page reloads — calculates drift and picks up exactly where I left off&lt;/li&gt;
&lt;li&gt; Fully installable PWA with lock screen media controls&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffsiidjoim1b77rgrkiie.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%2Ffsiidjoim1b77rgrkiie.png" alt="IMAGE OF FOCUS.RADIO LANDING"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://focus-radio.vercel.app/" rel="noopener noreferrer"&gt;https://focus-radio.vercel.app/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/judexify" rel="noopener noreferrer"&gt;
        judexify
      &lt;/a&gt; / &lt;a href="https://github.com/judexify/focus.radio" rel="noopener noreferrer"&gt;
        focus.radio
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A minimalist online radio and productivity app streaming lo-fi beats to help you concentrate, reduce distractions, and maintain workflow momentum. Includes focus timers, micro-break games, motivational prompts, simulated live listener counts and a plant that grows with your consistency.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;This project was bootstrapped with &lt;a href="https://github.com/facebook/create-react-app" rel="noopener noreferrer"&gt;Create React App&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;focus.radio&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A quiet place to do your best work. Lo-fi radio, ambient sounds, focus timers, a work journal, and a plant that grows with your consistency.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Radio + Ambient&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;24/7 lo-fi stream with offline drone fallback&lt;/li&gt;
&lt;li&gt;Independent ambient mixer — rain, café, static, hearth&lt;/li&gt;
&lt;li&gt;Ambient plays without the radio. Radio plays without ambient. Both have their own controls.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Focus Timer&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Three modes: Deep (90m), Focus (50m), Drift (25m)&lt;/li&gt;
&lt;li&gt;Custom durations from 25 minutes up to 6 hours&lt;/li&gt;
&lt;li&gt;Custom session colors — change the ring, gradient and page accent&lt;/li&gt;
&lt;li&gt;Breathing ritual before every session&lt;/li&gt;
&lt;li&gt;Sessions survive page reloads — timer keeps running even if you close and reopen the tab&lt;/li&gt;
&lt;li&gt;Distraction shield for Deep Work mode (fullscreen lockout)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Work Journal&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Every session logged with intent and reflection&lt;/li&gt;
&lt;li&gt;Partial sessions saved automatically if you end early&lt;/li&gt;
&lt;li&gt;Grouped by day with total time…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/judexify/focus.radio" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;No backend. No database. No account required. Everything lives in the browser and on the device.&lt;br&gt;
Stack:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;React 18 + Zustand for state : with persist middleware for the journal and streaks&lt;/li&gt;
&lt;li&gt;Framer Motion for every animation : transitions, plant sway, ambient pulse&lt;/li&gt;
&lt;li&gt;Tailwind CSS for the dark, minimal aesthetic&lt;/li&gt;
&lt;li&gt;Lucide React for icons throughout&lt;/li&gt;
&lt;li&gt;Web Audio API : all ambient sounds are generated programmatically. Rain is pink noise through a bandpass filter. Café is brown noise. Fire is pink noise with an LFO tremolo. Static is flat white. No audio files, no network required for ambience, it always works.&lt;/li&gt;
&lt;li&gt;Web Workers : the timer runs entirely off the main thread, immune to tab throttling&lt;/li&gt;
&lt;li&gt;localStorage : timer state saved on every tick with a timestamp. On reload: newElapsed = savedElapsed + Math.floor((Date.now() - savedAt) / 1000). If the session finished while the tab was closed, it clears cleanly. If not, the worker boots with the corrected value and picks right back up.&lt;/li&gt;
&lt;li&gt;Media Session API : lock screen controls on iOS, Android and desktop&lt;/li&gt;
&lt;li&gt;Service Worker : PWA with cache-first for assets, network-only for streams&lt;/li&gt;
&lt;li&gt;Claude helped me think through architecture decisions and debug edge cases, the drift calculation, the AudioContext lifecycle fix, the plant stages.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
