Everything here lives in the app under Settings → Data, except plan sharing, which is on the Plan screen.
| You want to | Use |
|---|---|
| Bring your workout history from another app | Import from another app (CSV) |
| Pull workouts, routines and weigh-ins from Hevy Pro | Import from Hevy (API key) |
| Bring body weight over from an iPhone | Import from another app with the Apple Health export |
| Give someone your routines | Plan → Share your plan → Export plan file |
| Back up or move everything | Export backup / Import backup |
Export a CSV from your old app, then pick it under Settings → Data → Import from another app. openGym matches exercise names against its library; anything it doesn't recognise becomes one of your own exercises, so nothing in the file is dropped. Days that already have a workout in openGym are left alone, so importing the same file twice never duplicates anything.
These exports work without any editing:
| App | Where to export |
|---|---|
| FitNotes (Android) | Settings → Backup/Export → Spreadsheet Export |
| FitNotes 2 (iOS) | Export workouts as CSV |
| Strong | Settings → Export Data |
| Hevy | Profile → Settings → Export & Import Data |
| Gravl | Profile → Export Data |
Other files work too, as long as they have a date, an exercise name and something measured (weight and reps, a time or a distance). See your own CSV below.
Note
History is a log of what you did, so it's imported separately from your routines. Importing workouts doesn't create or change any plan.
With Hevy Pro you can skip the CSV:
- In Hevy, open Settings → Developer and create an API key.
- In openGym, go to Settings → Data → Import from Hevy and paste the key. It's used for this import only and isn't saved.
- Choose workouts, routines, weigh-ins or any mix, then confirm.
Routines always arrive as new plans; nothing you already have is overwritten.
In the Health app on your iPhone, tap your profile picture, then Export All Health Data. Unzip
the result and pick export.xml under Import from another app. The file is often hundreds of
megabytes; openGym reads only the body-weight records from it, in whatever unit each one was saved
in, and keeps one weigh-in per day. Days that already have a weigh-in are left alone.
A CSV with a date column and a weight column works the same way.
On the Plan screen, tap the share icon:
- Export plan file writes your routines and weekly schedule to a small JSON file. It contains no workouts and no weigh-ins.
- Import a plan file adds someone else's plan to yours. It merges, so your own routines are never overwritten.
- Print / Save as PDF gives you a clean printout.
An export always contains every routine. To share only some of them, import the file into the demo, delete what you don't want, and export again. The demo keeps everything in your browser; nothing is uploaded. The same trick works for building a plan on a computer and then importing it into the phone app.
Writing a plan file by hand is possible but fiddly, because the exercise ids have to match the library.
- Export backup (JSON) saves your whole profile as one file. Export with photos & videos (.zip) includes your media as well.
- Import backup restores such a file and replaces everything currently in the app.
- Auto-backup on changes (phone app only) saves a dated copy to
Documents/openGymafter each workout or routine edit and keeps the newest 14. Point a sync app at that folder to get them off the phone.
If you host openGym yourself, backing up the ./data folder covers every profile at once; see
backups.
The smallest file that works:
workout name,exercise,date,weight kg,reps
Leg Day,Squat,2026-08-21,120,5
Leg Day,Squat,2026-08-21,125,4
Leg Day,Leg Press,2026-08-21,200,1One row per set. Column names are matched ignoring case and punctuation; the first match wins.
| Field | Accepted headers |
|---|---|
| exercise | exercise, exercise name, exercise title |
| date | date, workout date |
| start time | start time, start date |
| end time | end time |
| workout name | workout name, title, workout |
| category | category, body part, muscle group |
| weight in kg | weight kg |
| weight in lb | weight lbs, weight lb |
| weight, unit in another column | weight |
| weight unit | weight unit, unit |
| reps | reps, repetitions |
| RPE | rpe, rpe rating |
| RIR | rir, reps in reserve |
| distance in km | distance km |
| distance, unit in another column | distance |
| distance unit | distance unit |
| duration in seconds | seconds, duration seconds, set duration sec |
| duration | time, duration |
| set type | set type |
| note | comment, comments, notes, note, workout notes |
The CSV parser is frontend/src/lib/import-csv.js. The Hevy API import and a detected Hevy CSV
resolve exercises through the same generated lookup, frontend/src/lib/hevy-id-map.js (template id
for the API, English title for the CSV). To regenerate it, set HEVY_API_KEY in the environment or
.env and run node scripts/build-hevy-id-map.mjs. Localised (non-English) Hevy titles fall back
to name matching.