← All work

Multi-Tenant Analytics Platform: from raw log to ranked result

A free web platform where a player community uploads game combat logs of up to 300 MB and gets fight-by-fight breakdowns, percentiles and rankings back. Parsing runs on the server in worker threads, results land in a relational database, and one codebase serves each tenant from its own container. Built and operated by Agentas.

Status
Live, free for the community
Architecture
One image; own container and database per tenant
Stack
Node.js, Express, SQLite, worker threads
Source
Private — walkthrough on request
Analytics platform leaderboard
A leaderboard built from uploaded combat logs.

What it does

Parsing in worker threads

An uploaded log goes into a job queue and is parsed in a separate worker thread, so the web server stays responsive. The number of workers is capped by the CPU count, and when the queue is full, new uploads get a clear message to try again shortly.

One parser, one write path

The browser and the server share the same parser code, and every parsed log is stored through a single insert path. When the parsing logic improves, an admin reparse runs the whole archive through the new version.

Rankings computed on the server

Percentiles are value-based, your result measured against the best of your class, and they are computed only on the server, so a client cannot fake them. Cached results are cleared whenever an admin changes the data behind them.

Related uploads grouped automatically

Several uploads from the same session are grouped by time window, player overlap and matching fights, and every log gets a relevance score, so duplicates and low-value logs are easy to spot.

Private mode

A player can analyse a log without publishing it. The server parses it in memory and returns the result without writing it to disk or to the database.

Compare with the simulator

From a boss fight, a player can rebuild their own setup in our simulator and see how their result compares with what the simulation says was possible. Both sites share one login.

Relevant if you're looking for…

epoglogs.com is a free platform for a player community, and the engineering behind it suits any business that needs answers from files or events.

  • A combat log analysis site for your game community: upload a raw log of up to 300 MB and get fight-by-fight breakdowns, percentiles and leaderboards.
  • A log parser that keeps up with big uploads: each log is parsed on the server in its own worker thread behind a job queue, so the site stays responsive.
  • Log analysis software for your own business data: we build the same pattern for clients, from upload and parsing to numbers computed on the server in a clean data model.
  • A multi-tenant platform on one codebase: one Docker image serves each tenant from its own container and database, and we set up this kind of platform for clients.

We build this for clients: Data and reporting platform · Custom software and internal tools

How it works

  1. 01

    Upload

    A raw combat log, up to 300 MB, enters a job queue.

  2. 02

    Parse

    A worker thread turns raw events into fights, players and metrics.

  3. 03

    Store

    One write path into normalized tables, grouped with related logs.

  4. 04

    Rank

    Server-side percentiles and leaderboards, cached until the data changes.

How it's built

The platform is one Node.js and Express service with a plain JavaScript front end and a short dependency list. The same Docker image serves every tenant: a setting at startup picks the tenant, and everything tenant-specific, from branding to search-engine metadata, comes from per-tenant data files. Each tenant runs in its own container with its own SQLite database, in separate dev and prod environments, so one tenant can be changed or switched off without touching another.

Storage is SQLite in WAL mode with about 60 tables and hand-written SQL. When metadata queries slowed to 18 to 32 seconds, we traced the cause to multi-megabyte fight data stored inside the main rows, moved it to side tables with a guarded migration, and made those queries roughly 200 to 400 times faster. CI builds the image once, and the server pulls that exact tagged image over a private network.

Engineering highlights

  • Worker-thread parsing with a capped pool and back-pressure
  • About 60 tables, hand-written SQL, no ORM
  • Metadata queries made roughly 200–400× faster
  • Strict content-security policy and escaping of user-supplied text
  • Nine runtime dependencies, no front-end framework or bundler
  • Separate dev and prod per tenant, each deployed from its own branch

Questions

What is a combat log analyzer?

It reads the event log a game writes during fights and turns it into numbers per fight and per player. On epoglogs.com the parsing runs on the server, and the results become breakdowns, percentiles and leaderboards.

Is epoglogs.com free to use?

Yes. It is a free community service, built and operated by Agentas.

Can I analyse a log without publishing it?

Yes. In private mode the server parses the log in memory and sends back the result without writing anything to disk or to the database.

Want something like this?

The same pattern fits any business that collects files or events and needs answers from them: parse away from the request path, store once in a clean model, compute the numbers that matter on the server, and keep each customer's data in its own place.

Get in touch

← All work · Software & AI for businesses