Samuel Enocsson 5b9138da25 ci: fix deploy.yml and consolidate workflows
Fix YAML indentation (on:/jobs: were nested under name:), correct
image name from shcizo/myapp to shcizo/pdga-rating, switch registry
auth from GITEA_TOKEN to PACKAGES_TOKEN (auto-injected token lacks
effective registry access), and add packages:write permission.

Remove docker-build.yml since deploy.yml now covers build + push +
deploy in one workflow — previously both triggered on tag push and
raced for the same image tags.
2026-05-22 15:22:41 +02:00
2026-03-20 07:45:38 +00:00

PDGA Ratings Scraper

A comprehensive web application that scrapes PDGA player ratings, calculates rating predictions, and displays them with interactive charts and real-time updates.

Setup

Local Development

  1. Install dependencies:
npm install
  1. Add PDGA numbers to pdga-numbers.txt (one per line)

  2. Start the server:

npm start
  1. Open http://localhost:3000 in your browser
  1. Build and run with Docker:
docker build -t pdga-ratings .
docker run -p 3000:3000 --name pdga-ratings-container pdga-ratings
  1. Open http://localhost:3000 in your browser

Features

Core Functionality

  • Database-first architecture: SQLite database serves as single source of truth
  • Automatic startup population: Reads pdga-numbers.txt and populates missing players at startup
  • User-controlled refresh: Data only updates when user explicitly clicks refresh icons
  • Optimized PDGA scraping: Uses /details page as baseline + only scrapes NEW tournaments for predictions

Rating System

  • Official PDGA ratings: Current player ratings from PDGA website
  • Rating predictions: Multi-day tournament support with weighted calculations
  • Rating history charts: Interactive SVG charts with hover tooltips
  • Rating changes: Shows recent rating changes with color-coded indicators

User Interface

  • Mobile-responsive design: Optimized layouts for desktop and mobile
  • Expandable player rows: Click to view detailed rating history charts
  • Individual refresh controls: Separate refresh icons for ratings, predictions, and charts
  • Progress tracking: Real-time progress bars for bulk operations
  • Error handling: Comprehensive error messages with retry suggestions

Performance & Reliability

  • Respectful scraping: 2-second delays between PDGA requests
  • Smart caching: Database persistence with user-controlled freshness
  • Docker optimization: Alpine Linux with Chromium for stable Puppeteer execution
  • Retry logic: Automatic retries with fallback strategies for network issues

Usage

Basic Operations

  • View ratings: Page loads instantly from database
  • Refresh player data: Click refresh icon next to player rating
  • Refresh predictions: Click refresh icon next to predicted rating
  • View rating history: Click on any player row to expand chart
  • Refresh charts: Click refresh icon in chart title

Player Management

  • Edit pdga-numbers.txt to add/remove players
  • Restart server to automatically populate new players
  • Use "Load All" button to force refresh all player data

API Endpoints

  • GET /api/ratings - Get all player ratings from database
  • POST /api/refresh-player/:pdgaNumber - Refresh specific player
  • POST /api/refresh-round-history/:pdgaNumber - Refresh player predictions
  • GET /api/rating-history/:pdgaNumber - Get player rating history
  • GET /api/database-status - Check database population status

Technical Details

Architecture

  • Backend: Node.js + Express + SQLite
  • Frontend: Vanilla JavaScript with Server-Sent Events
  • Scraping: Puppeteer with Alpine Linux + Chromium
  • Charts: Custom SVG implementation with interactive tooltips

PDGA Integration

  • Uses official PDGA /details page for rating calculations
  • Only scrapes tournaments played AFTER last official round
  • Respects PDGA servers with proper delays and retry logic
  • Handles both current ratings and historical data

Docker Configuration

  • Alpine Linux base for minimal footprint
  • Pre-installed Chromium for Puppeteer
  • Non-root user for security
  • Proper volume mounting for data persistence
S
Description
Find rating for known players
Readme 1.4 MiB
Languages
JavaScript 63.8%
CSS 21.7%
EJS 14.2%
Dockerfile 0.3%