Focus toolinglive

Rainodoro

Conventional timer alarms make focus feel like a countdown to a punishment; Rainodoro ends a session with rain instead of a bell.

The classroom problem

Pomodoro timers are built for offices, not for students who already treat every buzzer and countdown as a small emergency. A student who struggles with focus doesn’t need a louder reminder that time is running out — they need the transition out of a work session to feel calm, not alarming. Most timer apps get this backwards: the harder it is to sit still, the more jarring the tool that’s supposed to help.

The design decision

Rainodoro replaces the alarm with a bucket that fills with rain as you work. The session ends when the bucket is full, not when a bell goes off. Nothing about the ending is sudden — the visual reward accumulates the whole time you’re focused, so finishing a session feels like watching something complete rather than being interrupted. Everything else about the tool (task lists, break modes, session stats) exists to support that one decision, not to compete with it.

How it works

Rainodoro runs entirely client-side in vanilla JavaScript — no build step, no framework, no server round-trip for the timer itself. A student can:

  • Run a focus timer with a visible, filling rain bucket instead of a countdown
  • Attach a task list to a session, with multiple named lists
  • Switch between break modes between sessions
  • See session stats and a printable session summary over time

Everything runs locally, with no account and no data leaving the browser — the original build also offered optional Google sign-in and cloud sync, which this version deliberately drops. A tool meant to demonstrate engineering decisions on a portfolio has no business asking a visitor to authenticate with Google first, and the timer, tasks, and rain visual never needed an account to be the actual point.

The calm-by-default posture extends to the visual design: no flashing states, no red countdown text, no sound that plays without being asked for.

What I’d do next

The original build (rainodoro.com, now offline) had grown a Supabase backend and Google Sign-In for cross-device sync — real functionality, but more than a portfolio demo needs to prove the timer’s actual idea. This version keeps everything that makes the tool itself work and drops the account layer entirely, folded into this site as a live page rather than a separate deployment.

Honestly, rather than carrying forward an old, unverified list of rough edges: the timer’s state machine (src/timer.js) is already cleanly separated from the rain-bucket rendering (graphics-controller.js) in this codebase, and icon-only controls are labelled — a refactor that seemed necessary from the outside wasn’t, once actually in the code. What’s genuinely still true: this is 9,000-odd lines of tightly-coupled, pre-ES-modules JavaScript sharing state through global scope rather than imports, which was the right shape for a single developer iterating fast and is not the shape it would take starting today. If this tool grows another feature, that’s the first thing worth changing.