competitive-companion is a free, open source browsers & extensions project written in TypeScript and released under MIT. It has 1,339 GitHub stars, 220 forks and 90 open issues, and was last pushed 2 days ago. On this registry it ranks #123 of 150 tracked projects in Browsers & Extensions, with 5 head-to-head comparisons available. It gained 22 stars over the last 30 tracked days.

What is competitive-companion?

Competitive Companion is an MIT-licensed browser extension that parses competitive programming problems and contests from online judges and sends the extracted data to the local editor, judge, or helper tool that a solver already uses.

What it is

Competitive Companion is a TypeScript browser extension published for Chrome and Firefox, with its source hosted on GitHub. It reads problem and contest pages on competitive programming judges such as AtCoder, Codeforces, CodeChef, CSES, DMOJ, HackerRank, HackerEarth, beecrowd, Baekjoon Online Judge, and many university-hosted and regional online judges, then pushes the parsed result out to whatever tool is listening for it. The extension ships as a Web Store listing and a Mozilla Add-ons listing rather than as an application, so its job is to sit between a judge website in the browser and the user's local development environment.

The concrete problem it solves is transcription. Without it, a solver who wants to work on a problem locally has to copy the statement, hand-collect each example testcase, and separately note the time and memory limits before writing a single line of solution code. Competitive Companion replaces that manual copying with automatic extraction: it pulls the example testcases and the time and memory constraints straight from the judge page and delivers a structured payload to the receiving tool. The receiving side is deliberately open, which is why so many unrelated editors have integrated against it instead of each one building its own scrapers.

Key capabilities

  • Parses both individual problems and full contests, depending on which parser a site supports.
  • Extracts example testcases together with time and memory constraints from the judge statement.
  • Supports per-site problem and contest parsers across a large matrix of judges, including AtCoder, Codeforces, CodeChef, CSES, DMOJ, beecrowd, Koçaeli-style university judges, and others.
  • Distinguishes parser coverage per site, so entries such as DOMjudge provide a contest parser only.
  • Sends parsed data to consumer tools including CP Editor, Competitive Programming Helper, CHelper, JHelper, Hightail, Caide, acmX, cpbooster, and Mind Sport.
  • Feeds terminal and modal editors through integrations such as CompetiTest.nvim, cphelper.nvim, Assistant.nvim, and Faster-OJ.nvim.
  • Documents a custom-tools path so any program that can parse the sent data can act as a receiver.
  • Repository topics cover atcoder, codeforces, icpc, kattis, competitive-programming, and browser-extension.

Who uses it and how

  • ICPC and Codeforces-style contestants who work in CP Editor or Competitive Programming Helper, and who want a problem's samples loaded into the editor without leaving the browser.
  • VS Code users who install acmX or Competitive Programming Helper and rely on the extension as the ingestion step.
  • Neovim users running CompetiTest.nvim, cphelper.nvim, or Faster-OJ.nvim, where the extension is the front end of a terminal-based workflow.
  • JetBrains users on CHelper, JHelper, or Mind Sport, and Eclipse users on Caide or Hightail.
  • Tool authors and maintainers of judges or training platforms who implement a custom receiver against the documented data format.
  • Contest participants who use the contest parser to pull every problem in a round at once instead of opening pages one by one.

Getting started

Install the Chrome extension from the Chrome Web Store or the Firefox add-on from Mozilla Add-ons; the user-facing path is a browser install rather than a build. Developers building from source can use the repository's Build GitHub Actions workflow.

How it compares

No paid or equivalent products are listed among the facts, and no directly competing parser is named, so Competitive Companion stands alone in this registry as a browser-side problem parser. The tools named in the README are consumers rather than alternatives: CP Editor, CPH, JHelper, Hightail, and the rest depend on the extension for input instead of duplicating it.

When to use it — and when not to

A self-hoster does not run a server here, but the extension is only half of a workflow, so it is useless without a companion receiver such as CP Editor, CPH, or a custom tool that can parse the sent data. Anyone who wants a standalone command-line scraper, or who works on a judge absent from the supported-website matrix, should look elsewhere. The project carries 90 open issues and an uneven parser matrix, so expect some sites to be problem-only and others contest-only; the README is also largely a link directory and a support table rather than a deep technical guide.

project readme (upstream, from github) — read inline

Competitive Companion

Build Status
Chrome Web Store Version Chrome Web Store Users Chrome Web Store Rating
Mozilla Add-on Version Mozilla Add-on Users Mozilla Add-on Rating

A browser extension which parses competitive programming problems from various online judges (like AtCoder and Codeforces) and sends them to various tools (like CP Editor and CPH). Capable of parsing problems and contests and extracting data like the example testcases and the time and memory constraints.

Install

Tools that use Competitive Companion

Supported websites

Website Problem parser Contest parser
33OJ ✔ ✔
A2 Online Judge ✔ ✔
ACMP ✔
AcWing ✔
Aizu Online Judge ✔
Algotester ✔
AlgoZenith ✔
Anarchy Golf ✔
AtCoder ✔ ✔
A.Y. Jackson Online Judge ✔ ✔
Baekjoon Online Judge ✔
BAPS OJ ✔ ✔
beecrowd ✔ ✔
BJTU OJ ✔
Bloomberg CodeCon ✔
BUCTOJ ✔ ✔
CodeChef ✔ ✔
CodeDrills ✔
Codeforces ✔ ✔
CodeMarshal ✔ ✔
CodeRun ✔ ✔
CodeUp ✔
COJ ✔ ✔
Contest Hunter ✔ ✔
CPython.uz ✔ ✔
CS Academy ✔
CSES ✔ ✔
CSGOJ ✔ ✔
CSU-ACM Online Judge ✔ ✔
CYEZOJ ✔ ✔
Daimayuan Online Judge ✔ ✔
Dimik OJ ✔
DMOJ ✔ ✔
DOMjudge ✔
DotOJ ✔ ✔
Eolymp ✔ ✔
ECNU Online Judge ✔ ✔
FZU Online Judge ✔ ✔
Google Coding Competitions ✔
HackerEarth ✔ ✔
HackerRank ✔ ✔
HDOJ ✔ ✔
HIT Online Judge ✔
hihoCoder ✔ ✔
HKOI Online Judge ✔ ✔
HOJ ✔
Hrbust Online Judge ✔
Hydro ✔ ✔
ICPC Live Archive ✔
InfoArena ✔
ITCoder HUTECH ✔
Jutge ✔
Kattis ✔ ✔
KEP.uz ✔ ✔
Kilonova ✔ ✔
Lanqiao ✔ ✔
Le Quy Don Online Judge ✔ ✔
Library Checker ✔
LibreOJ ✔ ✔
LightOJ ✔ ✔
LSYOI ✔
Luogu ✔ ✔
MarisaOJ ✔ ✔
Mendo ✔
Meta Coding Competitions ✔
MOI Arena ✔ ✔
mrJudge ✔
MSK Informatics ✔
NBUT Online Judge ✔ ✔
Neps Academy ✔
NerdArena ✔
Newton School ✔
NOJ ✔ ✔
NowCoder ✔
NYTD Online Judge ✔ ✔
oiClass ✔ ✔
Olinfo ✔
Olympicode ✔
omegaUp ✔
OpenJudge ✔ ✔
OTOG ✔
Panda Online Judge ✔
PBInfo ✔
PEG Judge ✔ ✔
POJ ✔ ✔
PTA ✔
Public Judge ✔ ✔
QBXTOJ ✔
QDUOJ ✔ ✔
QQWhale ✔
RoboContest ✔ ✔
SDUT OnlineJudge ✔
SeriousOJ ✔ ✔
Sort Me ✔
SPOJ ✔
SSOIER ✔
StarryCoding ✔
TheJobOverflow ✔
Timus Online Judge ✔ ✔
TLX ✔ ✔
Toph ✔
uDebug ✔
Universal Cup ✔ ✔
UOJ ✔ ✔
USACO ✔
USACO Training ✔
UVa Online Judge ✔
Virtual Judge ✔ ✔
VNOI Online Judge ✔ ✔
YACS ✔
Yandex ✔ ✔
XXM ✔
X-Camp ✔
yukicoder ✔ ✔
Yun Dou Xue Yuan ✔ ✔
ZOJ ✔
ZUFEOJ ✔ ✔

Custom tools

Competitive Companion can send the parsed data in JSON format to your own tools. To do this, start an HTTP server listening for POST requests to / on any of the ports listed in ./src/hosts/hosts.ts. An example on how to accomplish this can be found in jmerle/competitive-companion-example.

If you want your own tool added to the released version of Competitive Companion, create an issue in this repository specifying the name and a link to the tool.

The format

Here's an example of the data sent when parsing Codeforces 954G:

{
    "name": "G. Castle Defense",
    "group": "Codeforces - Educational Codeforces Round 40 (Rated for Div. 2)",
    "url": "https://codeforces.com/problemset/problem/954/G",
    "interactive": false,
    "memoryLimit": 256,
    "timeLimit": 1500,
    "tests": [
        {
            "input": "5 0 6\n5 4 3 4 9\n",
            "output": "5\n"
        },
        {
            "input": "4 2 0\n1 2 3 4\n",
            "output": "6\n"
        },
        {
            "input": "5 1 1\n2 1 2 1 2\n",
            "output": "3\n"
        }
    ],
    "testType": "single",
    "input": {
        "type": "stdin"
    },
    "output": {
        "type": "stdout"
    },
    "languages": {
        "java": {
            "mainClass": "Main",
            "taskClass": "GCastleDefense"
        }
    },
    "batch": {
        "id": "123e67c8-03c6-44a4-a3f9-5918533f9fb2",
        "size": 1
    }
}

It's not required for a tool to parse all these options, since some of them are tool/language-specific. However, it is required for all extensions/tools that send data via this format to fill all required options.

Explanation
  • name: The full name of the problem. Can be used for display purposes.
  • group: Used to group problems together, which can be useful for archiving purposes. Follows the format -, where the hyphen is discarded if the category is empty.
  • url: A link to the problem on the judge's website.
  • interactive (optional): Whether this is an interactive problem or not.
  • memoryLimit: The memory limit in MB.
  • timeLimit: The time limit in ms.
  • tests: An array of objects containing testcase data. The JSON objects in the array all have two keys: input and output. Both the input and the output need to end with a newline character.
  • testType: The type of the tests. Supports two options: "single" and "multiNumber". Explanation of these two can be found on the JHelper wiki.
  • input: An object which is used to configure how to receive input. Supported types:
    • stdin: Receive input via stdin. No additional options required.
    • file: Receive input via a file. The file name has to be given via the fileName option.
    • regex: Receive input via a file. The file to use is selected by taking the most recently modified that matches the given regex. The regex pattern to use has to be given via the pattern option.
  • output: An object which is used to configure how to send output. Supported types:
    • stdout: Send output to stdout. No additional options required.
    • file: Send output to a file. The file name has to be given via the fileName option.
  • languages: An object with language specific settings. At the moment this only contains Java settings, but since I don't think putting language specific settings as top-level options is a good idea, I decided to put them in an object. This also allows for other languages to have custom configuration added later on. Required keys:
    • java: An object with Java specific settings. Required options:
      • mainClass: The name of the outer class containing the solution.
      • taskClass: The classname-friendly version of the problem's full name. Cannot be the same as mainClass. Can also be useful for non-Java tools because a classname-friendly string is also a filename-friendly string.
  • batch: An object containing information about the batch of problems that this problem belongs to. Required options:
    • id: A UUIDv4 string which uniquely identifies a batch. All problems in a batch have the same batch id.
    • size: The size of the batch, which is 1 when using a problem parser and the amount of problems in the contest when using a contest parser.

Running locally

The following commands can be used to start working on Competitive Companion locally. Additionally, make sure you got Node.js and PNPM installed.

# Clone the repository
git clone https://github.com/jmerle/competitive-companion.git

# cd into the extension folder
cd competitive-companion

# Install the dependencies
pnpm install

# Decide what you want to do next

# Build the Chrome code to the build-chrome/ directory
pnpm build:chrome

# Build the Firefox code to the build-firefox/ directory
pnpm build:firefox

# Lint the extension for possible mistakes
pnpm lint

# Package the extension to ZIP files
pnpm package

# Does the same as dev:firefox but with Chrome, with the exception that the extension is not automatically reloaded
# You'll have to manually go to chrome://extensions and click on the reload button on the Competitive Companion entry
pnpm dev:chrome

# Launch a Firefox instance with Competitive Companion loaded into a temporary profile
# Automatically re-compiles the code when the source changes
# Automatically reloads the extension in the Firefox instance when the code is re-compiled
pnpm dev:firefox

Testing

To run the tests, use pnpm test, or pnpm test:no-headless to run tests with the Chrome instance visible. Append -- -t to the command to only run tests with names matching the given pattern.

Mozilla reviewers

The information provided below is meant for Mozilla volunteers.

Software versions used:
Node.js: 26.4.0
PNPM: 11.9.0

Third-party libraries that can be found in the minified extension:

Package the extension by cd'ing into the source code submission directory, installing the dependencies with pnpm install and packaging with pnpm package:firefox. The result can be found in the dist/ directory.

Frequently asked questions

Is competitive-companion free to use?

competitive-companion is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does competitive-companion do?

Browser extension which parses competitive programming problems

What is competitive-companion written in?

competitive-companion is primarily written in TypeScript. Its source is publicly available at https://github.com/jmerle/competitive-companion, and it has 1,339 GitHub stars.