Identify Your Weak Spots in Competitive Programming
Track your Codeforces progress, discover knowledge gaps, and improve faster with detailed analytics.
The Problem: You solve hundreds of problems on Codeforces, but don't know which topics need improvement or where to focus your practice.
The Solution: BetterForces automatically analyzes your profile to reveal:
- Activity Timeline - Your solving activity over any time period with adaptive detail
- Weak Topics - Which algorithms and data structures you struggle with
- Abandoned Problems - Problems you attempted but never solved (great practice targets!)
- Difficulty Progression - How your skills have grown across rating ranges
- Tag Statistics - Your average performance on each problem type
Stop guessing where to improve. Start practicing smarter.
git clone https://github.com/deyna256/betterforces.git
cd betterforces
cp .env.example .env
just build
just upOpen http://localhost:3000 and enter any Codeforces handle to see their analytics.
That's it! 🚀
| Feature | Description |
|---|---|
| Daily Activity Timeline | Track your solving activity over time with adaptive granularity (hours to years) |
| Difficulty Distribution | Visualize how many problems you've solved at each rating level (800-3500) |
| Tag Analysis | See your average and median rating for each topic (DP, graphs, greedy, etc.) |
| Weak Topics Detection | Automatically identifies topics where your performance is below average |
| Abandoned Problems | Tracks problems you attempted but never solved, grouped by tags or difficulty |
| Time Period Filtering | Filter any metric by period (1D, 1W, 1M, 6M, 1Y, All) — no extra API calls |
| Smart Caching | Instant responses with stale-while-revalidate pattern (4-hour fresh cache, 24-hour stale) |
| Rate-Limited Worker | Respects Codeforces API limits with async task processing |
- Backend: Python 3.13, Litestar (async web framework), Redis (caching + task queue)
- Worker: Python 3.13, async task processor with rate limiting
- Frontend: React 18, TypeScript, Vite, Tailwind CSS, Chart.js
- Tooling: UV package manager, Docker Compose, Just (command runner)
- Getting Started - Development setup and local installation
- API Reference - REST API documentation with examples
- Architecture - System design and technical details
- Deployment - Production deployment guide
- Contributing - How to contribute to the project
All endpoints accept a Codeforces handle as a path parameter:
GET /daily-activity/{handle}- Activity timeline with adaptive granularityGET /difficulty-distribution/{handle}- Problem count by ratingGET /tag-ratings/{handle}- Average/median ratings per topicGET /tag-ratings/{handle}/weak- Weak topics with threshold filteringGET /abandoned-problems/by-tags/{handle}- Failed attempts grouped by tagsGET /abandoned-problems/by-ratings/{handle}- Failed attempts grouped by difficulty
All metric endpoints accept an optional ?period= query param (day, week, month, half_year, year, all_time).
Interactive documentation: http://localhost:8000/schema/swagger
See API Reference for detailed examples.
Requirements: Docker and Docker Compose
just build # Build Docker images
just up # Start all services
just logs # View logs
just down # Stop servicesFor local development without Docker, see Development Guide.
We welcome contributions! Please read CONTRIBUTING.md for guidelines on:
- Branch naming conventions
- Pull request workflow
- CI requirements
- Code review process
MIT License - see LICENSE for details.
- Live Demo: https://betterforces.deyna.xyz
- Issues: https://github.com/deyna256/betterforces/issues
- Discussions: https://github.com/deyna256/betterforces/discussions