v0.3.0-pre1 — Polished UI, animated loader, results confetti, iOS CSV fix & non-English support (pre-release)
Pre-releasePre-release — big UX pass and two critical fixes (iOS CSV picker,
non-English exports). Up for testing before the stable v0.3.0.
Please try it on your setup and report anything odd on
GitHub issues.
The ranking engine, coefficients and thresholds are unchanged
from v0.2 — your ranks won't move.
Highlights
🎉 Results reveal
Fresh dashboards now land with a confetti burst colored from your
top rank's palette. Fires only on real computations (not on F5 or
when you click Back to your results).
⏳ Rank-parade loader
The plain spinner is gone. The 9 rank emblems now light up in
sequence, each glowing in its own color, giving a "climb the
ladder" feel while your data is crunched. Step messages
("Loading workouts… 3/12", "Parsing CSV…") still show on top.
✨ Landing hover
- Custom styled tooltip on the rank emblems (colored border per
rank, smooth fade) — no more ugly native browser tooltip. - Emblems now lift + glow in their own color on hover.
Critical fixes
📱 iOS Safari — CSV picker
Two combined bugs prevented iPhone users from importing a CSV at all.
- The picker used to open, the file could be selected, and nothing
ever registered in the app. Rewritten with the canonical iOS-safe
overlay input pattern. - The CSV was sometimes greyed out in the iOS Files picker (Hevy's
export is served astext/plain/application/octet-stream).
Widened theacceptfilter accordingly.
🌍 Non-English CSV exports
Hevy's exercise catalog is English-only, so exporting from a French
(or Spanish, German, Portuguese, …) Hevy app used to produce empty
ranks — the app only recognized ASCII-named exercises (typically
Core). Two things fixed this:
- UTF-8 read —
FileReaderwas silently decoding iOS CSVs as
Windows-1252, turning accented titles into mojibake. - FR + EN title fallback — when a title isn't in the English
catalog, the engine now infers the muscle group from a curated
bilingual keyword list (~95 % coverage on standard exercises).
Verified end-to-end on a real French export: all 6 groups populate.
A discreet notice on the results page tells users when many
exercises were routed via the fallback, and the CSV import panel now
carries an upfront tip recommending switching Hevy to English for a
strictly perfect mapping.
Under the hood
- CSV validation — files are checked client-side for
extension / MIME / size (< 20 MB) / non-emptiness before hitting
the parser; bad files surface a clear toast instead of failing
deep inside. computeRanksreturn now includes
matchStats: { catalog, inferred, total }so the UI can decide
when to surface the locale notice.hasDatahardening — a group with lifts but no computable
eqRatio (e.g. missing bodyweight) is now correctlyhasData: false.- Confetti no longer suppressed by
prefers-reduced-motion.
A single-shot, ~4 s, non-strobing, pointer-events-none decorative
reveal doesn't meet the criteria the preference is designed to
guard against. The looping rank-parade loader still honors it.
Docs & codebase
- README header shows all 9 rank emblems (Bronze → Mythic).
- Roadmap restructured into a proper TODO (Done / Planned /
Ideas / Ongoing), including new items (sub-tiers, actionable
recommendations, interactive rank legend, API-mode reliability
hint). - Entire codebase is in English (comments, CLI, error messages).
French keywords used to map Hevy exercise titles in French are
kept intentionally.
🧪 Why pre-release?
The iOS overlay-input pattern and the FR/EN inference are the
canonical solutions for their respective problems, but real-world
iOS can still surprise. If the picker still misbehaves on your
device — please report it and include:
- iOS version
- Where the CSV comes from (Hevy iOS share, iCloud Drive, Files,
Google Drive, other) - Any error toast shown
Next
Once feedback confirms iOS + non-English exports are happy on real
devices, a stable v0.3.0 ships with identical changes (no
-pre1 suffix). Full details:
CHANGELOG.md.