Stop DoomScrolling! I Built the Tab I Actually Want to Open.. - Focus.radio

# devchallenge# weekendchallenge# showdev
Stop DoomScrolling! I Built the Tab I Actually Want to Open.. - Focus.radioJudexify

This is a submission for the DEV Weekend Challenge: Community The Community I know the...

This is a submission for the DEV Weekend Challenge: Community

The Community

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.

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.

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.

What I Built

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.
Everything it does:

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

Demo

IMAGE OF FOCUS.RADIO LANDING

https://focus-radio.vercel.app/

Code

GitHub logo judexify / focus.radio

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.

This project was bootstrapped with Create React App.

focus.radio

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.


Features

Radio + Ambient

  • 24/7 lo-fi stream with offline drone fallback
  • Independent ambient mixer — rain, café, static, hearth
  • Ambient plays without the radio. Radio plays without ambient. Both have their own controls.

Focus Timer

  • Three modes: Deep (90m), Focus (50m), Drift (25m)
  • Custom durations from 25 minutes up to 6 hours
  • Custom session colors — change the ring, gradient and page accent
  • Breathing ritual before every session
  • Sessions survive page reloads — timer keeps running even if you close and reopen the tab
  • Distraction shield for Deep Work mode (fullscreen lockout)

Work Journal

  • Every session logged with intent and reflection
  • Partial sessions saved automatically if you end early
  • Grouped by day with total time…

How I Built It

No backend. No database. No account required. Everything lives in the browser and on the device.
Stack:

  1. React 18 + Zustand for state : with persist middleware for the journal and streaks
  2. Framer Motion for every animation : transitions, plant sway, ambient pulse
  3. Tailwind CSS for the dark, minimal aesthetic
  4. Lucide React for icons throughout
  5. 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.
  6. Web Workers : the timer runs entirely off the main thread, immune to tab throttling
  7. 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.
  8. Media Session API : lock screen controls on iOS, Android and desktop
  9. Service Worker : PWA with cache-first for assets, network-only for streams
  10. Claude helped me think through architecture decisions and debug edge cases, the drift calculation, the AudioContext lifecycle fix, the plant stages.