DEV Community

Erik Novikov
Erik Novikov

Posted on

How I built voice-type

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_trgm similarity 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.

Architecture

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)