Skip to main content

What is Presentum?

Presentum is a declarative Flutter engine for building dynamic, conditional UI at scale. It helps you manage campaigns, app updates, special offers, tips, notifications, and more with clean, testable, type-safe code. Instead of spreading show/hide logic across your widgets, you describe what should be shown as data, and Presentum’s engine, guards, and outlets handle where, when, and how it appears.
Think of Presentum as a presentation orchestrator that coordinates what users see based on rules, not imperative commands.

The problem

Managing presentations imperatively with scattered show/hide logic leads to boilerplate and scaling issues:

The solution

Presentum separates what (payloads), when (guards), where (surfaces), and how (outlets):
All eligibility logic is centralized. The outlet renders. The payload is data. Guards contain business rules. Everything is testable.

When to use Presentum

Perfect for

  • Marketing campaigns and banners
  • App update notifications (Shorebird, CodePush)
  • Special offers with discount codes
  • Onboarding tips and tutorials
  • Feature announcements
  • System maintenance alerts
  • User-targeted messaging
  • A/B testing content

Not designed for

  • Navigation/routing (use GoRouter, AutoRoute)
  • Layout management (use Flutter widgets)
  • General app state (use Riverpod, BLoC)
  • Real-time chat messages
  • Transient toasts/snackbars

What Presentum handles

Presentum can evaluate ANY condition you need:
  • User segments (premium, free, trial)
  • Geographic location (country, region, city)
  • App version (force update for old versions)
  • Device type (phone, tablet, platform)
  • OS type (iOS, Android, Web)
  • User behavior (purchase history, usage patterns)
  • Time-based rules (holidays, business hours, date ranges)
  • A/B test groups
  • Feature flags
  • Custom business logic
The engine is flexible and scalable - if you can write a rule for it, Presentum can handle it.

How it works

Presentum coordinates the flow between your data sources, eligibility rules, and UI:
1

Fetch candidates

Your app fetches presentations from Firebase Remote Config, APIs, or local sources.
2

Feed to engine

Convert to items and feed to Presentum using setCandidates or setCandidatesWithDiff.
3

Guards process

Engine runs all guards in sequence to determine eligibility, apply rules, and update state.
4

State committed

New state is committed and observers are notified.
5

Outlets rebuild

Outlets watching affected surfaces rebuild with new active items.
6

User interacts

User dismisses or converts, which records to storage and may trigger guard re-evaluation.

Key concepts

1

Surfaces

Where presentations appear. Named locations in your UI.
Learn more β†’
2

Payloads

What you want to show. Your domain objects with metadata.
Learn more β†’
3

Guards

When to show. Your business logic and eligibility rules.
Learn more β†’
4

Outlets

Rendering presentations. Just UI code, no business logic.
Learn more β†’

Production example

Here’s a real-world implementation from a production app:
See full production implementation β†’

Next steps

Quickstart

Build your first presentation in 5 minutes

Core concepts

Understand the architecture

Production example

See real-world implementation

API reference

Complete API documentation