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.
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_logsand the [Unreleased] section of the changelog before it's claimed as fixed here — this file does not promise every region is always fresh.
![]() |
![]() |
| Interactive World Map - All tournaments at a glance with clustered pins | Paginated List - Browse and search tournaments by country, format, rating |
- Interactive Leaflet map with real-time tournament clusters
- Zoom to any region: Europe, Asia, Americas
- Click pins for instant tournament details
- No login required
- 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
- 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)
- Visit
/statsfor tournament frequency, popular formats, and regional breakdowns - No authentication required
- Updated weekly as new tournaments are scraped
| 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 |
- Node.js 20+
- npm or yarn
-
Clone and install:
git clone https://github.com/AnayDhawan/tourneyradar.git cd tourneyradar npm install -
Set up environment variables:
cp .env.local.example .env.local
Fill in your Supabase project URL and keys. See
.env.local.examplefor all required variables. -
Run dev server:
npm run dev
-
Lint code:
npm run lint
Tournament data is freely available: no auth, no key, no cost.
Base URL: https://tourneyradar-api.vercel.app
| 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 |
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
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.
| 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 |
| Route | Description |
|---|---|
/player/login |
Sign in |
/player/register |
Create account |
/player/wishlist |
Saved tournaments |
| 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 |
See CONTRIBUTING.md.
Good first issues: add a new data source, add a missing country, improve the map UI.
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.
lib/countryMap.ts: add'bhutan': 'BT'toNAME_TO_CODEandBT: 'Bhutan'toCODE_TO_NAME.scripts/scrape.ts: add Chess-Results' 3-letter federation code (e.g.'BHU') to thefedsarray, and to the relevant entry inREGION_MAP(Bhutan would go undersouth-asia, alongsideBAN,SRI,PAK).- Run it locally against your own Supabase project:
npx tsx --env-file=.env.local scripts/scrape.ts --region south-asia, and confirm tournaments upsert withcountry_code: 'BT'. - 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.
Thanks to everyone who has fixed a bug, hardened the CI, or improved the map.
Apache-2.0. Use freely, give credit where it's due.
Questions? Open an issue or reach out at tourneyradar.com.



