TechEniac

Esquadify - a Serverless Gaming Platform With Live Streaming and Stake Escrow

Esquadify is a competitive gaming platform that brings match creation, live streaming, wagering, and automated settlement into one connected experience. Players can challenge each other to head-to-head matches, stake ranked belts and prize money, and broadcast their matches live while spectators interact through real-time chat and gifting. The platform securely holds stakes throughout the event and releases them only after the result is verified, with a dispute process for contested or unanswered outcomes. Built over roughly a year, the platform combines a four-tier belt economy, real-time streaming, token-based payments, player statistics, and serverless infrastructure into a complete competitive gaming experience.

GamingTech
Esquadify gaming platform

Client Background

Milad came to TechEniac with a picture of competitive gaming that the existing tools only half-served. Tournament platforms organise brackets but don't broadcast. Streaming platforms broadcast but have no stake in the outcome. Wagering between players happens constantly and gets settled on trust, screenshots, and whoever argues hardest in a group chat.

Esquadify was built to be all three at once: the place a match is arranged, the place it is watched, and the place it is settled. Players challenge each other to head-to-head matches, stake ranked belts and prize money on the result, and broadcast the match live to an audience that can chat and send gifts while it happens. The platform holds the stakes from the moment a challenge is accepted and releases them only once a result is verified.

Development ran for roughly a year, covering the belt economy and event lifecycle, the OBS and streaming pipeline, real-time chat and gifting, dispute resolution, and the token and payout system underneath it all

Pain Points

Competitive gaming becomes significantly more complex when matches involve real stakes, live audiences, and player rankings. Esquadify needed to replace informal wagering and fragmented streaming workflows with a platform that could securely hold stakes, verify match outcomes, control broadcasts, and keep live audiences engaged while ensuring every event reached a reliable final state.

Wagered Matches Settle on Trust, Not on a Platform

When two players agree a match is worth something, the money and the belts sit with the players right up until someone has to hand them over. The loser has every incentive to stop replying, and there is no neutral party holding anything. Any platform that arranges the match but leaves settlement to the players has skipped the part that actually goes wrong.

Broadcasting a Match Means Running Two Systems at Once

A player who wants their match watched has to configure OBS, start the stream, then keep half an eye on it - muting a mic, switching a scene, checking they are actually live - while playing a match they have money riding on. Every one of those actions means leaving the game. The tooling to broadcast and the place the match is happening were two different windows.

A Self-Reported Result Is the Weakest Basis for Moving Money

A player saying they won is fine right up until the moment it matters. Once a prize pool is attached, one side's word cannot be what releases it, and the platform needs a way to tell the difference between a result both players agree on, a result they contest, and a result only one of them ever submits.

A Rank That Only Goes Up Stops Meaning Anything

If winning raises a player's standing but losing costs nothing, standing stops measuring skill within a few weeks and starts measuring how many matches someone has played. For a competitive ladder to hold its shape, a loss has to cost something real - which means the ranking system and the wagering system have to be the same system.

Client Expectations

Player-created events for any game, where the creator sets the belt tier, the stake, and whether spectators watch free or pay tokens to attend

Stakes locked into the event before the match begins, so neither player is trusting the other to pay up afterwards

Broadcast controls inside the platform, so a player can mute, switch scenes, and manage their stream without alt-tabbing out of a match

A live room rather than a video feed, with real-time chat and gifting running alongside the stream

Two-sided result submission with a real dispute path and human adjudication for contested outcomes

A four-tier belt economy with automatic promotion and a genuine cost to losing

A permanent record of past events, their chat, and their results, aggregated into player statistics

A clean boundary between real money and platform currency, with card purchase on the way in and a reviewed payout on the way out

Proposed Solution

Player-Defined Events with Configurable Stakes

Esquadify does not hold a catalogue of supported games with fixed formats. A player names the game, picks which of the four belt tiers the match is fought at, sets how many belts each side is putting up, and chooses the spectator model: a public event anyone can watch free, or a paid event where the creator sets a token price at the door. The result is a platform whose inventory of matches is defined entirely by what its players actually want to play, with stakes calibrated by the people taking the risk.

Belt and Prize Escrow Held by the Event

Accepting a challenge is the moment the stakes stop belonging to the players. Both sides' belts and prize money move out of their balances and are held against the event itself for the duration of the match. Neither player can spend, gift, or withdraw what they have put up, and neither can quietly walk away from it. When the event settles, the stake moves from the event to the winner - it is never in two places, and it never depends on a losing player choosing to pay. On paid events, the tokens spectators pay at the door are split between the two players, so an event that draws an audience is worth more to both competitors.

In-Browser OBS Control over obs-websocket v5

The platform connects directly to the player's own OBS installation over obs-websocket v5 and exposes its controls inside the event page. Mute and unmute, switch scenes, toggle sources, start and stop the broadcast - the actions a player would otherwise alt-tab for sit on the same screen as the match. Commands apply to OBS immediately over the socket, and changes the player makes inside OBS come back the other way, so the panel reflects what the software is actually doing rather than what the platform last asked it to do.

RTMP Ingest to AWS IVS for Low-Latency Streaming

The broadcast itself goes out the conventional way. OBS pushes over RTMP, authenticated with a stream key issued by the platform, into AWS IVS, which handles ingest and low-latency distribution to every spectator in the room. Keeping ingest on a standard protocol means any OBS setup a player already has works without modification, while IVS absorbs the delivery and scaling problem.

Two-Sided Result Verification with Admin Adjudication

When the match ends, each player submits who won. If both name the same winner, the event settles and the stake releases immediately. If they name different winners - or if one player submits and the other never does - the event escalates to dispute rather than resolving on one side's word. In a dispute, each player files a written account and uploads an image as proof, which goes to an administrative review queue where an admin decides the winner. The stake stays locked throughout, so there is no window in which a contested result has already paid out

Four-Tier Belt Economy with Automatic Cascade

Belts are Esquadify's measure of standing, and they are won and lost rather than only accumulated. Winning takes the opponent's staked belts; losing hands over your own. Promotion is automatic and cascading - ten bronze consolidate into a silver, ten silver into a gold, ten gold into a platinum - and the cascade resolves all the way through in a single settlement, so a win that lands a player on a hundred bronze converts straight to a gold rather than stepping through the tiers one at a time. Image name - profile

Match Archive and Player Statistics

Finished events close into an archive that keeps the result, the participants, and the chat that ran alongside the match. Each player's profile aggregates that history into the figures that matter competitively: wins and losses, events created, times challenged, and current belt and token holdings - answering the question an opponent is actually asking before accepting a challenge.

How Is This Different from Other Agencies?

Most agencies sell hours. TechEniac partners on outcomes. Here is what that looks like in practice.

Challenges

How We Resolved

Browser-Side OBS State Drifting Out of Sync

The control panel talks to OBS on the player's own machine, but it is not the only thing doing so — the player has hotkeys and OBS's own window. A panel that flips a mute toggle simply because it sent a mute command drifts from reality within minutes, and a player mid-match ends up trusting an indicator that is quietly lying. The interface was built to never treat its own command as confirmation: a control sends its request and waits for the corresponding event back from obs-websocket v5's event stream before changing what it displays. On connecting, the panel pulls full current state and hydrates from it, so it opens matching whatever OBS is already doing. A dropped socket surfaces as an explicit disconnected state rather than leaving controls that look live but reach nothing.

Concurrent Stake Locking on a Distributed Databas

Accepting a challenge is not one write. It debits the challenger's belts, debits the opponent's, moves the prize money, credits it all to the event, and flips the event's status. Written as a plain read-then-write sequence on DynamoDB, two taps from two devices — or one Lambda invocation retried after a timeout that had actually succeeded — can both read the same starting balance and both write from it, creating belts and prize money that exist twice. Every balance change was made a conditional write predicated on the value it read, and the event's status transition conditional on the event still being in a state that permits accepting. The first request through wins; the second fails its condition and is rejected rather than blindly retried. Where several items must move together, they are grouped as a single transactional write, so the whole accept either lands or none of it does.

Multi-Tier Belt Conversion Interrupted Mid-Cascade

Ten bronze become a silver, ten silver a gold, ten gold a platinum. The obvious implementation is a loop — convert a tier, check again, convert again — and it is wrong on a serverless runtime. A player who wins their way to a hundred bronze needs two full passes through the ladder, and any invocation that times out or is interrupted between passes leaves that balance visibly, possibly permanently, mid-conversion. Conversion was made a calculation rather than a process: the incoming total resolves to its final four-tier balance in a single pass, written as one conditional update in the same operation that awards the win. A hundred bronze resolves straight to a gold in the write that awarded it, and there is no intermediate state to be caught in.

Stateless Compute Serving Stateful Live Rooms

Everyone watching a match holds an open WebSocket connection, and a gift or chat message has to reach all of them within a moment of being sent. But the Lambda handling that message is a fresh, stateless process that knows nothing about who is in the room, and rediscovering the audience from scratch on every message does not hold up when chat and gifts fire continuously through a live match. Connection identity was moved out of the runtime entirely: on connect, the connection is registered against its event room, with Redis holding the hot room-to-connections mapping so a fan-out is one lookup rather than a scan. Disconnects clear their own record on the disconnect route, and connections that vanish without one are pruned when a send to them comes back gone. Delivery then costs in proportion to the size of the room, not the size of the platform.

Unresponsive Players Freezing Prize Pools Indefinitely

Two cases are straightforward: both players name the same winner and the event settles, or they name different winners and it is a dispute. The third case quietly breaks the model — one player submits and the other never opens the app again. A system that waits for two submissions leaves that stake locked forever, and one that awards the win to whoever submitted first rewards speed rather than the actual result. Silence was made a form of disagreement rather than a forfeit: an unanswered result escalates into exactly the same dispute queue a contested one does, where the submitted account and proof image go to an admin who decides the outcome. Every event therefore has a terminal state that does not depend on both players cooperating, and no player can protect a stake they have lost by refusing to acknowledge the match happened

Impact Generated

1

Year

of Continuous Product Development

4-Tier

Belt Economy

with Automatic 10:1 Cascade

~20

DynamoDB Tables

Powering the Platform

2

Real-Time Channels

per Live Match support spectator chat/gifting and browser-based OBS contro

Tech Stack & Infrastructure

Frontend

React Native Web

Backend Runtime

Node.jsAWS LambdaAWS AmplifyAmazon EC2

Data & Caching

Amazon DynamoDBRedis

Real-Time & Streaming

AWS API Gateway WebSocketSocket.IORaw WebSocketsobs-websocket v5RTMP

Payments & Integrations

StripeMailgunAWS S3

You might also like some of our recent stories