Skip to main content
  1. Articles/
  2. Chess/

Automated ratings lists generation for the Chess Federation of Canada

·836 words·4 mins
The output generated from a CSV sample uploaded

Alongside Ahmed Khalf, a former Executive of the University of Toronto’s Hart House Chess Club, I’ve worked on tools to streamline the organization of chess tournaments. Both of us were computer science students and served as club Execs during 2022–2023. One of our key contributions was a tool for creating and maintaining CFC ratings lists. Originally a Python console app, it is now deployed here with a web interface GitHub repo.

This post explores the motivation, design, and future plans for the project.

The Traditional Method of Organizing Chess Tournaments #

Running a rated chess tournament means collecting accurate player ratings from official sources like the Chess Federation of Canada (CFC) or FIDE. For small unrated events, this process may be trivial—but for rated events, accurate ratings are critical for fair pairings.

For a typical 250-player event, manually looking up each player’s ratings, membership status, and FIDE ID could take about 30 seconds per player. That’s over 2 hours per tournament—time better spent on other critical organizing tasks. Repeating this weekly adds up to 10+ hours a month.

Home screen of the ratings processor

Saving Time for More Impactful Work #

As Executives, we already dedicated significant time to running the club. Between Fall 2022 and Spring 2025, I personally spent most Friday evenings at Hart House overseeing Casual Chess, plus two more days a week on club operations. Automation helped us shift our focus from repetitive tasks to more meaningful planning and event execution.

Whether it’s improving player experience, organizing supplies, or growing the club, freeing up time matters.

The Project: From JSON to CSV in Seconds #

We discovered that the CFC provides a public JSON API. For example, my own data can be fetched via: https://server.chess.ca/api/player/v1/150532 with the data looking as follows:


  "updated": "2025-06-19",
  "player": {
    "cfc_id": 150532,
    "cfc_expiry": "2025-07-07",
    "fide_id": 2620189,
    "name_first": "Victor",
    "name_last": "Zheng",
    "addr_city": "Toronto",
    "addr_province": "ON",
    "regular_rating": 2177,
    "regular_indicator": 2192,
    "quick_rating": 1967,
    "quick_indicator": 2092,
    "events": [
      {
        "id": 202502050,
        "name": "SCC Jack Frost FIDE Rated",
        "date_end": "2025-02-06",
        "rating_type": "R",
        "games_played": 1,
        "score": 1.5,
        "rating_pre": 2175,
        "rating_perf": 2098,
        "rating_post": 2177,
        "rating_indicator": 2192
      },
      {
        "id": 202501140,
        "name": "2025 Canadian University Team Crown",
        "date_end": "2025-01-26",
        "rating_type": "R",
        "games_played": 5,
        "score": 2.5,
        "rating_pre": 2192,
        "rating_perf": 2111,
        "rating_post": 2175,
        "rating_indicator": 2192
      }
    ]
},

Ahmed built a system that sends API requests to these endpoints, parses the JSON response, and outputs the results to a CSV file. Our tool allows organizers to input CFC IDs and automatically retrieve FIDE IDs, correct player names, fetch official CFC ratings (both quick and regular), and generate comprehensive player lists. What used to take 2+ hours for 250 players now completes in under a minute.

A key feature is membership validation—the system checks each player’s CFC expiry date against the tournament date to identify players whose memberships will expire before the event.

The Web App #

I deployed the application to a website so organizers don’t need to install Python locally. Users simply upload a CSV file and download the processed results. Using Racknerd for hosting keeps infrastructure costs minimal. The Web App is deployed on an NGINX Web Server running on Racknerd with a subdomain from chesstools.org, my collection of free chess tools. The Web App runs NextJS and has a simple Dockerized process management for generating the CSV reports.

We built the web interface primarily for club executives who lack programming experience or can’t set up Python environments. Our goal is to make the tool completely client-side (except for CFC API requests) to avoid storing user data on our servers.

Future Improvements #

Several areas are areas for future refinement:

  • Accurate membership verification for unrated players
  • Handling edge cases with newly created memberships
  • Cross-referencing FIDE and CFC ratings for consistency
  • Including info on when the data refreshes (currently updated every Friday morning)
The output generated from the sample csv uploaded

Impact #

This project eliminates hours of manual work per tournament. Instead of spending entire days manually verifying CFC IDs, ratings, and sections, organizers can generate accurate lists in minutes. This time savings allows focus on other critical tournament preparation tasks. A large amount of focus in my opinion can be then allocated to solving some of the other issues in chess such as spectator engagement, community building, and player retention.

For our club, this represented a shift from 10+ hours monthly on data entry to 5 minutes per event—enabling us to run more frequent, higher-quality tournaments.

Conclusion #

Our ratings processor demonstrates how simple automation can transform manual workflows. By leveraging the CFC’s public API, we’ve created a tool that benefits chess organizers across Canada.

This project sparked my interest in efficiency and automation, showing how targeted solutions can significantly improve operational workflows. The tool continues to support Hart House Chess Club events and is available for organizers nationwide.

Please reach out if you have any thoughts or improvements. For those who are coders, please feel free to log GitHub issues/prs to: https://github.com/Hart-House-Chess-Club/cfc-status-ui.

From an event at the Hart House Chess Club where this tool was used (Photo by Jay Bhadreshwara)