docs/content/concepts/visualization/blueprints.md
When you work with the Rerun Viewer, understanding blueprints is important if you want to build consistency around your Viewer experience.
For a video overview, check out the Blueprints video on YouTube.
<iframe width="560" height="315" src="https://www.youtube.com/embed/kxbkbFVAsBo?si=k2JPz3RbhR1--pcw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>A way to think about the Rerun View is that
Both pieces are crucial. Without a recording there is nothing to show. Without a blueprint there is no way to show it. Even when you use Rerun without explicitly loading a blueprint, the Viewer creates one automatically for you.
Blueprints give you complete control over the Viewer's layout and configuration:
In general, if you can modify an aspect of how something looks through the Viewer, you are actually modifying the blueprint.
The Application ID is how blueprints connect to your data. This is a critical concept:
All recordings that share the same Application ID will use the same blueprint.
This loose coupling between blueprints and recordings means:
Think of the Application ID as the "key" that binds a blueprint to a specific type of recording. If you want recordings to share the same layout, give them the same Application ID.
The Viewer provides two types of blueprint reset, accessible from the blueprint panel:
<picture> <source media="(max-width: 480px)" srcset="https://static.rerun.io/blueprint-reset/c52e124cc4d0109b672264357b0193f7f7c8d6c5/480w.png"> <source media="(max-width: 768px)" srcset="https://static.rerun.io/blueprint-reset/c52e124cc4d0109b672264357b0193f7f7c8d6c5/768w.png"> <source media="(max-width: 1024px)" srcset="https://static.rerun.io/blueprint-reset/c52e124cc4d0109b672264357b0193f7f7c8d6c5/1024w.png"> <source media="(max-width: 1200px)" srcset="https://static.rerun.io/blueprint-reset/c52e124cc4d0109b672264357b0193f7f7c8d6c5/1200w.png"> </picture>This generates a new blueprint automatically based on your current data. The Viewer analyzes what you've logged and creates an appropriate layout using built-in heuristics. This is useful when you want to start fresh and let Rerun figure out a reasonable layout.
This returns to your programmatically specified blueprint (sent from code) or a saved blueprint file (.rbl). If you've sent a blueprint using rr.send_blueprint() or loaded a .rbl file, this becomes your "default." The reset button in the blueprint panel will restore this default whenever you need it.
When no default blueprint has been set, the reset button will use the heuristic blueprint instead.
<picture> <source media="(max-width: 480px)" srcset="https://static.rerun.io/fe1fcf086752f5d7cdd64b195fb3a6cb99c50737_current_default_heuristic.png"> </picture>There are three complementary approaches to creating and modifying blueprints:
Modify blueprints directly in the Viewer UI:
This is the fastest way to experiment with layouts. See Configure the Viewer for a complete guide.
Save your blueprint configuration to .rbl files:
.rbl files into the ViewerBlueprint files are portable and can be version-controlled alongside your code.
Write blueprint code that configures the Viewer automatically:
rerun.blueprint APIsrr.send_blueprint() or via default_blueprint parameterFor example, you might send different blueprints automatically based on detected issues in your application (e.g., a robot enters an error state and surfaces the correct blueprint to help you debug that)
import rerun as rr
import rerun.blueprint as rrb
if robot_error:
# Show diagnostic views for debugging
blueprint = rrb.Grid(
rrb.Spatial3DView(name="Robot view", origin="/world/robot"),
rrb.TextLogView(name="Error Logs", origin="/diagnostics"),
rrb.TimeSeriesView(name="Sensor Data", origin="/sensors"),
)
rr.send_blueprint(blueprint, make_active=True)
See Configure the Viewer for detailed examples and our guide on how to build a blueprint programmatically.
Create blueprints optimized for diagnosing particular issues. For example, when debugging robot perception, you might want a blueprint that shows:
Save a blueprint file and share it with your team. Everyone loading that blueprint with matching recordings will see the data the same way, making it easier to discuss findings and collaborate.
Create different blueprint templates for different types of recordings. For example:
Generate blueprints programmatically based on runtime conditions. For instance, automatically create one view per detected anomaly, or adjust the layout based on how many data sources are active.
Under the hood, blueprints are just data. They are structured using the same Entity Component System as your recordings, but with blueprint-specific archetypes and a separate blueprint timeline. This architecture provides several advantages:
The Viewer is designed to be deterministic. Every frame, the Viewer:
This means the Viewer output is a deterministic function of the blueprint and the recording, with minimal persisted state between frames.