Releases: dschoepel/stats-for-strava-config-tool
v1.2.6
What's New
Added
-
Most Recent Milestones widget — added
mostRecentMilestonesto the default widget definitions. This widget displays a timeline view of your key achievements and milestones over time. Configurable vianumberOfMilestonesToDisplay(default: 5). Added to the default dashboard layout at 33% width.Example
config.yamlusage:appearance: dashboard: layout: - { 'widget': 'mostRecentMilestones', 'width': 33, 'enabled': true, 'config': { 'numberOfMilestonesToDisplay': 5 } }
Documentation
- Updated widget definitions help docs to include
Most Recent Milestonesand the previously undocumentedAthlete Profilewidget in the default widgets table. Updated default widget count to 23.
Full Changelog: https://github.com/dschoepel/stats-for-strava-config-tool/blob/main/CHANGELOG.md
v1.2.5
What's Changed
Docker Image Optimization
- Enabled Next.js
output: 'standalone'mode — production image is now 129 MB, down from ~2.05 GB (~94% reduction). The runtime stage no longer runsnpm ci; only the traced standalone output, static assets, and public directory are copied. - Added root-level
.dockerignoreto reduce build context (excludes.git,node_modules,runner/,helper/,docs/, etc.). - Updated
docker/supervisord.confto launch Next.js vianode server.jsinstead ofnpm start, matching the standalone entrypoint. - Fixed standalone server hostname binding: explicitly set
HOSTNAME=0.0.0.0in supervisord so Next.js listens on all interfaces (Docker injectsHOSTNAME=<container-id>by default, which caused 502 Bad Gateway errors with the nginx proxy).
Security Updates
- dompurify (GHSA-v2wj-7wpq-c8vv, CVSS 6.1 XSS) — forced resolution to
>=3.3.2viaoverridesinpackage.json; the vulnerable transitive dependency pulled in bymonaco-editoris now pinned to the patched version. - bcryptjs upgraded
2.4.3→3.0.3— full ESM rewrite; API signatures (hash,compare) are unchanged. Verified via login/logout testing. - framer-motion updated to
12.35.0(patch).
Full Changelog
https://github.com/dschoepel/stats-for-strava-config-tool/blob/main/CHANGELOG.md
v1.2.4
What's New
Added
- Recording Devices section in Gear Config — track GPS watches, bike computers, and other recording devices with purchase prices to calculate cost-per-workout. Device ID is found via the question-mark icon on the recording device page in the app.
- New version available indicator — the sidebar footer now checks GitHub Releases (server-side, cached 1 hour) and surfaces update availability:
- Expanded sidebar: orange "vX.X.X available" link below the current version
- Collapsed sidebar: orange dot badge on the version text
- Notification panel: one-time "New version vX.X.X is available!" notification with a "View Release Notes" action that opens the release in a new tab
- Deduplication via
localStorageensures the notification fires only once per new release version
Fixed
- Normalized the
retiredfield handling for gear items and fixed async settings loading in the gear configuration editor.
Chore
- Enforced LF line endings project-wide via
.gitattributes. - Added
docker-compose.override.ymlto.gitignoreto prevent local Docker overrides from being committed.
Full Changelog: https://github.com/dschoepel/stats-for-strava-config-tool/blob/main/CHANGELOG.md
v1.2.3
What's Changed
Added
- Optional API Key for AI Configuration — The API key field in the AI Provider Configuration section is now gated behind a Use API Key checkbox, making it optional rather than unconditionally required.
- When unchecked: the API key field is hidden and the key is saved as blank in YAML (
key:) - When checked: the API key field appears and must be non-empty before saving
- Auto-initializes on load: if an existing key is present in YAML the checkbox is automatically checked; if the key is blank it remains unchecked
- The internal
useApiKeyflag is stripped before saving and never appears in the YAML output
- When unchecked: the API key field is hidden and the key is saved as blank in YAML (
Behavior Summary
| Checkbox state | Key field | Validation | YAML output |
|---|---|---|---|
| Unchecked | Hidden | None | key: (blank) |
| Checked + key empty | Shown, error | Required message shown | Blocked from saving |
| Checked + key entered | Shown, valid | None | key: sk-abc123... |
| Loaded with existing key | Auto-checked | N/A | Key preserved |
| Loaded with blank key | Auto-unchecked | N/A | Key stays blank |
Full Changelog: https://github.com/dschoepel/stats-for-strava-config-tool/blob/main/CHANGELOG.md
1.2.2 — Add New Strava Sports Types, Vulnerability Fix
Release Date: February 22, 2026
This patch release resolves a local storage vulnerability and adds new Strava sport types to the default list.
ℹ️- If the new sports types don't appear in the Settings -> Sports List, you have two options:
- Add them manually
- Delete the file called
strava-sports-by-category.yamlin./config/settings/folder. Restart the docker container for thestats-for-strava-config-tooland it will be recreated with the new sport types.
Security
- Upgraded
nextto16.1.6to address security advisories affecting earlier versions.
Changed
- Replaced direct
localStorageaccess with centralizedsrc/utils/browserStorage.jshelpers to ensure SSR safety. - Marked client-only components with the
"use client"directive where required.
Added
- Added default sports to
INITIAL_SPORTS_LIST:Basketball,Volleyball,Cricket,Dance,Padel.
Fixed
- Resolved server-side ReferenceError caused by
localStorageusage during build; project builds successfully.
v1.2.1 - Code Quality and Stability Improvements
Release Date: January 27, 2026
This patch release resolves lint errors, React Fast Refresh warnings, and improves code quality across the configuration tool.
🐛 Bug Fixes
- React Fast Refresh Compliance: Extracted
ConfigContextanduseConfighook to separate file to eliminate Fast Refresh warnings in Next.js - DaemonConfigEditor: Removed unused dialog handler functions and fixed React hook dependency issues
- State Management: Fixed
handleRemoveCronJobto use functional setState pattern, preventing potential race conditions - Error Handling: Added proper error logging in widget definitions initialization
- Error Suppression: Enhanced AppShell to suppress known prop warnings from react-js-cron library
✨ Improvements
- User Guidance: Added reminder in Daemon configuration to restart daemon container after schedule changes
- Widget Support: Added
athleteProfilewidget definition to widget definitions manager
🔧 Technical Changes
- Updated 11 component imports to use new
useConfig.jsexport - Wrapped
cronJobsinuseMemowith proper dependencies - Improved hook dependency arrays across DaemonConfigEditor
📦 Upgrade Notes
No breaking changes. This release is fully backward compatible with v1.2.0.
Docker Image: ghcr.io/jonocairns/stats-for-strava-config-tool:v1.2.1
Full Changelog: https://github.com/[your-repo]/compare/v1.2.0...v1.2.1
v1.2.0 — SFS Console Feature & Documentation Update
Release Date: 2026-01-26
This major release introduces the SFS Console — a complete system for executing Statistics for Strava Symfony console commands directly from the web interface. It also includes a comprehensive documentation restructure and numerous bug fixes.
Highlights
- 🖥️ SFS Console — Run Statistics for Strava commands from a terminal-like UI
- 🔒 Two-Container Security Architecture — Secure command execution with validation separation
- 📚 Restructured Documentation — Cleaner README with dedicated guides in
docs/ - 🐛 Critical Bug Fixes — NumberInput multi-digit typing, session security improvements
What's New
SFS Console Feature
A terminal-like interface for running Statistics for Strava Symfony console commands without SSH access:
- Real-time streaming — Live output via Server-Sent Events (SSE)
- Command allowlist — Configurable list of safe commands in
console-commands.yaml - Command history — Track past executions with status badges
- Log management — View, download, and delete command execution logs
- Command discovery — Auto-detect available commands from the container
- Parameter support — Pass arguments to commands
- Stop functionality — Properly terminate running commands
- Navigation protection — Prevents accidental page leave during execution
Two-Container Security Model
Secure architecture separating validation from execution:
| Container | Role |
|---|---|
| stats-cmd-runner | Validates commands against allowlist, proxies requests. No Docker socket access. |
| stats-cmd-helper | Executes validated commands via docker exec. Has Docker socket access. |
Other New Features
- Resting Heart Rate — Track resting HR history in the Athlete section
- Days Used Unit — New gear maintenance tracking option
- Currency Input — Formatted currency input for gear pricing
- Token Refresh — New
/api/auth/refreshendpoint for extending sessions
Documentation Improvements
Restructured documentation for better usability:
| Document | Description |
|---|---|
| README.md | Streamlined quick start (~150 lines) |
| docs/INSTALLATION.md | Complete installation guide (Docker, Standalone, Nginx) |
| docs/FEATURES.md | Detailed feature documentation |
| docs/SFS-CONSOLE-SETUP.md | SFS Console setup guide |
| docs/TROUBLESHOOTING.md | Consolidated FAQ and troubleshooting |
| docs/AUTHENTICATION.md | Authentication and security details |
Bug Fixes
- NumberInput Bug — Fixed critical Chakra UI v3 issue where typing multi-digit numbers resulted in corrupted values. Created
SafeNumberInputwrapper component. - Session Security — SESSION_SECRET now regenerates on password change, invalidating all existing tokens
- Configuration Integrity — Fixed issue where athlete section was incorrectly merged into
config.yamlin split-file mode - Sports List — Fixed file detection and auto-repopulation on startup when file is empty
- Token Error Codes — Improved distinction between TOKEN_EXPIRED and TOKEN_INVALID errors
- Log Directory — Fixed path resolution in download-log API
Changed
- Container Names — Renamed for brand clarity:
strava-runner→stats-cmd-runnerstrava-command-helper→stats-cmd-helperSTRAVA_RUNNER_URL→STATS_CMD_RUNNER_URL
- Default View — Configuration menu collapsed by default for cleaner initial view
- Dark Mode — Improved styling consistency throughout the application
Technical Changes
New API Routes
| Route | Purpose |
|---|---|
GET /api/strava-console |
Runner health check |
GET /api/strava-console/discover |
Command discovery |
POST /api/strava-console/stop |
Stop running command |
GET /api/console-logs |
List command logs |
GET /api/download-log |
Download log files |
POST /api/auth/refresh |
Token refresh |
Component Refactoring
- StravaConsole split into 14 focused sub-components
- useStravaConsole hook split into 5 domain-specific hooks
- Console error boundary for graceful error recovery
- Comprehensive mobile responsiveness
Upgrade Notes
For Existing Users
-
Pull the latest images:
docker compose pull
-
If using SFS Console, add the new services to your
docker-compose.yml:- See docs/SFS-CONSOLE-SETUP.md for setup instructions
-
Update environment variables if you had the old names:
STRAVA_RUNNER_URL→STATS_CMD_RUNNER_URL
-
Restart your containers:
docker compose up -d
Breaking Changes
None — all changes are additive. SFS Console is optional and disabled by default.
Container Images
| Image | Tag |
|---|---|
ghcr.io/dschoepel/stats-for-strava-config-tool |
v1.2.0, latest |
ghcr.io/dschoepel/stats-cmd-runner |
v1.2.0, latest |
ghcr.io/dschoepel/stats-cmd-helper |
v1.2.0, latest |
Full Changelog
See CHANGELOG.md for complete version history.
Full Changelog: v1.0.1...v1.2.0
v1.0.1 - Add Resting Heart Rate and Days Used
[1.0.1] — 2026-01-19
Added
- Resting Heart Rate Configuration: Added support for tracking resting heart rate history in the Athlete section
- New RestingHeartRateEditor component for managing resting HR values over time
- Integrated with athlete configuration schema
- Gear Maintenance Enhancement: Added "days used" as a new unit option for tracking gear usage
- Provides more flexible tracking options alongside existing distance-based units
Fixed
- Configuration Integrity: Resolved critical issue where athlete section content was being merged back into
config.yamlwhen saving general section, despite athlete being in a separateconfig-general-athlete.yamlfile- Fixed split file save logic to properly exclude nested sections from parent file
- Ensures clean separation of configuration sections across split files
- Added validation to ensure heart rate zones do not overlap or have gaps between them
- Code Quality: Resolved lint errors in AthleteConfigEditor component
- Removed React Hooks from inside render prop callback
- Cleaned up unused imports and variables
Changed
- Updated configuration schemas to support new resting heart rate field
- Enhanced gear maintenance schema with additional unit option
v1.0.0 — Initial Release of the Visual Configuration Editor for Stats for Strava
Initial Release — v1.0.0
This is the first official release of the Stats for Strava – Configuration Tool, a web-based companion application that makes configuring your Statistics for Strava dashboard simple, guided, and error-free.
This version is fully functional, stable, and ready for general use.
✨ Highlights
📝 Form-Based Configuration Editor
- Guided forms for every Stats for Strava configuration section
- Real-time validation and required field indicators
- Type-specific controls (dropdowns, number inputs, date pickers, switches)
- Visual editors for heart rate zones, FTP history, weight history, and cron expressions
🔧 Configuration Management
-
Full support for all Stats for Strava configuration sections:
General, Athlete, Appearance, Import, Metrics, Gear, Zwift, Integrations, Daemon
-
Automatic configuration backups with timestamped filenames
-
Auto-created settings folder for tool-specific configuration
📊 Dashboard & Widget Tools
- Dashboard layout editor
- Sports List Editor
- Widget Definitions Editor with 20+ built-in widget templates
- Support for single-instance and multi-instance widgets
🛠️ YAML Utility
- YAML validation
- Syntax-highlighted file viewer
- YAML merge/combine tool
- Monaco Editor integration
🔒 Authentication
- Single-user login system
- First-time registration
- Password reset
- Secure bcrypt hashing and signed cookies
- Session persistence (default 7 days)
🔔 Notifications
- Lightweight reminder system for unsaved changes and required follow-up actions
- Badge indicator in the navbar
🎨 UI & Architecture
- Chakra UI v3 with semantic tokens and full dark mode support
- Responsive design for desktop, tablet, and mobile
- Unified AppShell layout with breadcrumb navigation
- Clean separation between UI (
app/) and infrastructure (src/)
🖼️ Screenshot
Screenshot: The dashboard view showing multi-file configuration mode, section mapping, and YAML utilities.
🐳 Docker Image
A prebuilt Docker image is available:
ghcr.io/dschoepel/stats-for-strava-config-tool:1.0.0
Works with Docker Compose, Portainer, or direct docker run.
📄 Documentation
- README.md — Installation, Docker setup, usage guide
- AUTHENTICATION.md — Login, registration, password reset
- DEVELOPER.md — Architecture and contribution guidelines
🙌 Thank You
This release marks the first stable milestone of the project.
Feedback, issues, and suggestions are welcome as the tool continues to evolve.
What's Changed
- Full form-based configuration editor with field descriptions, validation, and type-specific controls
- Guided editors for complex data structures:
- Heart rate zones
- Weight history
- FTP history
- Cron expression builder
- Dashboard and widget management tools:
- Dashboard layout editor
- Sports List Editor
- Widget Definitions Editor (20+ built-in widget templates)
- YAML Utility:
- YAML validation
- Syntax-highlighted file viewer
- YAML merge/combine tool
- Monaco Editor integration
- Gear Maintenance Utility for tracking mileage and service intervals
- Automatic configuration backups with timestamped filenames
- Auto-created settings folder with:
config-tool-settings.yamlstrava-sports-by-category.yamlwidget-definitions.yaml
- Single-user authentication system:
- First-time registration
- Login/logout
- Password reset
- Secure bcrypt hashing and signed cookies
- Session persistence (default 7 days)
- Notifications system with navbar badge indicator
- Unified AppShell layout with breadcrumb navigation
- Dark-mode-ready UI using Chakra UI v3 and semantic tokens
- Docker image published to GitHub Container Registry
- Support for standalone Node.js usage and reverse proxy deployments
New Contributors
Full Changelog: https://github.com/dschoepel/stats-for-strava-config-tool/commits/v1.0.0
