This MyTraL minor release brings:
- .
- Improved the first login experience in MyTraL DESKTOP incarnation: when no
user profile exists yet, a default
athleteuser ("MyTraL Athlete") is auto-created and auto-logged in, landing straight on the dashboard - no sign-up/login step required. Logging out disables auto-login until the next explicit login, so a second/third user can be added or logged into from the login page. - Calendar and sickness heatmaps now mark today with a yellow rectangle so the
current week and day stand out, and each sickness day's tooltip now reads like
2026-05-25: 3x sickinstead of a bare count.
- Fixed path(s) in Snap which pointed outside of strict confinement filesystem.
- .
This MyTraL minor release brings:
- Published MyTraL to the Snap Store at https://snapcraft.io using strict
confinement. The Snap Store snap runs the local server and opens the UI in the
default browser. Athlete data are stored in
$SNAP_USER_COMMON(~/snap/mytral/common) i.e. are NOT stored in the location used by all other distros - data persist until uninstall (snapd keeps a snapshot for ~31 days aftersnap remove). - Added new body mannequin - from robot-like to realistic anatomical muscle
geometry adapted from the MIT-licensed
react-native-body-highlighter. - Added activity bookmarks - bookmark any activity from its detail page.
- Added an
Elevationaspect to theThis vs. LastandChartspages, comparing weekly, monthly, and yearly elevation gain. The weekly and monthly charts also show a dashed redEveresting(8848 m) reference line so athletes can see whether their cumulative climbing reaches Mt. Everest peak.
- Redrew the body mannequin with realistic anatomical muscle geometry, used everywhere it appears (muscle load, injuries, and sickness). Muscle load now renders as a cool-to-hot volume heatmap.
- Documented both strict and classic Snap installations.
- Documented the missing
python3-allbuild prerequisite for local.debbuilds (make distro-ubuntu-deb) in the installation guide.
- Fixed Ubuntu PPA/
.debinstallation on Ubuntu releases that do not ship Python 3.12 as the system interpreter (trustythroughfocal) -postinstnow usesuvto provision a self-contained Python 3.12 under/opt/mytral, independent of the host's system Python. - Fixed
.debpackageArchitecturemetadata (all->amd64 arm64) to match whatpostinst'suvbootstrap actually supports, soaptrefuses unsupported architectures upfront instead of installing a package that fails during configure. - Fixed
.debpostinstfailing with an unclearuv pip installerror when the bundled wheel orrequirements.txtwas missing - it now fails fast with a clear message.
- Hardened
.debpostinst: the downloadeduvbinary is now verified against a pinnedsha256checksum before extraction, closing a supply-chain gap where a tampered or corrupted release asset would otherwise be executed as root during package installation.
- Rewrote
build/ubuntu/launchpad-release.shto accept an optional Ubuntu codename argument, building (and optionally uploading) a single distribution instead of always looping over every supported version. - Added a
UBUNTU_VERSIONparameter (defaultnoble) tomake distro-ubuntu-deb, and a newmake distro-launchpad-release-versiontarget to build and upload a single Ubuntu version's PPA package.
This MyTraL minor release brings:
- Added a Flatpak distribution (
fitness.mytral.Mytral). The package runs the local server and opens the UI in the default browser. Athlete data are stored outside of the sandbox in the standard MyTraL directory. - Added
Distro TarballGHA workflow that builds the upstream tarball inrel/<major.minor.patch>branches targetingmain. - Added
Distro SnapGHA workflow that builds the Snap package inrel/<major.minor.patch>branches targetingmain. - Added
Distro WindowsGHA workflow that builds the Windows installer and ZIP archive on a Windows runner inrel/<major.minor.patch>branches targetingmain. - Added
Distro FlatpakGHA workflow that builds the Flatpak bundle inrel/<major.minor.patch>branches targetingmain. - Added
distro-win-zipMakefile target that packages the Windows desktop executable into a ZIP archive (distro/windows/mytral-<version>.exe.zip).
- Removed the Waitress WSGI server from the desktop edition. The desktop app serves a single local, so it now uses Flask's built-in threaded server - this removes a dependency and simplifies installation and packaging across Snap, PPA, and the Windows installer.
- Updated
bleachfrom 6.3 to 6.4. - Updated
cryptographyfrom 46.0 to 48.0. - Updated
msgpackfrom 1.0 to 1.2. - Updated
pytest(dev) from 8.4 to 9.0.
- Documented Flatpak install and build.
- Documented Snap build.
- Fixed
distro-win-installerMakefile target which depended on the Linux targets.
This MyTraL minor release brings:
- Switched from Python 3.11 to Python 3.12. The main reason is that Snap 22 runtime
had Python 3.10 and Snap 24 runtime has Python 3.12. New Python constructs - like
type,override, andT- will be incorporated as I go.
- Added improved Windows installer make targets and build artifacts.
- Added Ubuntu
resoluteto Launchpad PPA.
- Fixed "missing waitress" server in the MyTraL installation from PPA
aptlog.
- Banner improved by the switch to MyTraL WWW palette.
This MyTraL minor release brings:
- Fixed and refactored Snap distribution builder to have
snapcraft.ioon repository paths required by snapcraft.io, use host's vs. container's resources correctly, and avoid use of (host) hard-coded paths.
This MyTraL minor release brings:
- Added Windows installer built with Inno Setup 6
(
build/windows/installer/mytral-setup.iss). Installs toC:\Program Files\MyTraL\, registers an uninstaller, and optionally creates a Desktop shortcut. - Added
distro-windows-installerMakefile target to build the Windows installer after the desktop executable is built withdistro-desktop-build-win. - Added
distro-windows-cleanMakefile target to remove Windows installer build artifacts. - Added Ubuntu PPA distribution for Ubuntu via Launchpad (
ppa:ultradvorka/sport). - Added
distro-ubuntu-debMakefile target to build.debpackage locally. - Added Snap package distribution for universal Linux package management. Opens a native desktop window via FlaskUI via classic confinement. User data stored in default locations.
- Fixed elevation chart rendering in the application's analysis page by smoothing the GPX points.
- Fixed
.debpackaging: Python dependencies are installed into an isolated virtualenv at/opt/mytral/venv/- system Python environment is never polluted. - Fixed
.debwrapper scripts to exportMYTRAL_INCARNATION,MYTRAL_USER_REGISTRATION, andMYTRAL_ENABLE_CACHEenvironment variables for correct desktop startup.
- Fixed top calendar week navigation which was slooow as it was build on the frontend - moved it to the backend.
- Fixed top feed day navigation which was slooow as it was build on the frontend - moved it to the backend.
- Fixed duplicated activities list loading by the
routes.py::calendar_view()
- Added MyTraL configuration guide.
- Added Ubuntu PPA installation guide.
- Added Ubuntu .deb installation guide.
This MyTraL minor release brings:
- Added Windows 10 distribution build to GH release.
- Fixed Desktop binary environment variables based setup so that athletes can create accounts OOTB.
- Added Ubuntu distribution build guide.
- Added Python @ Ubuntu distribution guide.
- Added Debian @ Docker distribution guide.
- Added Fedora @ Docker distribution guide.
This MyTraL minor release brings:
- Added activity type color border hint to goals, gear, and several other pages.
- Added Strava synchronization of individual activities from the activity GET page.
- Added card encouraging athlete to create an activity to pages which need at least one activity to render.
- Added weight to gear.
- Added tarball distribution.
- Added Debian @ Docker distribution.
- Added Fedora @ Docker distribution.
- Added weight field to gear model allowing track the weight of your gear like running shoes, or bikes.
- Fixed km / hour usage of retired gears with no history.
- Fixed exercise / symptom delete message to contain display name (not UUID) when removing these entities from an activity.
- Removed color from Strava links on the day activities view and search result view.
- Fixed exercise and symptom delete pages to show display names instead of UUIDs.
- Adding the installation documentation.
This MyTraL release is very special to me. After years of coding and hacking together various versions of MyTraL I am moving to a brand-new Git repository on my 50th birthday.
Sports have been my main hobby for 40 years - I have 30 years of training data scattered across everything from paper logs to MyTraL. Today, I’m starting a fresh chapter - free from hacks, sensitive data and the "sins of my youth."
Channeling Steve Prefontaine energy today - pure heart, max effort, FLOSS execution!
- Added polyline with map background to the activity feed.
- Added rainbow polyline w/ running dot to the activity feed.
- Added elevation chart to the activity feed.
- Added "maximize map" action to the activity view page.
- Added description field to symptoms so that user can specify how to cure such injury or illness.
- Added import of Strava bulk user export ZIP archive (activities, GPX/TCX recordings, photos).
- Added TCX import (individual files and directory of recordings/archives).
- Added
genderfield to the athlete profile in order to calculate metrics like TRIMP more accurately. - Added TRIMP calculation and chart to the
Progressmenu. - Added FIT directory import - import all FIT files from a local directory in one go, with automatic conflict detection and parquet generation.
- Bulldozer framework - a multiprocessing-based sandboxed job runner for parallelizing CPU-bound import workloads across multiple cores.
- GPX polyline encoding with 2 selectable methods: fast distance-based sampling (default) and legacy RDP-based simplification for preview rendering. New GPX polyline encoding is ~4000× faster with the new distance-based sampling method - the default for all recording import paths.
- Added meta sport taxonomy based lifetime totals insight page.
- Added new cards on the homepage indicating the risk of injury, gear needed service, suggested activity and weight balance.
- Added resting HR estimate to the athlete metrics page.
- Strava API import is not hidden behing feature flag (just inverse condition on FE).
- Refactored Predictions insight page to two pages - Predictions and Analytics.
- Rewritten task manager, tasks and tasks invocation - removed duplicated task manager definitions, converged to MyTraL's task manager, typed tasks are used from now on.
- Strava bulk ZIP archive import rewritten with Bulldozer framework for parallel photo & recording upload, parquet conversion, and GPX map-data precomputation.
- Polar Precision Performance import rewritten with Bulldozer framework - HRM blob upload and parquet generation now run in .
- Removed
Suffer Scorefrom the ActivityEntity and related forms and HTML code.
- Fixed blobstore logging message which no longer specifies wrong blob type.
- Polar HRM import conflict resolution no longer fails on missing year-cache entries.
fit_toolmonkeypatch tolerates non-UTF8 bytes in FIT string fields (Garmin developer fields), preventing silent parse failures.- Fixed many problems in the Polar PPP import - from user forgetting to switch the activity type, to the source of data (HRM vs. PDD) and the right units.
- Fixed notifications decorator - it's newly tightly coupled w/ the icon.
This MyTraL minor release brings:
- Added import from FIT.
- Added import from GPX - file or directory.
- Added GPX recording management: upload, view metadata, edit name/description/keywords, download, and delete.
- Added storing of recorded data (FIT, GPX, Polar HRM) to Parquet and Polars-based loading/saving.
- Added power zones.
- Added HR zones.
- Added 2D maps rendering for GPX recordings.
- Added athlete performance metrics w/ FTP, aerobic/anaerobic thresholds, ... estimates.
- Added recorded data analytics - ridge/bar/line charts of various metrics.
- Added multi-photo upload support for activities - up to 50 photos per activity.
- Added outfits selection to activity create and update (all) forms.
- Added outfits display to activity detail page.
- Added sickness / injury in time chart.
- Added day-based navigation to the activity feed.
- Added week-based navigation to the caledar activity view.
- Added avatar/photo upload support for users, AI coaches, gear, goals, and exercises.
- Added preview of TabPFN ML-powered predictions feature with dedicated settings and predictions pages (behind feature flag).
- Added sponsor link to the application layout.
- Added Windows binary build.
- Added and expanded sport taxonomy and mappings (new meta_activity_type, many new AT_* constants, Strava/FIT mappings, Concept2 uses AT_ROW_ERG).
- Enriched bootstraps for activity types, exercises, and symptoms (muscle groups, descriptions/default weights, symptom body-part targeting) with new pytest coverage.
- Core data model changes:
ActivityEntity.sportrenamed toActivityEntity.activity_type_key- breaks backward compatibility.- Added
ActivityEntity.avg_cadenceandActivityEntity.max_cadence- consider rides, rowing, swimming, and other activities. - Added
ActivityEntity.meta_activity_type- considerskiaggregating DP/F roller ski, DP/F nordic ski, ... - Added
ActivityEntity.tags. - Added
ActivityEntity.is_plan.
- Reworked photo UI flows (entity photo galleries, activity/exercise photo metadata editor pages, markdown image support) and updated documentation site pages.
- Data migration framework:
- Migration step: rename sport to activity type in activities and gears.
- Migration step: merge new activity types, exercises and symptoms.
- Expert UI tool: migration of activities from one activity type to another.
- Python tool: re-sync Strava activities to re-new lost source attributes.
- Activity update no longer purges source attributes (ID, descriptor and URL).
- Blobstore exception handling in activity view/update routes now only silently ignores
expected
BlobStoreError; unexpected errors are logged and re-raised for easier debugging. - GPX import rewritten to be non-blocking (except upload) and to make intensive work in the asynchronous task.
- Per-request total size limit is now enforced when uploading multiple photos in a single request, preventing excessive memory use.
- EXIF metadata stripping in image processing no longer materialises the full pixel array into a Python list; metadata is cleared in-place, reducing memory allocation significantly for large images.
- HTML documentation is newly generated from Markdown files in this repository.
- Public HTML documentation for mytral.fitness is newly generated from Markdown files in this repository.
- Added random attack which generates synthetic data of all MyTraL entities including attachments and recordings.
This MyTraL minor release brings:
- ACoaches - AI coaching feature powered by LLM providers:
- Configure LLM providers: local Ollama, Anthropic Claude, or OpenAI GPT — each with optional API key stored encrypted at rest.
- Define AI coaches with custom names and system prompts (personality, focus area, coaching style); built-in out-of-the-box prompt templates to get started quickly.
- Persistent multi-turn chat sessions with each coach — full history saved per user.
- Context-aware responses: coaches automatically receive recent activities, PRs, gear, symptoms, and athlete profile as structured context with every message.
- Streaming responses for real-time token-by-token output in the chat UI.
- Fetch available models directly from a running Ollama instance.
- New dependencies:
anthropic,openai,pydantic-ai,griffe.
- Extensibility API: introducing ability of pluggable activities importers.
- Desktop and webapp MyTraL incarnation which controls sign-up and log-in process.
- Users are newly allowed to enable auto-login on desktop.
- Dashboard revamp for better UX - advanced charts refactored to
Insights, this vs. last month moved to the dashboard. - Injection of feature flags to Jinja templates.
- Import of activities from Concept2 CSV, Google Sheets CSV, MyTraL JSON.
- Import of entities from MyTraL JSON files.
- Rewritten Strava API (developer) integration (deprecated due to legal term changes).
- Completely rewritten MyTraL configuration, ability to configure MyTraL using environment variables and default values.
- Fixed directory resolution and use to by compliant with XDG base directory specification https://specifications.freedesktop.org/basedir-spec/latest/
- Removed
desktop.keyto ensure portability in case that MyTraL is used on different machines which share the data. - Fixed discarded fields when updating activities - add/edit/delete exercises/lap/symptom while other fields were modified lead to the loss of data.
- Fixed desktop distribution build as it became the main distribution incarnation going forward.
This MyTraL minor release brings:
- Ability to specify muscle groups for exercises and activity types - shown in the activity detail and day pages.
- Ability to specify body part for symptoms - shown in
Mepage. - Muscle group heatmap in the day presented as manequinn.
- Previous / next day navigation in the day and activity view.
- Structured logging using
structlog. - User dataset size statistics to the account page.
- Deployments and build configuration upgraded from Python 3.10 to Python 3.11.
- Source code migrated to 3.11 constructions like
matchorSelf.
- Progress/PRs grouping based on time e.g. 30' laps.
This MyTraL minor release brings:
- Filtering of fields in create / update activity HTML pages.
- Filtering of exercise types by tag.
- Markdown support for activity, exercise type, gear, outfit, goal, and lap/route descriptions.
- Ranked laps: added
rankedboolean field toLapEntityso individual laps within an activity can be marked as personal bests, mirroring the existingrankedflag on activities. - Progress / PRs page now includes ranked laps in addition to ranked activities, showing lap name, distance, duration, activity types, and date with a link back to the parent activity.
- DRY of Jinja templates - new macros and includes.
- Moved Flask
SECRET_KEYtoMYTRAL_SECRET_KEY(with a random per-start fallback + warning) and restricted CORS origins viaMYTRAL_CORS_ORIGINS. - Made debug mode configurable via
MYTRAL_DEBUGand default server bind host configurable viaMYTRAL_HOST(default127.0.0.1). - Upgraded password hashing to
bcryptand introduced backward-compatible verification for legacySHA-256hashes; updated login to useverify_password. - Hardened Strava integration:
HTTPSOAuth authorize URL, removed token logging, and switched activity export toAuthorization: Bearerinstead of query-string tokens. - Fixed several runtime issues in routes (invalid
enum/inthandling, uninitialized variables, and incorrect activity key type). - Fixed negative index exploitation: added
index < 1guard afterint(index)conversion in exercise and symptom update/delete routes to preventpop(-1)silently deleting the last list element. - Fixed timing side-channel in legacy
SHA-256password verification: replaced==withhmac.compare_digest(). - Fixed CORS origins parsing: added
.strip()to each origin to prevent leading/trailing whitespace causing origin mismatches. - Added
URLandDSNto env-var redaction blocklist on the admin/settings page to prevent credential-bearing connection strings from leaking. - Added boot-time warning log when
MYTRAL_CORS_ORIGINSis not set in the environment. - Added
RuntimeErrorfail-fast guard inrun.pywhendebug=Trueis combined with a non-loopbackMYTRAL_HOSTto prevent accidental remote debugger exposure. - Added unit tests for
hash_passwordandverify_passwordcoveringbcrypt, legacySHA-256, wrong passwords, and empty inputs.
- Fixed
enable_cache=False(passthrough) mode: activities were still served from stale in-memory data on subsequent requests becausedataset_name()andset_dataset_name()were not overridden inPassthroughUserCache, causing_load()to skip filesystem re-reads after the first request. Both methods are now overridden so every request always reloads activity data from the filesystem.
- All dependencies and dev dependency group items pinned with
~=inpyproject.toml. - Security: upgraded
bokeh3.6.3 → 3.8.2 (CVE-2026-21883),flask3.1.0 → 3.1.3 (CVE-2025-47278, CVE-2026-27205),flask-cors5.0.0 → 6.0.2 (CVE-2024-6866, CVE-2024-6844, CVE-2024-6839),jinja23.1.5 → 3.1.6 (CVE-2025-27516),pillow11.1.0 → 12.1.1 (CVE-2026-25990),requests2.32.3 → 2.32.5 (CVE-2024-47081),tornado6.4.2 → 6.5.4 (CVE-2025-47287),urllib32.3.0 → 2.6.3 (CVE-2025-50182, CVE-2025-50181, CVE-2025-66418, CVE-2025-66471, CVE-2026-21441),werkzeug3.1.3 → 3.1.6 (CVE-2025-66221, CVE-2026-21860, CVE-2026-27199).
This MyTraL minor release brings:
- Eisenhower matrix HTML page for goals.
- Ability to tag exercises to filter them and to create routines/sets.
- Admin view with the deployment environment introspection.
CLAUDE.mdremoved as its content is getting obsolete (GitHub copilot and Augment AI is used for agent assisted coding).pipbasedMakefileas well asrequirements*.txtfiles removed as switch touvis definitive and there is no need to keep these files with gradually obsolete content.
- Fixed unexplainable set of minutes and seconds when creating / updating an activity.
- Units format and hints in charts y-axis legends as well as charts hover-over tooltips.
- GitHub Actions workflows to use
uvinstead ofpip. - Fixed deading and writing of unicode characters, like emojis, by forcing UTF-8 encoding in JSON IO persistence functions.
- HTML documentation scripts revamp.
- Added "Why MyTraL?" HTML documentation page.
- End to end review of sources to ensure AGPL license omnipresence.
- SpaceShip.com deployment documentation and artifacts.
- Switched from
black,isortandflake8torufffor configurability and speed. - Code quality toolchain configuration moved from files to
pyproject.toml. - Makefile target to sync data between SpaceShip.com and localhost.
- Updated 2026 year in the copyright.
This MyTraL minor release brings:
- Pass through cache allowing to operate on system where caching would cause data inconsistency (data modified & uploaded to cache on 1 node and then overwritten on another node).
This MyTraL minor release brings:
- Weight graph shows the Monday's date instead of the week number.
- Goals listing page shows activity type display name instead of the ID.
This MyTraL minor release brings:
- Onboarding logic:
- checklist feature with progress tracking
- User onboarding state management
- Checklist items for profile completion and gear setup
- Completion percentage calculation
- Dismiss and reset functionality for onboarding
- Fixed strava.com import failing due to printing non-ASCII characters to console.
This MyTraL minor release brings:
- Gear Components Feature: Track individual components of gear items
- Add, edit, delete components for any gear (e.g., bike chain, running shoe insoles)
- Automatic usage tracking from activities (distance and time)
- Service interval monitoring (km, hours, and time-based)
- Visual notifications when components require service
- Service history recording with costs
- Component replacement workflow with chain tracking
- Component status management (active/retired)
- Total Cost of Ownership (TCoO) includes all component and service costs
- Support for multiple service intervals per component
- Attention indicators in gear list showing components needing service
- Settings:
- Added 4 metrics for goals, exercises, symptoms, laps and outfits.
- Changed activities and settings (gear, exercises, symptoms, ...) JSON persistence from dicts to lists.
- Enhanced Gear class to support components and component history.
- Updated gear list to show service attention indicators.
- Updated gear detail page to show components table.
- Improved TCoO calculation to include all component costs.
- Activity creation/update now tracks component usage automatically.
- Added web application distribution build.
- Rewritten desktop application executable build.
This MyTraL minor release brings:
- Lap type data model entity, forms, routes and HTML pages.
- Day view.
- Activity feed view.
- Body diagram with interactive injuries and sicknesses filtering.
- Removed
activity_keyfield in theactivity/exercises[]items. - Renamed
activity/exercises[]/nametoactivity/exercises[]/name. - Activity can newly have more than one gear.
- Activity newly has 0 or more laps.
- Route data model entity, forms and HTML pages.
- Version management with the single source of truth (SSOT) approach.
- Scripts for building of the HTML documentation.
- Initial drafts of digitization, terminology and normalization documentation.
This MyTraL major release brings:
- Initial release of MyTraL training log application.
- User authentication and session management.
- Training log entry creation and management.
- Activity tracking (running, cycling, swimming, strength training).
- Interactive Bokeh charts for training data visualization.
- Weekly and monthly training statistics.
- JSON-based data persistence.
- Responsive web interface using Tabler framework.
- WTForms-based form validation.
- Export training data to CSV format.
- Training calendar view.
- Activity filtering and search functionality.
- Secure password hashing for user accounts.
- Session management with Flask-Login.
- CSRF protection on all forms.
- Optimized JSON file operations for faster data loading.
- Lazy loading of chart data for improved page load times.
- Complete README with installation and setup instructions.
- API documentation for backend modules.
- User guide for training log features.
- Development setup guide.
- Flask-based web server configuration.
- Deployment configuration for PythonAnywhere.
- Automated testing with pytest.
- Code quality tools (black, flake8, isort).
- Makefile for common development tasks.
- UV-based dependency management.
This MyTraL patch release brings:
- Initial YAML data format with applications.
- Manually written pure HTML pages no-JavaScript/no-CSS (bar) charts.
The first MyTraL commit - YAML based datasets with Python based scripts.
All notable changes to MyTraL (My Training Log) are documented by this file whose format is based on Keep a Changelog. This project adheres to Semantic Versioning. Find conventions details and template at the bottom of this document.
Version Numbering (Semantic Versioning)
- MAJOR (X.0.0): Incompatible API changes, breaking changes, or major functionality overhauls.
- MINOR (x.Y.0): New features added in a backward-compatible manner.
- PATCH (x.y.Z): Backward-compatible bug fixes, security patches, and minor improvements.
Changes are organized into the following categories:
- Added: New features, functionality, or capabilities.
- Changed: Changes in existing functionality or behavior.
- Deprecated: Features that will be removed in upcoming releases.
- Removed: Features or functionality that have been removed.
- Fixed: Bug fixes and error corrections.
- Security: Security vulnerability fixes and improvements.
- Performance: Performance improvements and optimizations.
- Documentation: Documentation updates and improvements.
- Dependencies: Dependency updates and changes.
- Infrastructure: Build, deployment, and infrastructure changes.
Entry Format
- Use present tense ("Add feature" not "Added feature").
- Start with a verb when possible.
- Be concise but descriptive.
- Reference issue/PR numbers when applicable:
[#123]. - Group related changes together.
- Most important changes first within each category.
Release Date Format
- Use ISO 8601 date format:
YYYY-MM-DD.
Version History Links