Rumble Advertising Center

Moving a live ad platform off Bootstrap

AdTech·B2B SaaS·Web & Mobile·Design System·Lead Design·Front-end

I lead design for RAC, Rumble’s advertising platform. This is its redesign: from a 2021 Bootstrap 3 admin to Vue 3, PrimeVue and Tailwind — shipped page by page without a big-bang release, on a design system rebuilt from the shipped code.

View Live Project
Redesigned wallet on a phone: balance, add funds and payment methods.
Redesigned statistics on a phone: date range, grouping and a chart card.
Redesigned Creator Management on a phone: each creator as a card with status, platforms and stats.
Redesigned campaign builder on a phone: a stepper with general settings and publisher choice.
Redesigned creatives library on a phone: upload area and creative cards.

Role

  • Lead Product Designer
  • Front-end contributor

Team

  • Product & engineering
  • ~9 engineers on the migration
  • Ops, finance, sales, support

Tools

  • Figma
  • PrimeVue 4, Tailwind v4
  • Vue 3, Laravel, Jira

Timeline

  • May 2023 – present
  • Redesign shipping since Aug 2024
  • Ongoing

Internal tool. Every screenshot uses seeded demo data; names and figures are fictional.

Overview

This case study shows how I redesigned a live revenue platform without ever freezing it — one route at a time, with a way back to the classic interface.

About RAC

RAC is a self-serve ad platform and an internal admin in one Laravel codebase. It serves three audiences and the teams behind them:

  • Advertisers — run traffic campaigns and book creators for live reads.
  • Publishers & creators — monetise sites and zones, manage channels and deliverables.
  • Rumble’s own teams — ops, account managers, finance, sales and support approve, schedule and reconcile everything.
Redesigned dashboard with the expanded sidebar and design annotations.
* The redesigned shell: a sidebar that holds 140 destinations, collapsible to a 67px rail. I designed it and built it myself.

Problem

The app started in 2021 on a Bootstrap 3 admin theme. Every new feature added a page, and every page solved its own layout — the stylesheet chain ended up declaring 582 colours and 38 font sizes, and the navigation grew to 140 entries.

Three problems sat on top of each other: a UI that had drifted page by page, an information architecture that scattered single jobs across a dozen screens, and no safe way to change either on a tool that moves advertiser money.

Solution

Flows first, then structure, then pixels. I mapped the highest-traffic and most fragmented flows, rebuilt the information architecture around jobs, and put the visual layer on a design system that mirrors the shipped PrimeVue preset.

It ships one route at a time behind a route flag, with an escape hatch back to the classic interface — so advertisers get improvements months earlier and revenue flows never freeze.

Leading the way: design lead and decision owner

Since May 2023 I’ve owned every design and product decision on RAC — flows, information architecture, the design system, and business calls like how off-platform deliverables are priced. I also ship front-end code: the collapsible sidebar and the wallet addresses UI are mine.

Deliverables

A redesigned app shell and navigation, the core advertiser and admin flows, a creator operations workspace, and a design system that developers can build from without guessing.

119Routes live
54Colour tokens
1,310Button variants

Impact

The redesign made RAC calmer, faster to learn and cheaper to extend — without a single big-bang release.

  • Campaign setup went from three overloaded tabs to five guided steps, with the publisher chosen first to stop mismatched creatives.
  • Managing a creator went from five tools to one workspace, and on pages that exist in both versions the rendered palette dropped from 40 colours to 27.
3 → 5Guided steps
5 → 1Creator tools
−33%Visual noise

Research

Before touching pixels I measured the legacy UI, and mapped who uses RAC, who runs it and who builds it.

01

UI Audit

I scanned the stylesheet chain and the rendered pages that exist in both versions, at 1440px, on the same local data. Four numbers tell the story — and one honest outlier shows what the design system work still targets.

Unique colours declared

Legacy stylesheet chain (33 files) vs the RAC token collection.

582 → 54

Colours actually rendered

Union across four pages that exist in both versions.

40 → 27

Font sizes

Declared legacy sizes vs the 12 text styles in the design system.

38 → 12

Routes on the redesign

Routes opted into the new shell, Aug 2024 → Sep 2026.

0 → 119

Button styles rendered

Shipped pages still render five severities at six heights — closing that gap is exactly what the design system targets.

11 → 22in progress
UI audit board: legacy desktop and mobile screenshots with seven numbered findings, next to declared and rendered style counts.
02

Stakeholder Map

RAC has two kinds of users who rarely meet: the advertisers, publishers and creators who use it, and the internal teams who run it. The internal teams carry most of the complexity — 11 approval queues, 3 sales queues and a finance queue.

I worked with each group directly: ops and account managers on the creator workspace, finance on IO review and invoicing, sales on pricing, support on where advertisers got stuck, and engineering on what could ship in each release.

Stakeholder map: external audiences, internal teams and the product team, each with the source that evidences them.
03

Problem Framing

The visual drift was a symptom, not the cause. To look after one creator, an admin used a 13-column settings table and an edit popup, a separate scheduler, the campaigns list, a third-party viewership tool and Slack for ownership. Key pain points:

  • Visual drift: six button fills with no reserved primary colour, tiles coloured at random, three kinds of breadcrumb.
  • Scattered jobs: creator operations spread over 23 navigation entries in three groups.
  • Risky change: 354 Blade views that could not be replaced in one release.
Problem framing board: a problem statement, three stacked problem layers with evidence, and four How Might We questions.

Ideation

Flows first, then structure, then pixels — and every big call written down with the options I turned down.

04

Task Flows

I mapped the two flows that mattered most, before and after: the advertiser’s campaign builder, the highest-traffic flow, and the admin’s creator management, the most fragmented one. Three tabs became five named steps; five tools became one workspace.

Task flows board: campaign creation goes from 3 tabs to 5 steps; managing a creator goes from 5 tools to 1 workspace.
05

Information Architecture

Counting where each job lived in the navigation showed that creator operations needed a workspace of their own — a triage list plus a nine-tab Creator 360 page — and that the whole app needed a navigation that could hold 140 destinations.

Information architecture board: the 18 admin navigation groups with 23 creator entries highlighted, next to the designed Creators workspace.
06

Key Decisions

Five calls shaped the redesign. For each one I weighed the realistic options and owned the choice.

Rollout

Migrate page by page behind route flags

354 Blade views, three audiences and live advertiser spend. A rewrite would have frozen the product for as long as it took.

  • ✕
    Big-bang rewriteClean result, but nothing ships until everything ships.
  • ✕
    A separate new appTwo apps to run, and users jumping between them.
  • ✓
    Page by page inside the same appA route attribute opts a page into the new shell.

Why: every page ships when it is ready, and the “switch to the classic interface” link fires an analytics event — so the fallback is measurable instead of a guess.

Pricing

Price every off-platform deliverable explicitly

Cross-posts to X, YouTube, TikTok and Instagram had nowhere to live, so a read that was already paid for started multiplying its flat rate.

  • ✕
    A free-text note on the IOInvisible to pricing and payouts.
  • ✕
    A new priced line for every postCharges advertisers twice for simple distribution.
  • ✓
    One flag per entryDistribution adds $0; a separate deliverable carries its own price.

Why: campaign totals and creator payouts stay correct, advertisers see exactly what adds cost before they commit, and sales gets a clean way to sell extra deliverables.

Design system

Rebuild the design system from the shipped code

The Figma library had drifted from what PrimeVue actually renders. Design specified one thing; development built another.

  • ✕
    Keep the old custom libraryFamiliar, but already out of step with the code.
  • ✕
    Use PrimeOne defaults as they areMatches PrimeVue’s docs, not RAC’s preset.
  • ✓
    Align PrimeOne to the RAC presetTokens, type and sizes from real usage.

Why: developers implement PrimeVue, so designing with what they build stops drift. The app uses the small button 235 times and the large one 4 times — so Small became a first-class variant.

Structure

Give creator operations one workspace

Managing one creator took five tools, and settings were edited in a popup that duplicated the detail view.

  • ✕
    Improve the table and popupFaster, but still five tools.
  • ✕
    Add more pages under CreatorsMore entries in an already long navigation.
  • ✓
    A triage list plus Creator 360Nine tabs, one canonical place to edit.

Why: ownership, scheduling and campaign context belong next to the creator they describe — fewer tool switches, faster triage.

Mobile

On mobile, keep the table and pin the actions

Ops tables have 10 to 16 columns. At 390px the legacy tables simply overflow.

  • ✕
    Hide columns on small screensThe hidden column is always the one someone needs.
  • ✕
    Turn every row into a cardReadable, but rows stop being comparable.
  • ✓
    Scroll the table, pin the actionsStatus and amount sit in the first viewport.

Why: data stays comparable, it matches how production freezes columns, and it gives one rule for every table in the product.

Design

A design system that mirrors the code, then the product, screen by screen.

07

Design System

The RAC collection holds 54 colour variables with light and dark modes, so dark mode is a mode switch rather than a second palette. Twelve flat text styles mirror the app’s 14px root. Buttons, badges, tags and tables are components with the variants the code actually uses.

Two rules came out of real mistakes: surface tokens that match in light mode but diverge in dark are named by role, and every regular-weight text is bound to a style — because “looks right” is not the same as “will stay right”.

Design system board: before-and-after counts, colour tokens with light and dark swatches, the twelve text styles, and live components.
08

Before & After

Each pair shows the same data at the same scroll position. Drag the handle to compare the legacy page with the redesign.

BeforeAfter

    09

    Sidebar Navigation

    The legacy app hid 140 entries behind five top-level dropdowns. The redesign moves navigation into a sidebar grouped by job, with notification counts and an account switcher for agencies. It collapses from 290px to a 67px icon rail, giving tables and charts 223px back, and remembers the choice. I designed it and built it myself.

    10

    Creative Folders & Campaign Linking

    Creatives lived in one flat grid and could only be attached from inside a campaign. Now advertisers link creatives to one or many campaigns straight from the library, see at a glance where each one runs, and organise the library into folders. Linking shipped in June 2025.

    11

    Global Search, by Role

    Finding a campaign, a creative or a user meant knowing which of 140 pages it lived on. One search field in the top nav, opened with ⌘K, now returns results and quick actions based on who is searching — advertisers see their own campaigns and creatives; admins search users, sites and approval queues across the platform.

    12

    Rollout

    Four switches make the incremental rollout work: a route attribute that opts a page into the redesign, an escape hatch back to the classic interface, a preview gate for unfinished pages, and a per-user permission for dark mode. I sequenced the work for reach and revenue — advertiser flows first, admin tools after — and routes on the redesign went from 54 to 117 between March and June 2026.

    Rollout board: four rollout switches, redesign routes per quarter from 0 to 119, milestones, and an effort-and-reach plot.

    Reflection

    13

    Impact

    The redesign laid the foundation for everything RAC ships next — measured, not guessed:

    119

    Routes live

    From zero in August 2024, without a single big-bang release.

    −33%

    Visual noise

    Rendered colours down from 40 to 27 on pages in both versions.

    3 → 5

    Campaign setup

    Three overloaded tabs became five guided steps.

    5 → 1

    Creator operations

    Five tools for one creator became one workspace.

    54 · 12

    Design system

    Colour tokens and text styles matched to the code.

    $0

    Pricing leak

    A paid read can no longer multiply its flat rate.

    +223px

    Screen space

    The collapsible sidebar hands data-heavy pages more width.

    Shipped

    Dark mode

    Same tokens as light, so every new page gets it for free.

    14

    Timeline

    1. I join as lead designer of RAC; dashboards redesigned for all four roles.
    2. New top navigation on every legacy page; the redesign’s app shell goes in.
    3. Creatives with campaign linking, and the campaign builder with its classic-interface escape hatch.
    4. Dark mode, behind a per-user permission.
    5. Collapsible sidebar, designed and built by me; the migration wave begins.
    6. Design system re-aligned to the shipped preset; Wallet, Statistics and global search designs.
    7. Off-platform deliverable pricing; Creator 360 across all nine tabs.
    15

    What I’d Do Differently

    Name surface roles before dark mode

    Two tokens were identical in light and opposite in dark. Defining “recedes” and “rises” surfaces first would have saved a sweep of 192 cells.

    Publishing the library is part of done

    A dark-mode value changed in the source but was never published. A release step with a changelog closes that loop.

    Mobile rules before mobile screens

    A scrolling tab strip shipped on 13 frames before the rule — the menu, never a tab strip — was written down.

    Measure the baseline first

    The escape hatch was instrumented from day one, but task time wasn’t captured beforehand. Next time the baseline comes first.

    Contact

    martintenovski@hotmail.com

    Let’s make something complex feel simple

    LinkedIn