Case study · 08 of 27

Nomad Arabia: moving a live-events agency off WordPress without anyone noticing

Nomad Arabia is the live-events agency in the group of companies I run technology for: capital-markets forums in Riyadh and Hong Kong, the Tadawul ring-the-bell ceremony, Mercedes-Benz and BMW launches and activations across the…

Role: Group CTO; sole developer of the rebuildStack: Next.js 14 (App Router), React 18, the agency's original theme CSS and brand fonts served verbatim, jQuery, slick, GSAP ScrollSmoother, AOS and Fancybox ported for the animations, deployed on VercelLive: nomad-arabia.com
Nomad Arabia: moving a live-events agency off WordPress without anyone noticing, live site
Live: nomad-arabia.com

Context

Nomad Arabia is the live-events agency in the group of companies I run technology for: capital-markets forums in Riyadh and Hong Kong, the Tadawul ring-the-bell ceremony, Mercedes-Benz and BMW launches and activations across the GCC, the X-CAT World Series. Its public site was a WordPress theme with a heavy plugin stack, and it had become the odd one out: every other property in the group was on Next.js with a shared deployment and security posture, and the WordPress install was one more thing to patch, back up and defend.

The brief I set myself was strict: move it to the same stack as the rest of the group, keep every URL, and make the result visually indistinguishable from the original. A marketing site for an agency that sells visual experiences cannot come back looking "migrated".

What I built

A faithful reconstruction, not a redesign

The theme's stylesheets are served unchanged from public/assets/css in their original load order, and the asset folders mirror the theme's layout so every relative url(../fonts/...) and url(../images/...) reference resolves without editing a line of CSS. The brand fonts (Muller, Future Flow) were missing from the saved pages, so I recovered them from the live theme. Plain <img> and <video> tags reproduce the original markup exactly rather than routing through next/image.

The animation layer, ported

The original relied on jQuery, slick sliders, GSAP with ScrollSmoother, AOS reveals and a Fancybox gallery. A single SiteScripts component loads those libraries in order and ports the theme's initialisation logic: hero text reveal, sponsor marquees, the event slider, sticky header, scroll-to-top, lightbox and smooth scrolling. Initialisation is idempotent and re-runs on client-side navigation, which is the detail that makes an App Router site with jQuery-era plugins behave.

Twelve event pages from one data module

src/data/events.js holds the portfolio: twelve events with the slugs the WordPress site used, so every existing link, share and search result keeps working. Each renders through a dynamic [slug] route with copy, showcase video and gallery.

Assets brought home, selectively

Images, fonts and theme files were localised into the repository. Videos were first self-hosted, then the large event showcase clips were moved to a CDN and dropped from the repo to keep clones and deploys fast. The homepage hero video was later swapped for a Nomad Hospitality clip as the group's positioning shifted, and the footer gained a Group of Companies section linking the sister brands.

Decisions worth noting

Why it is in the portfolio

It is a small, complete example of the unglamorous CTO work that keeps a group of companies coherent: retiring a platform, preserving everything the business cares about, and doing it quietly. It is presented at its true scale, a marketing-site migration, alongside the platform builds it sits next to in the group.

Next step

Have a system like this to build, rescue or scale?

I run technology for several companies at the same time and take on a small number of fractional engagements. The first step is always a scoped audit.