Skip to content
 
 

Latest commit

 

History

206 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
TourneyRadar

Find chess tournaments happening near you and around the world.

Next.js TypeScript Supabase Tailwind CSS Vercel CI License: Apache 2.0 Stars

tourneyradar.com


TourneyRadar puts 1,100+ upcoming chess tournaments across 80+ countries on one interactive map, updated weekly.

Chess tournaments are scattered across Chess-Results.com, federation websites, and club newsletters. TourneyRadar puts them all in one place. Filter by country, time control, and FIDE rating status. No account needed.


Project Status

Feature-complete, actively maintained, not actively developed. TourneyRadar does what it set out to do: put tournaments on a map. It is not chasing a roadmap.

  • Shipped: currently at v2.0.0 (tagged 2026-05-12; see CHANGELOG.md). Core flows (map, list, tournament detail, public API, player wishlist) are done and stable.
  • Maintained: the scraper cron and dependency/security fixes land in most weeks (see recent commit history) — this is a maintenance cadence, not a feature-development one.
  • Responsive: issues and PRs are read and triaged, typically within a few days.
  • Not actively planned: no new major features are queued. Good first issues (new scrapers, small UI/API additions) are still welcome and get reviewed.
  • Known gaps: if a specific region's scraper is failing, it'll be reflected in scraper_logs and the [Unreleased] section of the changelog before it's claimed as fixed here — this file does not promise every region is always fresh.

Feature Highlights

TourneyRadar Demo

Map View Tournament List View
Interactive World Map - All tournaments at a glance with clustered pins Paginated List - Browse and search tournaments by country, format, rating

Key Features

Map Experience

  • Interactive Leaflet map with real-time tournament clusters
  • Zoom to any region: Europe, Asia, Americas
  • Click pins for instant tournament details
  • No login required

Filtering & Discovery

  • Filter by country, time control, FIDE rating status
  • Search tournaments by name, organizer, venue
  • Upcoming tournaments sorted by date
  • Discover new events in your region

Tournament Details

  • Complete info: venue, prize pool, time control, rounds, registration link
  • Contact organizer via email or WhatsApp
  • External links to Chess-Results and federation websites
  • Tournament status (ongoing, completed, upcoming)

Public Analytics

  • Visit /stats for tournament frequency, popular formats, and regional breakdowns
  • No authentication required
  • Updated weekly as new tournaments are scraped

Tech Stack

Component Technology
Frontend Next.js 16, React 19, TypeScript
Styling Tailwind CSS v4
Maps Leaflet + react-leaflet-cluster
Backend Supabase (PostgreSQL)
Data Pipeline Puppeteer scraper (GitHub Actions weekly)
Deployment Vercel

Getting Started

Prerequisites

  • Node.js 20+
  • npm or yarn

Local Development

  1. Clone and install:

    git clone https://github.com/AnayDhawan/tourneyradar.git
    cd tourneyradar
    npm install
  2. Set up environment variables:

    cp .env.local.example .env.local

    Fill in your Supabase project URL and keys. See .env.local.example for all required variables.

  3. Run dev server:

    npm run dev

    Open http://localhost:3000

  4. Lint code:

    npm run lint

Public API

Tournament data is freely available: no auth, no key, no cost.

Base URL: https://tourneyradar-api.vercel.app

Endpoints

Endpoint Method Description
/v1/tournaments GET List tournaments (filter by country, category, upcoming, fide_rated)
/v1/tournaments/:id GET Single tournament details
/v1/countries GET All countries with tournament data

Example Request

curl "https://tourneyradar-api.vercel.app/v1/tournaments?country=IN&upcoming=true"

Response:

[
  {
    "id": "tour-001",
    "name": "Bangalore Open 2026",
    "location": "Bangalore, India",
    "country": "India",
    "country_code": "IN",
    "lat": 12.9716,
    "lng": 77.5946,
    "date": "2026-06-15",
    "fide_rated": true,
    "time_control": "90+30",
    "prize_pool": "₹5,00,000"
  }
]

Full API docs: tourneyradar-api


How Data Gets In

A Puppeteer scraper hits Chess-Results.com weekly across 140+ federation codes, parses tournament details, geocodes locations via Google Maps, and upserts everything into Supabase. Runs automatically via GitHub Actions with no manual intervention needed.


Routes

Public Pages

Route Description
/ Interactive world map
/tournaments Paginated list of all tournaments
/tournaments/[id] Tournament detail page
/country/[code] Tournaments filtered by country code
/stats Public analytics dashboard

Player Portal

Route Description
/player/login Sign in
/player/register Create account
/player/wishlist Saved tournaments

API Routes

Route Method Description
/api/tournaments GET List tournaments
/api/tournaments/upcoming GET/POST Paginated upcoming tournaments
/api/wishlist GET/POST/DELETE Player favorites
/api/cron/scrape-tournaments POST Vercel cron trigger

Contributing

See CONTRIBUTING.md.

Good first issues: add a new data source, add a missing country, improve the map UI.

Contributing a data source

The single highest-value contribution here: it puts a whole country's tournaments on the map. Start from the New scraper source issue template to propose one before writing code.

Two extension points:

File What it does
scripts/scrape.ts The federation code list (feds, ~line 503) and the REGION_MAP used to scope a scrape run to one region (e.g. --region south-asia)
lib/countryMap.ts Bidirectional country name ↔ ISO 3166-1 alpha-2 mapping (NAME_TO_CODE / CODE_TO_NAME), extend this whenever a new federation covers a country that isn't mapped yet

Worked example: adding Bhutan.

  1. lib/countryMap.ts: add 'bhutan': 'BT' to NAME_TO_CODE and BT: 'Bhutan' to CODE_TO_NAME.
  2. scripts/scrape.ts: add Chess-Results' 3-letter federation code (e.g. 'BHU') to the feds array, and to the relevant entry in REGION_MAP (Bhutan would go under south-asia, alongside BAN, SRI, PAK).
  3. Run it locally against your own Supabase project: npx tsx --env-file=.env.local scripts/scrape.ts --region south-asia, and confirm tournaments upsert with country_code: 'BT'.
  4. Open a PR with one example tournament URL that scraped successfully, per CONTRIBUTING.md.

For a source other than Chess-Results (FIDE, a national federation site, Lichess broadcasts), see the full walkthrough in CONTRIBUTING.md.


Contributors

Thanks to everyone who has fixed a bug, hardened the CI, or improved the map.

Contributors


License

Apache-2.0. Use freely, give credit where it's due.


Questions? Open an issue or reach out at tourneyradar.com.

About

An open-source interactive map of over-the-board chess tournaments worldwide. Filter by country, time control, and FIDE rating status, no account needed. Data scraped weekly from Chess-Results.com across 80+ countries.

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages