Guidance for LLMs working in this repo.
Rerun: time-aware multimodal data stack + visualization for robotics, spatial AI, computer vision. SDKs (Python, Rust, C++) log rich data (images, point clouds, tensors, etc.). Viewer for visualization.
pixi for task management + deps. See pixi.toml for full task list.
Building:
pixi run py-build- Build Python SDK into local .venv (uses uv)pixi run rerun-build- Build native viewer (without web viewer)pixi run rerun-build-web- Build web viewer (wasm)pixi run cpp-build-all- Build all C++ artifacts
Running:
pixi run rerun- Run viewerpixi run uvpy script.py- Run Python scripts with rerun SDKcargo run -p <package_name>- Run specific Rust example (e.g.,cargo run -p dna)
Code generation:
pixi run codegen- Generate Rust/Python/C++ code from .fbs type definitions
Formatting:
pixi run rs-fmt- Format Rust files. Always run after editing Rust files, before committing.pixi run py-fmt- Format Python filespixi run cpp-fmt- Format C++ filespixi run toml-fmt- Format TOML files
Testing:
cargo clippy -p <crate_name>- Run rust checks before buildingcargo nextest run --all-features --no-fail-fast -p <crate_name>- Run tests for specific crate- Example:
cargo nextest run --all-features --no-fail-fast -p re_view_spatial
- Example:
- Use
cargo nextest(notcargo test) for better output + parallelism - Always use
--all-featuresunless specific reason not to - Use
--no-fail-fastto gather all failures in single run
Snapshots:
instasnapshots: Text-based, run with regular Rust tests. On failure:cargo insta review(install:cargo install cargo-insta)- Image comparison tests: Render image vs checked-in reference. Uses
egui_kittest'sHarness::snapshot+TestContextfor mocking viewer.- Results saved to
tests/snapshots/, failures producediff.png - Update refs:
UPDATE_SNAPSHOTS=1 - Update from failed CI run:
./scripts/update_snapshots_from_ci.sh - Best practices: see egui_kittest README
- Results saved to
Critical: Never edit generated files directly. All generated files marked "DO NOT EDIT" at top.
.fbs files (definitions/) → pixi run codegen → Generated code (Rust/Python/C++) + docs (docs/content/reference/types/)
- Type definitions in
crates/store/re_sdk_types/definitions/rerun/datatypes/*.fbs- Low-level types (Vec3D, Mat4x4, etc.)components/*.fbs- Component types (Position3D, Color, etc.)archetypes/*.fbs- Archetypes (Points3D, Image, etc.)blueprint/*.fbs- Blueprint system types
- Codegen implementation in
crates/build/re_types_builder/ - After modifying .fbs files, run
pixi run codegento regenerate
Add custom functionality to generated types via _ext files:
- Rust:
filename_ext.rs(auto-imported by codegen) - Python:
filename_ext.py(mixed into generated class) - C++:
filename_ext.cpp(compiled + included auto, parts may be marked for copy into header by codegen)
- use
…instead of... - Validate conventions via
pixi run lint-rerun <file>(no file = check everything) - Prose style (em vs en dash, sentence endings, casing) — see
DESIGN.md. In short: spaced em dash—, never unspacedword—word, and don't use–as a sentence dash (it's for numeric ranges only) - In error and log messages, put the error first and any file path at the end (e.g.
Failed to import: {err}\nFile path: {path}), never in the middle. Paths can be long or sensitive, so trailing placement makes them easy to strip when copy-pasting. - One sentence per line in markdown files. Markdown joins consecutive lines into a paragraph, so rendering is unchanged — but diffs become much easier to review.
crates/
├── build/ # Code generation (re_types_builder)
├── store/ # Data types, storage, querying
├── top/ # User-facing SDKs and CLI
└── viewer/ # Viewer UI and rendering
More details in ARCHITECTURE.md.
When adding, removing, or renaming a crate, update ARCHITECTURE.md:
add the crate to the appropriate crate table, and flag for the author that the crate-organization diagram (FigJam) needs a manual update — see the HTML comment next to the diagram in ARCHITECTURE.md for instructions.
Three levels (generated from .fbs files):
- Datatypes (
rerun.datatypes.*) - Basic types like Vec3D, Color - Components (
rerun.components.*) - Named semantic wrappers (Position3D, Radius) - Archetypes (
rerun.archetypes.*) - Collections of components (Points3D, Image)
Each archetype specifies:
- Required components (must provide)
- Recommended components (good defaults)
- Optional components
Example: Points3D requires positions, recommends colors and radii, optional labels.
SDK (log archetype)
↓ encode to Apache Arrow
LogMsg (encoded data)
↓ transport (gRPC/file/memory)
re_chunk_store (indexed time series DB)
↓ query
Viewer (immediate mode rendering)
Viewer's configuration layer:
- Stored as separate store (
re_entity_db) with "blueprint" timeline - Defines: view layout, visibility, per-entity overrides, view properties
- Uses same type system as logged data
- Path hierarchy:
/viewport/,/view/{uuid}/,/container/{uuid}/
Each view type (Spatial3D, TimeSeries, etc.) has registered visualizers:
- Determine which entities/archetypes can be visualized
- Execute per-frame: query data → process → generate render commands
- Examples: Points3DVisualizer, LineStripsVisualizer, MeshVisualizer
Viewer uses immediate mode: every frame, query store + re-render from scratch.
See docs/snippets/README.md for running, building, finding snippets. Config in docs/snippets/snippets.toml.
Python uses separate uv-managed .venv (not pixi's conda env):
pixi run py-build # Build rerun-sdk into .venv
pixi run uvpy script.py # Run Python scripts via uv
pixi run uv run script.py # Explicit uv runuv wrapper unsets CONDA_PREFIX for isolation from pixi's env.
- PyO3 Configuration: PyO3 config errors → run
pixi run ensure-pyo3-build-cfg - git-lfs: Required for test snapshots. Install + run
git lfs install - Immediate Mode: Entire viewer rendered from scratch each frame (no state management callbacks)
- Arrow Native: Data stored, transmitted, queried as Apache Arrow arrays
- Multi-language: .fbs changes affect Rust, Python, C++ simultaneously
Python API docs use MkDocs + mkdocstrings (NOT Sphinx). Never use reStructuredText (rST) in Python docstrings. Use markdown:
- Cross-refs:
[ClassName][]not:class:ClassName`` /:func:/ `:meth:` - Warnings:
!!! warning(MkDocs admonition with indented body) not.. warning:: - Deprecation: use
@deprecateddecorator (mkdocstrings renders it), don't duplicate in docstring - Code blocks: markdown fenced blocks, not
.. code-block:: - Params: numpy-style (
Parameters,Returnswith----------)
See docs/README.md for full docs architecture.
Docs span multiple sites: main docs at rerun.io/docs (from docs/content/), API refs for Python (MkDocs), C++ (Doxygen), JS (TypeDoc) at ref.rerun.io/docs/{python,cpp,js}/.
Key points:
docs/content/reference/types/auto-generated bypixi run codegenfrom.fbsfiles - don't editdocs/content/reference/cli.mdauto-generated bypixi run man- don't edit- Code snippets in
docs/snippets/all/with Python, Rust, C++ implementations pixi run py-docs-servepreviews Python API docs locallypixi run -e cpp cpp-docsbuilds C++ docs
ARCHITECTURE.md- Detailed architecture docsBUILD.md- Full build instructionsCODE_STYLE.md- Code style guidelinesDESIGN.md- UI design guidelines (GUI, CLI, docs, log messages)docs/README.md- Documentation system (sites, builds, deployment)rerun_py/README.md- Python SDK instructions
Don't open pull requests or issues unless explicitly asked. When opening or interacting with one, follow the pull request template or issue templates, and disclose that you are an LLM. Let the user know that you included this disclosure.