# Beat Offset > A rhythm timing practice instrument in the browser. Pick a notated pattern, a tempo, a time signature and how the > click behaves, then tap the rhythm by keyboard, mouse or touch. Every tap is matched to the beat grid and measured > in milliseconds - early or late, by beat position, by bar, with drift and the tempo actually kept - and drawn on a > scrolling timeline. A coach model reads the timing profile and prescribes a practice set that loads with one tap; > every number it cites is checked against the page's own measurements. URL: https://beat-offset.skillsafe.ai/ API: https://beat-offset.skillsafe.ai/api.html Model: gpt-terra (SkillSafe alias; resolves to gpt-5.6-terra), 10% publisher markup Derived from: @onewave-ai/practice-plan-creator (https://skillsafe.ai/skill/@onewave-ai/practice-plan-creator/, github.com/onewave-ai/claude-skills, MIT) - "drills by skill level and time, warm-up, skill work, scrimmage, cool-down", applied to rhythm practice. ## What is free (no sign-in, sound optional) - Metronome synthesised with Web Audio (square-wave clicks, accented downbeat, optional subdivision clicks), or a visual click alone with sound off. Tempo 40-220 BPM; 3/4, 4/4, 5/4 and 6/8 (the 6/8 beat is the dotted quarter). - 19 patterns over five levels, drawn as rhythm notation: quarter pulse, straight eighths, backbeat, off-beats, triplets, swing, Charleston, sixteenths, gallop, reverse gallop, tresillo, triplet skip, sixteenths without the beat, only the "a", hemiola, three over two, and three 6/8 patterns. - Click modes: every beat; two bars on and two off; backbeat only; count-in only. - Taps: Space, J, F, K, D, a click or a touch on the pad. Event timestamps are used, not handler time. - Latency calibration (tap along to 16 clicks; the median offset of the settled taps), kept separately for sound and visual-only. - Measurement: each tap goes to its nearest note within half the gap to the neighbouring note (at most 300 ms); a second tap for one note is an extra; taps before the first note are count-in taps. Reported: share of notes within +-25 ms ("in the pocket"), hit rate, mean, spread (sample SD), median, mean and 90th-percentile absolute offset, offset by position (each on-beat, and the e / & / a / trip / let pooled across beats), by bar, drift (least-squares ms per bar), felt tempo (from tap spacing alone), first vs second half, bars with vs without the click. - A timeline (beats as a ruler, early marks above the line in magenta, late below in amber, in-pocket in cyan, missed notes as rings, extra taps as diamonds, a moving-average drift curve and the fitted drift line, click-off bars hatched), charts by position and by bar, a tempo progression suggestion (+6 BPM at 80% in the pocket and 95% hit, -8 BPM under 45% or 75%), CSV of every tap, a Markdown report, history in the browser and the account. - Three example takes whose coach replies replay at no cost. ## What the coach does (metered, needs sign-in) One system prompt, two tasks selected by `task`: - `diagnose`: 2-5 findings, each citing one statistic copied from the take; 0-4 callouts pinned to bars; a practice set of 3-5 exercises in session order (warmup, skill, performance with the click dropping out, cooldown), each with a library pattern, meter, tempo, bars, click mode, minutes, a cue sentence and why. - `recheck`: the same, for a new take after practising, plus `progress` (each statistic before and after, with a verdict). The page checks every cited number (ms within 2 ms or 10%, percentages within 1.5 points, counts exact), rejects and lists any exercise whose pattern is not in the library or not in that meter, clamps tempos to 40-220, drops callouts on bars that do not exist, and compares each before/after verdict with its own rule. Inputs carry aggregates plus a clipped tap list: the first 24 taps in order and the 12 furthest off, up to 16 missed notes. Object fields are JSON strings (the input schema is scalar-only). Runs carry an Idempotency-Key of the form `beat-offset:::a`. ## Contract summary reply: {"task":"diagnose|recheck","headline":str,"findings":[{"finding":str,"stat":str,"position":str,"bar":int,"value":num,"severity":"high|medium|low"}],"callouts":[{"bar":int,"text":str}],"prescription":[{"phase":"warmup|skill|performance|cooldown","title":str,"pattern":str,"meter":str,"tempo":int,"bars":int,"click":"full|dropout|backbeat|countin","minutes":int,"cue":str,"why":str}],"progress":[{"stat":str,"position":str,"before":num,"after":num,"verdict":"better|same|worse"}],"next_step":str} ## Pages - https://beat-offset.skillsafe.ai/ - the instrument - https://beat-offset.skillsafe.ai/api.html - the API tutorial in eight languages