Updated September 2026
Every number this tool shows comes from a specific, inspectable pipeline that runs entirely inside your browser tab — no server, no upload, no API call carrying your photo anywhere. This page walks through exactly what happens between choosing a photo and seeing a result, in the same order the code runs it.
The tool uses TensorFlow.js together with Google's MoveNet pose-detection model, specifically the SINGLEPOSE_THUNDER variant. MoveNet ships in two sizes: "Lightning," tuned for real-time webcam speed at the cost of some precision, and "Thunder," which trades a bit of speed for meaningfully better keypoint accuracy. Because this tool analyzes one still photo at a time rather than a live video feed, latency of a second or two doesn't matter — accuracy does — so Thunder is the one loaded. The model (roughly 15 MB) downloads once per browser session from a public model-hosting CDN and then runs locally for every photo you analyze afterward.
Phone photos routinely carry an EXIF orientation flag that most naive image code ignores, leading to sideways or upside-down results. This tool loads your file with createImageBitmap(file, {imageOrientation: "from-image"}) where the browser supports it, which applies that rotation before anything else touches the image. The photo is then drawn onto a canvas capped at 720 pixels on its longest side — large enough for MoveNet's keypoint accuracy to be unaffected, small enough to keep detection fast on an ordinary phone or laptop.
MoveNet returns 17 keypoints, each with an (x, y) pixel position and a confidence score from 0 to 1: nose, left/right eye, left/right ear, left/right shoulder, left/right elbow, left/right wrist, left/right hip, left/right knee, and left/right ankle. This tool only uses a keypoint if its score is at least 0.3 — below that, the model is essentially guessing, and using the position would produce a meaningless ratio. If a needed keypoint falls under that threshold, the affected metric is skipped and you're told which body region wasn't confidently found rather than being shown a fabricated number.
The tool picks whichever ear MoveNet detected with higher confidence — the visible side in a side-profile photo — along with the shoulder and hip on that same side. From those three points:
forward-head % = |ear.x − shoulder.x| ÷ |shoulder.y − hip.y| × 100
The numerator is the horizontal pixel distance between ear and shoulder — how far forward the head sits. The denominator is the vertical pixel distance between shoulder and hip — your visible torso height in that photo. Dividing by torso height rather than using the raw pixel offset is what makes the number comparable across photos taken at different distances or zoom levels: both the offset and the torso height shrink or grow together as the camera moves closer or farther, so their ratio stays roughly stable. A head stacked directly over the shoulder scores close to 0%; the further forward it sits relative to your own torso height, the higher the percentage. The tool labels the result "Minimal" below 12%, "Mild" from 12–25%, "Moderate" from 25–40%, and "Pronounced" above 40% — these bands are descriptive labels chosen for readability, not clinically validated diagnostic cutoffs.
For a front-facing photo, the same normalizing idea applies to left/right symmetry instead of forward/back position:
level % = |pointA.y − pointB.y| ÷ |pointA.x − pointB.x| × 100
computed once for the two shoulder keypoints and once for the two hip keypoints. The numerator is how much higher one side sits than the other (in pixels); the denominator is the shoulder-width (or hip-width) in that same photo, which again cancels out camera distance. Two shoulders (or hips) at exactly the same height score 0%. The tool labels results "Level" below 4%, "Slight asymmetry" 4–8%, "Noticeable asymmetry" 8–15%, and "Pronounced asymmetry" above 15% — again, descriptive bands, not medical thresholds.
Every keypoint scoring above the 0.3 threshold is drawn as a dot on the canvas, connected to its neighboring keypoints (shoulder-to-elbow, hip-to-knee, and so on) with a line, directly over your photo. This isn't decorative — it's there so you can visually sanity-check the detection yourself. If the skeleton is clearly sitting on the wrong part of the photo, or missing an obviously visible joint, the metrics computed from it should be treated with real skepticism regardless of what percentage they report.
It would be easy to dress this up as more clinically rigorous than it is. It isn't a medical device, it has no clinical validation study behind it, and it was not built by or with physical therapists. What it is: an honest, transparent application of a well-established open-source pose-detection model to a well-defined geometric question, computed the same way every time, with the math shown above rather than hidden behind a black-box "score." If you want to track your own posture meaningfully over time, the most reliable way to use this tool is to take photos the same way — same distance, same angle, same lighting — every time, and watch the trend rather than fixating on any single number.