Breeze Timeline

breeze_timeline is an opt-in runtime timeline for Breeze. It is separate from the core runtime so applications that do not configure it do not retain or copy runtime state.

Installation

Add breeze_timeline to your dependencies:

def deps do
[
{:breeze_timeline, "~> 0.1.0"}
]
end

Register the timeline page on each Breeze server that should be recorded:

Breeze.Server.start_link(
view: MyApp.View,
inspector: [
pages: [
{Breeze.Timeline.Page,
every: 1,
limit: 120,
include: [:frame, :inspector]}
]
]
)

The page contributes its Breeze.Timeline.Hook to the source server through Breeze's custom-page :runtime_hooks integration. No separate hook configuration is required.

every controls sampling and limit bounds retained checkpoints. The default is one capture per rendered state and 120 retained entries, but no capture occurs unless the timeline page or hook is explicitly configured.

To enable it conditionally, build the options in the application:

inspector =
if Application.get_env(:my_app, :timeline, false) do
[pages: [{Breeze.Timeline.Page, every: 1, limit: 120}]]
else
false
end
Breeze.Server.start_link(view: MyApp.View, inspector: inspector)

Timeline recording adds render latency and memory usage. Checkpoint capture is synchronous and copies the configured server's view runtime tree. Treat the timeline as development tooling: keep it disabled in production unless there is a specific operational reason to enable it and its sampling and retention have been chosen for the workload. For larger applications, increase every, reduce limit, or omit optional :frame / :inspector attachments from include. Omitting :frame disables historical frame preview, but checkpoints can still be restored.

mix breeze.inspector

Breeze Inspector Page

The timeline starts on live latest. Selecting a checkpoint pauses the source application's view runtime and renders that captured frame in the inspector terminal, so stepping through entries shows exactly what the app displayed at each capture. Select live latest to resume the application without changing its state. Press Enter to discard every newer checkpoint and replace the running app with the selected state. The restored runtime stays paused until the next source-app interaction, and that interaction is processed normally. Restoring a checkpoint does not rerun the view's mount/2 callback.

Restore replaces Breeze-owned runtime state. Process mailboxes and external side effects are not rewound, and values such as PIDs, ports, references, or functions inside user assigns remain ordinary in-VM values.

Example

The repository includes a minesweeper example with timeline capture configured. Run the application and inspector in separate terminals from a repository checkout:

# terminal 1
mix run examples/minesweeper.exs
# terminal 2
mix breeze.inspector

The core Breeze examples remain timeline-independent.