Process a folder of cycling videos
Riders, fitters and coaches can do this entirely in the browser. There is no script to install or command to type.
- Open Process a folder from Cycling Form Analysis in desktop Chrome or Edge.
- Choose a folder and allow the browser to read and write it.
- Confirm the camera view (side or back), capture FPS and ride setting (indoor or outdoor). Override view/FPS for individual videos if needed.
- Choose the middle 12 seconds or the entire video. Press Process videos and keep this tab open.
- Find the MP4 highlight, PDF report and Markdown text beside each original. Review each row for warnings or failures.
What gets saved
For ride.mp4, the app creates results_ride.mp4, results_ride.pdf and results_ride.md. A results_ride.json receipt records the settings, actual frame rates, analyzed range and output sizes. The MP4 is a metric highlight reel, with 30 FPS output.
Originals are not changed. Existing result files are skipped, including incomplete sets. Move old or partial results before retrying. Videos with the same base name, such as ride.mp4 and ride.mov, must be renamed first. Files beginning results_ or reslts_ are excluded. Subfolders are not processed.
Recording settings that matter
- Camera view: both views give cadence; side view adds the fit angles (maximum knee extension, minimum hip angle, torso angle and shoulder angle); back view adds knee lateral tracking, pelvic obliquity and shoulder sway. Keep the whole rider in frame for several pedal strokes.
- Ride setting: Indoor (trainer) crops each video to one fixed window around the rider to remove clutter. Outdoor pans the crop with a rider who rides past the camera and measures from the rider’s hips, so position changes from travel do not count as sway. The same setting the app offers in Basic and Advanced; use separate batches for indoor and outdoor videos.
- Capture FPS: Auto reads the encoded file rate. Slow motion filmed at 120 FPS may be saved at 30 FPS; enter 120 in that case. Auto fails if the file rate cannot be read, so you can choose a rate explicitly. Cadence and other timing results use the capture rate.
- Segment: the middle 12 seconds is the default, as in the app’s Basic mode. Full video takes longer. The analysis can trim spans where the rider is out of view; the receipt records the actual range.
- Pose model and highlight: MoveNet Thunder is the app’s default; BlazePose Heavy is also available. The highlight reel can be vertical 720 × 1280 or cropped to the rider, with 2–10 seconds per metric.
Local processing and recovery
Video analysis and export happen in your browser. Static app code and model files may download from the internet. Folder permissions are granted by you in the browser, and you may need to grant them again after reopening the page.
One video runs at a time. A failure does not stop the rest. Stop batch cancels the active analysis/export; a save already in progress finishes before the queue stops. Closing the browser can leave partial results. Move these before retrying. Avoid concurrent programs writing to the same folder.
If the folder picker is unavailable, use a supported desktop browser such as Chrome or Edge, or return to the single-video app. MP4 export requires H.264 WebCodecs support; an unsupported encoder produces an error. Results are the same screening estimates and guidance offered by the single-video Cycling Form Analysis workflow.
For AI agents and developers: browser interface
Everything runs in the browser at https://apopt.com/cycling/automation.html. There is nothing to download or install. An AI agent or script that controls a browser (for example a browser-automation tool) can use the page’s versioned interface, window.apoptAutomation, instead of the folder picker.
- Open
https://apopt.com/cycling/automation.htmland wait untilwindow.apoptAutomation.version === 1. - Put one local video on the file input
#automation-video; the browser reads it locally. - Start the job, poll until it finishes, then read the Markdown or download the outputs.
const api = window.apoptAutomation;
api.capabilities(); // app "cycling", views, options, defaults, outputs
const id = api.start({
view: "side", captureFps: "auto", rideSetting: "indoor"
});
api.getJob(id); // state: running → succeeded / failed / cancelled
// After state === "succeeded":
await api.markdown(id); // the text results
api.download(id, "mp4"); // also "pdf" and "md"
api.cancel(id); // stops a running job
| Option | Values |
|---|---|
| view | side or back |
| captureFps | "auto" or the recorded FPS, 1–2000 |
| rideSetting | indoor (fixed crop) or outdoor (panned crop, drift removed) |
| range | center12 (middle 12 seconds) or full |
| model | movenet_thunder or blazepose |
| outputFormat | vertical or person-crop; metricCycleSeconds 2–10 |
One job runs at a time, and only the latest job’s outputs are kept, so save every output before starting another. Unknown options and out-of-range values are rejected before processing. Video stays in the browser; an agent that reads the Markdown receives that derived text.
Example agent request: “Open the Cycling Form Analysis automation page, analyze ride.mp4 as a side view of an indoor trainer ride at auto capture FPS, save the three outputs and read the Markdown.”