Changelog

Release history

Changelog

All notable changes to SkillCorner App are documented here. Each release includes new features, improvements, bug fixes, and tests.

Performance & Live Search

3.2.02026-04-08

Scouting filters load instantly with server-side caching, virtualized dropdowns render 10k+ players without freezing, and a new Highlightly live search lets you find any player globally — with photos from TheSportsDB.

FeatureHighlightly live search in dropdowns

Player and team dropdowns now search Highlightly API in real-time (debounced 400ms, cached 24h). Type 5+ characters to find any footballer worldwide, including those not in the local SkillCorner database.

FeatureExternal players in shortlist

Players found via Highlightly (e.g. Robert Lewandowski) appear in the shortlist with profile data from Highlightly — name, club, position, age. Physical metrics show as '—' when SkillCorner tracking data is unavailable.

FeaturePlayer photos from TheSportsDB

When Highlightly has no player image, the app now falls back to TheSportsDB (free API) for cutout and thumbnail photos. Photos are cached in the evidence database for instant reuse.

ImprovementServer-side filter cache

Filter queries against the read-only SkillCorner database are now cached in memory. Repeated requests return instantly instead of re-running 6-8 SQL queries against 2M rows.

ImprovementVirtualized filter dropdowns

Player and team dropdowns use @tanstack/react-virtual to render only visible items. Opening a 10k-player dropdown went from 2-5 second freeze to instant.

ImprovementDebounced filter fetching

Filter API calls are debounced by 150ms, preventing redundant requests when rapidly adding/removing filter chips.

FixShortlist table horizontal overflow

Added min-w-0 constraints and reduced cell padding so the shortlist table fits within its grid column without causing page-level horizontal scrollbars.

FixPlayer 360 profile for external players

External players now show full Highlightly profile (name, club, position, age) and TheSportsDB photo in the Player 360 panel instead of 'Unknown team / Unknown role'.

FixExternal player labels persist across refresh

Selected external player names are stored in sessionStorage so chip labels survive page refresh instead of showing raw 'hl:84035' identifiers.

Scouting Visual Enrichment

3.1.22026-04-08

Scouting now pulls Highlightly logos and player imagery into the review flow. League and team visuals are cached in the writable evidence database, while player photos remain best-effort with graceful fallbacks when the provider has no image.

FeatureHighlightly asset cache for scouting

Added a dedicated scouting asset cache in football-evidence.db and a batch /api/scouting/assets route. The main SkillCorner database stays read-only while logos and photos are hydrated from Highlightly on demand and reused across requests.

FeatureLeague and team visuals in match review

Recent matches, the evidence header, selected filter chips, and shortlist team cells now show Highlightly league and club logos when a reliable match is available.

FeaturePlayer avatars in selection workflows

Current Selection, Player 360, and saved-list sidebar entries now display player imagery from Highlightly when available, with initials-based fallbacks for players whose profile image is missing.

ImprovementBetter matching for lower-profile clubs and competitions

Added country-code resolution and conservative name-cleanup heuristics so domestic leagues and clubs with prefixes like SV, US, or FC resolve more reliably without attaching the wrong badge.

TestAsset lookup regression coverage

New tests cover scouting asset lookup helpers alongside the saved-list snapshot contract so image enrichment stays aligned with the existing scouting data model.

Saved Lists UX Pass

3.1.12026-04-08

Saved Lists are now easier to work with during scouting review: sidebar members carry real player context, list management supports multi-list selection, and shortlist actions no longer depend on a preselected active list.

FeatureClickable saved members in the sidebar

Saved list entries now render player name, team, and position from the primary SkillCorner dataset. Players that still match the current scouting scope can be opened directly in Player 360 from the sidebar.

FeatureManage lists from player actions

Shortlist rows, Current Selection, and Player 360 now expose a dedicated list picker so one player can be added to or removed from any saved list without switching the active list first.

ImprovementVisible multi-list memberships

Players now show which saved lists they belong to through inline badges and list-count labels, making cross-list overlaps visible during shortlist review.

ImprovementScope-aware sidebar list state

Saved members now indicate when they fall outside the current scouting scope, and long lists can be expanded in place instead of collapsing into anonymous player IDs.

TestSaved list detail snapshot coverage

Extended saved-lists tests now verify member snapshot payloads and fallback rendering for players that are missing from the read-only SkillCorner dataset.

Saved Lists & Changelog

3.1.02026-04-07

Persistent player watchlists for the Scouting module — create named lists, add/remove players with one click, filter by saved only. Plus a new Changelog page to track all releases.

FeatureSaved Lists (Watchlists)

Create multiple named lists (e.g. "Winter targets", "U23 wingers") to track players across scouting sessions. Lists persist in the local database and survive page reloads. Includes full CRUD — create, rename, delete with cascade cleanup.

FeatureBookmark column in shortlist table

New first column with a clickable bookmark icon per row. Filled bookmark = player is on the active list. Click to toggle — uses optimistic updates for instant feedback. Saved rows get a subtle primary tint for quick scanning.

Feature"Saved only" filter mode

Toggle in the sidebar filters the shortlist table to show only players from the active saved list that match current scouting filters. Shows intersection of "saved players" and "current scope" — useful for reviewing a curated list through different filter lenses.

FeatureSave/Remove in Player 360

Button in the Player 360 header to add or remove the current player from the active list. Hover-swap pattern: "Saved" label transforms to "Remove" on hover with destructive styling. Badge shows which list is active.

FeatureSidebar saved lists panel

New panel in the shortlist sidebar with: list selector dropdown (DropdownMenu), inline create input (Enter to save, Escape to cancel), mini player list with remove buttons (max 8 entries + overflow count), saved-only toggle switch, and copy-to-clipboard button.

FeatureCopy list to clipboard

One-click export of the active list as "Player Name — Team — Position" lines. Handy for sharing via email or messaging apps.

FeatureChangelog page

This page — a release history for the application. Accessible from the sidebar navigation. Documents all features, fixes, and improvements across releases.

ImprovementTab count badge

The "Shortlist" tab now shows a count badge with the number of saved players when an active list is selected (e.g. "Shortlist (12)").

Improvement4 new API endpoints

RESTful CRUD API at /api/scouting/saved-lists with list management, member add/remove, and batch membership lookups. Follows the existing evidence/check batch pattern.

Test12 unit tests for saved-lists data layer

Tests cover CRUD, idempotent add, no-op remove, cascade delete, cross-list membership, and batch lookups.

Scouting Module & Video Evidence

3.0.02026-04-06

Complete scouting workspace with recruitment shortlist, Player 360 percentile profiles, and video evidence integration via Highlightly API. Two-database architecture — read-only SkillCorner data + writable evidence cache.

FeatureRecruitment shortlist

Aggregated player table built from 6 metric tables (physical, passes, possessions, off-ball runs, on-ball engagements, under-pressure) via a 7-part CTE. Position-specific column presets. Paginated, sortable, sticky headers. Supports up to 150 players per scope.

FeaturePlayer 360 profile

Individual player deep-dive with percentile rankings against a peer pool (same position group). 8 metric blocks covering physical, progression, off-ball & defending. Visual percentile bars. Recent matches with quick-jump to evidence.

FeatureVideo evidence pipeline

Search highlights by match via Highlightly API. Automatic best-match ranking by team name, league, and date similarity. Inline video player for embeddable highlights. Geo-restriction checking. Results cached in local SQLite database.

FeatureMatch context panel

Statistics (possession, shots, fouls), match events timeline (goals, cards, substitutions with emojis), starting lineups with formations, and head-to-head history. Auto-linked from evidence search via match_provider_id.

FeatureDual-database architecture

Read-only skillcorner.db (monkey-patched prepare() rejects non-SELECT) for player metrics. Writable football-evidence.db for API cache and saved lists. WAL mode, foreign keys enabled, auto-schema migration on first access.

FeatureCascading scouting filters

Competition edition → teams → players → position group. Date range and min-minutes threshold. Collapsible filter panel with state persisted to sessionStorage. Filters sync to URL query string for shareable deep links.

FeatureURL state synchronization

All scouting state (filters, active tab, selected player, selected match) encoded in URL search params. Enables browser back/forward navigation and shareable deep links to specific player profiles.

FeatureInline video player

Best embeddable highlight rendered as inline iframe. Additional highlights listed below with play buttons that open in a modal dialog. Source links for external providers.

FeatureMatch video availability badges

Video icon indicator on Player 360 recent match cards. Batch-checks evidence cache to show which matches have existing highlights without triggering new API searches.

ImprovementPolish language support

Full Polish translations for the entire scouting module — 60+ keys covering all UI labels, empty states, and tooltips. Language persisted in localStorage.

ImprovementOpen Graph metadata

Dynamic OG image generation with SkillCorner branding. Correct metadataBase for production URLs. Branded SVG favicon.

FixHydration & embed fixes

Resolved React #418 hydration mismatch, YouTube error 153 (embed restrictions), and filter state persistence across tab switches.

TestE2E test suite for evidence pipeline

End-to-end tests for Highlightly API integration — evidence search, geo restrictions, match context. Tests evidence caching, empty states, and video embed rendering.

Physical Performance Browser

2.0.02026-04-06

The original data browser for match-level physical metrics. Configurable filters, split-by modes, and paginated DataTable with export capabilities.

FeaturePhysical performance data browser

Browse match-level metrics: distance, sprints, high-speed runs, accelerations, changes of direction. Filter by competition, team, match, player, position, date, result, venue, and age range.

FeatureSplit-by & aggregation modes

View data split by player+match, player, team, or team+match. Average-per toggle between match and 90-minute normalization. Configurable minutes threshold.

FeaturePaginated DataTable

Sortable columns, configurable page size, sticky headers. Items-per-page selector with first/prev/next/last navigation.

FeatureMulti-theme design system

4 color themes (Zinc, Forest, Navy, Light) using OKLCH color space. Theme switcher in sidebar, persisted in cookies. DM Sans / Outfit / JetBrains Mono font stack.

FeatureCollapsible sidebar navigation

240px expanded / 60px collapsed sidebar with branding, navigation, language/theme controls. Collapse state persisted in localStorage. Responsive mobile sheet variant.

SkillCorner App · Built with Next.js 16, SQLite, Tailwind CSS