FORM CHECK

An AI form check that hands you the frame, not a made-up number.

Upload one working set. We pull the actual frames out of your video, pin every fault to a timecode you can scrub to, and finish on a link you can paste straight back into the thread where you asked for a form check.

MP4 · MOV · WebM — up to 50MB / 30 min · 10 credits per analyzed minute · sign in to run

Run one on this page

The template is already set to Form Check. Drop in a file — or paste a YouTube link — and the run starts here.

SOURCE
TEMPLATE
Form CheckLOCKED FOR THIS PAGEPhase timing per rep, contact-sound localization, and every defect pinned to an annotated frame.

Private by default — your video and report are visible only to you, unless you choose to share them.

Not sure it's worth the credits? Signed-in accounts can run the first 60 seconds only, at a lower cost, from the credits dialog.

Film it like this

None of this is fussiness. Each line below changes what the pipeline is able to find — and one of them decides whether the millisecond numbers exist at all.

  1. CAMERA HEIGHT

    Hip to chest height, on something that isn't your hand. A camera that drifts turns every phase boundary into a judgement call.

  2. ANGLE

    Squats: 45° from behind. Deadlift, bench and press: straight side-on. Racket and bat sports: side-on to the contact point, so contact is a silhouette rather than a foreshortened blur.

  3. LOAD

    Use a genuinely challenging weight. A set that never degrades gives the first-rep vs last-rep comparison nothing to compare.

  4. FRAME RATE

    60fps if your phone offers it. Our frame extractor tops out at 60fps, so that is the finest video grid available — about 17ms per frame. At 30fps you get about 33ms. Shooting 240fps slo-mo does not buy you more than the 60fps ceiling here.

  5. SOUND — DON'T MUTE IT

    The millisecond on a contact fault comes from the audio, not the picture. No audio track means no onsets, which means the contact and breathing checks have nothing to anchor to and quietly don't fire.

WHY A WEB TOOL AND NOT AN APP

Your report is a link. That is the entire point.

Nearly every AI form-check tool shipped in the last two years is an iOS app. An app can draw an overlay on your screen; it cannot give you something to paste. Ours finishes on a public URL — its own page, carrying the annotated frames and the timecodes.

  1. 01

    Finish a run

    When the analysis completes, your browser lands on the report's own address. You don't publish it or toggle anything — the address exists from the moment the run starts.

  2. 02

    Copy the link

    Hit Copy link at the top of the report. The link opens for anyone you send it to: no account, no sign-in.

  3. 03

    Paste it back

    Into the r/formcheck thread, the group chat, your coach's DMs. They open the same annotated frames at the same timecodes you are looking at, and can argue with a specific frame instead of a vibe.

Two honest details about that link. Its id is a 16-character random string, so nobody reaches your report by guessing or by browsing a list. And we tell search engines not to index report pages — your set never turns up in anybody's search results. Shareable, not searchable.

What we measure. What we don't.

Competing tools quote joint angles to the degree and 3D kinematics off a single handheld phone camera. No depth sensor is doing that work and no calibration step exists in their onboarding — those numbers are produced, not measured. So we don't print them. The two lists below are not marketing copy: they are the same fixed lists the report prints at the bottom of every form-check run, read from the same constant in the codebase.

We measure

  • Phase timing from ffmpeg frame timestamps
  • Defect evidence frames
  • Rep-to-rep rhythm consistency

We don't claim

  • Joint angle measurements
  • Bar/ball speed
  • 3D kinematics
  • Injury diagnosis

Every millisecond in the report traces to a physical frame or an audio onset. That rule has teeth: the model may only speak in whole seconds, and every sub-second number is manufactured on our side from an ffmpeg frame index or a DSP onset. A finding whose timecode can't be traced to one of those loses its timecode rather than being handed a plausible-looking one; a phase row missing a real boundary frame is dropped rather than interpolated.

How a run actually works

Three passes. The middle one is why we can put a millisecond on a contact at all.

  1. 01

    Scan the whole video

    One low-frame-rate pass over everything: which exercise this is, how many working sets, roughly how many reps, whether a coach is audible, and where every impact sound falls. This pass may only answer in whole seconds — it is looking for places to come back to, not producing final numbers.

  2. 02

    Drill into the suspicious windows

    We reopen the video at each window and extract real frames — up to 60fps, up to 16 frames per window, across up to 8 windows. Impact windows are re-centred on the nearest audio onset before the frames are cut, because a model's guess at "around 0:42" can miss the contact by more than the window is wide. The onset millisecond is then matched to the frame the model picked as contact, within a 50ms tolerance; when nothing lands inside it, the drill is recorded as unbound rather than fudged.

  3. 03

    Assemble the report

    Faults, a phase-timing table, and the annotated evidence frames. Assembly is deterministic and suspicious of its own model: anything carrying a timecode outside the set of milliseconds we physically produced is stripped before it reaches you.

The checks a form-check run can fire

These are the real check identifiers inside the pipeline, not a feature grid. Which ones fire depends on what is actually in your video — a silent clip fires two of them, a coached set with audible breathing fires all five.

CHECKFIRES WHENWHAT IT PRODUCES
S1_IMPACTEvery impact sound the scan pass hears — plates touching down, bat or racket on ball, foot strike.The first frame where contact is visible, with a box drawn on the contact point, carrying the audio onset millisecond pinned to that exact frame — or marked unbound when no onset lands within tolerance.
S2_CUEOnly when a coach or training partner is audible in the clip.One line per cue: the cue quoted verbatim, whether it was executed, and the frame index the call was made on.
S3_BREATHOnly when breathing is audible — which in practice needs a mic near the lifter, not one three metres away.A verdict on whether the breathing pattern fits the phases: match, mismatch, or inconclusive. This is the one check that gets a real audio-and-video clip instead of stills.
FATIGUE_FIRSTAlways — the first working reps of the first set.Phase decomposition and comparable markers: torso angle tendency, depth reached, bar or implement path drift, tempo as frame counts per phase.
FATIGUE_LASTAlways — the last working reps of the last set.The same markers on the other end of the session, so the two can be read against each other. Note that the comparison itself feeds the fault list — the report does not print a separate first-set-vs-last-set table today.

Two of these five depend entirely on your audio track. Mute the clip, or film from far enough away that the mic hears nothing, and S1 and S3 have nothing to anchor to — you still get a report, it just loses the part that makes it worth more than a slow-motion replay.

Per-movement capture notes

The pipeline is not hard-coded per exercise — the scan pass names the movement itself. What does change per movement is where to stand and whether there is a contact sound worth pinning to.

MOVEMENTCAMERACONTACT SOUNDPHASE VOCABULARY
Barbell squat45° from behindWeak — plates rattle at the turnaroundsetup / descent / bottom / ascent / lockout
DeadliftSide-on, full body in frameStrong — plates touch down every repsetup / pull / lockout / descent
Bench pressSide-on, slightly above bar heightModerate — bar-to-chest contactsetup / descent / chest / press / lockout
Tennis forehand or serveSide-on to the contact pointStrong and clean — ball on stringsbackswing / contact / follow-through
Basketball jump shotSide-on or 45°Release is silent — only the rim gives a soundgather / rise / release / follow-through

Phase names come out of the model's own decomposition, so yours may read a little differently. The rule that does not bend: a phase row appears only when both of its boundaries exist as frames we actually extracted. A boundary we couldn't pin drops the row instead of estimating it.

Real reports from this page

Every card is an actual run of this pipeline — the same upload you would give it, the same report you would get back. Click one to open the full report it was taken from.

VIEW FULL REPORT
SOURCE 2160pSTOCK FOOTAGE

Barbell deadlift · form check

Barbell deadlift · form check00:00:00.000

Controlled conventional deadlift execution with stable spinal neutrality and clean lockout throughout the repetition.

FINDINGS

  • 00:00:03.180infoSynchronized Concentric Pull

    Torso angle opens smoothly as the barbell tracks vertically close to the shins past the knees with synchronized hip and knee extension.

  • 00:00:04.700infoUpright Lockout Posture

    Athlete reaches complete hip and knee extension at the top of the pull with upright spinal alignment and no excessive lumbar hyperextension.

  • 00:00:06.251infoControlled Eccentric Lowering and Impact

    Barbell achieves floor contact under controlled eccentric tension while maintaining braced trunk positioning and neutral spine alignment.

PHASE TIMING

setup (rep 1)00:00:00.48400:00:00.984
concentric (rep 1)00:00:03.18000:00:03.780
ascent (rep 1)00:00:04.18000:00:04.700

EVIDENCE

During this first-set sample of the deadlift concentric…
00:00:03.180
The suspicion of form breakdown during descent is refuted…
00:00:06.251
DURATION
00:06
DRILLS
4
FRAMES
12
FINDINGS
4
SOURCE
3840x2160

Pexels License · Tima Miroshnichenko / Pexels

VIEW FULL REPORT
SOURCE 2160pSTOCK FOOTAGE

Golf drive · form check

Golf drive · form check00:00:00.000

Clean driver swing mechanics highlighted by stable spine angle and complete weight transfer onto lead side.

FINDINGS

  • 00:00:02.967infoClean Club-to-Ball Contact Off Tee

    The clubhead struck the teed golf ball cleanly with the golfer retaining forward trunk lean and head position behind the strike zone as the trail heel lifted into weight transfer.

  • 00:00:05.467infoControlled Post-Shot Balance and Club Lowering

    Following swing completion, the golfer held a balanced finish on the lead leg and lowered the club with upright posture without stepping out of stance.

PHASE TIMING

downswing (rep 1)00:00:02.68000:00:02.960
follow-through (rep 1)00:00:02.96000:00:03.280
post-shot balance (rep 1)00:00:05.46700:00:06.467

EVIDENCE

Suspicion refuted: the golfer demonstrates clean swing…
00:00:02.680
Impact is confirmed at frame 6, where the clubhead strikes…
00:00:02.967
DURATION
00:06
DRILLS
4
FRAMES
12
FINDINGS
3
SOURCE
4096x2160

Pexels License · Ryan Parkland / Pexels

VIEW FULL REPORT
SOURCE 1080pSTOCK FOOTAGE

Barbell squat · form check

Barbell squat · form check00:00:00.000

Consistent squat depth and torso stability maintained across all repetitions.

FINDINGS

  • 00:00:01.180infoConsistent Full Depth and Controlled Ascent

    During the first repetition, the athlete hits full depth with the hip crease below knee level and completes a stable concentric ascent to full lockout with vertical bar tracking.

  • 00:00:05.480infoStable Footing and Torso Angle on Final Repetition

    On the final repetition descent, the athlete maintains a neutral spine, stable torso inclination, and firmly planted heels without ankle collapse or forward torso drop into the hole.

PHASE TIMING

concentric (rep 1)00:00:01.18000:00:01.780
descent (rep 3)00:00:05.48000:00:06.080

EVIDENCE

First repetition baseline established: the athlete reaches…
00:00:01.180
Suspicion of fatigue-induced form breakdown is refuted as…
00:00:05.480
DURATION
00:06
DRILLS
2
FRAMES
6
FINDINGS
2
SOURCE
1920x1080

Pexels License · Harvey Tan Villarino / Pexels

Sample reports — every card links to the real report it was taken from, analyzed with this tool.

Questions people actually ask

Is there a free AI form check?
New accounts start with free credits — enough to see a real report with real evidence frames before you pay for one. After that a run costs 10 credits per analyzed minute, or 4 if we could only deliver scan-level findings. Partial minutes round up. No subscription.
Do you measure my knee angle or bar speed in degrees and metres per second?
No, and we won't. Measuring a joint angle from one handheld camera needs depth information your phone's rear camera doesn't hand over, plus a calibration step nobody performs. Tools printing "142° knee flexion" from a bedroom video are printing a number, not measuring one. We describe technique qualitatively — "knees cave inward", "bar drifts forward" — pinned to a frame you can check yourself.
What can I upload?
MP4, MOV or WebM, up to 50MB and 30 minutes. One or two working sets is the right amount — a whole gym session mostly spends credits on rest periods.
Do I need to film in 240fps slow motion?
No — and it helps less than you'd expect. Our frame extractor tops out at 60fps, the finest video grid a run can use, about 17ms between frames. The sharper number on a contact fault doesn't come from the picture anyway: it comes from the audio onset, detected at roughly 23ms resolution, then pinned to the contact frame.
Which exercises does it cover — squat, deadlift, bench, tennis, golf?
There is no per-exercise model to support or not support. The first pass identifies the movement from the video itself and the drills are written around what it found, so a barbell squat, a tennis forehand and a boxing combination go through the same machinery. What differs is how much there is to pin: a clear contact sound buys sharper timecodes than silence.
Can I send the report to my coach?
Yes — hit Copy link at the top of the report and send it over. It opens for anyone with the link: no account, no app.
Does it work if the video has no sound?
It runs, but loses its best trick. Impact detection and the breathing check are both driven by the audio track — no audio means no onsets, so those checks don't fire and every millisecond comes from the frame grid alone. If you can only send silent video, shoot 60fps to keep that grid fine.
How is this different from just posting on r/formcheck?
It isn't a replacement — it's what you post. Instead of a raw clip and "how's my depth", you post a link where the depth question already has a timecode, a frame and a box on it. People can then disagree with something specific, and it comes back in minutes.
Will it tell me if I'm injured or about to be?
No. Injury diagnosis is on the "we don't claim" list above and it stays there. The report describes what the video shows, at frames you can check. What that means for your body is a conversation for someone qualified who can look at you, not at 40 seconds of footage.
Can I use a YouTube link instead of uploading?
You can, and it goes through the same frame extraction as an upload. For form check we'd still rather have the file: the fetched copy is capped at 480p — enough to watch a bar path drift, thin for anything finer. If the fetch fails, the run falls back to scan-level findings at the lower scan-only rate.

One set. One link. Nothing you can't verify.

The tool is at the top of this page — you never left it.

Run a form check