All work

Case study 01 · iGaming platform · B2B · Regulated market

One platform.
Seven operator brands.

A B2B platform that lets sports-betting and online-casino operators in the regulated Brazilian market run their own branded product: a player portal on the web, as a PWA and in mobile apps, and a back office to manage it. The multi-brand frontend we built took it from a single brand to seven on one codebase, with more than a million players.

Product
Player portal (web, PWA, iOS & Android) and operator back office
Our role
Dmytro as frontend lead; Denys and Nikita as frontend engineers in 2025–26
Period
October 2022 → today
Team
About 12 people, 4–5 of them frontend at a time
7

operator brands on one codebase

1M+

players across the brands

66% → 15%

of portal commits were bug fixes, 2022 → 2026

1–1.5 months

to build identity verification (KYC) for a regulatory deadline

45–50 → 75–80

page-speed score (Lighthouse) after the Next.js rebuild, on staging

0 → 862

automated test files, 72% coverage

The challenge

A white-label platform grows by adding operator brands, and this one was preparing to launch into a regulated market where search traffic mattered. In autumn 2022 the player portal served a single brand, wasn't ready for search engines and carried duplicated desktop and mobile code from a legacy sportsbook. The back office was a monolithic app from 2020.

Regulators added hard deadlines along the way. In late 2025 the portal hit a performance ceiling and still had no automated tests, so the team decided to rebuild it on Next.js.

Results

  • Market launch 1.5 years after development started; today seven operator brands run on one codebase, with more than a million players.
  • Brazilian requirements for identity verification and responsible gaming were met on time, which kept the platform operating in the regulated market.
  • Quality improved year after year: two in three portal commits were bug fixes in 2022, about one in seven in 2026, and reverts dropped from 30 in 2023 to 5 in 2026.
  • The Next.js rebuild is ready for launch: its page-speed score is 75–80 against 45–50 today, measured on staging, with 862 automated test files at 72% coverage.
  • About two releases a month in 2025, roughly 265,000 lines of legacy code removed over four years, and new developers onboarded in a few weeks.

The client, brand names, domains and screenshots are under NDA. Quality figures come from git history.

What we did

  1. 01

    Found in search before launch

    Server-side rendering with each brand's look and localised addresses, so the portal could bring in the search traffic the launch depended on.

  2. 02

    Seven brands, one codebase

    A theming system turns a brand's palette into a complete look, and each brand's country, currency, language and payment settings live in the back office. Seven brands launched on it in two years, and brand apps for iOS and Android were added too.

  3. 03

    Room to grow

    Both products moved into monorepos split into eleven micro-frontends with clear boundaries, and the back office was rebuilt on a new API, removing about 65,000 lines of legacy code in six months.

  4. 04

    Identity checks before the regulator's deadline

    Document scanning, face detection and liveness checks built from scratch and live within 1–1.5 months. In 2026 the company switched to an external provider.

  5. 05

    Operators edit their own sites

    Visual builders for the header, navigation and game cards with a live preview, so operators change their sites without developers.

  6. 06

    Shared design systems

    Component libraries for the portal and the back office, and an in-house data table that replaced the paid AG Grid Enterprise in 141 places.

  7. 07

    A faster, tested portal on Next.js

    In 2026 a team of five rebuilt the portal on Next.js 16 and React 19, with page speed and automated tests as the goals. It is ready for launch.

Under the hood

Event-driven cache invalidation

Operators expect banner, game and promo changes to appear on every brand's site at once, while pages stay cached for speed. Timer-based revalidation can't do both: content is either stale or constantly rebuilt.

  1. Every back-office change publishes an event to RabbitMQ, tagged with the operator it belongs to.
  2. Each Next.js instance listens for those events and revalidates only the affected pages and data.
  3. The prerender cache ships inside the Docker image, so a deploy doesn't start with every request missing the cache.
  4. One API client sets cache lifetimes and tags for all data, since Next.js no longer caches fetch by default.

Who did what

Dmytro Muzylov

Frontend lead · Oct 2022 → today

Joined as a senior engineer and became frontend lead within the first year. Owns the frontend architecture and infrastructure, the design systems and the mobile apps, and reviewed about three in four portal pull requests.

Denys Sukhomlyn

Senior frontend engineer · Aug 2025 → Jun 2026

Built the header, navigation and game-card builders end to end, from the admin editor to the live site. In the Next.js rebuild, moved about 57 components — from sportsbook cards to responsible-gaming pages — and wrote 86 test files.

Nikita Topchii

Frontend engineer · Jul 2025 → 2026

Built identity-document and verification flows and settings in the portal, and sportsbook, user and bonus screens in the back office. In the Next.js rebuild, moved the casino and sportsbook screens, set up PWA behaviour and added tests.

How we worked

Two-week sprints with a board per brand. The client's PM owns priorities and releases, and the engineers can reach the client directly with questions. Every change goes through a reviewed pull request with automated checks, and a feature can wait for its release without blocking others. Since 2026 the team has worked with Claude Code under agreed repository rules.

Stack

Player portal
  • Angular 20
  • Nx 21
  • Module Federation
  • SSR on Express
  • NgRx → signals
  • Angular CDK
  • Tailwind + design tokens
  • SignalR
  • PWA
  • Cypress
Back office
  • Angular 19
  • Nx 20
  • Module Federation
  • Signals
  • Angular CDK
  • TanStack Table
  • Monaco
  • Chart.js
Next.js rebuild
  • Next.js 16
  • React 19
  • Nx 22
  • Zustand
  • SWR
  • react-hook-form + zod
  • Storybook 10 + MSW
  • Vitest + Testing Library
  • RabbitMQ
Mobile & backend
  • TWA → Capacitor
  • .NET APIs (client team)
  • WebSockets
  • MassTransit

Start a conversation

Running a multi-brand platform?

Tell us what you're building, modernising or trying to unblock. One contract via a Lithuanian entity, EU VAT invoicing — we reply within one business day.