Release history
All notable changes to SkillCorner App are documented here. Each release includes new features, improvements, bug fixes, and tests.
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.
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.
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.
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.
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.
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.
Filter API calls are debounced by 150ms, preventing redundant requests when rapidly adding/removing filter chips.
Added min-w-0 constraints and reduced cell padding so the shortlist table fits within its grid column without causing page-level horizontal scrollbars.
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'.
Selected external player names are stored in sessionStorage so chip labels survive page refresh instead of showing raw 'hl:84035' identifiers.
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.
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.
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.
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.
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.
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 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.
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.
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.
Players now show which saved lists they belong to through inline badges and list-count labels, making cross-list overlaps visible during shortlist review.
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.
Extended saved-lists tests now verify member snapshot payloads and fallback rendering for players that are missing from the read-only SkillCorner dataset.
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.
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.
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.
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.
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.
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.
One-click export of the active list as "Player Name — Team — Position" lines. Handy for sharing via email or messaging apps.
This page — a release history for the application. Accessible from the sidebar navigation. Documents all features, fixes, and improvements across releases.
The "Shortlist" tab now shows a count badge with the number of saved players when an active list is selected (e.g. "Shortlist (12)").
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.
Tests cover CRUD, idempotent add, no-op remove, cascade delete, cross-list membership, and batch lookups.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Full Polish translations for the entire scouting module — 60+ keys covering all UI labels, empty states, and tooltips. Language persisted in localStorage.
Dynamic OG image generation with SkillCorner branding. Correct metadataBase for production URLs. Branded SVG favicon.
Resolved React #418 hydration mismatch, YouTube error 153 (embed restrictions), and filter state persistence across tab switches.
End-to-end tests for Highlightly API integration — evidence search, geo restrictions, match context. Tests evidence caching, empty states, and video embed rendering.
The original data browser for match-level physical metrics. Configurable filters, split-by modes, and paginated DataTable with export capabilities.
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.
View data split by player+match, player, team, or team+match. Average-per toggle between match and 90-minute normalization. Configurable minutes threshold.
Sortable columns, configurable page size, sticky headers. Items-per-page selector with first/prev/next/last navigation.
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.
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