Switch from Hevy or Strong in 60 seconds
Switching cost is history plus habit. The history takes one file. The habit takes one workout with the targets ghosted in.
The three steps
- Export. In Hevy or Strong, export your workouts as a CSV. Both apps write one row per set.
- Open with Outrep. Share or open the file with Outrep (Android: “Open with”, or share to Outrep), or in Outrep go to Settings → Import from Hevy / Strong and pick it. The format is detected from the header; you never choose it.
- Confirm. A row shows “Import hevy-export.csv?”. Tap it. Progress runs in lines consumed; the summary reads, for example, “Hevy: 3 workouts, 19 sets, 1 new exercises”.
A 2,000-set file parses in well under a second and imports in about 0.6 s in the JVM test. Each workout is written in its own transaction, so a file that fails halfway leaves the earlier workouts intact.
What comes across
| Field | Hevy | Strong |
|---|---|---|
| Workouts | Title, start and end time, description | Date, name, duration (“1h 5m” gives the end time), notes |
| Sets | Weight (kg or lb, converted), reps, distance, seconds, RPE | Weight, reps, distance, seconds, RPE; the comma layout has no unit column, so weights are taken in your profile unit, the older semicolon layout carries a unit per row |
| Set types | normal, warmup, dropset, failure | Set order W / D / F become warm-up, drop, failure; “Rest Timer” and “Note” rows are skipped |
| Supersets | Consecutive rows with the same exercise form one block, so A, B, A, B becomes four blocks in file order | |
How exercise names are matched
Names are normalized (lower case, a trailing “(Barbell)” moved to the front, hyphens and slashes to spaces, a few plurals singularised) and then matched in order:
- Exact normalized name in the library, or a custom exercise from an earlier import.
- An alias table of common Hevy and Strong spellings: “Squat (Barbell)” → Back Squat, “Deadlift (Barbell)” → Conventional Deadlift, “Bent Over Row (Barbell)” → Barbell Row, “Lat Pulldown (Cable)” → Lat Pulldown, “Bicep Curl (Dumbbell)” → Dumbbell Curl, “Pull Up” → Pull-Up.
- Same words in any order, ignoring filler like “grip”, “standing”, “seated”. When two library rows share the words, the one carrying the filler word the file used wins; a name that cannot tell them apart becomes a custom exercise rather than a wrong match.
Anything left becomes a custom exercise named exactly as in the file, with the equipment guessed from the name. It is created once and reused on the next import.
What does not come across
- PR rows. Imported sets are history, not records, because history-based PRs would be assigned in file order rather than by date. PR detection starts from the next workout you log; the Level card and the e1RM trend read the imported sets directly, so they count there.
- Rows with values that are not finite, negative, or beyond sane caps (1,000 kg, 1,000 reps, 1,000 km, 24 h). They are skipped and counted as “N rows skipped”. An RPE outside 0–10 is dropped from its set.
- Time zones. Timestamps carry none, so they are taken in the device’s zone.
Re-importing is safe
A workout whose start minute and title already exist is skipped. Import the same file twice and the summary says “0 workouts, 0 sets, N already imported”. Outrep’s own CSV export uses the Hevy layout, so it re-imports through the same path.
Then the first workout
Start any exercise you imported. The set row shows last time in the Last-time column and the target ghosted in; the chip says “Beat last week by 2.5 kg” or “Beat last week by 1 rep”. Tap “Why?” for the sentence.
Compare first: Outrep vs Hevy, Outrep vs Strong.