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
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
- 01
Upload
A raw combat log, up to 300 MB, enters a job queue.
- 02
Parse
A worker thread turns raw events into fights, players and metrics.
- 03
Store
One write path into normalized tables, grouped with related logs.
- 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