Quick update on — shipped a feature I've been wanting since launch: a meditation mode.
What it does
Instead of tapping manually, you can now flip an auto-play toggle and the wooden fish taps itself at a steady rhythm. You pick the speed (slow / medium / fast) and a duration (10, 20, 30, 60 min, or unlimited). When the session ends, it stops. That's it.
The intended use case: put on headphones, turn on auto-play at slow speed, and just listen. The wooden fish sound works surprisingly well as a meditation anchor — brief, predictable, not asking anything of you.
What made it annoying to build
Web Audio on mobile is a nightmare. A few things I ran into:
iOS suspends the AudioContext between taps if it was created without a user gesture. Each auto-tap then hit a resume() → warmup buffer → play chain that added ~150ms of latency. Fixed by pre-warming the context inside the toggle's change event (which counts as a user gesture), before the first auto-tap fires from setTimeout.
The animation and sound were out of sync — the fish visually "hit" 80ms after the sound played. Switched from a CSS transition to a keyframe animation that starts at the hit position, so both fire at t=0.
bfcache (back/forward cache): if you navigate away mid-session and hit Back, the page restores from cache with the toggle still on but the timer dead. Fixed with a pagehide listener that stops auto-play before the snapshot is taken.
What's next
Watch how meditation mode affects session length and return visits — curious if people actually use it for more than a few minutes
Keep building out SEO content. Just added meditation guide pages in EN/ZH/JA targeting "wooden fish meditation timer" — waiting to see if they get any traction in GSC
Niche directories and community posts. Still early on distribution, mostly experimenting with where the audience actually is