← Back to Blog

Firebase Remote Config vs Server-Driven UI: Where Config Ends and UI Begins

Firebase Remote Config is the first tool most Android teams reach for when they want to change something without an app release. It works great — until you need to change a layout, reorder a screen, or add a component that doesn't exist yet. That's when you need server-driven UI.

What Firebase Remote Config Actually Does

Remote Config is a key-value store in the cloud. You define parameters in the Firebase console, fetch them in your app, and use the values to control behavior. It's straightforward and well-integrated with the Firebase ecosystem.

// Typical Remote Config usage
val remoteConfig = Firebase.remoteConfig
remoteConfig.fetchAndActivate().addOnCompleteListener {
    val showBanner = remoteConfig.getBoolean("show_promo_banner")
    val bannerText = remoteConfig.getString("promo_banner_text")
    val maxItems = remoteConfig.getLong("home_feed_max_items")
}

This works perfectly for:

💡 The Key Insight
Remote Config changes values within existing UI code. If your layout says if (showBanner) Banner(text), Remote Config can toggle the boolean. But it can't create the Banner composable — that has to already exist in the app binary.

Where Remote Config Hits Its Limits

The frustration usually starts when your PM, designer, or marketing team asks for something that Remote Config can't deliver. Here are the six walls teams commonly hit:

1. You Can't Change Layout Structure

Want to move the search bar from the top of the screen to a floating action button? Swap a list view for a grid? Add a new section between two existing ones? Remote Config can't help. The layout is hardcoded in your Compose or XML files.

2. New Components Need a Release

If marketing wants a countdown timer on the home screen and you don't have one coded, that's a sprint, a PR, a QA cycle, and an app store review. Remote Config can't conjure UI components that don't exist.

3. A/B Testing Is Limited to Pre-Coded Variants

Firebase A/B Testing lets you test different values, but both variants must already be coded. You can test "Buy Now" vs. "Add to Cart" but not a horizontal carousel vs. a vertical grid — unless both layouts are already in the app.

4. The 2,000 Parameter Ceiling

Remote Config supports up to 2,000 parameters per project. For a few feature flags, that's plenty. But teams that try to use it for complex screen configurations quickly find themselves managing hundreds of tightly coupled parameters.

5. Fetch Throttling and Caching

Remote Config has a 12-hour minimum fetch interval by default (5 per hour in development). This is fine for feature flags that change rarely, but problematic if you need real-time UI updates for time-sensitive promotions or live events.

6. No UI-Level Exposure Tracking

When you run an A/B test with Remote Config, you know a user fetched a variant. But did they actually see the component? SDUI with proper instrumentation tracks actual UI exposure — when a component enters the viewport — giving you cleaner experiment data.

What Server-Driven UI Changes

Server-driven UI flips the model. Instead of fetching values and plugging them into hardcoded layouts, the server sends the entire UI structure. The client has a library of components it can render, and the server composes them into screens.

// Remote Config: values plugged into hardcoded layout
@Composable
fun HomeScreen() {
    val showBanner = remoteConfig.getBoolean("show_banner")
    Column {
        if (showBanner) PromoBanner()  // Must exist in code
        ProductGrid()                   // Always a grid, hardcoded
        RecommendationList()            // Fixed position
    }
}

// SDUI: server defines the layout
@Composable
fun HomeScreen(layout: SDUIScreen) {
    // Server can send ANY combination of registered components
    // in ANY order, with ANY configuration
    SDUIRenderer(screen = layout)
}

The practical difference is massive:

Capability Remote Config Server-Driven UI
Change text, colors, values ✓ Native strength ✓ Yes
Toggle existing features ✓ Boolean flags ✓ Include/exclude components
Reorder screen sections ✗ No ✓ Server controls order
Add new UI sections ✗ Requires app update ✓ Compose from component library
Change layout type (list → grid) ✗ No ✓ Server picks the component
A/B test any layout variant ✗ Pre-coded variants only ✓ Unlimited server-side variants
Personalize per user segment Limited (conditions) ✓ Entirely different screens
Update old app versions Values only ✓ New layouts on old binaries
Setup complexity ✓ Minutes Days to weeks (or SDK)
Cost ✓ Free (Firebase) SDK or DIY engineering cost

The Evolution: How Teams Get Here

Almost nobody starts with SDUI. There's a natural progression that most mobile teams follow. Recognizing where you are helps you decide what's next.

1
Hardcoded Everything
Every change requires a new build, QA, and release. Two-week cycles. PM frustration begins.
2
Firebase Remote Config
Feature flags, remote strings, simple A/B tests. Fast wins. But eventually someone asks "can we change the layout?" and the answer is no.
3
JSON-Driven Config Hacks
Teams start putting JSON blobs in Remote Config parameters to describe layouts. It works — barely. No type safety, no tooling, fragile.
4
Server-Driven UI
A proper rendering engine, component registry, and server-side screen builder. Layout control without app releases. This is where Airbnb, DoorDash, Lyft, and Netflix ended up.
🎯 You Don't Have to Jump to Step 4
If Remote Config covers your needs today, keep using it. SDUI adds complexity. The question is whether the flexibility is worth the investment for your team. Check our ROI calculator to find out.

Real Scenarios: Which Tool Wins?

📝 Updating CTA button text for a promotion

Marketing wants to change "Shop Now" to "Spring Sale — 30% Off" for two weeks.

Winner
Firebase Remote Config ✓ — One parameter change in the console
🔄 Reordering the home screen for different markets

Users in Japan should see trending products first, while users in the US see personalized recommendations. Different section order, same components.

Winner
Server-Driven UI ✓ — Server sends different section ordering per region
🧪 A/B testing a completely new checkout flow

Design proposed a single-page checkout vs. the current multi-step flow. Neither variant exists in the app.

Winner
Server-Driven UI ✓ — Both flows defined server-side, no release needed
🚨 Emergency: disabling a broken payment method

Apple Pay integration is crashing on iOS 18. Need to hide the button in the next 5 minutes.

Winner
Either works — Remote Config is fine for kill switches
🎯 Personalized onboarding per user type

Enterprise users see admin setup, consumers see a product tour, returning users skip onboarding entirely. Three different screen structures.

Winner
Server-Driven UI ✓ — Different screens per segment, no code changes
Adding a limited-time countdown banner

Black Friday countdown banner with a timer, deal summary, and CTA. The app doesn't have a countdown component.

Winner
Server-Driven UI ✓ — If a countdown component is registered, server inserts it anywhere

Using Both Together

This isn't an either-or decision. The most effective approach uses Remote Config and SDUI together, each doing what it does best.

Pattern: Remote Config Gates SDUI

Use a Remote Config boolean to control whether a screen uses the legacy hardcoded layout or the new SDUI-powered layout. This lets you gradually roll out SDUI screen by screen.

@Composable
fun HomeScreen() {
    val useSDUI = remoteConfig.getBoolean("home_screen_sdui_enabled")

    if (useSDUI) {
        // New: server-driven layout
        val screen = pyramidClient.getScreen("home")
        PyramidRenderer(screen)
    } else {
        // Legacy: hardcoded layout
        LegacyHomeScreen()
    }
}

Pattern: SDUI with Remote Config Values

Your SDUI layout can reference Remote Config values for things like copy or thresholds, while the server controls the structure. Best of both worlds.

Pattern: Gradual Migration

Start with your most-changed screens. If the home screen gets updated every sprint but the settings screen changes once a year, make the home screen SDUI and leave settings hardcoded.

📊 Migration Priority Framework
Rank screens by: (frequency of changes × business impact) ÷ complexity. High-churn, high-value, simple screens migrate first. Static screens stay hardcoded.

Cost Comparison

Firebase Remote Config is free. That's a real advantage. But consider the full cost picture:

If you only change layouts once or twice a year, Remote Config is the obvious choice. If you're changing layouts weekly or running continuous experiments, the math shifts quickly. Our ROI calculator can model this for your team.

When to Stick with Remote Config

Remote Config is the right tool when:

When to Add Server-Driven UI

Consider SDUI when:

🚩 The JSON Hack Signal
If your team has started encoding UI structure as JSON inside Remote Config parameters, you've outgrown Remote Config. That's a homegrown SDUI without the safety, tooling, or type safety. It's the clearest sign it's time to evaluate a proper solution.

Migration Checklist

If you decide to add SDUI alongside Remote Config, here's a practical sequence:

  1. Audit your screens — Which ones change most? Which have the most A/B test requests?
  2. Pick one screen — Start with a high-churn, lower-risk screen (not checkout)
  3. Map your components — List the UI components that screen uses today
  4. Integrate the SDK — Register your components with the SDUI renderer (Pyramid quickstart)
  5. Define the screen server-side — Recreate the current layout as a server-driven screen
  6. Gate with Remote Config — Use a feature flag to roll out the SDUI version to 5%, then 25%, then 100%
  7. Expand — Add more screens as confidence builds

Related Articles

Outgrown Remote Config?

Pyramid gives you server-driven UI with a typed DSL, component registry, and built-in experimentation — without building a rendering engine from scratch. Keep using Remote Config for what it's good at. Let Pyramid handle the rest.

Join the Waitlist →