Carrot, But Userscript adds compact rating insight columns to Codeforces standings pages through Tampermonkey.
Designed for a fast, responsive, lightweight, and stable standings experience. It does not install a browser extension package, add a settings page, or take over the Codeforces interface.
Install Tampermonkey first, then install the userscript:
Click the button above to open Tampermonkey's one-click install page, or install the userscript from the latest release manually:
https://github.com/Yan233th/carrot-but-userscript/releases/latest/download/carrot-but-userscript.user.js
After installation, open a supported Codeforces standings page. The script will add rating columns directly to the standings table.
The script adds three columns:
Π: performance rating, showing the rating level the row's contest result resembles.Δ: rating change, showing predicted or official rating gain/loss.Rank: rank movement. During prediction it shows the delta needed for the next rank; after official rating changes are published it shows the actual rank movement, or—for no change.
The columns appear in-place, beside the Codeforces standings table. Loading is
shown immediately, then replaced with either final official data or predictions.
Rows that cannot be matched show N/A.
Once official rating changes are available, Δ and Rank appear without waiting
for performance. Π loads separately; if its data or calculation is unavailable,
it shows N/A without replacing the official results.
The script has two main states:
- Predicted: shown while the contest is running, during system testing, or after final standings are visible but official rating changes are not yet published.
- Final: shown after Codeforces publishes official rating changes. Official
Δvalues come from Codeforces; performance is calculated from the final standings and the official pre-contest ratings.
Header color indicates the state:
- Gray underlined headers: loading.
- Amber headers: predictions.
- Green headers: official final rating changes.
The script caches API data in the browser's IndexedDB for codeforces.com to
avoid repeated requests when you reload or move between standings pages.
Cache data stays in the browser rather than passing through Tampermonkey's
extension messaging. Only the standings row fields needed for calculations are
stored.
Current cache behavior:
- Contest metadata: finished contests are cached for 24 hours; active contests are not cached.
- Standings: active or not-yet-final standings are cached for 30 seconds; final standings are cached for 24 hours.
- Rating changes: published official rating changes are cached for 24 hours; empty pending responses are not cached.
- Rated users: the Codeforces rated-user list is cached for 1 hour.
- Empty pending rating-change responses, rendered table cells, and prediction results are not stored.
Every cache read or write removes expired entries across all contests, including contests you no longer visit. Clearing Codeforces site data also removes this cache. If browser storage is unavailable or full, the script continues with live API data.
A small Contest cache panel shows cache status for the current page. Its
Clear button clears all current-version cache entries created by this
userscript.
Cache panel states:
hit: cached data was reused.miss: cacheable data was fetched and stored because no fresh cache existed.live: the data is intentionally not cached, such as active contest metadata or empty pending rating-change responses.unused: that data source was not needed for the current page state.cleared: current-version cache entries were cleared from the panel.unavailable: data was fetched but could not be cached in browser storage.
Older versions used Tampermonkey storage, which could grow large enough to hit
the browser extension's 64MiB message limit. This version no longer accesses
that storage; the first visit fetches fresh data into IndexedDB. The Clear
button clears the new cache, not legacy Tampermonkey data. Updating an existing
installation preserves its old storage, which Tampermonkey may still include
in script startup messages even with @grant none.
If an affected installation still fails to start, back up its script source,
then permanently delete only this userscript from Tampermonkey. If it goes to
the trash bin, permanently remove that entry too. Install the new *.user.js
file and reload the Codeforces tabs. Do not restore the old script storage;
reinstalling Tampermonkey itself is not required.
The script uses data available to the current page and the public Codeforces API. It does not bypass Codeforces permissions, hidden frozen standings, private gym access, or account-specific friends-list restrictions.
When contest.standings is unavailable because of Codeforces API access rules
or temporary HTML/Cloudflare responses, the script can rebuild usable standings
from public contest submissions and hacks. This fallback is meant to keep active
and just-finished contests usable; official final rating changes still come from
Codeforces.
Team contests, clearly unrated contests, and very old finished contests without
official rating changes may show N/A instead of predictions.
Carrot, But Userscript runs on Codeforces contest and gym standings pages, including friends standings:
https://codeforces.com/contest/*/standings*https://codeforces.com/gym/*/standings*
It does not run on problem pages, submission pages, profiles, or other Codeforces pages.
Tampermonkey can update the script automatically from GitHub Releases. The
installed script checks a small metadata file first, then downloads the full
*.user.js file only when a newer version is available.
Thanks to meooow25/carrot, the original browser extension for Codeforces rating insight columns.
Thanks also to wuyuqian114514/carrot-plus for documenting practical Codeforces behavior changes and fallback data paths.
This project uses Bun and TypeScript. For local development:
bun installbun run buildThe generated files are written to dist/. The *.user.js file is the
userscript that can be installed directly in Tampermonkey; the *.meta.js file
is metadata for update checks.