PRACTICALHIT

Features

Phone-camera + laser-cartridge dry fire

Set the phone on a tripod, point it at an IPSC silhouette, drop a laser cartridge into the chamber. The app reads each shot's location at preview frame-rate and converts it into a scored zone.

Calibration

Detection trust pipeline

Every laser candidate is ranked through five filters in strict order:

  1. ROI — must land inside the calibrated silhouette + 8 % border.
  2. Blob size — bright pixel cluster within 4–60 px.
  3. Flash duration — bright spike persists 1–3 frames.
  4. Brightness delta — Δ ≥ 50 from rolling baseline.
  5. Debounce — last accepted shot ≥ 100 ms ago.

A weighted confidence (0–1) over brightness, blob size, duration, ROI centeredness and background stability gates the final accept. Every accepted and rejected candidate is logged with its reason, so when the gate drops a shot you know whether it was lighting, size, ROI, or something else.

Modes & drills

Adding a drill is a JSON entry, not a screen.

Coaching layer

After every attempt the app emits one Primary insight, an optional Secondary in a different category, an Action card (Focus / Target / Drill), and a single-line takeaway. The engine is rule-based — deterministic, < 10 ms, no LLM.

Ten priority rules, in order:

  1. First-shot miss
  2. Draw breaking (delta > 150 ms)
  3. Over-confirming first shot (delta > 100 ms, hits clean)
  4. Transition miss (shots 2–3)
  5. Late miss (shots ≥ 4)
  6. Split inconsistency (stddev > threshold per focus)
  7. Miss rate up under speed
  8. Alpha leaking into C/D
  9. Speed up, points down
  10. Balanced run (positive reinforcement)

Tone shifts with skill tier — Beginner gets supportive phrasing, Advanced gets terse metric-driven lines. The tier is internal only; never shown as an ego label.

Multi-device sync

One phone is the master (timer + scoring). Other phones join as clients (detection only) via a 6-digit room code on the cloud relay. Master clock wins; clients ship local timestamps offset to master via NTP-style sync. Late events that arrive after the stop trigger but inside the grace window are sorted by global time and included in the final timeline.

Disconnect handling: a client gone for > 5 s flips the banner to red and the master finalises with the events it has. Master phone briefly offline → buffers events client- side and replays on reconnect.

Adaptive coaching from pooled data

Once practicalhit has enough runs, the engine compares your numbers to the population's:

Performance contract

Hard latency budgets that every PR must keep green:

Long-press the home title to surface the live debug overlay (BEEP / DETECT / RENDER / REPEAT pills, green when in budget, red when over). Two consecutive over-budget attempts → remote log entry.

Anti-cheat

Privacy