● THE PROBLEM
What we walked into.
The client had one Unreal Engine experience, on one GPU, for one player at a time. It took 30 seconds to start, and every session exposed the address of the machine behind it. Then a sales pilot sent 1,200 prospects in at once, and on day three the whole thing fell over.
GOALS WE COMMITTED TO
- One link for everyone, with the machine behind each session kept private
- Pixels on screen in under two seconds from a warm pool, and under twelve from cold
- Every session reachable only by the person it belongs to
- Enough visibility to follow a single frozen frame through five services
● THE SOLUTION
What we shipped.
- 01A Go orchestrator that runs the GPU pool. It leases a warm Unreal instance to each new player, holds the lease in Redis, and takes the machine back the moment they leave.
- 02Unreal Pixel Streaming on every GPU node, so a thin laptop or a phone plays like a workstation. The heavy rendering never leaves the data centre.
- 03Kong at the front door, handling mTLS, checking tokens and keeping each tenant inside its own rate limits.
- 04Laravel for sign in and permissions, NestJS for the session lifecycle, and RabbitMQ carrying events between them.
- 05Fluent Bit gathering logs from every node into Loki, linked by trace ID to metrics in Prometheus and traces in Tempo.
Architecture
The full topology, at a glance.
Microservices
The services we shipped.
stream-orchestratorGo
GPU pool, leases, evictions
auth-svcLaravel
SSO, RBAC, JWT
session-svcNestJS
session lifecycle, limits
upload-svcLaravel
build ingest, transcoding
log-svcNestJS
RabbitMQ → Loki bridge
billing-svcNode
metered minutes, Stripe

