Skip to content

Server-driven UI for Flutter

Change your app’s screens without shipping a release

Design screens in the browser and publish them. Your Flutter app renders them live with the open-source Stac package, and you can roll back in one click.

What you publish (Stac JSON)
{
  "type": "scaffold",
  "appBar": {
    "type": "appBar",
    "title": {
      "type": "text",
      "data": "Summer sale"
    }
  },
  "body": {
    "type": "padding",
    "padding": {
      "left": 16,
      "top": 16,
      "right": 16,
      "bottom": 16
    },
    "child": {
      "type": "column",
      "crossAxisAlignment": "start",
      "children": [
        {
          "type": "text",
          "data": "20% off everything until Sunday."
        },
        {
          "type": "elevatedButton",
          "child": {
            "type": "text",
            "data": "Shop now"
          },
          "onPressed": {
            "actionType": "none"
          }
        }
      ]
    }
  }
}
What your app runs (Dart)
import 'package:flutter/material.dart';
import 'package:stac/stac.dart';

class SummerSaleScreen extends StatelessWidget {
  const SummerSaleScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return Stac.fromNetwork(
      context: context,
      request: StacNetworkRequest(
        url: 'https://sdui.in/api/v1/screens/summer_sale?apiKey=sdui_your_project_key',
        method: Method.get,
      ),
      loadingWidget: (context) => const Center(child: CircularProgressIndicator()),
      errorWidget: (context, error) => const Center(child: Text('Could not load this screen')),
    );
  }
}

How it works

Three steps from idea to every phone

No app-store review, no forced update. Your app keeps its own navigation, auth and logic.

  1. Step 1

    Design

    Build the screen in the visual editor, or edit its Stac JSON directly. Both views edit the same draft.

  2. Step 2

    Publish

    Publishing validates the screen against the Stac 1.5 contract and stores an immutable version.

  3. Step 3

    Render

    Your Flutter app loads the screen with Stac.fromNetwork. Changes typically reach users within a minute.

Features

Built for teams that ship Flutter apps

  • Visual and code editing

    Drag widgets onto a device frame, or switch to Code view. Edits sync both ways.

  • Validated before it ships

    Unknown widgets, bad enum values and unreadable colours are caught at publish, not on a customer’s phone.

  • Versions and rollback

    Every publish is a numbered version. Roll back or unpublish a screen in one click.

  • Stable screen URLs

    Renaming a screen never changes its URL. Changing a URL is an explicit action with a warning.

  • Cached at the edge

    Screens requested by URL with an apiKey are served from the CDN with ETags, so those app launches rarely touch the database.

  • Read-only API keys

    Each project has a publishable key that can only read published screens. Rotate it with a 7-day grace period.

Start with one screen

The free plan includes one project with three screens. Add Stac to your app and publish your first screen in an afternoon.