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:
- Feature toggles — Turn features on or off without a release
- Copy changes — Update button text, labels, or messages
- Thresholds and limits — Adjust numeric values like pagination limits
- Simple A/B tests — Via Firebase A/B Testing integration
- Rollout gating — Percentage-based rollouts with user conditions
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.
Real Scenarios: Which Tool Wins?
Marketing wants to change "Shop Now" to "Spring Sale — 30% Off" for two weeks.
Users in Japan should see trending products first, while users in the US see personalized recommendations. Different section order, same components.
Design proposed a single-page checkout vs. the current multi-step flow. Neither variant exists in the app.
Apple Pay integration is crashing on iOS 18. Need to hide the button in the next 5 minutes.
Enterprise users see admin setup, consumers see a product tour, returning users skip onboarding entirely. Three different screen structures.
Black Friday countdown banner with a timer, deal summary, and CTA. The app doesn't have a countdown component.
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.
Cost Comparison
Firebase Remote Config is free. That's a real advantage. But consider the full cost picture:
- Remote Config: Free tool, but every layout change costs a sprint cycle (~$5,000-15,000 in engineer time per change)
- DIY SDUI: 3-6 months of engineering to build ($300,000-$1,000,000), plus ongoing maintenance
- SDUI Platform (e.g., Pyramid): SDK integration in days, subscription covers the infrastructure
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:
- Your UI changes are limited to text, colors, and toggle states
- Your team ships app updates on a regular cadence and the cycle time is acceptable
- You're a small team and the added complexity of SDUI isn't justified
- Your experimentation needs are covered by Firebase A/B Testing
- Budget constraints make free tooling essential
When to Add Server-Driven UI
Consider SDUI when:
- Your PM or designer requests layout changes that require releases
- You're running into the cost of slow releases — missed deadlines, coordination overhead, long QA cycles
- You need to run growth experiments on UI structure, not just values
- Different user segments need fundamentally different screen layouts
- Your app serves multiple markets with different UI requirements
- You've started putting JSON blobs in Remote Config parameters to hack layout control
Migration Checklist
If you decide to add SDUI alongside Remote Config, here's a practical sequence:
- Audit your screens — Which ones change most? Which have the most A/B test requests?
- Pick one screen — Start with a high-churn, lower-risk screen (not checkout)
- Map your components — List the UI components that screen uses today
- Integrate the SDK — Register your components with the SDUI renderer (Pyramid quickstart)
- Define the screen server-side — Recreate the current layout as a server-driven screen
- Gate with Remote Config — Use a feature flag to roll out the SDUI version to 5%, then 25%, then 100%
- Expand — Add more screens as confidence builds
Related Articles
- Feature Flags vs SDUI: When to Use Each →
- What Is Server-Driven UI? A Complete Guide →
- SDUI Tutorial: Dynamic Screens with Jetpack Compose →
- CodePush Alternatives in 2026: What Are Your Options? →
- SDUI Adoption Playbook: From Evaluation to Production →
- Migrating to Server-Driven UI: A Practical Guide →
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 →