CodeforcesSync is a Chrome extension that automatically detects when you get an "Accepted" verdict on Codeforces and pushes the solution to a GitHub repository of your choice. It runs in the background — no manual copying or committing required.
Yes. Firefox is fully supported (version 128+). See the Release Guide for Firefox installation instructions.
Yes. CodeforcesSync is open source under the MIT License.
Yes. You need a GitHub account with a repository to store your solutions. You also need a GitHub Personal Access Token with repo scope (obtained via OAuth during setup).
- Chrome / Edge: version 102 or later. The extension uses
chrome.storage.session, introduced in Chrome 102 (May 2022). - Firefox: version 128 or later.
storage.sessionis available since Firefox 128.
Download the latest release ZIP from the Releases page, extract it, and load it as an unpacked extension in Chrome (chrome://extensions → Developer mode → Load unpacked).
Not yet. The extension is distributed via GitHub Releases. See the Roadmap for store submission plans.
Yes. The token is stored in chrome.storage.local, which is only accessible to the extension's own origin. The token is never logged, displayed, or sent to third parties. The OAuth flow uses PKCE and passes through a stateless Vercel broker that never stores the token.
Only if you grant it access during OAuth. The extension requests the repo scope, which allows it to read and write to repositories you choose. You can revoke this access at any time from your GitHub settings.
No. The extension does not include any analytics, tracking, or telemetry.
The extension injects a content script into Codeforces pages to extract source code from the DOM. This is required to bypass Cloudflare's bot protection.
Only submissions with the "Accepted" (OK) verdict are synced. Submissions with other verdicts (wrong answer, time limit exceeded, compilation error, etc.) are ignored.
Currently, all accepted submissions are synced automatically. Selective syncing is on the Roadmap.
Yes. You can configure a subdirectory in Settings (e.g., solutions/). All synced files will be placed under that directory.
No. Only submissions made after installing and configuring the extension are synced. There is no backfill feature.
Every 60 seconds, via Chrome Alarms.
The submission will not be synced until a Codeforces tab is available. The extension polls the Codeforces API every 60 seconds and will detect the new submission, but it needs an active tab to fetch the source code. If no tab is available, the extension falls back to the RSS feed (metadata only — source code cannot be synced).
- Is a Codeforces tab open in your browser?
- Is your submission "Accepted" (not WA, TLE, etc.)?
- Is your GitHub token still valid?
- Check the service worker logs for errors.
- See Troubleshooting for detailed steps.
- Verify your Vercel broker is deployed.
- Check that
GITHUB_CLIENT_IDandGITHUB_CLIENT_SECRETare set. - Verify the OAuth callback URL matches your Vercel deployment.
- Make sure you're on Chrome 102+, Edge 102+, or Firefox 128+.
The Codeforces API may be down, or your handle may be incorrect. Check your handle in Settings and verify it at https://codeforces.com/profile/your_handle.
The extension injects a content script into your active Codeforces tab. The script runs in your authenticated browser session, which Cloudflare trusts. The script extracts the source code from the submission page DOM and sends it back to the service worker.
The extension falls back to parsing the Codeforces RSS feed. The RSS feed contains submission metadata (problem name, language, contest ID) but not the source code. Without an active tab, the source code cannot be fetched.
- GitHub API: The extension retries failed requests up to 3 times with exponential backoff (1s, 2s, 4s). GET requests time out at 10 seconds, PUT requests at 30 seconds.
- Codeforces API: The extension polls every 60 seconds, well below the rate limit threshold.
Yes. You need to go through the OAuth and setup process on each machine. Your GitHub token can have multiple active tokens (from OAuth or PATs).
Go to chrome://extensions, find CodeforcesSync, and click Remove. This deletes all extension data, including your GitHub token and settings.
See CONTRIBUTING.md for guidelines. Contributions are welcome.
Open a bug report with steps to reproduce, Chrome version, and console logs from the service worker and popup.
Open a feature request.