logo falcao Dev
.../projects

Golden Palace Dice

The casino app of Golden Palace, one of the largest gaming operators in Belgium, on iOS and Android. Built by Nightborn, the agency I work for, for its client Golden Palace: I was the main developer on the app, on one of the biggest accounts of the agency. React Native, regulated fintech, tens of thousands of active players.

I shipped more than 30 features, from bank account verification with TrueLayer and identity with itsme to payment and game provider integrations and the deep links between the web app and the mobile app. I wrote the native module that closed a months-old touch conflict in the live-table WebView. I profiled low-end Android with Perfetto and brought every screen to 60+ FPS, and cut cold start from 4.1 s to 0.9 s.

I built the quality and release machinery around it: Jest, React Native Testing Library and Maestro on every pull request, which halved regressions in production and took coverage from 18% to 54%. A GitHub Actions and Fastlane pipeline ships a validated release to QA every Friday and OTA updates on demand. Re.Pack took builds from 35 minutes to under 5, and the monorepo moved from Yarn 1 to pnpm with a measured 3x faster install.

Golden Palace Dice interface
Release date
November 2025
Project name
Golden Palace

Frontend

  • React Native
  • Reanimated

Tooling

  • TypeScript
  • Jest
  • React Native Testing Library
  • Maestro
  • Fastlane
  • GitHub Actions CI/CD
  • pnpm monorepo
  • Re.Pack
  • Perfetto
-50%
Regressions reaching production

Production regressions counted before and after the test layers went in: Jest unit tests, React Native Testing Library component and integration tests, Maestro end-to-end on every pull request.

18% to 54%
Test coverage of the codebase

Jest coverage report over the whole codebase, before the testing effort and today. Hooks, integrations and components were covered first. Still increasing.

4.1 s to 0.9 s
Cold start

Measured on device before and after enabling Hermes and restructuring the lazy loading of non-essential screens.

35 to < 5 min
Build time

Duration of an app build in the pipeline, before and after build caching and Re.Pack reusing the native build so only the JavaScript bundle is rebuilt.

The walkthrough

5 sections
01 / 05

Features I shipped

More than 30 features in production, on the money and compliance side first: bank account verification with TrueLayer open banking, identity verification with itsme, payment providers, game provider integrations. Deep links between the web app and the mobile app, so a link on any page opens the same screen on the phone. And the native module that closed a touch conflict between the gesture handler and the live-table WebView that had been open for months.

Diagram of the features I shipped on Golden Palace Dice: 30+ features, TrueLayer bank verification, itsme identity, game provider integrations, payments, deep links between the web app and the mobile app, and the native module for the touch conflict
02 / 05

Performance, measured on real devices

Cold start from 4.1 s to 0.9 s with Hermes and a lazy-loading strategy. Then the low-end Android phones: profiled with Android Profiler and Perfetto, the heavy Reanimated animations were saturating the JS thread. Disabled or rewritten screen by screen, p95 dropped frames fell 40%, and every screen holds 60+ FPS on iOS and on Android 14 and up.

Diagram of the performance work on Golden Palace Dice: cold start 4.1 s to 0.9 s, p95 dropped frames down 40% on low-end Android after profiling with Perfetto, 60+ FPS on every screen, and the native module between the gesture handler and the WebView
03 / 05

Quality, built into the pipeline

Four layers of tests: Jest for every hook and piece of logic, React Native Testing Library for components and integrations, Maestro for the real journeys on device, all running per pull request, nightly and before every build. Regressions reaching production fell by half. Coverage of the whole codebase went from 18% to 54% and is still climbing.

Diagram of the test layers on Golden Palace Dice: Jest unit tests, React Native Testing Library component and integration tests, Maestro end-to-end; regressions in production down 50%, coverage from 18% to 54%
04 / 05

Releases every Friday, hands off

GitHub Actions and Fastlane build, test and hand a validated release to QA on a schedule, for iOS and Android, with nobody pressing a button. A second pipeline ships JavaScript-only changes over the air to QA and to production. Re.Pack reuses the native build and rebuilds only the bundle, for QA and for every developer locally: 35 minutes became under 5.

Diagram of the release pipeline on Golden Palace Dice: scheduled Friday trigger, tests, Fastlane native build, QA build, release; OTA update pipeline; build time 35 to under 5 minutes with Re.Pack
05 / 05

Monorepo: Yarn 1 to pnpm

Yarn 1 is end of life, so I moved the monorepo to pnpm and measured it first. Cold install 267 s to 90 s, warm install 134 s to 43 s, 14 s incremental, 2.3 GB less on disk. The isolated node_modules layout means a package can only import what it declares, which removes a whole class of works-on-my-machine bugs.

Table of the Yarn 1 to pnpm migration benchmark on Golden Palace Dice: cold install 267 s to 90 s, warm install 134 s to 43 s or 14 s incremental, disk down 2.3 GB, isolated node_modules, readable lockfile diffs
Go back to projects