style-src 'self' (without unsafe-inline) silently blocks style="..."
attributes introduced via innerHTML — the CSS parses fine and the
attribute is present in the DOM, but the browser never applies it,
so every bar rendered at its track's full width regardless of its
real percentage. script-src stays locked down; this only loosens
CSS, and no untrusted external content is ever rendered into a
style attribute here.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
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>