📢 Got something to promote? This is your space! Whether it's: A coding project or tool A Fiverr or Upwork gig Your Discord server or Chess.com club A YouTube channel, website, or anything else 👉 Post it right here. 🚫 Do not advertise anywhere else in the forums.All off-thread promos will be deleted — no exceptions. ✅ Use this thread to connect, promote, and support others in the ChessDev Hub. Let’s help each other grow the right way. Share your connections below.⬇️
🧠 ♟ 🔧⚡Hi all! I'm curious what tools people are using to program for Chess.com --- whether you're writing scripts, working with the API, automating tournament workflows, or analyzing games. My background is in C# and C++, but these days I'm building tools with Python and using a fully free AI-enhanced setup: 🔧 My current stack: VS Code (free) Pylance (free, fantastic Python AI autocomplete) GitHub Copilot (free-ish if you’re under the usage limit) ChatGPT-4 (for coding, debugging, and generating samples fast) Pylance often finishes 10+ lines of code just from a few keystrokes — sometimes even useful 😄Copilot lets me click an error, ask for a fix, and it will suggest changes. Not perfect, but a huge boost to productivity.You can even right-click code and get detailed explanations or (caution ⚠️) use the refactor option... which may or may not destroy your code 😅 I rarely search through volumes of documentation anymore — ChatGPT and Copilot usually give me a fast starting point or complete snippet. 💬 What about you? Let’s share what works and build a thread that helps new coders dive into Chess.com dev with confidence!
Why GitHub? Why ChessDev-Hub? GitHub is the backbone of modern open-source development. It’s where millions of developers: ✅ Collaborate on code in real time ✅ Track issues, tasks, and improvements ✅ Review and merge contributions safely ✅ Share projects with a global community Joining the ChessDev-Hub GitHub organization means: ♟️ Access to our repositories of Chess.com-friendly tools, bots, and automation 🤝 Collaboration with like-minded developers who love chess + coding 🛠️ Opportunities to learn GitHub best practices: pull requests, branching, reviews 🌍 Being part of a team shaping open-source projects that benefit the wider chess community Whether you’re new to GitHub or already experienced, ChessDev-Hub is a place to contribute, learn, and build real tools together. Links; Creating GitHub Account to Join ChessDev-HubBest Practices for Git Development with GitHub (VS Code)VsCode vs PyCharm Community EditionBest Practices for Git Development with GitHub (PyCharm Community Edition)
🧠 How to Use the Chess.com API in Python — With Headers & Real Examples♟️🐍 So what do you want to do with the Chess.com API? You can pull user profiles, ratings, games, tournament participants, and more. The data is all public, and it's a great way to build analysis tools, or club automation systems. ⚠️ Why You Need Custom Headers Before we jump into the code, here’s a critical tip:Always include headers in your API requests. Chess.com uses rate limiting and spam prevention. If you skip the headers, you’ll be Forbidden. 403 Forbidden (Access denied) If do do to much to fast you will get. 429 Too Many Requests (You’ve hit the rate limit) Adding a proper User-Agent with your app name and contact info tells their system: “Hey, I’m not a bot. I’m a human using this responsibly. Here’s how to reach me.” 🧰 Setup: Define Your Custom Headers in Python We'll use an Enum to organize different headers for different purposes. This is optional but clean and scalable: from enum import Enum import requests # 🧠 Define headers for each type of API call class Api_Headers(Enum): ACTIVE_PLAYERS = { "User-Agent": "GT-Active-Players-App/1.0 (Python 3.9.13) -- Finds daily players. (contact- BEST @YourUsername on Chess.com or LEAST RELIABLE dev@example.com)", "Accept": "application/json", "Accept-Encoding": "gzip, deflate", "Connection": "keep-alive" } TOURNAMENT_PARTICIPANTS = { "User-Agent": "GT-Tournament-Participation-App/1.0 (Python 3.9.13) -- Gets tournament player list. (contact- BEST @YourUsername on Chess.com or LEAST RELIABLE dev@example.com)", "Accept": "application/json", "Accept-Encoding": "gzip, deflate", "Connection": "keep-alive" } USER_INFO = { "User-Agent": "GT-User-Info-App/1.0 (Python 3.9.13) -- Gets user info. (contact- BEST @YourUsername on Chess.com or LEAST RELIABLE dev@example.com)", "Accept": "application/json", "Accept-Encoding": "gzip, deflate", "Connection": "keep-alive" } 🧪 Example: Get the List of Players in a Tournament Let’s say you want to get a list of usernames who joined a specific tournament. 📘 Endpoint:https://api.chess.com/pub/tournament/{tournament-name}/players Here’s a full Python function to do just that: def get_tournament_usernames(tournament_name): """ Queries the Chess.com public API to get the list of player usernames in a tournament. Parameters: tournament_name (str): The slug or URL-friendly name of the tournament (e.g., 'gt-april-showers-knockout-1-1600'). Returns: list: A list of usernames who are participants in the tournament. """ # Build the full API URL using the tournament name url = f"https://api.chess.com/pub/tournament/{tournament_name}/players" # Make the GET request with headers to avoid rate-limiting or blocking response = requests.get( url, headers=Api_Headers.TOURNAMENT_PARTICIPANTS.value ) # If the request fails (e.g., bad tournament or missing headers), print status if response.status_code != 200: print(f"⚠️ Failed to get players: HTTP {response.status_code}") return [] # Convert the JSON API response into a Python dictionary data = response.json() # Extract the list of usernames from the response usernames = [ player["username"] for player in data.get("players", []) if "username" in player ] return usernames 🧪 Try It Out: players = get_tournament_usernames("gt-april-showers-knockout-1-1600") print(players) Output: ['ChessFan123', 'QueenCrusher', 'KnightRider89', ...] ✅ Summary Headers matter: use User-Agent to avoid getting blocked. The API is free and public — but you still need to be polite. The data you can grab is super useful for clubs, tournaments, analysis, and automation. 💬 Got questions? Want to explore more endpoints like user stats, game history, or leaderboards? Drop a comment in this thread.
https://www.chess.com/game/141848950068
Avatar of GoodyPrime
GoodyPrime Aug 17, 2025
1) One-time setup Install & configure Git # Global identity (use anything; it stays local) git config --global user.name "Your Name" git config --global user.email "you@example.local" # Sensible defaults git config --global init.defaultBranch main git config --global pull.ff only git config --global fetch.prune true git config --global rerere.enabled true # auto-resolve repeated merges git config --global core.autocrlf true # Windows; use 'input' on macOS/Linux # macOS/Linux: git config --global core.autocrlf input VS Code essentials Extensions: GitLens, Git Graph, Prettier (or Black/ruff for Python), EditorConfig, language linters. Settings (File → Preferences → Settings → search the keys below): git.enableSmartCommit: true git.confirmSync: false files.trimTrailingWhitespace: true editor.formatOnSave: true diffEditor.ignoreTrimWhitespace: true Workspace .vscode/settings.json (checked into the repo) for formatter/linter choices. Project skeleton (top level) .vscode/ .gitignore .gitattributes README.md CHANGELOG.md docs/ scripts/ src/ tests/ .gitignore (good cross-platform base) # OS .DS_Store Thumbs.db # Editors .vscode/* !.vscode/settings.json !.vscode/tasks.json !.vscode/extensions.json # Dependencies / builds node_modules/ dist/ build/ *.log .gitattributes (line endings consistent) * text=auto Optional: local “remote” for extra safety Create a bare repo on the same machine or another drive and push to it like a remote: # Create a bare backup repo mkdir -p D:/git-backups/myproject.git # or /mnt/data/git-backups on Linux cd D:/git-backups && git init --bare myproject.git # In your working repo: git remote add backup D:/git-backups/myproject.git You now have origin (optional) and backup (a path remote). You can also point backup to a USB drive or a network share. 2) Daily working loop (VS Code + Git) A. Start of day git status git fetch --all # if you use a local bare remote shared by other machines/users git switch -c feat/short-description # or 'git switch main' if continuing B. While coding Keep changes small and focused. Run tests/linters locally (add VS Code Tasks to automate). Commit early, commit often with clear messages (Conventional Commits optional): feat(parser): add FEN validation fix(ui): correct dark theme contrast chore: update dependencies git add -p # stage hunks interactively git commit -m "feat(parser): add FEN validation" If you need to pause: git stash push -u -m "WIP board animations" # ...switch to another task... git stash pop C. Midday or after each task Rebase your feature branch on main to keep history clean: git switch feat/board-anim git fetch --all git rebase main Push to your local backup: git push backup HEAD D. End of day “check-in” Make sure working tree is clean. git add -A git commit -m "chore: EOD checkpoint" || echo "Nothing to commit" Tag an EOD snapshot (optional but great for rollback): git tag -f eod-$(date +%Y-%m-%d) git push backup --tags git push backup --all Create a portable bundle archive (air-gap-safe backup): git bundle create ../myproject-$(date +%Y%m%d).bundle --all Copy the bundle to another drive/cloud. You can restore withgit clone myproject-20250817.bundle myproject. 3) Branching & history main: always green (tests pass). feat/ branches for features; fix/ for bugfixes; chore/ for maintenance. Use rebase (not merge) to keep linear history: git rebase -i main Squash tiny fixups before integrating: git commit --fixup <SHA> git rebase -i --autosquash main 4) Quality gates (local only) Pre-commit hooks (no server needed): Option A: lightweight manual hooks in .git/hooks/ (not versioned by default). Option B (recommended): pre-commit framework (versioned config). pip install pre-commit # or use pipx/uv/conda pre-commit sample-config > .pre-commit-config.yaml pre-commit install Add linters/formatters; they’ll run before each commit. VS Code Tasks to standardize:.vscode/tasks.json { "version": "2.0.0", "tasks": [ { "label": "test", "type": "shell", "command": "pytest -q" }, { "label": "lint", "type": "shell", "command": "ruff check ." }, { "label": "format", "type": "shell", "command": "ruff format ." } ] } 5) Weekly maintenance (5–10 min) # Update tools/deps, run full test suite git switch main git pull --rebase --all # from local remotes if used git gc --prune=now --aggressive # tidy up repo git tag -a v0.1.0 -m "Alpha snapshot" # if you hit a milestone git push backup --tags --all 6) Collaboration without GitHub (optional) Local file remote on a shared drive: others add backup as their origin. Ad-hoc patch exchange: git format-patch -1 <SHA> # creates .patch files git am < 0001-some-change.patch Self-hosted options (later): Gitea, GitLab CE, or git daemon over LAN. 7) Recovery quick recipes Undo last commit (keep changes staged): git reset --soft HEAD~1 Discard local changes to a file: git checkout -- path/to/file Restore from bundle: git clone /path/to/myproject-20250817.bundle myproject 8) Minimal daily checklist (copy/paste) git status (clean?) Pull/rebase from main (if using a shared local remote) Work on feat/<topic>; commit small, clear messages Run tests/linters before commit git push backup HEAD after each logical chunk End-of-day tag + bundle backup
https://github.com/SpeedDemonCCXR/Chess.com-Shadow-Mode----Chrome/tree/main follow the instructions in the README. It should work perfectly. If any issues encountered, please tell me.  Note: This extension code has been created and coded by me.  Advantage to the Zen Mode Extension (Which you can also try out and use if you want) is that this extension does NOT hide the notation pane, but it also removes the Start Game Message that Chess.com displays in the chatbox (which has the opponent username, rating, title) at the start of each game. 
Why Git Hub Org? GitHub Organizations allow teams to collaborate on open-source projects — for example, Python Chess and Stockfish.ChessDev-Hub is a GitHub organization of developers who are also members of Chess.com. Our goal is to collaborate on Chess.com TOS-compliant tools, scripts, and browser extensions.About 40% of our members have never used GitHub before, and that’s okay — we’re happy to train you. Some companies even donate to open-source projects, and if you already work for one, your employer might sponsor or pay for your involvement. First Steps for New ChessDev Hub Members Goal: Get you set up on GitHub and ready to collaborate in under 10 minutes. 1. Create a GitHub Account Go to https://github.com/join Fill in: Username (can be your Chess.com name or something new) Email address (use one you check often) Password Choose the Free plan Complete the email verification 2. Set Up Your Profile Click your profile picture (top-right) → Your profile → Edit profile Add: Profile picture (can be your Chess.com avatar) Bio (optional, but recommended — include “Chess.com username: [yourname]”) Location & website if you want 3. Accept Your Invite to ChessDev-Hub After sending your GitHub username to us, you’ll get an email from GitHub Click Accept Invitation You’ll now see ChessDev-Hub listed under your Organizations in GitHub 4. Explore the Projects Go to https://github.com/ChessDev-Hub Click on a repository to see: README.md (project overview) Issues (open tasks and feature requests) Discussions (ideas, questions, planning) 5. Try Your First Contribution Find a small “good first issue” in Issues Comment that you’d like to work on it Fork the repository, make your changes, and submit a Pull Request (we can walk you through this step-by-step) 💡 Tip for beginners: You don’t need to know advanced coding to help — documentation, testing, and ideas are just as valuable.
I've just been reading a thread in the Developer Community club in which Allen posted some Python code to help a member who's having problems. I'm guessing that Allen copied that content from a Python console window but all the indentation was lost in the process... https://www.chess.com/clubs/forum/view/twitch-bot-api-requests-being-blocked#comment-116395280  I remember some years ago using the <pre> ('preserve') HTML tags to ensure all spacing was kept when it was posted, so that it's displayed correctly in a browser but when I tried it again recently the <pre> tags were stripped out by the site's posting-editor. Anyone know of a way of posting 'block-type' content while preserving all spacing? * Under normal conditions a browser will strip all whitespace that's considered superfluous.
We’re building something special — a place where code meets community, and developers support each other as they grow. If you're passionate about programming, community, and helping others, we’d love to have you on our leadership team! Here's what the Membership Director role includes: ✅ Invite developers to join.✅ Approve membership requests & welcome newcomers✅ Post a positive notes and cheer everyone up✅ Collect quick feedback from members who leave and help advice us' We already have a fantastic (but small) group of members and dedicated admins — now we’re looking for one more star player to join the top shelf. Comment below to apply, tell us what you got and we'll all choose. — AlAlper ♟💻 Founder – ChessDev Hub ( helping chess devs form over a week!!)
Add list of coders to invite so we do not overlap.
🧑‍💻 How to Use the Source Code Icon for Better Posts Want to post clean code or advanced formatting? Step one: 👉 Click the  Source Code icon in the post editor (you might need to click the ⋯ icon first to find it). This opens a plain text editor where you can paste raw HTML, code blocks, or advanced formatting. More steps coming soon… stay tuned!— AlAlper ♟💻
What are you working on?What's spinning around in your brain today?Coding something cool? Debugging something evil?Found a weird API? Built a funky bot? Just tinkering? Whether it’s Python, C#, Selenium, database hacks, or a completely random thought, drop it here. Show us what you’re doing (or trying to do). Screenshots, rants, victories, and questions all welcome. 👨‍💻⚙️🧩💡This is your space. Devs helping devs. Coders helping coders. Or just vibing. If it is is big make a new thread. 
Many ways to return API endpoint in various environments and coding method. This is mine. Using VBA to return data into MS Excel spreadsheet. Standarised module for every call. ' 13/02/23' Input: 'up_HTTP' String of URL API endpoint' Input: 'ModName' calling Subroutine to include in 'User-Agent'' Input: 'svalidate', additional checking if required' Output: 'get_API' string contains endpoint data or error string' Changed to include .status return value Public Function get_data_API(ByRef up_http As Variant, ByRef ModName As Variant, Optional sValidate As Variant) As String If IsMissing(sValidate) Then sValidate = "" Dim xmlHttpDim iCount, iPCount As IntegerDim sStatus As Variant Set xmlHttp = CreateObject("msxml2.xmlhttp.6.0") Dim UNameWindows As VariantDim sPath, sFileLog As VariantUNameWindows = Environ("USERNAME") sPath = ActiveWorkbook.PathsFileLog = sPath & "\MPLog.txt" booLog = ThisWorkbook.Worksheets("Control Panel").CheckBox9.Value With xmlHttpiCount = 0iPCount = 0Do.Open "get", up_http, False.setRequestHeader "User-Agent", ModName & ", username: " & UNameWindows & "; contact: xxxxxx@xxx.com".sendsStatus = .Status'Debug.Print CSng(Trim(.Status))Select Case sStatus Case Is = 200get_data_API = .responseTextCase Is = 301'MsgBox "Wrong URL", vbCritical, "Incorrect"get_data_API = "Error 301: Wrong URL " & up_httpiCount = 100 ' Not viable immediate returnbooLog = TrueCase Is = 304'MsgBox "Data unchanged", vbCritical, "If-Modified-Since"get_data_API = "Error 304: Data unchanged: " & up_httpiCount = iCount + 1 ' Try againCase Is = 404'MsgBox "No Data for URL" & xmlHttp, vbCritical, "Error 404"get_data_API = "Error 404: No Data for URL: " & up_httpiCount = 100 ' Not viable immediate returnbooLog = TrueCase Is = 410'MsgBox "No Data for URL will be available" & xmlHttp, vbCritical, "Error 410"get_data_API = "Error 410: No Data for URL will be available: " & up_httpiCount = 100 ' Not viable immediate returnbooLog = TrueCase Is = 429'MsgBox "Rate limit", vbCritical, "Error 429"get_data_API = "Error 429: rate limit"iCount = iCount + 1 ' Try againbooLog = TrueCase Is = 502'MsgBox "DB Overload", vbCritical, "Oh no!"get_data_API = "Error 502: DB Overload"iCount = iCount + 1 ' Try againDoEventsApplication.Wait (Now + TimeValue("00:10:00"))Case Elseget_data_API = "Error xxx: Unknown error"iCount = iCount + 1 ' Try againbooLog = TrueEnd SelectIf booLog Then Call Log2File(sFileLog, sStatus, up_http)If InStr(get_data_API, "Temporary rate limit exceeded") > 0 TheniPCount = iPCount + 1If InStr(Application.StatusBar, " Upload Paused") ThenApplication.StatusBar = Left(Application.StatusBar, Len(Application.StatusBar) - 1) & iPCountElseApplication.StatusBar = Application.StatusBar & " Upload Paused " & iPCountEnd IfDoEventsApplication.Wait (Now + TimeValue("00:10:00"))get_data_API = "" End IfLoop While (get_data_API = "" And iCount < 100) Or InStr(LCase(get_data_API), "bad gateway") > 0End With Set xmlHttp = Nothing End Function
💬 New here? Stuck on something? Need a hand? This is the go-to hub for asking questions, getting help, and troubleshooting anything Chess.com-related — including but not limited to: 🧩 Scripts, bots, and automations ⚙️ Chess.com tools or APIs 🖥️ Setup issues or code problems 🧪 Or just figuring out where to start! 📌 Quick question? Ask it here.If your issue is more detailed or you’d prefer your own space, you can create a new forum topic here. We’re here to help — post below and someone will jump in! ⬇️