Challenge Hub
Competitive programming challenges, directly inside VS Code.
Challenge Hub pulls the full Codeforces problemset into your editor, renders
each problem statement cleanly, and works completely offline once synced.
No browser tab. No context switch. Just problems, in your editor, next to
your code.
Features
Offline-first problemset
Hit Refresh once, and Challenge Hub downloads the entire Codeforces
problemset — over 11,000 problems — into local storage. After that, everything
works without a network connection.
A dedicated Challenge Hub view in the Activity Bar organizes every problem
by difficulty:
Unrated, ≤ 1200, 1200 – 1400, 1400 – 1600, … up to 2400+
- Collapsible groups with problem counts
- One row per problem, with tags and a difficulty icon
Click any problem to open it.
Clean problem rendering
Statement pages are parsed and re-rendered with a readable layout:
- Hero card with title, rating, tags, and time/memory limits
- Problem / Input / Output as properly formatted prose
- Examples as numbered, zebra-striped tables with a Copy input button
- Math rendered via MathJax — so
1 \le t \le 500 shows as 1 ≤ t ≤ 500,
and display formulas render the way Codeforces shows them
- Automatic light/dark theming through VS Code theme variables
Command Palette access
Everything the sidebar does is also available from the palette:
| Command |
What it does |
| Challenge Hub: Refresh Challenges |
Download the latest problemset |
| Challenge Hub: Open Problem |
Quick Pick a problem by name |
| Challenge Hub: Show Cached Challenges Info |
Show how many problems are cached |
| Challenge Hub: Focus Problems View |
Jump to the sidebar |
Getting started
- Install the extension.
- Open the Challenge Hub icon in the Activity Bar.
- Click the refresh button (⟳) in the view title bar.
- Wait for the download — 11k+ problems, usually under 30 seconds.
- Browse by rating, click a problem, and start solving.
You only need to refresh once. The cache lives in VS Code's global storage
and survives restarts.
Requirements
- VS Code 1.85.0 or newer
- Internet access only for the initial refresh and for loading problem
statements the first time you open them
- MathJax is loaded from a CDN, so formula rendering needs network access.
Everything else works offline.
Extension settings
None yet. Everything is cached in globalStorage and rebuilt on demand.
Known limitations
- Problem statements are fetched on demand. The problemset metadata is
cached, but each problem's HTML is fetched when you open it, so opening a
problem for the first time requires network access.
- MathJax requires a CDN. If
cdn.jsdelivr.net is blocked, formulas
render as raw $$$...$$$ text.
- No submission support. Challenge Hub is a reader, not a judge. To
submit, use the "Open on Codeforces" link.
- Search is per-group. The tree view's built-in filter only matches
currently-visible rows.
How it works
- Cache. On refresh, the extension calls
codeforces.com/api/problemset.problems and writes the result to
codeforces.json in context.globalStorageUri. Writes are atomic
(write-to-temp then rename) so a crash mid-write can't corrupt the cache.
- IPv4-first networking. Node 17+ prefers IPv6, which fails on many home
networks with an
ETIMEDOUT. Challenge Hub forces ipv4first and sets
family: 4 on every request, matching curl's behavior.
- HTML parsing. Problem statements are parsed with regex and a
balanced-tag walk — no external HTML parser dependency. Sections
(
legend, input-specification, output-specification, sample-test,
note) are extracted by class name and re-rendered with our own CSS.
- Rendering. The webview loads MathJax with a config that recognizes
Codeforces' triple-dollar delimiters (
$$$...$$$ inline, $$$$$$ ... $$$$$$
display). A strict CSP allows only the CDN and inline styles.
| |