Skip to content
stefan matić

Plate 03 · Sports analytics · 2022 to present, on and off

Atlas Sports Analytics: turning messy live sports feeds into clean, instant data

Live sports data arrives messy and fast. I've worked across the whole pipeline, from the service that collects raw StatsPerform data to the app fans use, so live scores and stats reach the screen accurately.

Client
Atlas Sports Analytics
Role
Designed and built the backend; built the Angular frontend
Period
2022 to present, on and off
Atlas Sports Analytics: how it worksSystem diagram with 6 numbered parts, explained in the list below.STATSPERFORMraw data1PROVIDERNestJS · CQRS2CONSUMERgRPC · NestJS3DATAMongoDB4BFFNestJS · CQRS5FRONTENDAngular · RxJS6
Plate 03 · Atlas Sports AnalyticsReal-time pipeline
  • 3CQRS services: provider, consumer and BFF
  • Livescores delivered end to end, endpoint by endpoint
  • 1,000sof lines refactored for speed and clarity

The problem

Atlas Sports Analytics shows live scores, fixtures and analytics. Its raw material comes from several third-party data providers, StatsPerform above all: high volume, inconsistent in format, and time-critical. Fans notice a wrong score within seconds.

What I did

  • Built on a CQRS architecture across three NestJS services: a provider that collects raw data from StatsPerform (the most important of several providers), a consumer that reshapes it and stores it, and a BFF that shapes API responses for the frontend.
  • Connected the services with gRPC, streaming data from the provider to the consumer.
  • Delivered data to fans endpoint by endpoint, taking each dataset from raw feed to the Angular screen, including live scores.
  • Refactored thousands of lines of code: untangled spaghetti code and made the services significantly faster.
  • Queue-backed processing with BullMQ and Redis smooths bursts and retries failures without taking the system down.

How it works

  1. StatsPerform (raw data). The main third-party source of live sports data.

  2. Provider (NestJS · CQRS). Collects raw data from StatsPerform.

  3. Consumer (gRPC · NestJS). Receives data over gRPC, reshapes it and stores it.

  4. Data (MongoDB). Clean, structured, ready to query.

  5. BFF (NestJS · CQRS). Reads the data and shapes API responses for the frontend.

  6. Frontend (Angular · RxJS). Live scores and stats that update as games happen.

Stack

NestJSCQRSTypeScriptgRPCRxJSBullMQRedisMongoDBAWSAngular
Have a project?

Let's build the whole thing properly.

An MVP, a rebuild, or a system that has to survive launch day. Tell me what you're building in a 30-minute call.

Book a 30-min callmaticstefan1996@gmail.com
Need an engineer on your team?

Senior full-stack, remote, CET.

Available as a long-term contractor on a monthly rate, embedded in your team, or full-time. Seven years across React, Node and the cloud, plus CTO experience.