How I built dotapro.org
Intro
This post breaks down dotapro.org — an open-source Dota 2 analytics platform for professional matches. I'll cover why I built it and the technical decisions behind it.
Why I built it
Dota 2 is one of the few games I actually enjoy. I couldn't find a good tool for browsing professional match data with proper filtering, so I built one.
What it does
- Advanced filtering by league, team, player, and hero
- Real-time ETL pipeline keeping match data up to date
- Fast
pg_trgmsimilarity search for names
Architecture
The React frontend talks to an API Lambda. A separate scraper Lambda runs on a schedule, pulls data from the OpenDota API, and inserts it into PostgreSQL on RDS.
Storage
PostgreSQL on AWS RDS. I briefly ran Postgres manually on an EC2 instance just to understand what managed services actually abstract away — OS patching, backups, vertical scaling. The time cost isn't worth the savings unless you're optimizing hard on infrastructure spend.
Compute
Two Lambdas: one scraper on an EventBridge schedule, one monolithic API Lambda handling all routes via go-chi.
The monolith was a deliberate choice. One codebase, one deployment, and warm starts benefit all endpoints regardless of which one was hit first. I initially over-engineered it — scraper → SQS → ingestor Lambda — then collapsed it into a single Lambda when I realized nothing actually required that complexity.
Split a Lambda monolith when you have separate teams needing independent deployments, or a specific hot path that needs provisioned concurrency. Otherwise, keep it simple.
Frontend
React + TypeScript + Tailwind + Vite + TanStack Router/Query, deployed to S3 behind CloudFront. Standard setup, nothing unusual.
CI/CD
GitHub Actions on push to main, with OIDC auth to AWS. Selectively redeploys only what changed — UI gets built and synced to S3 with a CloudFront invalidation, Lambdas get compiled and pushed via update-function-code.
Conclusion
Feel free to check it out at dotapro.org. The code is also on GitHub — drop a star if you find it useful. Happy coding!

Top comments (0)