Back to Portfolio

Case Study: Pyramids Queue

One operator was running a 500-player esports circuit out of a spreadsheet, a Discord server, and a group chat. We replaced it with four systems on one database.

Esports operationsMENA · Wild RiftDiscord botTeams OSPublic sitePostgres + RLS

The problem, in the client’s words

Pyramids Queue runs the MENA circuit for Wild Rift, feeding into Rift Legends, the EMEA league. Cup 7 had 536 players, 195 matches, and seven streamers producing 4,394 hours of watch time.

All of it was coordinated by hand. Registration was people posting rosters into a Discord channel. Standings were a spreadsheet somebody updated between matches. The results a broadcaster read on air came from a different place than the ones on the website. Nobody could answer “where are we” without asking three people.

The cost was not the tools. It was that one person was the integration layer between them, and that person could not take a week off.

What we built

Four systems, sharing one Postgres database. That last part is the whole design.

PyramidsQ Bot

A Discord bot that registers teams from a pasted roster, reads a Toornament bracket screenshot, creates a private channel per match with both team roles in it, DMs every player a direct link, posts the rules, fires a ready check ten minutes before kickoff, and reads the end-of-game scoreboard into per-player statistics.

Nexaro Teams OS

The staff platform. 57 screens across tasks, approvals, reporting, directory, chat, and a 36-screen esports module covering tournaments, matches, incidents, prize pools, staff shifts, broadcast logs and fantasy.

pyramidsqueue.com

The public site. Schedule, standings, player statistics, rosters, prizes, rules, and an explainer of how MENA feeds the EMEA league. Sixteen pages, five of them live from the database on a sixty second refresh.

The database

One Postgres instance behind all four, with row level security as the boundary between seven separate competitive circuits.

Nexaro Teams OS operations dashboard
Nexaro Teams OS, the operations dashboard

The result a match takes

  1. 1
    A moderator runs one command in the match channel with the end-of-game screenshot.
  2. 2
    The bot posts the score to the results channel, writes the series score to the database, and reads the scoreboard image into per-player rows.
  3. 3
    Standings on the public site update within a minute. Player statistics do not. They wait.
  4. 4
    A staff member checks the extracted rows against the screenshot in Teams OS and approves them. Then they appear.

Nobody retypes anything. Nobody reconciles two sources.

Nexaro Teams OS player records screen
Nexaro Teams OS player records, where extracted stats wait for a human check

The decision that defines the system

Automation removes typing, never judgement.

Anything a model extracted is held unverified until a person approves it, and the filter that enforces that lives in a database view rather than in a page, so no future feature can bypass it by querying differently.

That distinction is not decoration. Wild Rift scoreboards print no champion names, only a circular portrait, so the champion field is image recognition rather than text. The model is instructed to return blank when unsure. A blank column a referee fills in is a minor annoyance. A confidently wrong one that reaches a public leaderboard is an argument, and after that nobody trusts any of the numbers.

Match scores are treated differently and publish immediately, because a score is a number a moderator typed. There is nothing to verify.

Multi tenancy, from day one

TürkiyeSpainItalyFranceDACHCISMENA

Seven circuits run on one deployment: Türkiye, Spain, Italy, France, DACH, CIS and MENA. Each sees only its own data, and that is enforced by row level security in the database rather than by a filter in application code, so a missing where clause in a future feature cannot leak another circuit’s data.

White label throughout. Your name, your colours, your domain. The customers of a customer never see us.

A new tournament, department or workflow is a settings change. No branch, no redeploy, no per-customer codebase to maintain.

Proof

7
Circuits on one deployment
536
Players in a single cup
195+
Matches operated
147K
Live views tracked
4,394.3
Hours watched
86,000
Lines of code across four systems

Pyramids Cup 7 ran on this end to end. Pyramids Cup 8 opened on it in September 2026.

Nexaro Teams OS media reporting screen
Nexaro Teams OS media reporting

Why it did not become shelfware

Because the team that built it uses it every week to run a real tournament. Every awkward edge in the product exists because something went wrong on a live match day and had to be fixed by the following week. That is also why the roadmap has not drifted into features nobody asked for.

See the live artefact

Pyramids Cup 7 ran on this system end to end. The public site is live now.