A multi-platform competitive-programming dashboard that tracks your LeetCode, Codeforces, and CodeChef profiles in one place, with a head-to-head Compare mode.
- Summary strip: total solved, combined rating, global active streak (any platform counts), contests this month.
- One card per platform; each platform connects with its own handle, so usernames can differ per site.
- Rating progression chart overlaying all three platforms, solved-by-platform donut, and upcoming contests merged from all three sites with one-click Google Calendar reminders.
Platform-scoped tiles and cards, plus a deep dive: submission-activity heatmap with all-time streaks, difficulty analysis against the full question bank, language breakdown, contest-rating history, and practice recommendations.
Every card scopes to the active platform — its tiles, a single-series rating chart, a highlighted donut segment, and only that platform's upcoming contests.
Enter any public LeetCode username for a head-to-head, then link the rival's Codeforces/CodeChef handles to compare across platforms:
- Versus header with a live "metrics won" scoreline.
- Platform switcher: Combined / LeetCode / Codeforces / CodeChef.
- Head-to-head diverging bars (solved, ratings, streaks, acceptance, contests, percentile).
- Topic-strengths radar from LeetCode tag stats (top 6 topics by combined solved, normalized per axis).
- Breakdown card per platform: LeetCode difficulty split, Codeforces solved-by-problem-rating buckets (under 1400 / 1400–1900 / over 1900), CodeChef contests-by-division.
- Dual rating timeline (last 12 months, all-time fallback) with a computed "gap closed" insight.
- Recently-compared rivals for one-click rematches.
| Layer | Tech |
|---|---|
| Frontend | Vite · React 18 · TypeScript · MUI v6 |
| Backend | Express 4 (TypeScript, tsx watch) |
| Data | LeetCode public GraphQL · Codeforces REST API · CodeChef profile parsing |
There is no database. Every stat is fetched live from the platform APIs and held in an in-memory cache, so the app runs straight from a clone.
- Node.js 20+
npm install
npm run dev # Express on :3001 + Vite on :5173 (proxied /api)Open http://localhost:5173 and connect your handles on the All platforms tab.
No configuration is required. The API port defaults to 3001; set PORT in a
.env if you need a different one.
Routes are platform-first, so every URL reads as platform → user → action
(e.g. POST /api/leetcode/alice/sync):
| Method | Route | Purpose |
|---|---|---|
| GET | /api/leetcode/:handle |
LeetCode stats payload (cached) |
| POST | /api/leetcode/:handle/sync |
Force a refetch, return fresh stats |
| GET | /api/codeforces/:handle |
Codeforces stats payload (cached) |
| POST | /api/codeforces/:handle/sync |
Force a refetch |
| GET | /api/codechef/:handle |
CodeChef stats payload (cached) |
| POST | /api/codechef/:handle/sync |
Force a refetch |
| GET | /api/recommendations |
Shuffled practice picks |
| GET | /api/contests/upcoming |
Upcoming contests, all platforms (10-min cache) |
- LeetCode — public GraphQL, no auth needed for public profiles. The default calendar only covers the rolling year, so a read walks every active year for true all-time streaks. Those calls are sequential on purpose; a parallel burst trips LeetCode's rate limiting.
- Codeforces — official REST API (
user.info,user.rating,user.status). Problem-rating buckets are computed from each first-AC submission. Submissions are capped at the 10,000 most recent, so the heatmap of a very heavy account won't reach all the way back. - CodeChef — no official API, so the profile page is parsed directly. This is brittle by nature: if CodeChef redesigns, the regexes in
server/codechef.tsneed a refresh. The page exposes no per-day submission data, so CodeChef has no heatmap or streak. - Nothing is persisted. Each
(platform, handle)pair is cached in memory for 10 minutes and re-fetched on demand, which is why handles can differ per site for both your own profile and compare rivals.
server/ Express API, one module per platform + in-memory cache
src/
components/ Bento cards (heatmap, difficulty, contest chart, …)
views/ AllPlatformsView · LeetCodeView (deep dive) · CompareView
theme.ts Design tokens + MUI theme
docs/screenshots Screenshots used in this README



