Skip to main content
Presentum - Declarative presentation engine for Flutter

Build dynamic UI at scale

Presentum is a declarative Flutter engine that helps you manage campaigns, app updates, special offers, tips, and notifications with clean, testable, type-safe code. Show the right message to the right user at the right time, with impression limits, cooldowns, A/B testing, and analytics - all handled automatically.

Declarative by design

Describe presentations as data. No imperative show/hide logic.

Type-safe

Generics ensure compile-time correctness. No runtime surprises.

Clean architecture

Business logic in guards, UI in outlets, tracking in storage.

Production ready

Eligibility rules, A/B tests, cooldowns, impression tracking built-in.

Quick example

// 1. Define surfaces
enum AppSurface with PresentumSurface {
  homeTopBanner,
  popup;
}

// 2. Create payload
class CampaignPayload extends PresentumPayload<AppSurface, CampaignVariant> {
  final String id;
  final int priority;
  final Map<String, Object?> metadata;
  final List<PresentumOption> options;
}

// 3. Initialize
final presentum = Presentum(
  storage: MyStorage(),
  guards: [CampaignGuard()],
);

// 4. Render
PresentumOutlet(
  surface: AppSurface.homeTopBanner,
  builder: (context, item) => BannerWidget(item),
)
That’s it! Presentum handles eligibility, impressions, cooldowns, and state automatically.

Get started

Introduction

Learn what Presentum is and why it exists

Quickstart

Build your first presentation in 5 minutes

Core concepts

Deep dive into architecture

What you can build

Check out the comprehensive example application source code.

Maintenance

Maintenance mode dialogs and system status notifications

App updates

Force update dialogs, optional upgrade prompts, changelog announcements

Marketing campaigns

Special offers with discount codes, limited-time sales, seasonal campaigns, A/B tests

Feature toggles

User-configurable feature flags, toggleable from settings, with dependency chains and feature-aware widgets that adapt UI based on enabled features

User preferences

Settings, user preferences, and feature toggles

Guides

Implementing guards

Build eligibility logic

Implementing storage

Persistent tracking layer

Building outlets

Create presentation widgets

State management

Integrate with your state solution

Recipes

Firebase Remote Config

Dynamic campaign management

App update dialogs

Force and optional updates

A/B testing

Multi-variant experiments

Analytics integration

Track impressions and conversions

Community

GitHub

Source code and issues

pub.dev

Package page and API docs

Ready to start?

Start with the quickstart guide

Build your first Presentum presentation in 5 minutes