Pointer diagnostics / local only

Bad stroke.
Find the guilty layer.

Separate device sampling, smoothing, paint delay, and undo cost—then send evidence a maintainer can act on.

No uploads. No drawing content in exports by default.

Concrete calibration slab with dotted orange input marks, a moss seam, and a continuous green stroke
RAW / PROCESSEDone motion, two traces

Test bench 01

Draw what feels wrong.

Make at least three strokes at your usual speed. The orange line shows received samples; moss shows the configured smoothing response.

Local captureReady
Browser timestamps may be rounded.
Optional report detail

Use a pen, mouse, or touch. With a keyboard, use arrow keys to move the start position and press Space or Enter to create a test stroke.

Raw samplesSmoothed path
Keyboard: arrows + Space

Current diagnosis

Waiting for a strokeNO DATA

Draw three slow and three fast strokes for a useful comparison.

Issue bundle

Take the evidence with you.

Versioned JSON includes timing aggregates, browser capability flags, findings, and your notes. It stays on this device until you attach it somewhere.

Four suspects, one trace

A readable timing chain.

  1. 01 Inputsample rate, p95 gaps, jitter, coalesced count
  2. 02 Smoothingdeclared following window versus raw timing
  3. 03 Renderinput receipt to the next reported paint
  4. 04 Historymeasured undo or document rebuild duration

For maintainers

Put the probe beside your brush engine.

Zero runtime dependencies. ESM, CommonJS, and TypeScript declarations. No telemetry.

npm
npm install pen-latency-lab
const probe = createStrokeProbe(canvas, {
  smoothingWindowMs: 12,
  onStroke: console.table
});