Process a folder of range-of-motion videos
Clinicians can do this entirely in the browser. There is no script to install or command to type.
- Open Process a folder from ROM Recovery in desktop Chrome or Edge.
- Choose a folder and allow the browser to read and write it.
- Choose the joint (protocol) the videos record, the affected side (Auto-detect, left or right) and the capture FPS. Override the FPS for individual videos if needed.
- Press Process videos and keep this tab open.
- Find the annotated MP4, PDF report and Markdown text beside each original. Review each row for warnings or failures.
What gets saved
For knee.mp4, the app creates results_knee.mp4, results_knee.pdf and results_knee.md. A results_knee.json receipt records the settings, actual frame rates, analyzed range and output sizes. The MP4 is the app’s own full annotated video: the whole clip with the measured angles drawn on it, at 30 FPS.
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 knee.mp4 and knee.mov, must be renamed first. Files beginning results_ or reslts_ are excluded. Subfolders are not processed.
Recording settings that matter
- Joint (protocol): Knee, Hip, Shoulder, Elbow or General (five-times sit-to-stand). Each protocol fixes its own camera view, movement and measures, exactly as in the app; record each video as the app’s recording guide describes. Use separate batches for different joints.
- Affected side: Auto-detect (the default) measures the side whose landmarks the camera sees in the most frames; for the bilateral shoulder protocol it picks the arm reaching less elevation. A fixed left or right side is honored, with a warning when the other side was visible far more often. Each result names the side it measured.
- 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. Repetition times and velocities use the capture rate.
- Whole clip: each video is analyzed from start to end, as in the app’s Basic mode. Results are never withheld for too few repetitions; one slow repetition is enough to measure, and the protocol’s recommended count gives steadier numbers.
- Pose model: MoveNet Thunder is the app’s default; BlazePose Heavy and the YOLO26 sizes (n fastest to x most accurate) match the app’s Advanced choices. If a YOLO model cannot run, the app falls back to MoveNet Thunder and the report names the model used.
- Each video stands alone: the batch does not save sessions or compare against the recovery timeline kept in the single-video app. Use the app’s Advanced mode to save a visit to that timeline.
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 ROM Recovery workflow: two-dimensional estimates of visible camera-plane motion, not a diagnosis. Perform only clinician-cleared movements.
For AI agents and developers: browser interface
Everything runs in the browser at https://apopt.com/rom/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/rom/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 "rom", views, options, defaults, outputs
const id = api.start({
captureFps: "auto", assessment: "knee", side: "auto"
});
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 |
|---|---|
| captureFps | "auto" or the recorded FPS, 1–2000 |
| assessment | knee, hip, shoulder, elbow or general (sit-to-stand); each protocol fixes its camera view, so there is no view option |
| side | auto (default), left or right |
| model | movenet_thunder, blazepose, or yolo26n_pose, yolo26s_pose, yolo26m_pose, yolo26l_pose, yolo26x_pose |
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 ROM Recovery automation page, analyze knee.mp4 with the knee protocol, auto-detected side and auto capture FPS, save the three outputs and read the Markdown.”