# RaceCraft Release Notes

This document tracks all notable changes to RaceCraft across releases.

---
## v2.5.3 15/08/26

### 🛠 Bug Fixes

* Fixed the production deployment image so Fly includes the internal `racecraft` package required by `app.py` during Gunicorn startup
* Resolved the release regression that caused `racecraft.win` to return a blank page behind a Fly `502`/connection-reset proxy error

---
## v2.5.2 15/08/26

### 🛠 Bug Fixes

* Fixed share-plan email reuse so existing share tokens are re-canonicalized to the RaceCraft host before sending

### ✨ New Features

* Added route-based sunlight indicators (sunrise, sunset, civil dawn, civil dusk) to Planner and Race Day
* Added Planner sunlight timeline strip, checkpoint phase chips, and phase-based recommendations
* Added a standalone Planner sunlight pill beside the Segment/Checkpoint table, with sunrise and sunset markers tied to the matching segment rows
* Added Race Day live sunlight status updates tied to entered actual checkpoint timing
* Added a new Planner weather widget with tabbed modes for **Current** conditions and **Race Day Window**
* Added race-window weather view showing **Day Before**, **Race Day**, and **Day After** cards based on the selected race date
* Added graceful partial availability handling: unavailable race-window days now render as **Not available yet** instead of blocking the full widget

### 🛠 Improvements

* `/api/calculate` now returns a normalized `sunlight` payload for multi-day race timelines
* Added timezone fallback metadata for deterministic behavior when timezone resolution is unavailable
* Simplified the Planner sunlight summary card to show only a shortened timezone label
* Removed the extra Planner sunlight summary status and recommendation lines to keep the card compact
* Weather widget values now update dynamically when the metric/imperial units toggle is switched (no page reload required)
* Improved weather card contrast so forecast icons remain visible against card backgrounds

---
## v2.5.1 20/05/26

### ✨ What's New

* **Better Race Day Experience** — The Race Day page now shows your race as a clear, easy-to-follow timeline organized by segments. Track your progress through each leg of your race at a glance, with all the key information right where you need it
* **Stay Informed About Updates** — You'll now see what's new whenever RaceCraft updates, so you never miss out on new features and improvements

### 🎯 Improvements

* **Richer Race Day Information**:
  - Your segment notes now appear on Race Day cards for quick reference during your race
  - See how long you're actually spending at each checkpoint with color-coded indicators that compare your planned vs actual stop times
  - "Segment Distance" labels are now clearer and easier to understand
  - Cleaner, less cluttered display with streamlined information
* **More Reliable Performance** — Behind-the-scenes improvements that make the app faster and more stable

### 🛠 Bug Fixes

* **Race Day Tracking Improvements**:
  - Fixed issues where some race metrics weren't displaying correctly
  - You can now clear arrival and departure times when needed, and all your projections will update correctly
  - ETA calculations are now more accurate throughout your race
  - Fixed crashes that could occur with certain race plans
* **Stability Improvements** — Resolved several issues that could cause the app to behave unexpectedly

## v2.5.0 14/05/26

### ✨ New Features

* New interactive route map above the elevation profile with Street and Satellite view options
* Elevation-profile hover now syncs with the map and shows richer timing details (including projected time of day when a start time is set)
* PDF exports now include Drop Bag Cue Cards to make aid-station execution easier during race day
* Added water carry strategy guidance in cue cards for clearer between-checkpoint planning

### Improvements & Fixes

* Share Plan links and share-by-email flows are more reliable
* Route loading now handles invalid files and failures more cleanly
* Stability and access-control improvements for connected account data

---
## v2.4.0 12/05/26

### ✨ New Features

* New flexible nutrition system with reusable custom fuel types for gels, drink mixes, bars, and more
* Plan fuelling per segment for far more accurate race nutrition strategies
* Brand new drop bag fuel planner with editable checkpoint packing lists
* Automatic fuel quantity aggregation makes drop bag prep dramatically easier
* Carb coverage indicators instantly highlight under-fuelled checkpoints
* Race-wide fuel summaries give a clear picture of total nutrition requirements
* PDF exports now include detailed drop bag nutrition packing summaries for race day execution
* Start and finish checkpoints now behave like full aid stations across the planner and PDF exports
* PDF exports now include “Leave Checkpoint With” targets for clearer fuel and water planning
* Race details like athlete name and bib number now save with your plan and appear in PDF exports

### Improvements & Fixes

* More reliable elevation charts in PDF exports
* Better loading feedback when opening and switching race plans
* Improved draft restore behaviour when loading race plans
* Stability improvements across fuelling, checkpoints, drafts, and PDF exports


---
## v2.3.2 05/05/26

### ✨ New Features & Improvements
- **Share Plan** — share any race plan with others via a time-limited link or email. Recipients get a one-click import that loads the plan into their own RaceCraft session for independent editing
  - Generate a 24-hour share link from the overflow (⋮) menu or from any plan item in the Load Plan modal
  - Optionally send the link directly to someone's email address
  - Recipients visit the link and confirm to import — the plan is theirs to edit and save as their own
  - Works for both saved server-side plans and anonymous/localStorage plans

---
## v2.3.1 14/04/26

### ✨ New Features & Improvements
- **Elevation chart**: clickable segments and checkpoints, hover effects, and aligned click/hover detection radii
- **Clickable Segment/checkpoint rows**: you can now click on the rows and it opens the segment/checkpoint editing screen
- Custom carb intake table added to the segment notes modal with a live Total Custom Carbs summary
- Segment stats panel added to the top of the segment notes modal
- Custom fuel column included in PDF drop bag table and tags; Start bag tag included so first-segment fuel is visible
- Terrain difficulty dropdown added to the segment edit modal, synced back to the left panel on save
- Centralized terrain options, removing the unused design spec

### Fixes 
- OAuth: preserve race plan and redirect back after Google login; validate return URL before redirecting

## v2.3.0 10/04/26

### ✨ New Features & Improvements
- **Segment View** — a brand new dual-row race plan table! Segments and checkpoints each get their own row, making it much easier to scan splits, stop times, nutrition, and hydration at a glance. Toggle between Segment View and the original Classic View with a single click
- **Wall-clock arrival & departure times** — when a race start time is set, Segment View now shows the real-world time you expect to arrive at and depart each checkpoint
- **Drop bag badge in Segment View** — checkpoints with a drop bag show a badge directly in the table row so you can see at a glance where your bags are waiting
- **Per-checkpoint stop time overrides** — set a custom stop time for individual checkpoints without affecting the global default. A badge on the checkpoint label shows the override, and clicking it removes it instantly
- **Course Difficulty column** — a new Course Difficulty column now appears in both Segment View and Classic View (and in the PDF export), showing the terrain and gradient difficulty for each segment
- **Segment notes** — add free-text notes to any segment directly in the race plan table. Notes are saved with your plan and included in the PDF export
- **Checkpoint notes in PDF export** — checkpoint notes you've added now appear in a dedicated table at the end of the exported PDF, with alternating row colors and a clear header
- **Auto-import waypoints for known races** — when a known race is selected, all waypoints are imported automatically. Manual waypoint import UI is retained for GPX uploads
- **Custom checkpoint names hide the CP-number prefix** — when a checkpoint has a custom name, only that name is shown (e.g. "Aid Station Alpha" instead of "CP2 Aid Station Alpha") in elevation profile labels, hover tooltips, and terrain difficulty dropdowns

### 🛠 Bug Fixes
- Fixed a NaN guard issue and deduplicated pacing restore logic that could cause incorrect pace values to persist after editing

## v2.2.3 09/03/26

### ✨ New Features & Improvements
- New feature: There is now a helpful tooltip that appears when you hover your mouse for pace warnings in the Race Plan Table 
- New Race Day Countdown card! Set your race date in the Race Day Timings section and a live countdown to race day will appear in your results summary — colour-coded green, orange, or red as the date approaches
- Each input section in the Race Configuration panel is now collapsible. Sections are collapsed by default showing just the title and a brief description, and can be expanded on demand — making it easier to navigate the planner without scrolling past settings you're not actively using 


### 🛠 Bug Fixes
- There was a small issue with the Final Pace calculation - it included the terrain skill regardless if it was enabled or not. This is now fixed and tidied up in this release 
- The technical skill level for the terrain difficulty section was being applied to the final pace regardless of whether it was enabled or not. This has been fixed in this release! 

## v2.2.2 06/03/26

### 🔥 Hot Fix 
- The cache busting was missing from 8 shared modules meaning there were cache issues causing browser instability when loading the app if it had been cache previously. This release fixes the issue.

## v2.2.1 05/03/26

### ✨ New Features & Improvements
- Good news! You can now use Google to securely sign-up/sign-in! Less steps to get access to your race plan. You can still use your email/password if you prefer - both methods will work and as long as you sign-in using the google account that has the same email address, your accounts will be linked
- Added a metric/imperial units toggle button! Now you can easily toggle between your preferred units
- Other minor UI improvements including changing the wording from "calculate" to "simulate" to more accurately describe what RaceCraft does 🏁

### 🛠 Bug Fixes
- no bugs were squashed in the making of this release

## v2.2.0 04/03/26

### ✨ New Features & Improvements
- Onboarding screen now released! A popup now walks you through setup whenever you have loaded the planner for the first time. It helps the user (YOU!) with setting up RaceCraft quickly with less of the struggle and more of the "what happens in my upcomming race" 🎉
- Improvement: removed the now redundant "total number of checkpoints" input field. This was cluttering the UI and you can already add/remove checkpoints using the + symbols 

### 🛠 Bug Fixes
- When setting the avg checkpoint time to 0mins (or leaving it blank) there was a small bug where the default became 5mins. Fixed in this release
- Drop Bag Contents for Each CP now calculates start to finish requirement if no drop-bags added.
- If the avg cp stop time was set to 0mins, it defaulted to 5mins which blew up the total cp time. In this release, if the cp stop time is set to 0mins or left blank, it defaults to 0mins. 


## v2.1.5 03/03/26

### ✨ New Features & Improvements
- Added checkpoint data to UTA100, UTA50 and UTMB-Miler 🎉 
- Added all the OuterLimits races for 2026 

### 🛠 Bug Fixes
- the version-badge was navigating to a broken link - fixed in this release 

## v2.1.4 03/03/26

### 🛠 Bug Fixes
- Critical bug fixed with elevation gain/loss not being calculated correctly when loading known races. 
- Uploading GPX files were unaffected by this bug
- Frontend display for the gpx-info box now displays the same information as the gpx upload method 

## v2.1.3 02/03/26

### ✨ New Features & Improvements

* **Name & Save modal** — You can now name a race-day plan 
* **Race Day reset improvements** — Clearing your plan now properly removes the sync banner and fully resets the state.
* **PDF export layout improvements** — Better spacing and cleaner formatting in exported plans.
* **Calculation reliability upgrades** — Refined exception handling for more stable plan generation.


### 🛠 Bug Fixes

* Resolved cancel button race condition in the Name & Save modal.
* Additional fixes identified during PR review.




## v2.1.2 27/02/26

### Features
- Enhance UI with terrain and fatigue toggle buttons; old checkboxes were difficult to see and click on
- You can now show your support for this app by buying me an energy gel! Just tap the energy gel in the top right hand corner of the page - thank you so much for showing some love! 
- You can now sign-in on any page - not just the landing/planner/race-day pages - yay for less clicking and navigating around
- Documentation has been updated for more better user understanding 

### Bug Fixes
- Some minor bugs were squashed in this release - the app is now more stable! If you notice anything, please report via the contact page 🐛

## v2.1.1 25/02/26

### Features
- Implement 12h/24h time format toggle across all pages and add utility functions for time formatting

## v2.1.0 25/02/26

### Features
- Shareable Race Day link for non-users! 😮 Now you can share youre Race Day plans with your support crew without them needed to create an account or sign-in. 
- Crew or support can update real arrival and departure times, and those changes ripple forward through every remaining checkpoint, recalculating what the rest of the race now looks like. It takes the plan from a static prediction into a dynamic strategy.
- All updates are synced with the original owner/create of the plan so all users stay up to date with what is happening on race day
- No reception? No problem! The app will store all the data on your device and sync to the server when connected again. 

### Bug Fixes
- Fix issue where sign-in was not recognised on the Race Day page

## v2.0.0 23/02/26

### Features 
This version brings an exciting new feature: 

🎉 A Race Day Page! 🎉

- A page dedicated for Race Day with live execution of race plans
- "Exporting to Race Day" creates an independent, editable Race Day plan
- Because we know the crew are out and about, this page is mobile-first, optimized for one-handed use on mobile and tablet screens
- Editable arrival and departure times for each checkpoint
- Instant recalculation of checkpoint times, cumulative time, and finish ETA
- Dynamic downstream timing adjustments after edits
- A Crew-friendly editing experience


## v1.9.4 22/02/26
- Default hidden columns view for race plan table 
- Version badge now opens a "Whats New" window
- Documentation names now rendered in title case

## v1.9.3 22/02/26
- Fix #175 issue with landing page icon for ios home screen shortcut

## v1.9.2 20/02/26
- Fix: issue with known races not loading in some environments due to path handling (added fallback paths for local dev)

## v1.9.1 20/02/26
- Fix: Preserve original GPX filename for display and API usage, separate from safe storage filename #148
- Fix: Load waypoints from known races #136

## v1.8.8 16/02/26
- Minor improvements to documentation and added release history. No functional changes in this release.

## v1.8.7 16/02/26

### New Features 
- Users can now import and claim local storage plans #164
- Keyboard & Input UX — Checkpoint Distances
    - Tab navigation: Moves focus to next/previous .checkpoint-distance input (Shift+Tab supported).
    - Enter commit: Pressing Enter commits the field — validate, sort, recalc (if GPX loaded), and persist draft.
    - Change-only updates: UI reloads/recalculations run only when the input value actually changed (avoids unnecessary work).

### Bug Fixes:
  - Fixed PDF export bug where race plan table was not rendering correctly due to missing styles.
  - Fixed issue with checkpoint distance inputs not becoming editable after certain interactions by ensuring proper event handling and state management.

## v1.8.6 15/02/26

### New Features
- Local Browser Storage for Unauthenticated Users #156
- Move sign-in notification to top center for better visibility and aesthetics #157
- Add local browser storage fallback for user identification when Supabase is not configured #156
- Auto-Save Race Plan to Local Storage (Draft Persistence) #155
- Feat: implement draft persistence system for race plans using localStorage #155

### Bug Fixes 
- no bugs in this release 

## v1.8.5 14/02/26

### New Features
- NEW FEATURE: Automatic checkpoint sorting by distance #146
  - Checkpoints are automatically sorted in ascending order when distance is changed
  - Sorting preserves all checkpoint metadata (names, icons, notes, dropbags, terrain)
  - Backend defensive sorting ensures data integrity regardless of input order
- NEW FEATURE: Insert checkpoint between existing checkpoints #146
  - "+" button between checkpoint rows for easy insertion
  - Automatically suggests midpoint distance between adjacent checkpoints
  - Auto-sorts after insertion to maintain proper order
- NEW FEATURE: Delete individual checkpoints #146
  - Trash icon button on each checkpoint row
  - Confirmation prompt for checkpoints with custom names/notes
  - Minimum checkpoint validation (at least 1 required)
- IMPROVEMENT: Backend validation for checkpoint data #146
  - Validates ascending order, no duplicates (within 10m)
  - Rejects negative distances
  - Descriptive error messages for validation failures


## v1.8.4 11/02/26

### New Features
- Added "Distance" column showing segment distance (not cumulative) [#145]
  - Placed between Segment and Cumul Dist columns for better clarity
  - Can be hidden like other columns
  - Included in PDF exports
- Column visibility controls - show/hide table columns [#145]
  - Click column headers to hide columns
  - Hidden columns displayed as chips above table
  - Click chips to restore columns
  - "Show All" button to restore all columns
  - Column visibility persisted in localStorage
  - PDF export respects column visibility
  - CSV export always includes all columns

### Improvements
- Column visibility system now only allows hiding/showing columns that are currently relevant [#145]
  - "Time of Arrival" column can only be hidden if start time is set
  - "Fatigue" column can only be hidden if fatigue tracking is enabled
  - "Terrain" column can only be hidden if terrain difficulty is enabled
  - "Course Difficulty" column can only be hidden in target time mode
  - Prevents confusion from hiding columns that aren't being used

### Bug Fixes
- Fixed missing cumulative_distance in loaded plans [#145]
  - Old saved plans now have distance and cumulative_distance calculated on load
  - Applies to both local file storage and cloud storage
- Checkpoint metadata not saved/loaded correctly in Supabase due to missing field in database schema [#143]

---

## v1.8.3 11/02/26

### New Features
- Add version number to main screen [#20]
- Add Buy Me a Coffee link to about page [#22]
- Add top action bar with menu toggle and profile button [#142]

### Bug Fixes
- Resolve issue with documentation on mobile screens rendering poorly [#140]
- Resolve issue with PDF export modal input field labels difficult to read in dark mode [#138]

---

## v1.8.1 10/02/26 - Hot Fix Release

### Bug Fixes
- Resolves issue with tooltip ghost rendering after mouse moves away

---

## v1.8.0 10/02/26

### Security
- Fixed XSS vulnerabilities in checkpoint name/metadata rendering
- Improved file upload validation with case-insensitive XML pattern checks
- Added type guards for checkpoint metadata access
- Sanitized error messages to prevent information leakage

### New Features
- GPX waypoint parsing and import as checkpoints
- Checkpoint editing with custom names, icons, and notes
- Light/Dark/Auto theme support with persistent preference

### Bug Fixes
- Fixed stale checkpoint metadata when importing waypoints
- Improved error handling with detailed logging

### UI Improvements
- Fixed theme switching for elevation chart colors
- Fixed modal escape key handler memory leak
- Added missing CSS variables for proper dark mode support

---

## v1.7.0 08/02/26

### New Features
- **Distance-Adaptive Base Pace Estimation**
  - Calculate base pace from known race performances (5K to ultra)
  - Uses Riegel's formula for performance prediction
  - Automatic intensity downshift for ultra-distances (>42.2km)
  - Toggle between manual pace entry and performance-based estimation
  - Seamless integration with existing pacing calculations

---

## v1.6.2 06/02/26

### Improvements
- Added cache busting to static assets by appending version query parameter in template

---

## v1.6.1 06/02/26

### Terminology Update
- Renamed "Gels/Sachets" to "Servings" throughout the application
  - UI labels, variable names, API fields, and exports all updated
  - Maintains backward compatibility: accepts both `carbs_per_gel` and `carbs_per_serving` in API
  - CSV/PDF exports now display "Number of Servings" instead of "Number of Gels"
  - Hover tooltips and documentation updated with new terminology

### New Features
- Added about page with markdown content and new navigation menu
- New PDF export with improved formatting and elevation profile integration

### Improvements
- Elevation profile plot now uses linear distance scale with bounded range
- Replaced checkpoint input toggle with button
- Removed export/import button

### Bug Fixes
- Resolved bug with target time validation where achieved times slightly above target were incorrectly flagged as invalid due to strict equality check - now uses a tolerance window to allow for minor allocation variability while still enforcing realistic target times

---

## v1.6.0 05/02/26 - Target Time Mode

### New Features
- **Target Time Mode**: Plan by desired finish time instead of pace
- Revised UI to support target time input and display estimated finish time

### Improvements
- Limit number of checkpoints to 30 for better performance and usability
- Distance column now shows accumulated distance at each checkpoint for clearer pacing strategy

### Bug Fixes
- Fixed flat-terrain pace calculation where a value of 0 resulted in a default of 30 due to falsy check

---

## v1.5.3 03/02/26

### Improvements
- Move all docs to folder and organize
- Update README with new links

---

## v1.5.0 03/02/26 - Known Races Feature

### New Features
- Display loaded plan name in UI title [#64]
- Add manual import for local and unowned plans [#59]
- Support anonymous user plans in list/load/delete endpoints [#56]

### Bug Fixes
- Clear form inputs and state on user sign-out [#60]

---

## v1.4.1 02/02/26

### Bug Fixes
- Fix Supabase client initialization to be lazy and handle invalid credentials gracefully
- Improved logging for authentication processes
- Input fields now cleared on GPX load or user sign-out to prevent stale data issues

---

## v1.4.0 02/02/26 - Supabase Integration

### New Features
- **Supabase Integration for User Authentication and Data Storage**

---

## v1.3.4 31/01/26

### Bug Fixes
- Fix decimal input validation for numeric fields
  - Change input type from 'number' to 'text' for all decimal-input fields
  - Fields updated: avg-cp-time, carbs-per-hour, water-per-hour, carbs-per-serving, checkpoint-distances
  - Enables proper JavaScript control over decimal input without browser interference

---

## v1.3.3 31/01/26

### Bug Fixes
- Fix decimal input for checkpoint distances
  - Change input type from 'number' to 'text' to allow JavaScript full control
  - Maintain pattern and inputmode for mobile keyboard support

---

## v1.3.2 30/01/26

### New Features
- **Validation Rules Implemented**:
  - Real Numbers: Inputs must be valid positive numbers
  - Distance Limits: Cannot exceed total route distance
  - No Duplicates: All checkpoint distances must be unique
  - Ascending Order: CP2 > CP1, CP3 > CP2, etc.
  - Immediate Feedback: Errors show instantly with visual indicators
  - Keep user informed and prevent invalid submissions to input fields

---

## v1.3.1 30/01/26

### Bug Fixes
- Quick fix to resolve port issues with Docker file

---

## v1.3.0 30/01/26

### Improvements
- CSV export now doesn't leave behind temporary files on the server
- Single parent directory for data storage, configurable via environment variables

---

## v1.2.2 30/01/26

### New Features
- Add drop bag plan to each of the tooltip hovers in the elevation profile plot [#26]

### Bug Fixes
- Fix incorrect serving count in drop bag plan when carbs per serving is specified
- Fix incorrect hover info tooltip for skill level in index.html

### Improvements
- Update export_csv function to improve checkpoint naming format in CSV output

---

## v1.2.1 29/01/26

### New Features
- Add iOS Home Screen and PWA meta tags for improved app integration [#23]

### Improvements
- Update skill level descriptions in index.html for clarity and improved user guidance
- Update technical skill level descriptions and options in index.html
- Update GPX upload handling to display distance and elevation gain, and fetch elevation profile
- Update header background color and adjust subtitle opacity
- Remove background from logo and update CSS styling for header text
- Update fav-icon to circle

---

**Last Updated**: February 11, 2026
