Skip to main content
A platform-keyed registry turns one portable MessagePresentation into a native payload for each channel, and degrades gracefully to text when a channel has no renderer.

Quick Start

1

Render for a known channel

2

Degrade unknown channels to text


How It Works

render_for(platform, presentation) resolves the platform’s renderer from the registry and returns its native payload; unregistered channels fall back to fallback_text.

The PresentationRenderer Protocol

Every renderer implements the PresentationRenderer Protocol — two static methods. Each renderer runs adapt_presentation against its own get_limits() before mapping blocks, so button overflow, unsupported selects/web-apps, and label truncation are applied uniformly.

Built-in Renderers


Graceful Degradation

fallback_text(presentation) keeps interactive content readable for channels without a renderer — nothing is silently dropped.
Text/context/divider blocks become lines, buttons and select options become • Label bullets, and URL buttons inline as • Label: URL.

Add a Channel

Write a class with the two static methods, then register it into _RENDERERS.
render_for("mychannel", presentation) now resolves your renderer.

Best Practices

Run adapt_presentation(presentation, get_limits()) first so button overflow, label caps, and unsupported selects/web-apps degrade uniformly before you build the native payload.
render_for(platform, presentation) resolves the renderer and falls back to text for unknown platforms, so adapters stay channel-agnostic.
When a channel can’t render a widget, surface it as text (labels, URLs) the way fallback_text does — a silently dropped button is worse than a text link.
Reply/list-row ids are how taps route back to your handler. Derive stable ids (command, callback value, or URL) and keep them within the channel’s id cap.

Bot Presentations

The portable presentation model and per-channel limits

Message Presentation

Buttons, menus, and web-app links on agent replies

WhatsApp Bot

Native interactive rendering on WhatsApp

Channel Capabilities

Live-edit, reactions, typing, and text limits per channel