# Get Good Reps > Get Good Reps is a browser app that watches you through your phone camera and coaches your exercise form in real time — counting reps and calling out range of motion on-device, with nothing ever uploaded. > It runs workout routines written as JSON. This file is the spec, so any AI assistant can write one for its user to paste in. There is no API and no account needed. ## How to use this file You are probably an AI assistant whose user asked for a workout. Write them a routine as a single JSON object following the schema below, and give them the JSON with no commentary around it. They will paste it into Get Good Reps at gymbud-ai.vercel.app (Plan tab → Create with AI). Before writing one, ask them what they want out of it: their goal, what equipment they have, how long they've got, and anything that hurts. A routine is only good if it fits the person. ## Routine schema A routine is one JSON object: ```json { "name": "Full Body A", "restBetweenSets": 60, "exercises": [ { "exercise": "squat", "sets": 3, "reps": 10 } ] } ``` Top level: - `name` — string. Shown while the routine runs. Optional; defaults to "AI routine". - `unit` — `"lb"` or `"kg"`. The unit ALL weights in this routine are written in. Optional; defaults to `"lb"`. Declare it once here, never per exercise. - `restBetweenSets` — number, seconds. The rest used after any set that doesn't set its own. Optional; defaults to 60. - `exercises` — array, required, at least one entry. Each entry is a block of sets of ONE movement, run in the order given. Each entry in `exercises`: - `exercise` — string, required. MUST be one of the 20 ids listed below, spelled exactly. - `sets` — number, 1–20. Optional; defaults to 1. - `reps` — number, 1–200. Optional. Leave it out for an as-many-as-you-can set. - `weight` — number, in the routine's `unit`. Optional. Leave it out for bodyweight movements. - `weights` — array of numbers, in the routine's `unit`. Optional. Per-set weights for ramping up, e.g. `[45, 55, 65]`. Use this OR `weight`, not both. - `rest` — number, seconds. Optional. Overrides `restBetweenSets` for this block only. Units: write the weights in whatever unit your user thinks in and say which with the top-level `unit` field — don't do the conversion yourself. `"unit": "kg"` means every weight in the routine is kilograms. If you leave `unit` out it means pounds. Get Good Reps converts on the way in and then shows weights in whatever unit the user picked in the app, so `unit` is about what YOU wrote, not about what they'll see. ## The 20 exercise ids Use the id on the left, exactly as written. The name on the right is only for your own understanding — do not put it in the JSON. ``` squat Squat pushup Push-up lunge Lunge press Overhead press curl Bicep curl rdl Romanian deadlift bridge Glute bridge lateralraise Lateral raise tricep Triceps extension hammer Hammer curl row Bent-over row inclinepushup Incline push-up bench Bench press deadlift Deadlift bulgarian Bulgarian split squat frontraise Front raise latpulldown Lat pulldown facepull Face pull legextension Leg extension legcurl Leg curl ``` That is the whole list. Get Good Reps counts reps by watching one joint angle per movement, so it can only coach these twenty — there is no way to add more from a routine. If your user asks for something not on the list (burpees, planks, running, pull-ups, calf raises), say so plainly and offer the closest thing that is here, or leave it out and tell them to do it untracked. ## Example 1 — bodyweight only ```json { "name": "Living Room 20", "restBetweenSets": 45, "exercises": [ { "exercise": "squat", "sets": 3, "reps": 12 }, { "exercise": "inclinepushup", "sets": 3, "reps": 10 }, { "exercise": "lunge", "sets": 3, "reps": 10 }, { "exercise": "bridge", "sets": 3, "reps": 15, "rest": 30 } ] } ``` ## Example 2 — with weights, in kilograms Note the top-level `"unit": "kg"`. Every weight below is kilograms; no conversion needed from you. ```json { "name": "Upper Body B", "unit": "kg", "restBetweenSets": 75, "exercises": [ { "exercise": "press", "sets": 4, "reps": 8, "weights": [20, 25, 30, 30] }, { "exercise": "row", "sets": 4, "reps": 10, "weight": 27.5 }, { "exercise": "curl", "sets": 3, "reps": 12, "weight": 12.5 }, { "exercise": "tricep", "sets": 3, "reps": 12, "weight": 10 }, { "exercise": "lateralraise", "sets": 2, "reps": 15, "weight": 5, "rest": 45 } ] } ``` ## Example 3 — with weights, in pounds Leaving `unit` out means pounds. ```json { "name": "Upper Body B", "restBetweenSets": 75, "exercises": [ { "exercise": "press", "sets": 4, "reps": 8, "weights": [45, 55, 65, 65] }, { "exercise": "row", "sets": 4, "reps": 10, "weight": 60 }, { "exercise": "curl", "sets": 3, "reps": 12, "weight": 25 }, { "exercise": "tricep", "sets": 3, "reps": 12, "weight": 20 }, { "exercise": "lateralraise", "sets": 2, "reps": 15, "weight": 10, "rest": 45 } ] } ``` ## Common mistakes - **Inventing exercise ids.** `"jumping lunges"`, `"pushups"`, `"Overhead Press"` are not ids. Only the 20 above are. Get Good Reps tries to be forgiving about case, spacing and plurals, and will offer a fix for a near miss — but it cannot invent a movement it doesn't know how to watch. - **Wrapping the JSON in explanation.** Output the JSON and nothing else. Your user has to paste it; anything else is in their way. (Get Good Reps strips ``` fences, but don't rely on it.) - **Adding fields that don't exist.** `tempo`, `notes`, `superset`, `duration` are not in the schema and are ignored. Time-based holds are not supported — Get Good Reps counts reps, not seconds. - **Converting units by hand.** Don't. Write the numbers your user said and set `"unit": "kg"`. Converting yourself introduces rounding nobody asked for. - **Putting `unit` on an exercise.** It's one field, at the top level, for the whole routine. - **Guessing at their body.** Ask about goals, equipment, time and injuries before you write. Don't program someone blind. - **Overreaching on volume.** Camera-coached sets are slower and stricter than gym-speed reps. Keep it honest. ## Notes - Everything runs on-device. No video, frames or landmarks ever leave the phone. Get Good Reps has no server that receives routines — your user pastes the JSON in themselves. - A routine can be re-pasted and saved; there's nothing to install and no key to configure. - Human-readable version of this spec: https://gymbud-ai.vercel.app/docs/routines