• 10 min read

Pyramid vs RemoteCompose vs DIY: Choosing the Right Server-Driven UI Approach for Jetpack Compose

Server-Driven UI is no longer a Big Tech secret. But in 2026, the question isn't whether to use SDUI — it's which approach to choose. This guide compares three paths: Pyramid, RemoteCompose, and building your own from scratch.

Quick Comparison

Feature Pyramid RemoteCompose DIY
Your components ✅ BYOC (Bring Your Own) ❌ Fixed set ✅ Full control
Setup time Hours Days Weeks–months
A/B testing Built-in (Live Values) No Build it yourself
Visual editor Yes No Build it yourself
Type safety Generated DSL JSON mapping Up to you
SwiftUI support ✅ Native ❌ Compose only Build it yourself
Backend SDK TypeScript + Kotlin N/A Build it yourself
Long-term cost Subscription Free (maintenance cost) Engineering time

What Is Server-Driven UI?

Before comparing, let's align on what SDUI actually means. It's a pattern where:

  1. Your backend defines what the mobile screen looks like (as JSON or a DSL)
  2. Your mobile app renders that definition using native components
  3. You update screens by changing the backend response — no app release needed

The key insight: your app becomes a rendering engine for backend-defined layouts. This decouples what users see from when you last published to the App Store.

Option 1: Pyramid — SDUI as a Platform

Pyramid takes the approach that your team shouldn't have to build SDUI infrastructure. It provides the full pipeline:

How It Works

  1. Annotate your Compose components with @PyramidBlock
  2. KSP extracts schemas automatically at build time
  3. Schemas sync to Pyramid's server via CLI (pyramid sync)
  4. Backend developers get generated, type-safe Kotlin DSL or TypeScript SDK
  5. Compose UI renders the server response using your registered components
// Your existing component — just add the annotation
@PyramidBlock(keyType = "PRODUCT_CARD")
@Composable
fun ProductCard(
    @PyramidProp(required = true) title: String,
    @PyramidProp price: Double?,
    @PyramidEvent onTap: () -> Unit
) {
    // Your existing Compose code, unchanged
}
// Backend: type-safe DSL generated from your components
val homeScreen = pyramid {
    column {
        productCard(
            title = "Premium Widget",
            price = 29.99,
            onTap = navigate("/products/123")
        )
    }
}

Strengths

Trade-offs

✅ Best For

Teams with existing design systems who want to make their components server-drivable without rebuilding their UI layer.

Option 2: RemoteCompose — Open-Source Compose-to-Document

RemoteCompose takes a fundamentally different approach. Instead of defining a component schema, it serializes Compose layout trees into a portable document format.

How It Works

  1. Author layouts in Compose on the server (or a content tool)
  2. Serialize the layout tree into RemoteCompose's binary format
  3. Client renders the document natively, mapping to real Compose primitives

The key innovation is that you're writing actual Compose on the server side, not JSON. The library handles serialization/deserialization.

Strengths

Trade-offs

✅ Best For

Teams that only target Android and want a lightweight, open-source way to serve dynamic layouts without building a full SDUI platform.

Option 3: DIY — Build Your Own SDUI

The third option is building SDUI from scratch. This is what most Big Tech companies did (why companies like Airbnb use SDUI's Ghost, DoorDash's Foundry, Lyft's SDUI, and Nubank's Catalyst). It's also what many teams attempt — with varying degrees of success.

How It Works

  1. Define your JSON schema for representing UI trees
  2. Build a renderer that maps JSON nodes to Compose components
  3. Write backend logic to produce the JSON
  4. Deploy server changes to update the UI

A Minimal DIY Renderer

@Composable
fun ServerDrivenRenderer(node: JsonObject) {
    when (node["type"]?.jsonPrimitive?.content) {
        "column" -> Column {
            node["children"]?.jsonArray?.forEach {
                ServerDrivenRenderer(it.jsonObject)
            }
        }
        "text" -> Text(
            text = node["content"]?.jsonPrimitive?.content ?: ""
        )
        "button" -> Button(
            onClick = { /* handle action */ }
        ) {
            Text(node["label"]?.jsonPrimitive?.content ?: "")
        }
    }
}

Strengths

Trade-offs

The Hidden Costs

The "free" in DIY is deceptive. Here's what teams typically discover:

Component Estimated Engineering Time
Core renderer 2-4 weeks
Action system (navigate, API calls) 2-3 weeks
State management 2-3 weeks
Schema versioning & migration 2-4 weeks
A/B testing integration 3-4 weeks
Preview/development tools 2-4 weeks
Documentation & onboarding 2-3 weeks
Total 15-25 weeks

⚠️ The Real Cost of "Free"

At a $150K/year engineer salary, DIY SDUI costs $45K-$72K in engineering time — before ongoing maintenance.

✅ Best For

Teams with dedicated platform engineering resources and unique requirements that no existing solution addresses. Also appropriate if you need deep integration with proprietary infrastructure.

Decision Framework

Choose Pyramid if:

Choose RemoteCompose if:

Build Your Own if:

The Bigger Picture

The SDUI landscape in 2026 looks very different from even two years ago. The pattern has moved from "Big Tech secret" to an emerging ecosystem of tools and frameworks.

The right choice depends on your team's size, platform targets, and how much infrastructure you want to own vs. buy.

For most mobile teams starting with SDUI today, the question is: how quickly do you need to be productive?

If speed and cross-platform support matter, a platform like Pyramid removes months of infrastructure work. If you're exploring SDUI on a single-platform project, RemoteCompose offers a lightweight entry point. If you're building for the long haul and have the team for it, DIY gives you maximum control.

Whatever you choose — the days of waiting 2 weeks for a button color change are over.

Ready to Try SDUI with Your Existing Components?

Pyramid lets you make your Compose and SwiftUI components server-drivable in hours, not months. Bring your own design system — we handle the infrastructure.

Join the Waitlist

Related Articles