Frontend Developer· 2023–2026

Content Catalyst Platform

ReactTypeScriptMulti-tenantUI/UXSaaS / Data PlatformsNext.jsMUIDynamoDBAWS

Overview

Content Catalyst provides a white-label subscriber portal platform for analyst research firms and enterprise insights providers, used by 275,000+ subscribers worldwide. I led the migration of the main product to a modern platform (Next.js App Router, React Server Components, Server Actions, MUI, AWS), delivering the majority of the frontend myself after leading the design and sprint planning.

I owned the frontend design system end to end (Figma, design tokens, variables), establishing conventions used across the main application, the AI assistant, and the admin platform, and built the per-tenant theming, feature-toggle, and locale-aware routing architecture that lets every tenant run its own branding and navigation without forking the codebase.

Design system

Migrated our Figma libraries onto MUI, adopting Figma's variables and modes to keep tokens in sync between design and code. Planned and implemented a dynamic design system for the homepage/showcase area, validated through dynamic mockups before it reached the codebase: a reusable component library (internally versioned V3, then reworked into V4) with easy-to-combine building blocks for content sections, letting new page sections ship fast instead of being bespoke each time.

Per-tenant branding: every tenant runs its own look without forking the codebase.

Features I designed and built

The homepage/showcase configuration system: layout, card variations, and section types that tenants can configure without code changes, plus a customisable showcase header. Showcase-wide loading states: skeletons and Suspense boundaries across both server- and client-rendered parts of the page, which also fed into general Next.js SSR practice improvements on the team.

Helping subscribers find the content and data they need.

Category Navigator: the site's mega menu, browsing the platform's content taxonomy (sector, region, and featured content types) in one expandable panel instead of forcing subscribers through a page-by-page category tree. It opens on demand, positions itself against the header, and reuses the same category data structure across desktop and mobile.

Category Navigator: browsing sector, region, and featured content in one panel.

Fully customisable header: a primary navigation bar tenants can populate with their own links (left-aligned, unlimited) plus a secondary bar (right-aligned, capped at two links), each configured per tenant in the admin platform without a code change or deploy.

The live header: primary and secondary nav bars, both tenant-configurable.

Fully customisable page blocks: the showcase homepage is built from an ordered list of section types (Hero, Promoted Content, Licensed Content by Category Cover, Products & Services, Power BI dashboard embeds, and more) that a tenant admin can add, remove, reorder, and configure without a deploy. Each block type renders differently depending on the tenant's content and settings, from a category cover with an icon and live subscription feed, to a grid of product/service cards, to an embedded Power BI dashboard.

Category cover block: recently added content for a subscribed category.
Products & Services block: content broken down by type.
A promotional banner block, one of the configurable section types.
An embedded Power BI dashboard block, live tenant data inside the showcase page.

I also consolidated a long-standing IFrame-embedding problem, where CCM pages were each handling iframe embedding differently through several fragmented helper functions, into a single reusable, app-wide component with consistent JavaScript-driven iframe settings.

A design system agents implement against

I migrated the design system out of Figma and into markdown living in the codebase itself: folder-level routing docs (what to read for a given area) plus a per-component spec for anything with real behavioural nuance, covering when to use it, its props, and its API usage, so Claude Code reads the constraints and conventions before touching a component rather than guessing from surrounding code. More detail on this in my AI-Assisted Engineering Workflows write-up.

Figma, migrated into specs agents implement against.