Releases: sethwv/game-thumbs
Releases · sethwv/game-thumbs
v1.8.1
Added
- AHL now uses HockeyTech as its data source
Changed
- HockeyTech provider now skips playoff bracket seasons with TBD teams, selecting the first season with a complete roster instead
- Fixed league thumb and cover layouts to prevent overlapping and clipping when combining logo, title/subtitle, and icon elements (#121 by @brheinfelder)
v1.8.0
Added
- Generic league event cover and thumbnail support with optional
title,subtitle, andiconurlquery parameters for non-matchup events (e.g. motorsports races) - #116 by @brheinfelder - Custom font support with a font registry system and bundled Saira Stencil fonts (OFL v1.1)
- Docker mount support for custom fonts
- US Open Cup (
usa.open) and USL Championship (usa.usl.1) leagues - #118 by @trevorswanson ALLOW_EVENT_OVERLAYSenvironment flag to gate event overlay rendering- Filesystem-backed image caching replacing in-memory caches
Fixed
- Critical fix for HockeyTech API key extraction - older versions of game-thumbs may fail to retrieve data without this update
- Improved error handling and logging for team-not-found cases
Security
- canvas updated to 3.2.3 (integer overflow fix in image data operations)
- axios updated to 1.15.0 (proxy handling and header injection vulnerabilities)
v1.7.0: Bump path-to-regexp from 8.3.0 to 8.4.0 (#112)
Added
- MLBStats provider - integrates the free MLB StatsAPI (no API key required), enabling support for MiLB, KBO, and other baseball leagues tracked by MLB without needing a third-party API key
- Minor League Baseball (
milb,milb-aaa,milb-aa,milb-high-a,milb-a,milb-winter,milb-independent) - all four MiLB levels plus winter and independent leagues, powered by the new MLBStats provider;milbautomatically searches all sub-levels via feeder leagues - Korean Baseball Organization (
kbo) via the new MLBStats provider - Formula 1 (
F1), NASCAR (NASCAR), and IndyCar (INDY) - placeholder leagues that return a mood-colored background with the league logo for any matchup request (no team logos or team data required) skipLogosleague config property - when set on a league, all matchup requests automatically use fallback/league-logo mode regardless of team parameters; custom leagues can use this flag to opt in- Pinnable Docker image tags for dev branch pushes - in addition to the branch name tag, each push now also produces a
branch-shatag (e.g.,dev-a1b2c3d4) for fully reproducible deployments
Changed
- Container healthcheck command simplified to use
curlin both the Dockerfile anddocker-compose.yml, and now correctly respects the$PORTenvironment variable - 2026 Winter Olympics leagues now use
skipLogosmode - Provider team and color caches migrated from in-memory Maps to the filesystem (
.cache/subdirectories), reducing memory footprint and persisting cache data across server restarts
Fixed
- Image cache TTL is now enforced on every cache hit by checking file modification time - previously, cached images could persist indefinitely across server restarts even after the configured TTL had elapsed
- Team matching: slug prefix matches in the ESPN provider no longer produce a perfect score, reducing incorrect matches for inputs that are ambiguous prefixes of multiple team slugs
TeamNotFoundErrorconstruction and available-team name extraction is now consistent across all providers, fixing cases where the error message omitted available teams depending on which provider handled the request
v1.6.0
Added
- Added
winnerquery parameter for matchup endpoints (/thumb,/cover,/logo) to visually highlight the winner by rendering the losing team in greyscale (35% opacity + greyed colors). - Added style 98: “3D embossed with league logo” (style 99 remains “3D embossed” without league logo).
- Added optional root route behavior via
ROOT_REDIRECT_URL:- When set,
GET /returns a 301 redirect to the configured docs URL. - When not set,
GET /returns a 444 with a docs suggestion (same overall “not found” semantics).
- When set,
- Added/expanded league definitions in
leagues.json:- Soccer: Euros + qualifying, UEFA Nations League, CONCACAF Nations League, AFCON + qualifying, English National League (+ north/south), FA Community Shield, FA Trophy, Scottish League Cup, English Women’s Super League
- Hockey: EIHL
- Cricket: The Hundred (men/women), IPL, BBL, CPL, BPL, PSL, MLC, NZ Super Smash, SA20, Nepal Premier League, T20 Blast
- Rugby: Six Nations (men/women), URC, Premiership Rugby, EPCR Challenge Cup, Rugby World Cup (men/women), Rugby League World Cup, Super League, MLR
- International baseball: World Baseball Classic (with light/dark logo assets)
- Added generic
ncaaleague definition with NCAA logo andfallbackLeague
Changed
- Improved team matching priority in
teamUtils:- Reduced exact city match score (700 → 500)
- Increased partial name/shortDisplayName match scores (400/300 → 700/650) so team-name matches beat city-only matches.
- NCAA route behavior: if the
:sportsegment isn’t a recognized NCAA shorthand, the route now callsnext()so the genericncaaleague routes can handle it instead of returning a 400. - Docker compose now maps
${PORT}to${PORT}(instead of host${PORT}→ container3000), aligning container port with the configured appPORT.
v1.5.2 Hotfix
Fixed
- Hardened FlagCDN country/team resolution to reduce incorrect matches by:
- Rejecting empty/whitespace-only inputs as not-found
- Rejecting very short normalized inputs (< 2 characters)
- Enforcing a minimum match score (≥ 700) before accepting a country match
Full Changelog: v1.5.0...v1.5.2
v1.5.1 Hotfix
Fixed
- Improved FlagCDN country/team matching to better handle inputs without spaces (e.g.,
unitedstates→united states) by:- Scoring exact “no-spaces” matches highly
- Adding “no-spaces starts-with” matching for partial inputs
Full Changelog: v1.5.0...v1.5.1
v1.5.0
Added
- Added Custom Teams support via
teams.json(custom: true) for teams not present in any provider data (e.g., conference teams, all-star teams, special events). Custom teams:- Bypass provider lookups entirely
- Can auto-extract colors from the provided logo when colors are omitted
- Support aliases and resolve with highest priority
- Added Olympics league aliases (e.g.,
olymh,olywh, “winter olympics”, etc.). - Added initial custom team entries:
- NFL: NFC and AFC (custom teams with official ESPN logo URLs)
- Olympics: GB alias expansion (Great Britain / UK variations)
Changed
- Improved rendering controls for fallback/placeholder scenarios with a
skipLogosflag so generators can intentionally render no team logos (used for Olympics missing-team fallback behavior). - Updated thumbnail and logo split styles to hide the white divider line (set to transparent), while keeping the underlying geometry intact (easy to re-enable later).
- Improved badge handling:
- Rejects empty/whitespace-only badge values
- Normalizes badge text (trim + collapse multiple spaces)
- Standardized FlagCDN provider “not found” errors to
TeamNotFoundError(instead of a country-specific error), aligning with the app’s fallback chain. - Dev script now enables
ALLOW_CUSTOM_BADGES=trueby default. - Dependency bumps: axios, canvas, cors.
Fixed
- Prevented custom teams from being mis-logged as provider-resolved teams by ensuring “custom” resolution is identified consistently in fallback logging.
Full Changelog: v1.4.0...v1.5.0
v1.4.0
Added
- Added two new matchup image styles for thumbnails and covers:
- Style 5: dark grid background
- Style 6: grid background tinted with team colors
- Added automatic support for many ESPN leagues that aren’t configured in
leagues.jsonby detecting them and generating a temporary league configuration on the fly. - Added an NCAA provider to improve NCAA team logo coverage by fetching official NCAA SVG logos and converting them to PNG.
- Added team aliases for Missouri State across NCAA men’s basketball and NCAA men’s volleyball.
- Added
ncaaas an additional provider option for several NCAA leagues, and changed many NCAA sports to fall back to NCAA men’s basketball for broader team coverage. - Added new matchup logo default behavior: styles 1, 5, and 6 include the league logo by default (unless
logo=false).
Changed
- Improved team matching robustness, including better handling of “State”/“St” variations and making aliases usable across fallback/related leagues.
- Darkened extracted dominant colors slightly to improve contrast in generated images.
- Unified and strengthened
fallback=truebehavior across endpoints, including a last-resort text placeholder if league logo processing fails.
Removed
- Removed the ESPN Direct Lookup API routes and documentation (direct
/espn/:sport/:league/...endpoints).
Fixed
- Improved fallback performance and reliability by resolving matchup teams in parallel, searching feeder leagues in parallel, and reusing a single processed league-logo placeholder when both teams are missing.
- (#86) Removed unsupported image types from accept header in imgUtils. This was preventing some NCAA logos from downloading and rendering correctly
Full Changelog: v1.3.0...v1.4.0
v1.3.1
Fixed
- Improved image download/processing reliability by validating downloaded image content and rejecting unsupported formats (including SVG or HTML error pages) instead of failing later during rendering.
- Hardened fallback-team generation so invalid/empty league logo downloads are detected and handled cleanly.
- Improved matchup fallback behavior by resolving teams in parallel and reusing a single processed league-logo placeholder when both teams need fallback.
Full Changelog: v1.3.0...v1.3.1
v1.3.0
Added
- Added tennis support (ATP/WTA) for matchup thumbnails/logos/covers, including doubles teams via
+(e.g.,djokovic+federervsnadal+murray). - Added optional league feature flags to enable/disable high-cost athlete leagues (e.g., Tennis, MMA) via environment variables.
- Added new supported leagues:
- USHL (HockeyTech)
- English FA Cup, EFL Cup, Copa del Rey
- Scottish leagues and cups (Premiership, Cup, Championship, League One, League Two)
- Added PWHL dark-mode league logo asset support.
Changed
- Improved badge handling by allowing custom badge values when explicitly enabled via
ALLOW_CUSTOM_BADGES. - Improved team logo fallback by allowing leagues to pull missing logos from configured feeder leagues.
- Updated ESPN athlete provider behavior for athlete-based sports:
- Uses sport-specific styling (e.g., tennis palettes) and better fallbacks (e.g., country flags when headshots are missing).
- Improves cache behavior and startup performance by persisting provider cache to disk and refreshing in the background.
- Adds rate limiting controls for ESPN athlete fetching to reduce the chance of provider throttling.
Fixed
- Fixed split-style thumbnail generation so one missing/broken team logo no longer prevents the other team logo from rendering.
- Reduced failures/noise when athlete headshots are missing by treating expected ESPN headshot 404s as normal and falling back when possible.
Full Changelog: v1.2.0...v1.3.0