Use your own AI

Badger works with whichever AI you already use. Export your training as a file, give it to the AI, and it can answer questions about your actual training or write you a program that Badger imports.

What you can hand it

  • Your training context, as text. The easiest place to start. Settings, then Your data, then Copy context for AI. Badger builds a short briefing on your phone: your training notes, your active program with its current targets, your last ten sessions, your records, the equipment at your gym, and anything you have marked as avoided. You see all of it before you copy it. It is short enough to paste into a chat, and it ends with instructions telling the AI how to read it and how to write a routine back, so you can paste it on its own and ask your question. The same action is at the bottom of your training notes page. See copying your context.
  • Your training history, as CSV. Settings, then Your data, then Export. One row per set, every set the app holds, with dates, weights, reps, RPE, RIR, your notes, and an is_complete column saying whether you actually performed the set. A long history is easier to attach as a file than to paste. See exporting data.
  • A routine, as a .badger file. Open a routine and pick Send routine file from its menu. It carries the plan and nothing about your history. The Programs page has every built-in program as a file.
  • Your gym, as a .badger file. Open a gym and pick Share gym from its menu. It lists the machines, bars, and accessories you actually have, so a program can be planned around your equipment. The "Write me a program" prompt below uses it.
  • The format itself. The .badger file format page documents every key, so an AI can write a file Badger will import.

Prompts worth starting from

Treat these as starting points: edit the bracketed parts, cut what does not apply, and question the answers.

Analyze my training

For the CSV export, which is every set you have ever logged, one row per set. Paste the prompt, then attach or paste the CSV underneath it.

I train with a workout tracker called Badger. Below (or attached) is a CSV export of every set I have logged, one row per set, with these columns:

date, workout_id, exercise_name, category, set_number, is_warmup, weight, weight_unit, reps, duration_seconds, distance, rpe, rir, comment, is_complete, is_skipped, heart_rate, weight_per_side, is_unilateral, reps_left, reps_right, duration_left_seconds, duration_right_seconds

How to read it:
- Only rows where is_complete is true were actually performed. A workout started from a routine creates all of its sets up front, so a session I began and abandoned still has rows here, filled in with what I planned to lift. Count only completed sets as training.
- is_skipped marks a set I deliberately passed on. It is never training either.
- Weights are stored in the unit named in weight_unit and are never converted, so convert before comparing kg and lbs rows.
- Rows where is_warmup is true are warmups. Leave them out of working volume.
- Empty cells mean the exercise does not use that field: a plank has duration_seconds and no reps.
- rpe is 1-10, rir is reps in reserve. Both are optional and often blank.
- heart_rate is my heart rate at the end of that set, in beats per minute, read from Apple Health or Health Connect. It is optional and usually blank: it only exists for sets logged while I was wearing a watch, with that feature switched on. Never treat a blank as zero.
- weight_per_side says what the weight column MEANS for that row: true means the number is what was loaded on one side (iso-lateral machines), false means it is the total, and blank means the row predates the setting and is unknown. The number itself is never doubled or converted, so treat a true row as roughly half the total load when you compare it with a total row, and say so when you do.
- is_unilateral is true on a set where I logged my left and right separately (one-arm or one-leg work). On those rows reps and duration_seconds hold my better arm, and reps_left, reps_right, duration_left_seconds and duration_right_seconds hold each arm. Those four columns are blank on every other row. Weight is one number for both arms, so a set's volume is weight x (reps_left + reps_right). A blank is_unilateral means an ordinary set. Never compare one-arm rows with both-arms rows of the same exercise as if they were the same lift, and point out a gap between my arms when there is one.

Please:
1. Summarize how I have actually been training: sessions per week, which lifts I do most, how volume splits across categories, and how consistent I am.
2. Show the trend on my main lifts: best working set and estimated 1RM over time, and whether each is climbing, flat, or slipping.
3. Point out imbalances, neglected movement patterns, and anything that looks like a plateau. Say what evidence you used for each.
4. Tell me what you would change, in priority order, and where you are unsure.

Ask me about my goals, my schedule, and any injuries before assuming them.

Review my program

For a routine you exported from Badger, or one from the Programs page. Paste the prompt, then the contents of the .badger file.

Below is a training program as a .badger file: the plain JSON format used by the Badger workout tracker. It is documented at https://badger.fit/badger-format/

Read it and tell me:
1. What this program actually is: how many sessions a week, what it prioritizes, and who it suits.
2. Where it is thin or unbalanced. Which muscle groups and movement patterns get little or no work?
3. How hard it is to recover from, and whether the volume is sane for someone training this often.
4. What you would change for my situation, and why. If I paste my gym's .badger file underneath, also say whether the program fits the equipment I actually have.

My situation: [training age, days a week I can train, goal, equipment, anything I need to work around].

Do not rewrite the file yet. Tell me what you would change first, then I will ask.

Write me a program as a .badger file

Your AI writes a routine, you save it as a .badger file and open it, and Badger imports it (the steps are under Importing what the AI writes, below). Fill in the bracketed parts before sending. Optionally paste your gym's .badger file underneath, and the program gets planned around the machines you actually have.

Write me a training program as a .badger file for the Badger workout tracker, so I can import it directly.

The format is documented at https://badger.fit/badger-format/ and there is a small worked example at https://badger.fit/programs/example-routine.badger

Follow the format exactly:
- Top level: "badger": "share/v1", "type": "routine", plus app_version, created_at, and payload.
- payload has routine (an object with at least "name"), days, exercises, and machines (machines can be an empty array).
- Each day has "name" and an "exercises" array of slots. Optionally add "scheduled_days": weekday numbers, 1 = Monday to 7 = Sunday.
- Each slot's "exercise_name" and "exercise_type" must exactly equal a "name" and "type" in payload.exercises. The slot's planned sets go in its "predefined_sets" array.
- Each entry in payload.exercises has "name", "type" and "category_name". type is one of: weight_reps, reps_only, time_only, distance_only, weight_only, weight_time, weight_distance, reps_time, reps_distance, distance_time.
- A set uses the fields its type needs: "reps" (and "weight" when you have one) for weight_reps, "duration_seconds" for time_only, "distance" in kilometers for distance types. Mark warmups with "is_warmup": true.
- Use ordinary exercise names ("Barbell Back Squat", not "BB squat"), so they match exercises I already have instead of creating duplicates.
- For a rep range, set reps to the bottom of the range and reps_max to the top. For an exact target, use reps alone.
- For an open-topped ("AMRAP") set, set reps to the minimum and "is_amrap": true, and leave reps_max out. That reads as "8+": at least 8 reps, then as many as possible. A set to failure is reps 1 with is_amrap true. Never set both is_amrap and reps_max on the same set.
- Leave weight out. I fill in my own weights.
- For a percentage-based set, write "percent_of_reference" (85.0 means 85%) and still leave weight out.
- Never put reps_max or is_amrap on a warmup set.
- Order matters: days, exercises, and sets import in the order they appear in their arrays.
- To pair exercises as a superset, give both slots the same "superset_key". To pre-assign swap options, use "alternatives": an array of objects like { "exercise_name": "...", "exercise_type": "..." }, each also defined in payload.exercises. For a tempo prescription, put it in "tempo" on the slot, like "3-1-2-0".
- If I paste a gym .badger file below, plan around its equipment: only pick machine exercises its machines support (barbell, dumbbell, and bodyweight movements are always available). For an exercise done on one of those machines, set default_machine_name to that machine's name exactly as written in my file, and copy the machine's entry into payload.machines verbatim. Never invent or rename a machine.
- A gym file may also list "bars" and "accessories". Read them for what the gym has, but do not put them in the routine: a routine slot carries no default bar and no accessories, so mention band or chain work in your explanation underneath instead of trying to encode it.
- Progression can live in the file. If the program changes week to week (like 5/3/1), write the day once with "cycle_length" and give each set a 0-based "week_index"; a set with no week_index applies every week. If a slot progresses by a fixed rule, you may write it as a "progression" object on the slot, following the Progression and Clause sections of the format page exactly. It needs "cadence", "reference_kind" and a "clauses" array in evaluation order that ends with an "always" clause; each clause needs "trigger", "action" and "target", plus "amount" (add_absolute, set_from_remembered), "percent" (add_percent) or "reps_min" (driver_reps_at_least, driver_reps_between) where the format page says so. Mark the set a driver trigger reads with "is_progression_driver": true. A rule that breaks those rules is dropped on import while the rest of the file still imports, so when unsure, leave the rule out and describe it underneath instead.

The smallest valid file looks like this:
{
  "badger": "share/v1",
  "app_version": "1.1.12",
  "created_at": "2026-09-23T00:00:00Z",
  "type": "routine",
  "payload": {
    "routine": { "name": "My Program" },
    "days": [
      {
        "name": "Day A",
        "exercises": [
          {
            "exercise_name": "Barbell Back Squat",
            "exercise_type": "weight_reps",
            "predefined_sets": [
              { "is_warmup": false, "reps": 5 }
            ]
          }
        ]
      }
    ],
    "exercises": [
      { "name": "Barbell Back Squat", "type": "weight_reps", "category_name": "Legs" }
    ],
    "machines": []
  }
}

What I want:
- Days a week: [4]
- Experience: [about two years of consistent lifting]
- Goal: [get stronger on the main barbell lifts while keeping some size work]
- Equipment: [full gym: rack, barbell, dumbbells, cables, common machines]
- Session length: [about an hour]
- Avoid: [nothing]

Give me the complete JSON in one code block, then explain the program in a few sentences underneath: what progresses, how, and when I should change something.

Importing what the AI writes

  1. Save the reply as a .badger file. Copy the JSON from the chat, paste it into any app that can save plain text as a file, and save it with a name ending in .badger, such as my-program.badger. Check that the app did not add .txt to the end; Badger will not open my-program.badger.txt. Some chat apps can also give you the JSON as a downloadable file if you ask for one with that name. On a computer, any text editor works; then move the file to your phone however you usually move files.
  2. Open the file with Badger. Tap it, or open it from your file manager (Files on an iPhone). Badger shows a preview before anything is saved.
  3. Check the preview before you import.
    • New exercises. A program of familiar lifts should create few or none. A long list means the AI invented names: fix the names in the file so the program lands on the exercises you already have, with their history and PRs.
    • A warning that exercises could not be matched. A day uses a name with no matching definition in exercises, or gave it the wrong type. Those slots are skipped. Fix the names in the file and the full program comes in.
    • New machines, if you gave it your gym file. There should be none. A new machine means the AI misspelled one; fix the name so the exercise lands on the machine you already track.

If the file will not open, check first that its name ends in exactly .badger. Otherwise it is malformed, or badger is not share/v1, or type is not routine. Paste the error back to the AI and ask for a corrected file.

Import only adds, so a program you do not like is a routine you delete; your history is not touched. Judge the training yourself: neither the preview nor the app checks whether the program is any good.

What this costs you in privacy

When you paste your data into a chat, it goes to the company running that chat, under their terms, and some of them train on what you send unless you turn that off. Badger itself sends nothing and needs no account for any of this: every step on this page is you exporting a file and choosing where it goes.

  • A routine file is the safe one. It is a plan: exercise names, sets, reps. No history, no dates, nothing about you.
  • The CSV is your training history: dates, weights, reps, and any per-set notes you wrote. It holds no name, email, device identifier or location. If you write personal things in set comments, read them before you share the file.
  • A model you run yourself keeps your data on your own device.