← back to the BallisticLens brief
BallisticLens · System diagrams

Where the rounds
actually went.

● PIPELINE LIVE · DIAGNOSTIC ENGINE: 8-DIRECTION FAULT WHEEL · VOICE OPT-IN

A mobile-first shooting coach. Log a string, photograph the target, and BallisticLens reads the group, computes where the rounds should have landed, and measures the gap to where they actually did. The pipeline is real and built honest. The intelligence sitting on top of it — the diagnostic rule set, the coaching vocabulary — is early, and these diagrams say so.

Blue — measured ground truth (the photo, the centroid, real splits)
Copper — the instrument's prediction & coaching voice
Coral — the gap, and what isn't built yet
01 / 05 — THE CORE LOOP

Two streams. One meets the target, one meets the math. They collide at the miss.

A measured stream runs left to right: the target photo goes through Imagick hole-detection to a centroid — the real center of the group. A predicted stream runs underneath it: the build's zero, height-over-bore, and velocity go through the ballistic solver to a theoretical point of impact. The two converge on the Shooter Delta — the vector between where the rounds went and where they should have. Everything downstream is reading that one number.

Measured stream — from the world Predicted stream — from the build Target photo CAMERA · UPLOAD See IMAGICK · CONN-COMPONENTS classical CV — not a net Centroid ACTUAL GROUP CENTER MANUAL TAPS — when the paper won't read Build params ZERO · HOB · VELOCITY Solve PEJSA-STYLE DROP · PHYSICS Theoretical POI WHERE IT SHOULD HIT Δ Shooter Delta MEASURED − PREDICTED Read the mechanic FAULT WHEEL — 8 DIRECTIONS Coach line TIERED VOCABULARY · HAND-WRITTEN Range card · share link · history GD COMPOSITE · INITIALS ONLY · TOKEN-SCOPED

All of this runs synchronously inside the save request — no queue, no worker, no cron. The merge is the structure worth remembering: a measured fact and a predicted fact meeting at a signed difference. The two boxes on the right are deliberately drawn in grey, not copper — they're the stages where the product is still thin.

02 / 05 — THE SHOOTER DELTA

The whole app is an argument about one gap.

Copper says where the round should have gone — the solver's prediction, dead center for a confirmed zero. Blue says where it actually went — the measured centroid of the holes in the paper. The coral vector between them is the entire value proposition. Today the engine names all eight directions of that gap; reading it across a whole string — cadence, fatigue, cold-bore drift — is the next frontier.

IDPA · −0 / −1 / −3 PREDICTED POI solver · confirmed zero MEASURED CENTROID SHOOTER DELTA 2.5 in low-left Δx −1.8 in · Δy −1.7 in · |Δ| 2.48 in scale resolved from target geometry READS AS Trigger anticipation / milking the grip right-handed · confidence 0.74 handedness flips the rule for lefties WHAT IT CAN'T DO YET This is the one classified pattern. Every other delta returns: "collect another string before assigning a cause."

The color choice is the point: keeping predicted (copper) and measured (blue) distinct is what lets the page say the math said here, the rounds went there. Collapse them into one color and you lose the only sentence that matters.

03 / 05 — THE COMPUTE LEDGER

Five steps, five kinds of compute — and an honest bar for how done each one is.

This isn't a "no AI" flex; it's a right-tool-per-step story. Classical vision, then physics, then a rule engine, then a scored lookup, then a generative voice. The interesting and honest part is the fill of each bar — two stages carry the product, two are skeletons, and the voice is deliberately gated.

STAGE KIND OF COMPUTE MATURITY STATUS 01 Hit detection Classical CV · Imagick connected-components LIVE 02 Ballistic POI Physics · Pejsa-style drop approximation LIVE 03 Mechanic diagnosis Rule engine · delta-pattern classification 8-direction wheel · single-shot LIVE 04 Coach line Scored lookup · hand-authored tier vocabulary finite line set EARLY 05 Coaching voice Generative · ElevenLabs TTS gated · explicit press · 6s delay OPT-IN

No LLM sits in the diagnostic path. The Anthropic key is wired into config as a placeholder for future generative coaching — it is not what produces today's read. Saying that plainly is the whole reason this chapter exists.

04 / 05 — PROVENANCE

Every value carries where it came from and how much to trust it.

BallisticLens prefills an estimate for anything it can infer — height-over-bore, velocity, zero — and records how it got there. Leave it alone and it saves as estimated. Touch it and it becomes manual or measured, and the user's number always wins. Diagnostics soften their certainty when an input was only a guess.

Inference CATALOG · PLATFORM · AMMO basis recorded HEIGHT OVER BORE 2.26 in value · estimate source · confidence Left unchanged → ESTIMATED saved as a guess · low confidence Edited → MANUAL / MEASURED user's number wins · high confidence SOURCE TAGS catalog measured user-entered learned estimated unknown Diagnostics read the confidence and soften the verdict an estimated input lowers the certainty of the mechanic call downstream

This is the architecture's real backbone and the part that's genuinely thought-through: the system stores not just a number but its origin and its trust, so nothing downstream pretends to be more certain than the inputs deserve.

05 / 05 — THE ARTIFACT

A shareable card, stripped of you.

The session composites into a 1200×1600 range card with PHP-GD — copper hit rings, a blue centroid crosshair, and a stat block. It's the app's pure image-craft piece: zero AI, classical raster. And it's privacy-first by construction — initials only. Email, full name, original filename, GPS, and device metadata never reach the card.

PURE PHP-GD COMPOSITE · 0 AI · CLASSICAL RASTER ● INITIALS ONLY · NO PII ON THE CARD target photo hits + centroid session stats hardware · ammo · group size · timer splits PHP-GD COMPOSITE 1200 × 1600 numbered hit rings blue centroid crosshair stat block classical raster · no model PRIVACY STRIP drop: email · name filename · GPS · device → initials only RANGE CARDBallisticLens 1 2 3 4 GLOCK 19 · RMR · 124gr GROUP 2.4 in @ 10 yd 1st 1.12s · split 0.28s avg Δ low-left · trigger anticipation J. W. initials only PRIVACY-FIRST BY CONSTRUCTION stripped: email · full name · original filename · GPS · device metadata kept: initials · hardware · ammo · group geometry · timer splits built to be shared without leaking the shooter copper — GD render / hit rings blue — measured centroid coral — the delta / the read

The stat line — "Δ low-left · trigger anticipation" — prints for any group, naming the mechanical fault across all eight directions of the chart and pairing each with the drill that confirms it. It now also weighs confidence by group dispersion: a tight offset group earns a confident mechanical read, a scattered one gets told to fix the grip before chasing a direction. What's still ahead is reading the fault across a whole string — cadence, fatigue, cold-bore drift. Every verdict still ships with the ball-and-dummy caveat: a probable cause to confirm, not a sentence.