Skip to main content

Version 2026.26.1

September 2, 2026

Race result pages now show each rider's time gap to the stage/GC leader.

  • Feature Race result pages now show each rider's time gap to the leader (e.g. "+1:24" or "s.t." for the same time) next to their stage and General Classification results, wherever PCS provides finish-time data.
  • Feature Compacted rider names on race result pages to first initial + last name (e.g. "T. Pogačar") for a cleaner, more consistent layout on both desktop and mobile.

Version 2026.26.2:

  • Feature Stage result pages for multi-stage races now have a Stage / GC toggle, showing the General Classification standings as they stood right after that stage, alongside the existing stage-only results.
  • Change Switching tabs on race result and team submission pages (Results/Ranking/Stages/Preview, Stage/GC, Submit/Startlist) is now instant — no more full page reload.

Version 2026.26.3:

  • Fixed Tab switches on race result pages (including the new Stage/GC toggle) no longer wait on the ranking/overall-standings computation, which only the Ranking tab actually needs — switching tabs is now near-instant instead of a ~1 second delay.
  • Fixed Fixed a bug where a stage's profile image could get permanently cached as a broken placeholder if PCS's image URL for it changed after the fact; broken images now hide instead of showing a broken-image icon.
  • Fixed Fixed recent-form averages on team submission pages sometimes showing 0 for every rider — caused by a per-user cache reused across races with a different rider set (e.g. visiting one race's startlist, then another's, within the same hour).

Version 2026.26.4:

  • Feature Added an email preference to your account page: opt in to news and update emails, with a one-click unsubscribe link in every email you receive.

Version 2026.26.5:

  • Feature Added a sticky ad banner at the bottom of the screen on narrower windows, where the side ad rails don't fit.
  • Fixed Fixed a rider's General Classification result for a finished stage race showing out of order in their results list — it now appears alongside that race's final stage instead of its first.

Version 2026.26.6:

  • Fixed Fixed the favorite star toggle doing nothing on duplicate rider cards — it now always works, wherever it's shown.
  • Fixed Fixed team submission ownership checks being off by up to two hours, which could wrongly exclude riders packed shortly before a stage's roster lock from that stage's eligible collection.
  • Fixed Fixed rider cards omitting a stat entirely when its value was exactly 0, instead of showing it.
  • Fixed Fixed the scoring system page breaking when a reward tier has no pack or no coins attached.
  • Fixed Fixed the Teams page browser tab showing the wrong title ("Team Details" instead of "Team Directory").
  • Fixed Fixed a rider's finishing-position percentage on public profile pages incorrectly showing 100% instead of 0% when they were the only participant in that stage or race.
  • Fixed Fixed reloading a pack-opening results page (or converting a duplicate card from it) sometimes incorrectly showing "no longer available" right after a pack had just been opened.
  • Change Dates across the site (account page, race previews, news articles, rider profiles, and more) now render in the correct language format instead of always showing English month names to Dutch-language visitors.
  • Change Visitors whose browser strongly prefers English but also lists Dutch as a lower-priority language are no longer incorrectly redirected to the Dutch version of the site.
  • Change The Ranking page's heading and title now show the current year automatically instead of a hardcoded year.
  • Change Removed a subtle outline that only appeared on two specific teams' jerseys, for visual consistency with the rest.
  • Change Added Dutch translations for the ranking heading, the stage/GC toggle labels, and the "GC standings not available yet" message.
  • {Changed} Backend improvements on schema consistency (every timestamp column now stores time zone information), scraper robustness, security hardening, and further code deduplication across models, routes, and templates.
  • Fixed Backend fixes on silent failure handling in reward/objective-crediting logic, an open-redirect risk, stale production data cleanup, and schema drift in a migration helper script.

Version 2026.26.7:

  • Fixed Fixed crafting a rider with insufficient shards showing no feedback message at all — it now correctly tells you the craft failed.
  • Change Merged the forgot-password page's instructions into one clearer sentence, for both English and Dutch.
  • {Changed} Backend improvements on script/documentation cleanup, further code deduplication across routes and static assets, and design-token consistency in CSS.

Version 2026.26.8:

  • {Changed} Internal maintenance: removed stale to-do notes for already-resolved scraper issues.

Version 2026.26.9:

  • Fixed Fixed the Weekly Warrior objective occasionally undercounting completed weekly objectives, so it now always credits progress correctly toward its target.
  • Change Sped up initial page rendering by loading icon fonts asynchronously instead of blocking the page on three external stylesheets.
  • {Changed} Backend improvements on scraper reliability (stages no longer get stuck permanently incomplete after a transient empty fetch), pack-opening and results-page query efficiency, and further code deduplication across routes.

Version 2026.26.10:

  • Fixed Fixed the sticky bottom ad banner sometimes covering most of the screen on narrower windows — it's now correctly clipped to its intended height.
  • Change The Ranking page's month/division/race-type pills now scroll horizontally on narrow screens instead of wrapping onto multiple lines, and months are listed most-recent-first.
  • {Changed} Internal maintenance: documented the pre_release_branch staging workflow in CLAUDE.md.
  • {Changed} Internal maintenance: archived the unmerged freemium/Supporter feature branch and documented its status in content/dev/freemium.md.
  • {Changed} Internal maintenance: production server hygiene pass — closed a public database exposure, enabled the firewall, removed stale/orphaned server artifacts, and renamed systemd units for naming consistency (documentation and deploy-pipeline references updated to match).
  • Change Static assets (CSS/JS/images/fonts) now carry a version tag derived from each file's own last-modified time, so they can be cached by the browser for much longer without risking anyone seeing a stale version after a change ships.
  • {Changed} Internal maintenance: re-enabled linting (flake8, isort, djlint) in CI, fixing the pre-existing violations.
  • Change Minor rider card rendering efficiency improvement.

Version 2026.26.11:

  • {Changed} Internal maintenance: removed the not-yet-launched Supporter subscription billing routes from the live app (Stripe was never configured, so this was unreachable dead weight) — the underlying database columns are kept as-is so the feature can be rebuilt later without a new migration. See content/dev/freemium.md for what was removed and how to restore it.
  • {Changed} Internal maintenance: production deploys now use pip-sync instead of pip install -r, so a dependency removed from the codebase is actually uninstalled on the server too, instead of silently lingering. Also added an automated check (deptry) that fails CI if a declared dependency goes unused or a used import isn't declared.
  • {Changed} Internal maintenance: linting (flake8, isort) now covers every git-tracked Python file, not just app/ and scripts/scrapers/ — the small number of pre-existing violations found (long lines, missing blank lines, two unused imports, one pointless f-string) were fixed rather than ignored.
  • {Changed} Internal maintenance: documented a plan to extend linting beyond Python/HTML to CSS, JS, JSON, Markdown, SQL, shell scripts, and GitHub Actions YAML, with suggested tools for each, in content/dev/_TO-DO.md.
  • {Changed} Internal maintenance: added an hourly automated server health check (stuck login sessions, stopped processes, failed systemd units, firewall/database-exposure regressions, low disk space), alerting via the same Discord webhook already used for other scraper health checks.

Version 2026.26.12:

  • {Changed} Internal maintenance: removed the working notes from the completed production server review now that every finding has been fixed, documented, or added to the to-do list, since the doc had served its purpose.

Version 2026.26.13:

  • {Changed} Internal maintenance: added a work IP to the production database's access allow-list (same restricted pattern used for the home IP added earlier), and removed a stale reference to the already-deleted Supporter billing routes from the internal to-do notes.

Version 2026.26.14:

  • Fixed Fixed the Achievements and Season Pass pages' locked-tier content being very hard to read (as low as 1.86:1 contrast in places) — the dimmed "locked" look is preserved, but the text underneath it is now legible.
  • Fixed Fixed several low-contrast text spots across the site — including on the Teams, Objectives, and Shard Conversion pages — that fell just short of accessibility guidelines against the dark background.
  • Fixed Added a keyboard skip-to-main-content link, a missing home page heading, and screen-reader labels on the flash-message close button, so keyboard and screen-reader users can navigate the site more easily.
  • Change Centered the Store's pack grid when the last row doesn't fill completely.
  • {Changed} Internal maintenance: fixed several heading-order issues (for screen-reader navigation) across the Info, News, Account, Store, Race Results, and GC Substitution pages, and added a seed-claude-test-user command to the local dev-database tooling for safely testing logged-in pages without real credentials.

Version 2026.26.15:

  • Fixed Fixed a duplicate internal ID between two news articles, which could make one of them unreachable at its own link.
  • {Changed} Internal maintenance: documented in CLAUDE.md that a new changelog file's id must be unique across all of content/news/, to prevent the same duplicate-ID mistake in the future.
  • {Changed} Internal maintenance: dropped the orphaned user_achievement database table, found unreferenced anywhere in the codebase during a models.py/database schema review — superseded by user_achievement_progress/user_achievement_unlocks.
  • Fixed Fixed team logos/flags not rendering for a team with no country code set, found during a models.py/database schema review.
  • Change Player profile pages now load faster on repeat views within a few minutes of each other.
  • {Changed} Internal maintenance: added the ORM-less rider_static table to the local dev-database cloning tool, grouped the GC-substitution page correctly on the internal performance dashboard, and root-caused why /races and the home page are still occasionally very slow for a small number of players (tracked in content/dev/_TO-DO.md — the fix needs a one-off data backfill plus a follow-up code change, not a quick pass).
  • {Changed} Internal maintenance: cleaned up content/dev/ and content/documentation/ — removed several fully-implemented or superseded planning docs, moved completed one-off reviews into content/dev/reviews/, renamed files to match their actual purpose, corrected a handful of stale/contradictory claims (a live AdSense integration two docs still described as "not present," and an in-app-ads compliance inconsistency for the upcoming mobile release), consolidated scattered open items into content/dev/_TO-DO.md, and documented the two folders' intended purpose in CLAUDE.md.