Chris’s Swim Training Progress and Evaluation
Chris’s Swim Training Progress and Evaluation
Description
Chris’s Swim Training Progress and Evaluation is a multi-user WordPress plugin for importing FIT and
CSV swimming workouts, manually recording pool workouts, preserving normalized workout history, evaluating native
meter and yard performances, tracking personal bests, managing swim events and
locations, and displaying selected results through display-only shortcodes.
Version 0.8 adds first-class manual pool-workout creation and editing, compressed workout-source imports, improved FIT fidelity for Apple Watch, Garmin, and FORM recordings, and workout-photo support. It retains all v0.7 Block Editor, open-water, Garmin, rebuild, analysis, privacy, REST API, and integration features.
v0.8
Version 0.8 adds first-class manual pool-workout entry for swimmers who do not use an automatic recording device. Manual workouts may contain coarse totals or ordered sets with repetitions, distance, stroke, notes, and optional timing. Timing provenance is preserved: explicitly measured repetition times may qualify as personal-best evidence, while set totals, intervals/send-offs, derived timing, overall workout duration, and unknown timing are not divided into invented performance times. Untimed sets still contribute training structure and volume.
Manual workouts are explicit manual sources rather than fake imports or device recordings. They use the same canonical workout history, Workout Details, workout numbers, Training Log, training totals, Personal Bests, Progress, public Workout display, Latest Workouts, blocks/shortcodes, Create/Edit Post workflow, and read-only REST API as appropriate. Editing/rebuilding is owner-scoped and transactional, and imported workouts are protected from being rewritten as manual workouts. Manual entry is limited to pool workouts and does not create manual open-water GPS routes.
Version 0.8 also improves source fidelity and workout administration:
* Preserve per-length FIT stroke counts from compatible Apple Watch, Garmin, and FORM pool-swim files in normalized length data.
* Show per-length stroke counts and an available Total Strokes value on Workout Details.
* Preserve FIT session heart-rate and cadence metrics for pool workouts.
* Improve Apple Watch FIT recording-device identification while retaining the device model.
* Use FIT Activity local timestamps when available for historically correct workout-local times, with the configured WordPress timezone retained as a fallback.
* Add transparent compressed-source handling for TrainingPeaks-style FIT gzip files and FORM ZIP exports while preserving the original archive in protected source storage.
* Add up to three workout photos with upload, replacement, deletion, and workout-detail display.
* Add private real-world FIT regression hooks and expanded deterministic regression coverage without publishing private workout files.
v0.7 Block Editor support
Version 0.7 adds native Block Editor support for the six existing public display features while preserving their shortcodes for backward compatibility. The blocks are dynamic/server-rendered and share the same PHP rendering, authorization, and privacy logic as the shortcodes.
- Latest Workouts —
[swimlog_latest]: swimmer override, count, and heading controls. - Personal Bests —
[swimlog_bests]: swimmer, course, stroke, distance, lifetime/age-group selection, age-group mode, and heading controls. - Upcoming Events —
[swimlog_upcoming_events]: swimmer, event count/site default, and heading controls. - Workout —
[swimlog_workout]: workout ID and heading controls; workout ownership determines the swimmer. - Training Log —
[swimlog_log]: swimmer, monthly/annual mode, month/year, and heading controls. - Progress —
[swimlog_progress]: swimmer, course, stroke, distance, and heading controls.
Public-results authorization is unchanged. Applicable blocks use the page/post author when no swimmer override is supplied and never fall back to the logged-in viewer. Open-water GPS routes remain separately opt-in, and GPS coordinates/trackpoints are not stored in block attributes or editor scripts.
Data Preservation
Historical data is preserved by default. Deactivation and ordinary updates do
not delete workout history or original source imports. Derived performances are
designed to be rebuildable from preserved authoritative workout data.
Screenshots

Swim Training Dashboard provides an overview of the latest workout, personal bests, upcoming events, and recent training activity.

Workout Details displays imported workout information, detected performances, preserved source imports, and normalized swim data.

Personal Bests tracks performances by age group, course, distance, and stroke, with lifetime personal bests identified.

PB Progression shows the performance history for a selected distance and stroke over time.

Six native WordPress blocks make it easy to add latest workouts, personal bests, upcoming events, individual workouts, training logs, and progress displays to pages and posts.
Reviews
Changelog
0.8
- Add first-class manual pool-workout creation and editing with coarse totals or structured sets, repetitions, strokes, notes, and optional timing.
- Preserve timing provenance so only explicitly measured repetition times can become performance evidence; do not manufacture personal-best times from set totals, intervals/send-offs, derived timing, or workout duration.
- Keep manual workouts as explicit authoritative manual sources with transactional owner-scoped editing/rebuilding and protection against rewriting imported workouts as manual.
- Add up to three workout photos with upload, replacement, deletion, and Workout Details presentation.
- Preserve per-length FIT stroke counts from compatible Apple Watch, Garmin, and FORM pool-swim recordings and display per-length strokes plus available total strokes on Workout Details.
- Preserve pool-session heart-rate and cadence metrics from FIT sources.
- Improve Apple Watch FIT device identification while preserving the recorded model.
- Use FIT Activity local timestamps for historical local workout times when available, with WordPress timezone fallback.
- Add transparent gzip and ZIP workout-source extraction for supported TrainingPeaks/FORM exports while preserving the original archive in protected storage and enforcing expanded-size/path validation.
- Advance the internal database schema to 0.9 for normalized per-length stroke counts, including existing-installation upgrade handling.
- Expand private/deterministic FIT, compressed-import, schema-migration, and Workout Details regression coverage across supported PHP versions.
0.7
- Add native dynamic WordPress blocks for Latest Workouts, Personal Bests, Upcoming Events, Workout, Training Log, and Progress while retaining all six legacy shortcodes.
- Share the existing PHP rendering/query layer between blocks and shortcodes so public authorization, defaults, validation, and output semantics remain consistent.
- Add InspectorControls for shortcode-equivalent options, including age-group personal bests, monthly/annual training logs, workout selection, and personal-best progression.
- Preserve workout-record ownership, page/post-author swimmer resolution, no logged-in-viewer fallback, and separate open-water GPS route opt-in.
- Keep progression calculations and chart data authoritative in PHP/front-end rendering rather than duplicating business logic in block editor JavaScript.
- Add six-block integration, security/privacy, and release-packaging regression coverage across PHP 7.4 through 8.4.
- Add explicit per-swimmer REST API permission (default OFF) plus an in-plugin REST API help/documentation screen linked from Swimmer Configuration.
- Add workout numbers to the administrative Workouts list and Workout Details screen for easier workout identification.
- Add Create Post/Edit Post workflow from Workout Details, creating a draft post with an automatically generated swim title and the native Workout block linked to that workout.
- Improve public workout-table responsiveness and readability, including horizontal overflow handling, protected column headings/values, and more compact table typography.
- Add Wide and Full alignment support metadata to all six native swim blocks.
0.6
- Harden canonical pool/open-water matching, timestamp handling, type-aware queries, annual totals, admin filtering, and public presentation.
- Add transactional workout rebuilds from preserved FIT, CSV, GPX, and TCX source files.
- Add defensive GPX and TCX open-water import through the normalized importer.
- Expand open-water analytics with 1 km splits, estimated moving-time splits, heart-rate/cadence charts, sparse/corrected GPS handling, and optimized trackpoint processing.
- Add configurable rolling pool stroke training-volume analytics, with a per-swimmer 1–24 month period (3-month default), separate meter/yard rankings by total distance, and current event-readiness summaries.
- Add explicit opt-in public open-water route sharing and improved self-contained geographic route context.
- Add scheduled Garmin synchronization for pool swims and known-location open-water swims.
- Add saved open-water location coordinates and conservative first-GPS-fix matching within 500 meters, with ambiguous matches left for review.
- Improve Garmin Personal API import-state presentation, per-activity/batch location workflows, and duplicate/review handling.
- Harden FIT recording-device identity and normalize recording-device presentation.
- Add an authenticated read-only swimlog/v1 REST API for external integrations while excluding private source data and open-water GPS coordinates.
- Add complete admin drill-down documentation for all registered public shortcodes, including swimlog_progress.
- Expand deterministic open-water/import regression coverage without publishing private activity files.
- Repair release-package automation and maintain PHP 7.4 through 8.4 regression coverage.
- Fix REST API swimmer authorization to use the installed own-results capability.
- Harden upgrades from v0.5, including GPX/TCX upload defaults and schema migration coverage.
- Make preserved-source rebuild authority deterministic and persist the authoritative import used for normalized structure.
- Add Garmin scheduled-sync operational telemetry for last attempt, last success, last error, result counts, and next scheduled check.
- Correct open-water HR/cadence chart elapsed-time origin and add numeric saved-location boundary coverage.
- Make the 42-day event-readiness policy explicit and add analytics metric unit/provenance metadata.
- Advance the internal database schema to 0.8 for persisted source-authority metadata.
0.5
- Add first-generation open-water FIT import, GPS/lap preservation, route visualization, analytics, and Garmin Personal API matching/import.
- Keep open-water workouts isolated from pool personal-best evaluation.