

01
The Idea
I wanted the simplest possible version of a breathing guide: one that opens instantly, needs no setup, and looks as calm as it is supposed to feel. The whole premise is a single light that responds to touch — hold anywhere to breathe in, let go to breathe out.
02
Approach
The visual is two full-screen WebGL fragment shaders: a low-resolution haze pass upsampled into a full-resolution pass that adds the warm light, vignette, and filmic tone curve. A film grain layer runs above the canvas as a compositor-only CSS element so it never affects shader cost. A spring carries the breath value — different damping for inhale and exhale so the settle feels like a real breath rather than a symmetric tween. An adaptive quality governor measures frame time and steps resolution down in four levels, deciding on the median to avoid reacting to load-time stalls.
03
What I Built
Beyond the free mode, there is a guided mode where a timeline eases your rhythm toward a chosen pace over the first third of a session, watching for signs you are struggling and holding steady rather than pushing on. 'Find my pace' times your own breath over four presses and suggests a slightly slower starting point. Sound is synthesised on demand — a soft open fifth whose pitch tracks the breath — and never created until the toggle is switched on. The pace, natural in/out timing, and chosen session length are the only things stored, in localStorage, on that device only; the page's CSP enforces this.
04
Outcome
It is deployed and installable as a PWA, works offline, and runs at 60 fps on a throttled mid-range profile. It has not yet been tested on a real phone, which is the honest next step — haptics, thumb hold through a full breath, and whether the ease-in pace actually feels gradual.
05 — FEATURES UP CLOSE


MORE CONCEPTSBack to all concepts→









