Paste a Best Coast Pairings event link to get roster-only stats:
faction/disposition distribution, per-team ITC rank rollups, and an
optional list-backfill for players missing faction/disposition data
(uses the viewer's own BCP auth token, stored client-side only).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Add refresh-elo job to .gitlab-ci.yml triggered by schedules; runs
the Python scraper and commits updated elo-data.json back to main
- Hide Stat-Check ELO column header on mobile (sm:hidden), fold ELO
score as a subtitle under ITC Points on mobile instead
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Scraper (statcheck-elo-scraper/refresh_elo.py) downloads the stat-check
ELO workbook from OneDrive and builds public/elo-data.json
- GitHub Actions workflow (.github/workflows/refresh-elo.yml) runs daily
at 06:00 UTC and commits updated ELO data
- Frontend fetches elo-data.json and matches players by name, using BCP
career event history to disambiguate same-name candidates
- ELO score shown in new sortable Stat-Check ELO column, visible on all
screen sizes; unmatched players show —
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Ports the career stats feature from the 40K rankings site: fetches
all-time W-L-T per player from BCP and shows it as a subtitle under
each season stat. Also folds W-L-T, ITC Rank, and Win% into the
Player and ITC Points cells on mobile so all stats are visible without
horizontal scrolling. Skeleton loader updated to match.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
W-L-T and ITC Rank appear as sub-text under the player name; Win% appears
under ITC Points. Desktop layout is unchanged. Skeleton loader also gets
matching placeholder lines on mobile.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Removes the standalone Career W% column. Career totals now appear
as a small secondary line inside the W-L-T and Win% cells, loading
asynchronously with a … placeholder while fetching.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
For each roster player, fire a parallel fetch to
/placings?placingsType=player&userId={id} and aggregate
wins/losses/ties across all events that have those fields.
Renders asynchronously - shows … while loading, — if no
data found. Column is sortable.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
stat-check.com's ELO data is behind Microsoft auth with no public
API or download endpoint available. Removing the sync script,
placeholder JSON, CI job, table column, and all related JS.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Helps identify what the server is actually returning when the
download URL doesn't serve the xlsx file.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Python 3.12 (PEP 668) blocks bare pip installs into the system.
Move the install step into the CI script and drop the self-install
fallback from the Python script.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
GitLab's YAML parser treats bare " mid-string as a new scalar.
Single-quote the affected lines and use a | block for the if/else.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- scripts/sync-elo.py: downloads Excel sheet, auto-detects columns,
writes public/elo-data.json keyed by lowercase player name
- .gitlab-ci.yml: sync-elo stage (schedules only) commits the JSON
then a normal push pipeline handles build + deploy; build/deploy
skip on scheduled runs to avoid double deployment
- index.html + main.js: ELO Rank column with sort support; loads
elo-data.json asynchronously and re-renders when ready; fails
silently if data is missing
Requires one-time setup:
1. GitLab project token (write_repository) stored as GITLAB_PUSH_TOKEN
2. Pipeline schedule: cron 0 2 * * 3 (Wednesday 02:00 UTC) on main
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Update deploy path, environment URL, nginx conf, and package name
to reflect the new subdomain.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Clone of the 40K rankings project adapted for Age of Sigmar: leagueId
RtgcexBzqjCM, AOS-branded headings, separate cache key, and CI/CD
deploying to /var/www/domains/gateway-gamers.net/aos-rankings/.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Hero carousel header with logo and photos matching kingmaker site
- Renamed "League Rank" to "ITC Rank"
- Full cursor-paginated standings scan with circular-cursor detection
to handle BCP API's pagination bug at the end of results; incremental
rendering shows results as each page arrives
- credentials:omit on all BCP fetches to prevent session cookie 500s
- GitLab CI pipeline: npm ci + vite build, rsync dist/ to
/var/www/domains/gateway-gamers.net/rankings/ on push to main
- nginx config for rankings.gateway-gamers.net with CSP allowing
connect-src to newprod-api.bestcoastpairings.com
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Converts the standalone leaderboard HTML into a proper build project
matching the kingmaker.gateway-gamers.net pattern: shared header/footer
partials in public/, leaderboard logic in src/main.js, and vite build
outputting to dist/.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>