From 2a547be7fe2430c128a13e40fc29e8c389539390 Mon Sep 17 00:00:00 2001 From: wehub-resource-sync Date: Mon, 13 Jul 2026 13:05:14 +0800 Subject: [PATCH] chore: import upstream snapshot with attribution --- .RERUN_ROOT | 0 .cargo/config.toml | 72 + .cargo/cranelift.toml | 39 + .clang-format | 34 + .config/nextest.toml | 11 + .dockerignore | 5 + .editorconfig | 15 + .gitattributes | 19 + .github/ISSUE_TEMPLATE/annoyance_report.md | 43 + .github/ISSUE_TEMPLATE/bug_report.md | 40 + .github/ISSUE_TEMPLATE/feature_request.md | 25 + .github/ISSUE_TEMPLATE/other.md | 10 + .github/ISSUE_TEMPLATE/project.md | 54 + .github/ISSUE_TEMPLATE/question.md | 10 + .github/actions/setup-rust/action.yml | 90 + .github/actions/vercel/action.yml | 51 + .../vercel/commands/deploy-preview.mjs | 39 + .../vercel/commands/deploy-production.mjs | 32 + .../actions/vercel/commands/update-env.mjs | 20 + .github/actions/vercel/index.mjs | 109 + .github/actions/vercel/manual.mjs | 73 + .github/actions/vercel/types.d.ts | 124 + .github/actions/vercel/util.mjs | 64 + .github/actions/vercel/vercel.mjs | 403 + .github/pull_request_template.md | 32 + .github/runs-on.yml | 45 + .github/scripts/setup_sccache.sh | 277 + .github/workflows/README.md | 16 + .github/workflows/adhoc_wheels.yml | 122 + .github/workflows/auto_approve.yml | 41 + .github/workflows/auto_docs.yml | 69 + .github/workflows/auto_docs_check.yml | 83 + .github/workflows/cargo_shear.yml | 35 + .github/workflows/checkboxes.yml | 42 + .github/workflows/clear_cache.yml | 61 + .github/workflows/contrib_checks.yml | 284 + .github/workflows/contrib_rerun_py.yml | 86 + .github/workflows/cpp_matrix_full.json | 40 + .github/workflows/enforce_branch_name.yml | 42 + .github/workflows/first_time_contrib.yml | 22 + .github/workflows/labels.yml | 83 + .github/workflows/lsan_suppressions.supp | 1 + .github/workflows/nightly.yml | 440 + .github/workflows/notify-reality-sync.yml | 54 + .github/workflows/on_gh_release.yml | 56 + .github/workflows/on_pr_comment.yml | 130 + .github/workflows/on_pull_request.yml | 252 + .github/workflows/on_pull_request_contrib.yml | 42 + .github/workflows/on_push_docs.yml | 98 + .github/workflows/on_push_main.yml | 265 + .github/workflows/pr-trigger-reality-sync.yml | 190 + .github/workflows/release.yml | 590 + .github/workflows/reusable_bench.yml | 137 + .../reusable_build_and_upload_rerun_c.yml | 172 + .../reusable_build_and_upload_rerun_cli.yml | 232 + .../reusable_build_and_upload_wheels.yml | 238 + .github/workflows/reusable_build_examples.yml | 104 + .github/workflows/reusable_build_js.yml | 73 + .github/workflows/reusable_build_web.yml | 126 + .../reusable_bundle_and_upload_rerun_cpp.yml | 61 + .github/workflows/reusable_checks.yml | 346 + .github/workflows/reusable_checks_cpp.yml | 122 + .../reusable_checks_doc_redirects.yml | 36 + .../workflows/reusable_checks_protobuf.yml | 61 + .github/workflows/reusable_checks_python.yml | 85 + .github/workflows/reusable_checks_rust.yml | 271 + .github/workflows/reusable_deploy_docs.yml | 246 + .../reusable_deploy_landing_preview.yml | 101 + .github/workflows/reusable_pip_index.yml | 69 + .github/workflows/reusable_publish_js.yml | 101 + .../workflows/reusable_publish_rerun_c.yml | 67 + .../workflows/reusable_publish_rerun_cli.yml | 58 + .github/workflows/reusable_publish_web.yml | 157 + .github/workflows/reusable_publish_wheels.yml | 141 + .github/workflows/reusable_release_crates.yml | 44 + .github/workflows/reusable_run_notebook.yml | 92 + .../reusable_sync_release_assets.yml | 61 + .github/workflows/reusable_test_wheels.yml | 196 + .github/workflows/reusable_track_size.yml | 184 + .../workflows/reusable_upload_examples.yml | 138 + .github/workflows/reusable_upload_js.yml | 147 + .github/workflows/reusable_upload_web.yml | 198 + .github/workflows/reusable_web_test.yml | 62 + .../workflows/update_kittest_snapshots.yml | 43 + .gitignore | 106 + .idea/.gitignore | 17 + .idea/vcs.xml | 6 + .idea/watcherTasks.xml | 85 + .mcp.json | 8 + .prettierignore | 18 + .prettierrc.toml | 19 + .python-version | 1 + .run/viewer_fast.run.xml | 22 + .rustfmt.toml | 6 + .typos.toml | 254 + .vscode/extensions.json | 26 + .vscode/launch.json | 196 + .vscode/settings.json | 68 + AGENTS.md | 204 + ARCHITECTURE.md | 291 + BUILD.md | 322 + CHANGELOG.md | 6632 +++++++ CLAUDE.md | 194 + CMakeLists.txt | 207 + CODE_OF_CONDUCT.md | 132 + CODE_STYLE.md | 364 + CONTRIBUTING.md | 265 + Cargo.lock | 15310 ++++++++++++++++ Cargo.toml | 981 + DESIGN.md | 48 + LICENSE-APACHE | 201 + LICENSE-MIT | 25 + README.md | 208 + README.wehub.md | 7 + RELEASES.md | 190 + SECURITY.md | 9 + TESTING.md | 104 + bacon.toml | 97 + ci_docker/Dockerfile | 52 + ci_docker/README.md | 7 + ci_docker/publish.sh | 11 + clippy.toml | 136 + crates/build/README.md | 1 + crates/build/re_build_info/Cargo.toml | 28 + crates/build/re_build_info/README.md | 10 + crates/build/re_build_info/src/build_info.rs | 199 + .../build/re_build_info/src/crate_version.rs | 707 + crates/build/re_build_info/src/lib.rs | 79 + crates/build/re_build_tools/Cargo.toml | 32 + crates/build/re_build_tools/README.md | 24 + crates/build/re_build_tools/src/git.rs | 90 + crates/build/re_build_tools/src/hashing.rs | 216 + crates/build/re_build_tools/src/lib.rs | 361 + .../re_build_tools/src/rebuild_detector.rs | 213 + crates/build/re_build_tools/src/rustfmt.rs | 41 + crates/build/re_dev_tools/Cargo.toml | 42 + crates/build/re_dev_tools/README.md | 11 + .../src/build_examples/example.rs | 376 + .../src/build_examples/install.rs | 50 + .../src/build_examples/manifest.rs | 173 + .../re_dev_tools/src/build_examples/mod.rs | 56 + .../src/build_examples/notebook.rs | 102 + .../re_dev_tools/src/build_examples/rrd.rs | 133 + .../src/build_examples/snippets.rs | 250 + .../src/build_examples/wait_for_output.rs | 54 + .../src/build_search_index/README.md | 24 + .../src/build_search_index/build.rs | 33 + .../src/build_search_index/ingest.rs | 161 + .../src/build_search_index/ingest/cpp.rs | 243 + .../src/build_search_index/ingest/docs.rs | 87 + .../src/build_search_index/ingest/examples.rs | 51 + .../src/build_search_index/ingest/python.rs | 366 + .../src/build_search_index/meili.rs | 192 + .../src/build_search_index/mod.rs | 34 + .../src/build_search_index/repl.rs | 86 + .../src/build_search_index/util.rs | 154 + .../src/build_web_viewer/README.md | 13 + .../re_dev_tools/src/build_web_viewer/lib.rs | 263 + .../re_dev_tools/src/build_web_viewer/mod.rs | 71 + crates/build/re_dev_tools/src/main.rs | 33 + crates/build/re_protos_builder/Cargo.toml | 29 + crates/build/re_protos_builder/README.md | 12 + .../src/bin/build_re_remote_store_types.rs | 55 + crates/build/re_protos_builder/src/lib.rs | 41 + crates/build/re_types_builder/.gitignore | 1 + crates/build/re_types_builder/Cargo.toml | 64 + crates/build/re_types_builder/README.md | 25 + crates/build/re_types_builder/build.rs | 91 + .../definitions/reflection.fbs | 181 + .../src/bin/build_re_types.rs | 178 + .../re_types_builder/src/codegen/common.rs | 479 + .../src/codegen/cpp/array_builder.rs | 118 + .../src/codegen/cpp/forward_decl.rs | 126 + .../src/codegen/cpp/includes.rs | 129 + .../src/codegen/cpp/method.rs | 167 + .../re_types_builder/src/codegen/cpp/mod.rs | 2887 +++ .../src/codegen/docs/datatype_docs.rs | 87 + .../re_types_builder/src/codegen/docs/mod.rs | 7 + .../src/codegen/docs/snippets_ref.rs | 683 + .../src/codegen/docs/website.rs | 795 + .../re_types_builder/src/codegen/fbs/mod.rs | 95 + .../build/re_types_builder/src/codegen/mod.rs | 62 + .../src/codegen/python/mod.rs | 3168 ++++ .../src/codegen/python/views.rs | 220 + .../re_types_builder/src/codegen/rust/api.rs | 1622 ++ .../src/codegen/rust/arrow.rs | 185 + .../src/codegen/rust/blueprint_validation.rs | 78 + .../src/codegen/rust/deserializer.rs | 1198 ++ .../re_types_builder/src/codegen/rust/mod.rs | 11 + .../src/codegen/rust/reflection.rs | 334 + .../src/codegen/rust/serializer.rs | 972 + .../re_types_builder/src/codegen/rust/util.rs | 399 + .../build/re_types_builder/src/data_type.rs | 218 + crates/build/re_types_builder/src/docs.rs | 646 + .../build/re_types_builder/src/format/cpp.rs | 26 + .../build/re_types_builder/src/format/fbs.rs | 9 + .../build/re_types_builder/src/format/mod.rs | 23 + .../re_types_builder/src/format/python.rs | 148 + .../build/re_types_builder/src/format/rust.rs | 42 + crates/build/re_types_builder/src/lib.rs | 708 + crates/build/re_types_builder/src/objects.rs | 1857 ++ .../build/re_types_builder/src/reflection.rs | 2981 +++ crates/build/re_types_builder/src/report.rs | 178 + .../re_types_builder/src/type_registry.rs | 224 + crates/store/README.md | 1 + crates/store/re_chunk/Cargo.toml | 62 + crates/store/re_chunk/README.md | 10 + .../re_chunk/examples/chunk_latest_at.rs | 83 + crates/store/re_chunk/examples/chunk_range.rs | 81 + crates/store/re_chunk/src/batcher.rs | 2042 +++ crates/store/re_chunk/src/builder.rs | 426 + crates/store/re_chunk/src/chunk.rs | 1987 ++ crates/store/re_chunk/src/iter.rs | 1561 ++ crates/store/re_chunk/src/latest_at.rs | 188 + crates/store/re_chunk/src/lib.rs | 53 + crates/store/re_chunk/src/merge.rs | 1101 ++ crates/store/re_chunk/src/range.rs | 286 + crates/store/re_chunk/src/shuffle.rs | 712 + crates/store/re_chunk/src/slice.rs | 1931 ++ crates/store/re_chunk/src/split.rs | 99 + crates/store/re_chunk/src/transport.rs | 483 + crates/store/re_chunk/src/unit_chunk.rs | 444 + crates/store/re_chunk/tests/formatting.rs | 63 + crates/store/re_chunk/tests/latest_at.rs | 565 + crates/store/re_chunk/tests/memory_test.rs | 356 + crates/store/re_chunk/tests/range.rs | 528 + .../snapshots/formatting__format_chunk.snap | 23 + .../formatting__format_chunk_redacted.snap | 23 + crates/store/re_chunk/tests/sorbet.rs | 35 + crates/store/re_chunk/tests/timeline.rs | 120 + .../re_chunk/tests/with_mapped_component.rs | 31 + crates/store/re_chunk_store/Cargo.toml | 73 + crates/store/re_chunk_store/README.md | 12 + crates/store/re_chunk_store/benches/gc.rs | 76 + crates/store/re_chunk_store/src/compact.rs | 398 + crates/store/re_chunk_store/src/dataframe.rs | 438 + .../re_chunk_store/src/drop_time_range.rs | 144 + .../store/re_chunk_store/src/entity_tree.rs | 176 + crates/store/re_chunk_store/src/events.rs | 967 + crates/store/re_chunk_store/src/gc.rs | 845 + crates/store/re_chunk_store/src/lazy_store.rs | 571 + crates/store/re_chunk_store/src/lib.rs | 145 + crates/store/re_chunk_store/src/lineage.rs | 1615 ++ .../src/missing_chunk_reporter.rs | 56 + crates/store/re_chunk_store/src/profile.rs | 136 + crates/store/re_chunk_store/src/properties.rs | 319 + crates/store/re_chunk_store/src/query.rs | 1909 ++ .../re_chunk_store/src/rebatch_videos.rs | 822 + ..._lineage__tests__lineage_bootstrapped.snap | 24 + ...age__tests__lineage_leaky_compactions.snap | 12 + ...ore__lineage__tests__lineage_volatile.snap | 24 + .../re_chunk_store/src/split_thick_thin.rs | 262 + crates/store/re_chunk_store/src/stats.rs | 495 + crates/store/re_chunk_store/src/store.rs | 1305 ++ .../store/re_chunk_store/src/store_schema.rs | 439 + .../store/re_chunk_store/src/subscribers.rs | 489 + crates/store/re_chunk_store/src/writes.rs | 2374 +++ crates/store/re_chunk_store/tests/compact.rs | 949 + .../store/re_chunk_store/tests/correctness.rs | 499 + .../store/re_chunk_store/tests/dataframe.rs | 233 + .../re_chunk_store/tests/drop_time_range.rs | 131 + .../store/re_chunk_store/tests/formatting.rs | 62 + crates/store/re_chunk_store/tests/gc.rs | 622 + .../store/re_chunk_store/tests/memory_test.rs | 153 + crates/store/re_chunk_store/tests/reads.rs | 1231 ++ .../dataframe__schema_static_columns-2.snap | 9 + .../dataframe__schema_static_columns-3.snap | 7 + .../dataframe__schema_static_columns.snap | 10 + .../formatting__format_chunk_store.snap | 39 + ...ory_test__scalars_on_one_timeline_new.snap | 9 + crates/store/re_chunk_store/tests/stats.rs | 161 + crates/store/re_data_source/Cargo.toml | 49 + crates/store/re_data_source/README.md | 18 + .../store/re_data_source/src/data_source.rs | 686 + .../src/fetch_file_from_http.rs | 124 + crates/store/re_data_source/src/lib.rs | 42 + crates/store/re_data_source/src/load_stdin.rs | 30 + .../src/stream_rrd_from_http.rs | 41 + crates/store/re_dataframe/Cargo.toml | 64 + crates/store/re_dataframe/README.md | 10 + crates/store/re_dataframe/benches/next_row.rs | 467 + crates/store/re_dataframe/examples/query.rs | 66 + crates/store/re_dataframe/src/engine.rs | 132 + crates/store/re_dataframe/src/lib.rs | 26 + crates/store/re_dataframe/src/query.rs | 4582 +++++ ..._query__tests__async_barebones_static.snap | 17 + ...uery__tests__async_barebones_temporal.snap | 29 + ..._dataframe__query__tests__barebones-2.snap | 29 + ...re_dataframe__query__tests__barebones.snap | 17 + .../re_dataframe__query__tests__clears-2.snap | 31 + .../re_dataframe__query__tests__clears.snap | 31 + ...e__query__tests__filtered_index_range.snap | 23 + ...__query__tests__filtered_index_values.snap | 19 + ..._query__tests__filtered_is_not_null-2.snap | 16 + ..._query__tests__filtered_is_not_null-3.snap | 29 + ..._query__tests__filtered_is_not_null-4.snap | 23 + ...e__query__tests__filtered_is_not_null.snap | 16 + ...query__tests__query_static_any_values.snap | 15 + ..._dataframe__query__tests__selection-2.snap | 26 + ..._dataframe__query__tests__selection-3.snap | 33 + ..._dataframe__query__tests__selection-4.snap | 39 + ...re_dataframe__query__tests__selection.snap | 7 + ...__sparse_fill_strategy_latestatglobal.snap | 29 + ...e__query__tests__using_index_values-2.snap | 29 + ...ame__query__tests__using_index_values.snap | 29 + ...aframe__query__tests__view_contents-2.snap | 23 + ...ataframe__query__tests__view_contents.snap | 12 + ...y__tests__view_contents_and_selection.snap | 26 + crates/store/re_dataframe/src/utils.rs | 680 + crates/store/re_datafusion/ARCHITECTURE.md | 389 + crates/store/re_datafusion/Cargo.toml | 83 + crates/store/re_datafusion/PIPELINE_BUDGET.md | 124 + crates/store/re_datafusion/README.md | 12 + crates/store/re_datafusion/src/analytics.rs | 2466 +++ .../src/batch_coalescer/coalesce_exec.rs | 344 + .../src/batch_coalescer/coalescer.rs | 518 + .../re_datafusion/src/batch_coalescer/mod.rs | 2 + .../re_datafusion/src/catalog_provider.rs | 432 + .../store/re_datafusion/src/chunk_fetcher.rs | 938 + .../src/dataframe_query_common.rs | 2091 +++ .../src/dataframe_query_provider.rs | 893 + .../dataframe_query_provider/cpu_worker.rs | 2219 +++ .../src/dataframe_query_provider/io_loop.rs | 1691 ++ .../src/dataframe_query_provider_wasm.rs | 582 + .../re_datafusion/src/dataset_manifest.rs | 153 + crates/store/re_datafusion/src/errors.rs | 16 + .../src/grpc_streaming_provider.rs | 763 + crates/store/re_datafusion/src/lib.rs | 49 + .../src/local_chunk_store_provider.rs | 565 + .../re_datafusion/src/metrics_capture.rs | 348 + .../re_datafusion/src/pipeline_budget.rs | 1404 ++ .../src/pipeline_budget/tests.rs | 1226 ++ .../re_datafusion/src/pushdown_expressions.rs | 1465 ++ .../src/segment_chunk_manifest.rs | 553 + .../store/re_datafusion/src/segment_table.rs | 143 + .../re_datafusion/src/table_entry_provider.rs | 585 + crates/store/re_datafusion/src/wasm_compat.rs | 58 + crates/store/re_entity_db/Cargo.toml | 75 + crates/store/re_entity_db/README.md | 10 + .../re_entity_db/examples/memory_usage.rs | 168 + .../store/re_entity_db/src/chunk_requests.rs | 232 + .../src/data_meta_per_timeline.rs | 446 + crates/store/re_entity_db/src/entity_db.rs | 1426 ++ .../re_entity_db/src/ingestion_statistics.rs | 157 + .../store/re_entity_db/src/instance_path.rs | 253 + crates/store/re_entity_db/src/lib.rs | 73 + .../re_entity_db/src/rrd_manifest_index.rs | 751 + .../rrd_manifest_index/chunk_prioritizer.rs | 1843 ++ .../collapsed_time_ranges.rs | 153 + .../sorted_temporal_chunks.rs | 434 + .../rrd_manifest_index/time_range_merger.rs | 816 + .../re_entity_db/src/sorted_range_map.rs | 336 + crates/store/re_entity_db/src/store_bundle.rs | 159 + .../src/versioned_instance_path.rs | 121 + crates/store/re_entity_db/tests/clear.rs | 636 + crates/store/re_grpc_client/Cargo.toml | 53 + crates/store/re_grpc_client/README.md | 10 + crates/store/re_grpc_client/src/lib.rs | 126 + crates/store/re_grpc_client/src/read.rs | 100 + crates/store/re_grpc_client/src/write.rs | 456 + .../store/re_grpc_client/src/write_table.rs | 32 + crates/store/re_grpc_server/Cargo.toml | 57 + crates/store/re_grpc_server/README.md | 10 + crates/store/re_grpc_server/src/lib.rs | 1931 ++ crates/store/re_grpc_server/src/main.rs | 24 + .../re_grpc_server/src/priority_stream.rs | 57 + crates/store/re_grpc_server/src/shutdown.rs | 40 + .../re_grpc_server/src/viewer_control.rs | 167 + crates/store/re_importer/Cargo.toml | 74 + crates/store/re_importer/README.md | 10 + crates/store/re_importer/src/import_file.rs | 386 + .../re_importer/src/importer_archetype.rs | 376 + .../re_importer/src/importer_directory.rs | 93 + .../re_importer/src/importer_external.rs | 381 + .../store/re_importer/src/importer_lerobot.rs | 129 + .../re_importer/src/importer_mcap/importer.rs | 360 + .../lenses/foxglove/camera_calibration.rs | 38 + .../lenses/foxglove/compressed_image.rs | 33 + .../lenses/foxglove/compressed_video.rs | 31 + .../lenses/foxglove/frame_transform.rs | 37 + .../lenses/foxglove/frame_transforms.rs | 37 + .../lenses/foxglove/location_fix.rs | 37 + .../lenses/foxglove/location_fixes.rs | 37 + .../src/importer_mcap/lenses/foxglove/log.rs | 55 + .../src/importer_mcap/lenses/foxglove/mod.rs | 64 + .../lenses/foxglove/packed_element_field.rs | 411 + .../lenses/foxglove/point_cloud.rs | 57 + .../lenses/foxglove/pose_in_frame.rs | 33 + .../lenses/foxglove/poses_in_frame.rs | 33 + .../lenses/foxglove/raw_image.rs | 33 + .../lenses/foxglove/voxel_grid.rs | 56 + .../src/importer_mcap/lenses/helpers.rs | 76 + .../src/importer_mcap/lenses/image_helpers.rs | 154 + .../src/importer_mcap/lenses/mod.rs | 38 + .../src/importer_mcap/lenses/ros2msg/log.rs | 140 + .../lenses/ros2msg/magnetic_field.rs | 27 + .../src/importer_mcap/lenses/ros2msg/mod.rs | 37 + .../lenses/ros2msg/occupancy_grid.rs | 51 + .../lenses/ros2msg/pose_stamped.rs | 31 + .../lenses/ros2msg/ros_map_helpers.rs | 152 + .../importer_mcap/lenses/ros2msg/string.rs | 13 + .../lenses/ros2msg/voxel_grid.rs | 380 + .../re_importer/src/importer_mcap/mod.rs | 13 + .../src/importer_mcap/robot_description.rs | 79 + .../assets/foxglove_camera_calibration.mcap | 3 + .../assets/foxglove_compressed_image.mcap | 3 + .../assets/foxglove_compressed_video.mcap | 3 + .../assets/foxglove_frame_transforms.mcap | 3 + .../tests/assets/foxglove_location_fixes.mcap | 3 + .../tests/assets/foxglove_log.mcap | 3 + .../tests/assets/foxglove_point_cloud.mcap | 3 + .../tests/assets/foxglove_poses_in_frame.mcap | 3 + .../tests/assets/foxglove_raw_image.mcap | 3 + .../tests/assets/foxglove_voxel_grid.mcap | 3 + .../importer_mcap/tests/assets/ros_log.mcap | 3 + .../tests/assets/ros_magnetic_field.mcap | 3 + .../tests/assets/ros_nav2_voxel_grid.mcap | 3 + .../tests/assets/ros_occupancy_grid.mcap | 3 + .../tests/assets/ros_pose_stamped.mcap | 3 + .../tests/assets/ros_string.mcap | 3 + .../src/importer_mcap/tests/foxglove/mod.rs | 12 + ...ibration__foxglove_camera_calibration.snap | 28 + ...ssed_image__foxglove_compressed_image.snap | 27 + ...ssed_video__foxglove_compressed_video.snap | 37 + ..._transforms__foxglove_frame_transform.snap | 54 + ...transforms__foxglove_frame_transforms.snap | 54 + ...location_fixes__foxglove_location_fix.snap | 32 + ...cation_fixes__foxglove_location_fixes.snap | 32 + ...sts__foxglove__test_log__foxglove_log.snap | 35 + ...est_point_cloud__foxglove_point_cloud.snap | 33 + ...cloud__foxglove_point_cloud_with_pose.snap | 33 + ...oses_in_frame__foxglove_pose_in_frame.snap | 25 + ...ses_in_frame__foxglove_poses_in_frame.snap | 27 + ...e__test_raw_image__foxglove_raw_image.snap | 30 + ..._test_voxel_grid__foxglove_voxel_grid.snap | 34 + .../tests/foxglove/test_camera_calibration.rs | 11 + .../tests/foxglove/test_compressed_image.rs | 11 + .../tests/foxglove/test_compressed_video.rs | 11 + .../tests/foxglove/test_frame_transforms.rs | 19 + .../tests/foxglove/test_location_fixes.rs | 19 + .../importer_mcap/tests/foxglove/test_log.rs | 11 + .../tests/foxglove/test_point_cloud.rs | 19 + .../tests/foxglove/test_poses_in_frame.rs | 19 + .../tests/foxglove/test_raw_image.rs | 11 + .../tests/foxglove/test_voxel_grid.rs | 11 + .../src/importer_mcap/tests/mod.rs | 6 + .../src/importer_mcap/tests/ros2msg/mod.rs | 8 + ...r_mcap__tests__ros2msg__test_log__log.snap | 44 + ...__test_magnetic_field__magnetic_field.snap | 28 + ...test_nav2_voxel_grid__nav2_voxel_grid.snap | 34 + ...__test_occupancy_grid__occupancy_grid.snap | 38 + ...2msg__test_pose_stamped__pose_stamped.snap | 30 + ...__tests__ros2msg__test_string__string.snap | 27 + .../importer_mcap/tests/ros2msg/test_log.rs | 11 + .../tests/ros2msg/test_magnetic_field.rs | 11 + .../tests/ros2msg/test_nav2_voxel_grid.rs | 11 + .../tests/ros2msg/test_occupancy_grid.rs | 11 + .../tests/ros2msg/test_pose_stamped.rs | 11 + .../tests/ros2msg/test_string.rs | 11 + .../src/importer_mcap/tests/util.rs | 58 + .../store/re_importer/src/importer_parquet.rs | 203 + crates/store/re_importer/src/importer_rrd.rs | 479 + .../src/importer_urdf/joint_transform.rs | 172 + .../re_importer/src/importer_urdf/mod.rs | 650 + .../importer_urdf/robot_description_parser.rs | 30 + .../src/importer_urdf/urdf_tree.rs | 546 + .../store/re_importer/src/lerobot/common.rs | 412 + .../re_importer/src/lerobot/datasetv2.rs | 556 + .../re_importer/src/lerobot/datasetv3.rs | 1228 ++ crates/store/re_importer/src/lerobot/mod.rs | 491 + crates/store/re_importer/src/lib.rs | 714 + crates/store/re_importer/tests/.gitattributes | 2 + .../tests/assets/supported_ros2_messages.mcap | 3 + .../test_mcap_importer__tests__ros2.snap | 3 + ...t_mp4_importer__tests__h264_nobframes.snap | 3 + .../re_importer/tests/test_mcap_importer.rs | 54 + .../re_importer/tests/test_mp4_importer.rs | 114 + crates/store/re_lenses/Cargo.toml | 30 + crates/store/re_lenses/README.md | 10 + crates/store/re_lenses/src/lib.rs | 15 + crates/store/re_lenses/src/op/mod.rs | 11 + crates/store/re_lenses/src/op/semantic.rs | 665 + crates/store/re_lenses/src/op/string.rs | 86 + crates/store/re_lenses/src/runtime.rs | 28 + crates/store/re_lenses/tests/test_builtins.rs | 53 + crates/store/re_lenses_core/Cargo.toml | 38 + crates/store/re_lenses_core/README.md | 15 + crates/store/re_lenses_core/src/ast.rs | 239 + crates/store/re_lenses_core/src/builder.rs | 194 + crates/store/re_lenses_core/src/cast.rs | 75 + crates/store/re_lenses_core/src/chunk.rs | 76 + .../re_lenses_core/src/combinators/cast.rs | 140 + .../re_lenses_core/src/combinators/error.rs | 112 + .../re_lenses_core/src/combinators/index.rs | 162 + .../re_lenses_core/src/combinators/map.rs | 331 + .../re_lenses_core/src/combinators/mod.rs | 21 + .../re_lenses_core/src/combinators/reshape.rs | 524 + .../src/combinators/transform.rs | 66 + crates/store/re_lenses_core/src/error.rs | 159 + crates/store/re_lenses_core/src/execute.rs | 455 + crates/store/re_lenses_core/src/lib.rs | 29 + crates/store/re_lenses_core/src/plan.rs | 209 + .../re_lenses_core/src/selector/dyn_expr.rs | 89 + .../store/re_lenses_core/src/selector/eval.rs | 604 + .../src/selector/function_registry.rs | 151 + .../re_lenses_core/src/selector/lexer.rs | 486 + .../store/re_lenses_core/src/selector/mod.rs | 340 + .../re_lenses_core/src/selector/parser.rs | 1090 ++ .../re_lenses_core/src/selector/runtime.rs | 83 + .../tests/test_apply_selector.rs | 107 + .../store/re_lenses_core/tests/test_cast.rs | 274 + .../tests/test_chunk_splitting.rs | 620 + .../tests/test_combinators_explode.rs | 225 + .../tests/test_combinators_string.rs | 181 + .../tests/test_combinators_transform.rs | 648 + .../tests/test_selector_array.rs | 86 + .../tests/test_selector_extraction.rs | 118 + .../tests/test_selector_functions.rs | 654 + .../tests/test_selector_list_array.rs | 541 + .../tests/test_selector_pack.rs | 249 + crates/store/re_lenses_core/tests/util.rs | 549 + crates/store/re_log_channel/Cargo.toml | 35 + crates/store/re_log_channel/README.md | 10 + .../re_log_channel/src/data_source_message.rs | 202 + crates/store/re_log_channel/src/lib.rs | 374 + crates/store/re_log_channel/src/receiver.rs | 122 + .../store/re_log_channel/src/receiver_set.rs | 296 + crates/store/re_log_channel/src/sender.rs | 117 + crates/store/re_log_encoding/Cargo.toml | 98 + crates/store/re_log_encoding/README.md | 10 + .../benches/msg_encode_benchmark.rs | 292 + crates/store/re_log_encoding/rrd.hexpat | 160 + .../re_log_encoding/src/app_id_injector.rs | 79 + .../re_log_encoding/src/chunk_provider/mod.rs | 44 + .../re_log_encoding/src/chunk_provider/rrd.rs | 195 + crates/store/re_log_encoding/src/lib.rs | 86 + .../re_log_encoding/src/rrd/chunk_reader.rs | 288 + .../src/rrd/decoder/iterator.rs | 582 + .../re_log_encoding/src/rrd/decoder/mod.rs | 105 + .../src/rrd/decoder/state_machine.rs | 809 + .../re_log_encoding/src/rrd/decoder/stream.rs | 315 + .../store/re_log_encoding/src/rrd/encoder.rs | 489 + .../store/re_log_encoding/src/rrd/errors.rs | 167 + .../re_log_encoding/src/rrd/file_sink.rs | 271 + .../src/rrd/footer/builders.rs | 503 + .../re_log_encoding/src/rrd/footer/mod.rs | 12 + .../src/rrd/footer/raw_rrd_manifest.rs | 1762 ++ .../src/rrd/footer/rrd_footer.rs | 29 + .../src/rrd/footer/rrd_manifest.rs | 605 + .../re_log_encoding/src/rrd/footer_reader.rs | 444 + .../store/re_log_encoding/src/rrd/frames.rs | 533 + .../store/re_log_encoding/src/rrd/log_msg.rs | 141 + crates/store/re_log_encoding/src/rrd/mod.rs | 132 + .../src/rrd/stream_from_http.rs | 223 + .../re_log_encoding/src/rrd/test_util.rs | 84 + .../re_log_encoding/src/transport_to_app.rs | 493 + .../tests/arrow_encode_roundtrip.rs | 47 + .../tests/footers_and_manifests.rs | 974 + ...and_manifests__rrd_manifest_blueprint.snap | 31 + ...ifests__rrd_manifest_blueprint_schema.snap | 41 + ...and_manifests__rrd_manifest_recording.snap | 73 + ...ifests__rrd_manifest_recording_schema.snap | 155 + ..._and_manifests__simple_manifest_batch.snap | 73 + ...mple_manifest_batch_native_map_static.snap | 15 + ...le_manifest_batch_native_map_temporal.snap | 77 + ...nifests__simple_manifest_batch_schema.snap | 155 + crates/store/re_log_types/Cargo.toml | 83 + crates/store/re_log_types/README.md | 12 + .../re_log_types/benches/parse_entity_path.rs | 39 + .../re_log_types/benches/vec_deque_ext.rs | 238 + crates/store/re_log_types/src/arrow_msg.rs | 85 + crates/store/re_log_types/src/entry_id.rs | 70 + crates/store/re_log_types/src/entry_name.rs | 138 + .../re_log_types/src/example_components.rs | 522 + crates/store/re_log_types/src/hash.rs | 60 + .../src/index/absolute_time_range.rs | 275 + .../store/re_log_types/src/index/duration.rs | 244 + crates/store/re_log_types/src/index/mod.rs | 27 + .../re_log_types/src/index/non_min_i64.rs | 280 + .../store/re_log_types/src/index/time_cell.rs | 263 + .../store/re_log_types/src/index/time_int.rs | 296 + .../re_log_types/src/index/time_point.rs | 240 + .../store/re_log_types/src/index/time_real.rs | 315 + .../store/re_log_types/src/index/time_type.rs | 310 + .../store/re_log_types/src/index/timeline.rs | 250 + .../re_log_types/src/index/timeline_point.rs | 39 + .../store/re_log_types/src/index/timestamp.rs | 553 + .../src/index/timestamp_format.rs | 115 + crates/store/re_log_types/src/instance.rs | 94 + crates/store/re_log_types/src/lib.rs | 1031 ++ .../re_log_types/src/path/component_path.rs | 46 + .../store/re_log_types/src/path/data_path.rs | 43 + .../re_log_types/src/path/entity_path.rs | 899 + .../src/path/entity_path_filter.rs | 1619 ++ .../re_log_types/src/path/entity_path_part.rs | 370 + crates/store/re_log_types/src/path/mod.rs | 79 + .../re_log_types/src/path/natural_ordering.rs | 96 + .../store/re_log_types/src/path/parse_path.rs | 557 + .../store/re_log_types/src/vec_deque_ext.rs | 303 + crates/store/re_mcap/Cargo.toml | 47 + crates/store/re_mcap/README.md | 10 + .../src/decoders/assets/attachments.mcap | 3 + .../store/re_mcap/src/decoders/attachments.rs | 278 + crates/store/re_mcap/src/decoders/metadata.rs | 204 + crates/store/re_mcap/src/decoders/mod.rs | 1191 ++ crates/store/re_mcap/src/decoders/protobuf.rs | 1336 ++ crates/store/re_mcap/src/decoders/raw.rs | 84 + .../re_mcap/src/decoders/recording_info.rs | 88 + crates/store/re_mcap/src/decoders/ros2.rs | 171 + .../re_mcap/src/decoders/ros2_reflection.rs | 781 + crates/store/re_mcap/src/decoders/schema.rs | 68 + ...ents__tests__attachments_mcap_fixture.snap | 37 + ...tion_tests__decode_failure_resilience.snap | 40 + ...d_combinations_with_presence_tracking.snap | 47 + ...ombinations_without_presence_tracking.snap | 47 + ...obuf__integration_tests__oneof_fields.snap | 30 + ...gration_tests__oneof_message_variants.snap | 31 + ...obuf__integration_tests__oneof_nested.snap | 28 + crates/store/re_mcap/src/decoders/stats.rs | 122 + crates/store/re_mcap/src/error.rs | 35 + crates/store/re_mcap/src/lib.rs | 19 + crates/store/re_mcap/src/parsers/cdr.rs | 79 + crates/store/re_mcap/src/parsers/dds.rs | 356 + crates/store/re_mcap/src/parsers/decode.rs | 167 + crates/store/re_mcap/src/parsers/mod.rs | 37 + .../ros2msg/definitions/builtin_interfaces.rs | 79 + .../ros2msg/definitions/geometry_msgs.rs | 51 + .../src/parsers/ros2msg/definitions/mod.rs | 11 + .../ros2msg/definitions/sensor_msgs.rs | 782 + .../parsers/ros2msg/definitions/std_msgs.rs | 60 + .../parsers/ros2msg/definitions/tf2_msgs.rs | 13 + .../store/re_mcap/src/parsers/ros2msg/mod.rs | 16 + .../src/parsers/ros2msg/scalar_parser.rs | 140 + .../ros2msg/sensor_msgs/camera_info.rs | 107 + .../ros2msg/sensor_msgs/compressed_image.rs | 176 + .../src/parsers/ros2msg/sensor_msgs/image.rs | 241 + .../src/parsers/ros2msg/sensor_msgs/imu.rs | 130 + .../ros2msg/sensor_msgs/joint_state.rs | 131 + .../src/parsers/ros2msg/sensor_msgs/joy.rs | 92 + .../src/parsers/ros2msg/sensor_msgs/mod.rs | 19 + .../ros2msg/sensor_msgs/nav_sat_fix.rs | 103 + .../ros2msg/sensor_msgs/point_cloud_2.rs | 832 + .../ros2msg/sensor_msgs/scalar_msgs.rs | 100 + .../parsers/ros2msg/std_msgs/float64_array.rs | 47 + .../ros2msg/std_msgs/float64_multi_array.rs | 47 + .../src/parsers/ros2msg/std_msgs/mod.rs | 5 + .../src/parsers/ros2msg/tf2_msgs/mod.rs | 1 + .../parsers/ros2msg/tf2_msgs/tf_message.rs | 174 + .../store/re_mcap/src/parsers/ros2msg/util.rs | 18 + crates/store/re_mcap/src/util.rs | 187 + crates/store/re_mp4_reader/Cargo.toml | 34 + crates/store/re_mp4_reader/README.md | 10 + crates/store/re_mp4_reader/src/asset.rs | 148 + crates/store/re_mp4_reader/src/config.rs | 75 + crates/store/re_mp4_reader/src/error.rs | 58 + crates/store/re_mp4_reader/src/lib.rs | 126 + crates/store/re_mp4_reader/src/stream.rs | 668 + crates/store/re_mp4_reader/tests/stream.rs | 189 + crates/store/re_parquet/Cargo.toml | 33 + crates/store/re_parquet/src/config.rs | 126 + crates/store/re_parquet/src/grouping.rs | 151 + crates/store/re_parquet/src/lib.rs | 42 + crates/store/re_parquet/src/streaming.rs | 550 + crates/store/re_parquet/src/timeline.rs | 158 + crates/store/re_parquet/tests/integration.rs | 886 + crates/store/re_protos/.gitattributes | 4 + crates/store/re_protos/Cargo.toml | 66 + crates/store/re_protos/README.md | 16 + crates/store/re_protos/proto/.gitignore | 1 + .../proto/rerun/v1alpha1/cloud.proto | 1217 ++ .../proto/rerun/v1alpha1/common.proto | 345 + .../proto/rerun/v1alpha1/log_msg.proto | 277 + .../proto/rerun/v1alpha1/sdk_comms.proto | 59 + .../proto/rerun/v1alpha1/viewer.proto | 137 + crates/store/re_protos/src/headers.rs | 123 + crates/store/re_protos/src/lib.rs | 439 + crates/store/re_protos/src/trace_id_layer.rs | 101 + .../rerun.cloud.v1alpha1.ext.chunk_key.rs | 361 + .../src/v1alpha1/rerun.cloud.v1alpha1.ext.rs | 2806 +++ .../rerun.cloud.v1alpha1.ext.schemas.rs | 245 + .../src/v1alpha1/rerun.cloud.v1alpha1.rs | 4787 +++++ .../src/v1alpha1/rerun.common.v1alpha1.ext.rs | 1286 ++ .../src/v1alpha1/rerun.common.v1alpha1.rs | 754 + .../v1alpha1/rerun.log_msg.v1alpha1.ext.rs | 396 + .../src/v1alpha1/rerun.log_msg.v1alpha1.rs | 489 + .../src/v1alpha1/rerun.sdk_comms.v1alpha1.rs | 1392 ++ ...tests__query_dataset_dataframe_schema.snap | 22 + ...__tests__query_tasks_dataframe_schema.snap | 15 + ...egister_with_dataset_dataframe_schema.snap | 9 + ...can_dataset_manifest_dataframe_schema.snap | 14 + ...__scan_segment_table_dataframe_schema.snap | 10 + crates/store/re_query/Cargo.toml | 83 + crates/store/re_query/README.md | 10 + crates/store/re_query/benches/latest_at.rs | 333 + .../re_query/examples/query_latest_at.rs | 133 + crates/store/re_query/examples/query_range.rs | 151 + crates/store/re_query/src/bin/clamped_zip.rs | 352 + crates/store/re_query/src/bin/range_zip.rs | 496 + crates/store/re_query/src/cache.rs | 597 + crates/store/re_query/src/cache_stats.rs | 108 + .../re_query/src/clamped_zip/.gitattributes | 1 + .../re_query/src/clamped_zip/generated.rs | 1201 ++ crates/store/re_query/src/clamped_zip/mod.rs | 64 + crates/store/re_query/src/latest_all.rs | 294 + crates/store/re_query/src/latest_at.rs | 1353 ++ crates/store/re_query/src/lib.rs | 81 + crates/store/re_query/src/range.rs | 654 + .../re_query/src/range_zip/.gitattributes | 1 + .../store/re_query/src/range_zip/generated.rs | 4212 +++++ crates/store/re_query/src/range_zip/mod.rs | 69 + crates/store/re_query/src/storage_engine.rs | 302 + crates/store/re_query/tests/latest_all.rs | 288 + crates/store/re_query/tests/latest_at.rs | 731 + crates/store/re_query/tests/range.rs | 1367 ++ crates/store/re_redap_client/Cargo.toml | 80 + crates/store/re_redap_client/README.md | 10 + .../re_redap_client/src/analytics_exporter.rs | 75 + crates/store/re_redap_client/src/api_error.rs | 460 + .../src/api_response_stream.rs | 73 + .../re_redap_client/src/connection_client.rs | 1503 ++ .../src/connection_registry.rs | 811 + crates/store/re_redap_client/src/grpc.rs | 1268 ++ crates/store/re_redap_client/src/lib.rs | 425 + .../src/segment_chunk_provider.rs | 170 + crates/store/re_redap_tests/Cargo.toml | 47 + crates/store/re_redap_tests/README.md | 44 + crates/store/re_redap_tests/src/lib.rs | 39 + .../src/tests/column_projection.rs | 240 + .../store/re_redap_tests/src/tests/common.rs | 734 + .../src/tests/create_dataset.rs | 263 + .../re_redap_tests/src/tests/create_table.rs | 169 + .../src/tests/dataset_schema.rs | 58 + .../re_redap_tests/src/tests/entries_table.rs | 198 + .../re_redap_tests/src/tests/fetch_chunks.rs | 227 + crates/store/re_redap_tests/src/tests/mod.rs | 182 + .../re_redap_tests/src/tests/query_dataset.rs | 599 + .../re_redap_tests/src/tests/query_filter.rs | 460 + .../src/tests/query_index_values.rs | 1096 ++ .../src/tests/register_asset.rs | 492 + .../src/tests/register_segment.rs | 1604 ++ .../re_redap_tests/src/tests/rrd_manifest.rs | 370 + ...jection__dataset_manifest_all_columns.snap | 18 + ...projection__segment_table_all_columns.snap | 14 + ...ests__create_table__create_table_data.snap | 8 + ..._dataset_schema__empty_dataset_schema.snap | 7 + ...dataset_schema__simple_dataset_schema.snap | 104 + ...ts__entries_table__entries_table_data.snap | 9 + ...__entries_table__entries_table_schema.snap | 12 + ...ble__entries_table_with_empty_dataset.snap | 15 + ...ries_table_with_empty_dataset_deleted.snap | 9 + ...ch_chunks__simple_dataset_fetch_chunk.snap | 262 + ...ts__query_dataset__empty_dataset_data.snap | 8 + ...__query_dataset__empty_dataset_schema.snap | 22 + ..._dataset__simple_dataset_default_data.snap | 31 + ...ataset__simple_dataset_default_schema.snap | 22 + ...t__simple_dataset_exclude_static_data.snap | 19 + ..._simple_dataset_exclude_static_schema.snap | 22 + ..._simple_dataset_exclude_temporal_data.snap | 19 + ...imple_dataset_exclude_temporal_schema.snap | 22 + ...et__simple_dataset_single_entity_data.snap | 19 + ...__simple_dataset_single_entity_schema.snap | 22 + ...t__simple_dataset_single_segment_data.snap | 19 + ..._simple_dataset_single_segment_schema.snap | 22 + ...query_dataset__simple_with_layer_data.snap | 27 + ...ery_dataset__simple_with_layer_schema.snap | 22 + ...uery_dataset__with_query_default_data.snap | 15 + ...ry_dataset__with_query_default_schema.snap | 22 + ...ataset__with_query_latest_at_end_data.snap | 13 + ...aset__with_query_latest_at_end_schema.snap | 22 + ...__query_dataset__with_query_none_data.snap | 15 + ...query_dataset__with_query_none_schema.snap | 22 + ...ry_dataset__with_query_range_all_data.snap | 13 + ..._dataset__with_query_range_all_schema.snap | 22 + ...r__frame_nr_range_fill_latest_at_data.snap | 43 + ..._frame_nr_range_fill_latest_at_schema.snap | 34 + ...y_filter__frame_nr_range_no_fill_data.snap | 25 + ...filter__frame_nr_range_no_fill_schema.snap | 34 + ...y_filter__simple_dataset_default_data.snap | 61 + ...e_dataset_default_fill_latest_at_data.snap | 61 + ...dataset_default_fill_latest_at_schema.snap | 34 + ...filter__simple_dataset_default_schema.snap | 34 + ...lter__simple_dataset_frame_nr_eq_data.snap | 25 + ...taset_frame_nr_eq_fill_latest_at_data.snap | 43 + ...set_frame_nr_eq_fill_latest_at_schema.snap | 34 + ...er__simple_dataset_frame_nr_eq_schema.snap | 34 + ...r__simple_dataset_frame_nr_range_data.snap | 25 + ...et_frame_nr_range_fill_latest_at_data.snap | 43 + ..._frame_nr_range_fill_latest_at_schema.snap | 34 + ..._simple_dataset_frame_nr_range_schema.snap | 34 + ...filter__simple_dataset_seg_id_eq_data.snap | 25 + ...dataset_seg_id_eq_fill_latest_at_data.snap | 25 + ...taset_seg_id_eq_fill_latest_at_schema.snap | 34 + ...lter__simple_dataset_seg_id_eq_schema.snap | 34 + ..._duration_all_valid_index_values_data.snap | 23 + ...uration_all_valid_index_values_schema.snap | 34 + ...x_values_duration_single_segment_data.snap | 11 + ..._values_duration_unknown_segment_data.snap | 8 + ..._sequence_all_valid_index_values_data.snap | 23 + ...equence_all_valid_index_values_schema.snap | 34 + ...x_values_sequence_single_segment_data.snap | 11 + ..._values_sequence_unknown_segment_data.snap | 8 + ...timestamp_all_valid_index_values_data.snap | 23 + ...mestamp_all_valid_index_values_schema.snap | 34 + ..._values_timestamp_single_segment_data.snap | 11 + ...values_timestamp_unknown_segment_data.snap | 8 + ...register_segment__empty_manifest_data.snap | 8 + ...gister_segment__empty_manifest_schema.snap | 14 + ...register_segment__empty_segments_data.snap | 8 + ...gister_segment__empty_segments_schema.snap | 10 + ...out_of_order_properties_manifest_data.snap | 11 + ...t_of_order_properties_manifest_schema.snap | 21 + ...out_of_order_properties_segments_data.snap | 9 + ...t_of_order_properties_segments_schema.snap | 17 + ...egister_prefix_manifest_manifest_data.snap | 13 + ...ister_prefix_manifest_manifest_schema.snap | 14 + ...egister_prefix_segments_segments_data.snap | 13 + ...ister_prefix_segments_segments_schema.snap | 22 + ...1_props_should_be_there_segments_data.snap | 9 + ...props_should_be_there_segments_schema.snap | 15 + ...gment__simple_blueprint_manifest_data.snap | 9 + ...ent__simple_blueprint_manifest_schema.snap | 14 + ...gment__simple_blueprint_segments_data.snap | 9 + ...ent__simple_blueprint_segments_schema.snap | 22 + ...egister_segment__simple_manifest_data.snap | 13 + ...ister_segment__simple_manifest_schema.snap | 14 + ...egister_segment__simple_segments_data.snap | 13 + ...ister_segment__simple_segments_schema.snap | 22 + ...ent__simple_with_layers_manifest_data.snap | 17 + ...t__simple_with_layers_manifest_schema.snap | 14 + ...ent__simple_with_layers_segments_data.snap | 13 + ...t__simple_with_layers_segments_schema.snap | 22 + ...with_multiple_timelines_manifest_data.snap | 17 + ...th_multiple_timelines_manifest_schema.snap | 21 + ...with_multiple_timelines_segments_data.snap | 13 + ...th_multiple_timelines_segments_schema.snap | 53 + ..._simple_with_properties_manifest_data.snap | 17 + ...imple_with_properties_manifest_schema.snap | 28 + ..._simple_with_properties_segments_data.snap | 13 + ...imple_with_properties_segments_schema.snap | 36 + ...ifest__fetch_chunks_from_rrd_manifest.snap | 47 + ...ered_segment_rrd_manifest_1_all_there.snap | 45 + ...rd_manifest_1_all_there_sorbet_schema.snap | 44 + ...fest_1_all_there_sorbet_schema_sha256.snap | 5 + ...d_segment_rrd_manifest_2_base_removed.snap | 23 + ...manifest_2_base_removed_sorbet_schema.snap | 18 + ...t_2_base_removed_sorbet_schema_sha256.snap | 5 + ...ts__tests__rrd_manifest__rrd_manifest.snap | 43 + ..._manifest__rrd_manifest_sorbet_schema.snap | 38 + ...st__rrd_manifest_sorbet_schema_sha256.snap | 5 + ...ssing_1_should_be_empty_response_data.snap | 8 + ...ing_1_should_be_empty_response_schema.snap | 14 + ...products_1_register_all_manifest_data.snap | 31 + ...oducts_1_register_all_manifest_schema.snap | 14 + ...products_1_register_all_segments_data.snap | 13 + ...oducts_1_register_all_segments_schema.snap | 10 + ...yers_BD_for_segments_13_manifest_data.snap | 23 + ...rs_BD_for_segments_13_manifest_schema.snap | 14 + ...rs_BD_for_segments_13_response_schema.snap | 14 + ...yers_BD_for_segments_13_segments_data.snap | 13 + ...rs_BD_for_segments_13_segments_schema.snap | 10 + ...ers_BD_for_all_segments_manifest_data.snap | 19 + ...s_BD_for_all_segments_manifest_schema.snap | 14 + ...s_BD_for_all_segments_response_schema.snap | 14 + ...ers_BD_for_all_segments_segments_data.snap | 13 + ...s_BD_for_all_segments_segments_schema.snap | 10 + ..._layers_for_segments_23_manifest_data.snap | 11 + ...ayers_for_segments_23_manifest_schema.snap | 14 + ...ayers_for_segments_23_response_schema.snap | 14 + ..._layers_for_segments_23_segments_data.snap | 9 + ...ayers_for_segments_23_segments_schema.snap | 10 + ...__simple_1_register_all_manifest_data.snap | 13 + ...simple_1_register_all_manifest_schema.snap | 14 + ...__simple_1_register_all_segments_data.snap | 13 + ...simple_1_register_all_segments_schema.snap | 10 + ...le_2_remove_segment_id2_manifest_data.snap | 11 + ..._2_remove_segment_id2_manifest_schema.snap | 14 + ..._2_remove_segment_id2_response_schema.snap | 14 + ...le_2_remove_segment_id2_segments_data.snap | 11 + ..._2_remove_segment_id2_segments_schema.snap | 10 + ...move_remaining_segments_manifest_data.snap | 8 + ...ve_remaining_segments_manifest_schema.snap | 14 + ...ve_remaining_segments_response_schema.snap | 14 + ...move_remaining_segments_segments_data.snap | 8 + ...ve_remaining_segments_segments_schema.snap | 10 + ...simple_4_reregister_all_manifest_data.snap | 13 + ...mple_4_reregister_all_manifest_schema.snap | 14 + ...simple_4_reregister_all_segments_data.snap | 13 + ...mple_4_reregister_all_segments_schema.snap | 10 + ...t__unregister_then_query_1_added_data.snap | 15 + ..._unregister_then_query_1_added_schema.snap | 22 + ..._unregister_then_query_2_removed_data.snap | 8 + ...nregister_then_query_2_removed_schema.snap | 22 + ...sts__tests__write_table__append_table.snap | 32 + ...__tests__write_table__overwrite_table.snap | 20 + ...sts__tests__write_table__replace_rows.snap | 22 + .../src/tests/unregister_segment.rs | 654 + .../re_redap_tests/src/tests/update_entry.rs | 686 + .../re_redap_tests/src/tests/watch_events.rs | 70 + .../re_redap_tests/src/tests/write_table.rs | 155 + .../store/re_redap_tests/src/utils/client.rs | 135 + crates/store/re_redap_tests/src/utils/mod.rs | 5 + crates/store/re_redap_tests/src/utils/path.rs | 50 + .../store/re_redap_tests/src/utils/rerun.rs | 1215 ++ .../re_redap_tests/src/utils/streaming.rs | 42 + .../store/re_redap_tests/src/utils/tables.rs | 98 + crates/store/re_sdk_types/.gitattributes | 132 + crates/store/re_sdk_types/.gitignore | 1 + crates/store/re_sdk_types/Cargo.toml | 98 + crates/store/re_sdk_types/README.md | 14 + .../re_sdk_types/definitions/.gitattributes | 4 + .../re_sdk_types/definitions/attributes.fbs | 8 + .../definitions/attributes/arrow.fbs | 17 + .../definitions/attributes/cpp.fbs | 13 + .../definitions/attributes/docs.fbs | 21 + .../definitions/attributes/fbs.fbs | 43 + .../definitions/attributes/python.fbs | 9 + .../definitions/attributes/rust.fbs | 43 + .../re_sdk_types/definitions/entry_point.fbs | 23 + .../definitions/rerun/.gitattributes | 6 + .../definitions/rerun/archetypes.fbs | 52 + .../rerun/archetypes/annotation_context.fbs | 25 + .../definitions/rerun/archetypes/arrows2d.fbs | 62 + .../definitions/rerun/archetypes/arrows3d.fbs | 56 + .../definitions/rerun/archetypes/asset3d.fbs | 46 + .../rerun/archetypes/asset_video.fbs | 35 + .../rerun/archetypes/bar_chart.fbs | 32 + .../definitions/rerun/archetypes/boxes2d.fbs | 61 + .../definitions/rerun/archetypes/boxes3d.fbs | 72 + .../rerun/archetypes/capsules3d.fbs | 76 + .../definitions/rerun/archetypes/clear.fbs | 28 + .../rerun/archetypes/coordinate_frame.fbs | 24 + .../rerun/archetypes/cylinders3d.fbs | 73 + .../rerun/archetypes/depth_image.fbs | 82 + .../rerun/archetypes/ellipses2d.fbs | 61 + .../rerun/archetypes/ellipsoids3d.fbs | 74 + .../rerun/archetypes/encoded_depth_image.fbs | 57 + .../rerun/archetypes/encoded_image.fbs | 51 + .../rerun/archetypes/geo_line_strings.fbs | 39 + .../rerun/archetypes/geo_points.fbs | 39 + .../rerun/archetypes/graph_edges.fbs | 31 + .../rerun/archetypes/graph_nodes.fbs | 40 + .../definitions/rerun/archetypes/grid_map.fbs | 68 + .../definitions/rerun/archetypes/image.fbs | 59 + .../rerun/archetypes/instance_poses3d.fbs | 50 + .../rerun/archetypes/line_strips2d.fbs | 55 + .../rerun/archetypes/line_strips3d.fbs | 50 + .../rerun/archetypes/mcap_channel.fbs | 54 + .../rerun/archetypes/mcap_message.fbs | 34 + .../rerun/archetypes/mcap_schema.fbs | 55 + .../rerun/archetypes/mcap_statistics.fbs | 71 + .../definitions/rerun/archetypes/mesh3d.fbs | 78 + .../definitions/rerun/archetypes/pinhole.fbs | 117 + .../definitions/rerun/archetypes/points2d.fbs | 69 + .../definitions/rerun/archetypes/points3d.fbs | 71 + .../rerun/archetypes/recording_info.fbs | 20 + .../definitions/rerun/archetypes/scalars.fbs | 35 + .../rerun/archetypes/segmentation_image.fbs | 45 + .../rerun/archetypes/series_lines.fbs | 70 + .../rerun/archetypes/series_points.fbs | 59 + .../rerun/archetypes/state_change.fbs | 27 + .../rerun/archetypes/state_configuration.fbs | 51 + .../definitions/rerun/archetypes/tensor.fbs | 39 + .../rerun/archetypes/text_document.fbs | 28 + .../definitions/rerun/archetypes/text_log.fbs | 25 + .../rerun/archetypes/transform3d.fbs | 87 + .../rerun/archetypes/transform_axes3d.fbs | 21 + .../archetypes/video_frame_reference.fbs | 55 + .../rerun/archetypes/video_stream.fbs | 80 + .../rerun/archetypes/view_coordinates.fbs | 29 + .../rerun/archetypes/voxel_grid_map.fbs | 83 + .../definitions/rerun/attributes.fbs | 101 + .../rerun/blueprint/.gitattributes | 7 + .../rerun/blueprint/archetypes.fbs | 36 + .../archetypes/active_visualizers.fbs | 17 + .../rerun/blueprint/archetypes/background.fbs | 38 + .../archetypes/container_blueprint.fbs | 51 + .../blueprint/archetypes/dataframe_query.fbs | 42 + .../blueprint/archetypes/entity_behavior.fbs | 28 + .../blueprint/archetypes/eye_controls3d.fbs | 48 + .../blueprint/archetypes/force_center.fbs | 14 + .../archetypes/force_collision_radius.fbs | 19 + .../rerun/blueprint/archetypes/force_link.fbs | 19 + .../blueprint/archetypes/force_many_body.fbs | 19 + .../blueprint/archetypes/force_position.fbs | 17 + .../blueprint/archetypes/line_grid3d.fbs | 34 + .../blueprint/archetypes/map_background.fbs | 15 + .../rerun/blueprint/archetypes/map_zoom.fbs | 16 + .../blueprint/archetypes/near_clip_plane.fbs | 11 + .../blueprint/archetypes/panel_blueprint.fbs | 53 + .../blueprint/archetypes/plot_legend.fbs | 20 + .../blueprint/archetypes/scalar_axis.fbs | 20 + .../archetypes/spatial_information.fbs | 19 + .../blueprint/archetypes/table_blueprint.fbs | 37 + .../archetypes/tensor_scalar_mapping.fbs | 24 + .../archetypes/tensor_slice_selection.fbs | 29 + .../blueprint/archetypes/tensor_view_fit.fbs | 11 + .../archetypes/text_document_format.fbs | 20 + .../blueprint/archetypes/text_log_columns.fbs | 21 + .../blueprint/archetypes/text_log_format.fbs | 14 + .../blueprint/archetypes/text_log_rows.fbs | 16 + .../rerun/blueprint/archetypes/time_axis.fbs | 23 + .../blueprint/archetypes/view_blueprint.fbs | 32 + .../blueprint/archetypes/view_contents.fbs | 55 + .../archetypes/viewport_blueprint.fbs | 42 + .../archetypes/visible_time_ranges.fbs | 23 + .../blueprint/archetypes/visual_bounds2d.fbs | 17 + .../archetypes/visualizer_instruction.fbs | 13 + .../rerun/blueprint/components.fbs | 56 + .../components/absolute_time_range.fbs | 15 + .../rerun/blueprint/components/active_tab.fbs | 16 + .../blueprint/components/angular_speed.fbs | 13 + .../blueprint/components/apply_latest_at.fbs | 15 + .../blueprint/components/auto_layout.fbs | 16 + .../blueprint/components/auto_scroll.fbs | 15 + .../rerun/blueprint/components/auto_views.fbs | 14 + .../blueprint/components/background_kind.fbs | 23 + .../blueprint/components/column_name.fbs | 13 + .../blueprint/components/column_order.fbs | 13 + .../blueprint/components/column_share.fbs | 15 + .../components/component_column_selector.fbs | 13 + .../blueprint/components/container_kind.fbs | 22 + .../rerun/blueprint/components/corner2d.fbs | 22 + .../rerun/blueprint/components/enabled.fbs | 15 + .../rerun/blueprint/components/eye3d_kind.fbs | 25 + .../blueprint/components/filter_by_range.fbs | 13 + .../components/filter_is_not_null.fbs | 12 + .../blueprint/components/force_distance.fbs | 14 + .../blueprint/components/force_iterations.fbs | 14 + .../blueprint/components/force_strength.fbs | 14 + .../rerun/blueprint/components/fps.fbs | 15 + .../blueprint/components/grid_columns.fbs | 12 + .../blueprint/components/grid_spacing.fbs | 11 + .../blueprint/components/included_content.fbs | 14 + .../rerun/blueprint/components/link_axis.fbs | 20 + .../components/lock_range_during_zoom.fbs | 15 + .../rerun/blueprint/components/loop_mode.fbs | 25 + .../blueprint/components/map_provider.fbs | 25 + .../blueprint/components/near_clip_plane.fbs | 13 + .../blueprint/components/panel_state.fbs | 23 + .../rerun/blueprint/components/play_state.fbs | 23 + .../blueprint/components/playback_speed.fbs | 16 + .../blueprint/components/query_expression.fbs | 23 + .../blueprint/components/root_container.fbs | 14 + .../rerun/blueprint/components/row_share.fbs | 14 + .../blueprint/components/selected_columns.fbs | 13 + .../tensor_dimension_index_slider.fbs | 11 + .../blueprint/components/text_log_column.fbs | 15 + .../rerun/blueprint/components/time_int.fbs | 15 + .../rerun/blueprint/components/time_range.fbs | 13 + .../blueprint/components/timeline_column.fbs | 16 + .../blueprint/components/timeline_name.fbs | 14 + .../rerun/blueprint/components/view_class.fbs | 12 + .../rerun/blueprint/components/view_fit.fbs | 18 + .../blueprint/components/view_maximized.fbs | 10 + .../blueprint/components/view_origin.fbs | 12 + .../components/viewer_recommendation_hash.fbs | 16 + .../components/visible_time_range.fbs | 15 + .../blueprint/components/visual_bounds2d.fbs | 13 + .../visualizer_component_mapping.fbs | 10 + .../components/visualizer_instruction_id.fbs | 16 + .../blueprint/components/visualizer_type.fbs | 10 + .../rerun/blueprint/components/zoom_level.fbs | 13 + .../definitions/rerun/blueprint/datatypes.fbs | 10 + .../datatypes/component_column_selector.fbs | 22 + .../blueprint/datatypes/filter_by_range.fbs | 14 + .../datatypes/filter_is_not_null.fbs | 16 + .../blueprint/datatypes/selected_columns.fbs | 18 + .../tensor_dimension_index_slider.fbs | 16 + .../blueprint/datatypes/text_log_column.fbs | 33 + .../blueprint/datatypes/timeline_column.fbs | 17 + .../visualizer_component_mapping.fbs | 74 + .../definitions/rerun/blueprint/views.fbs | 13 + .../rerun/blueprint/views/bar_chart.fbs | 15 + .../rerun/blueprint/views/dataframe.fbs | 15 + .../rerun/blueprint/views/graph.fbs | 32 + .../definitions/rerun/blueprint/views/map.fbs | 14 + .../rerun/blueprint/views/spatial2d.fbs | 23 + .../rerun/blueprint/views/spatial3d.fbs | 26 + .../rerun/blueprint/views/state_timeline.fbs | 10 + .../rerun/blueprint/views/tensor.fbs | 17 + .../rerun/blueprint/views/text_document.fbs | 11 + .../rerun/blueprint/views/text_log.fbs | 17 + .../rerun/blueprint/views/time_series.fbs | 26 + .../definitions/rerun/components.fbs | 84 + .../rerun/components/aggregation_policy.fbs | 31 + .../rerun/components/albedo_factor.fbs | 12 + .../rerun/components/annotation_context.fbs | 19 + .../rerun/components/axis_length.fbs | 13 + .../definitions/rerun/components/blob.fbs | 16 + .../rerun/components/cell_size.fbs | 15 + .../rerun/components/channel_id.fbs | 18 + .../components/channel_message_counts.fbs | 16 + .../definitions/rerun/components/class_id.fbs | 18 + .../rerun/components/clear_is_recursive.fbs | 17 + .../definitions/rerun/components/color.fbs | 21 + .../definitions/rerun/components/colormap.fbs | 82 + .../definitions/rerun/components/count.fbs | 17 + .../rerun/components/depth_meter.fbs | 21 + .../rerun/components/draw_order.fbs | 19 + .../rerun/components/entity_path.fbs | 13 + .../rerun/components/fill_mode.fbs | 40 + .../rerun/components/fill_ratio.fbs | 19 + .../rerun/components/gamma_correction.fbs | 19 + .../rerun/components/geo_line_string.fbs | 15 + .../rerun/components/graph_edge.fbs | 11 + .../rerun/components/graph_node.fbs | 13 + .../rerun/components/graph_type.fbs | 17 + .../rerun/components/half_size2d.fbs | 16 + .../rerun/components/half_size3d.fbs | 17 + .../rerun/components/image_buffer.fbs | 16 + .../rerun/components/image_format.fbs | 9 + .../rerun/components/image_plane_distance.fbs | 13 + .../rerun/components/interactive.fbs | 13 + .../rerun/components/interpolation_mode.fbs | 25 + .../rerun/components/is_keyframe.fbs | 19 + .../rerun/components/key_value_pairs.fbs | 19 + .../rerun/components/keypoint_id.fbs | 26 + .../definitions/rerun/components/latlon.fbs | 14 + .../definitions/rerun/components/length.fbs | 16 + .../rerun/components/line_strip2d.fbs | 24 + .../rerun/components/line_strip3d.fbs | 23 + .../rerun/components/linear_speed.fbs | 10 + .../rerun/components/magnification_filter.fbs | 27 + .../rerun/components/marker_shape.fbs | 39 + .../rerun/components/marker_size.fbs | 13 + .../rerun/components/media_type.fbs | 19 + .../rerun/components/mesh_face_rendering.fbs | 23 + .../definitions/rerun/components/name.fbs | 16 + .../definitions/rerun/components/opacity.fbs | 17 + .../rerun/components/pinhole_projection.fbs | 20 + .../definitions/rerun/components/plane3d.fbs | 17 + .../rerun/components/point_shading.fbs | 16 + .../rerun/components/position2d.fbs | 14 + .../rerun/components/position3d.fbs | 13 + .../definitions/rerun/components/radius.fbs | 21 + .../definitions/rerun/components/range1d.fbs | 11 + .../rerun/components/resolution.fbs | 13 + .../rerun/components/rotation_axis_angle.fbs | 12 + .../rerun/components/rotation_quat.fbs | 13 + .../definitions/rerun/components/scalar.fbs | 16 + .../definitions/rerun/components/scale3d.fbs | 13 + .../rerun/components/schema_id.fbs | 16 + .../rerun/components/show_labels.fbs | 20 + .../rerun/components/stroke_width.fbs | 13 + .../rerun/components/tensor_data.fbs | 20 + .../components/tensor_dimension_selection.fbs | 28 + .../rerun/components/texcoord2d.fbs | 30 + .../definitions/rerun/components/text.fbs | 16 + .../rerun/components/text_log_level.fbs | 23 + .../rerun/components/timestamp.fbs | 17 + .../rerun/components/transform_frame_id.fbs | 21 + .../rerun/components/transform_mat3x3.fbs | 43 + .../rerun/components/transform_relation.fbs | 21 + .../rerun/components/translation3d.fbs | 9 + .../rerun/components/triangle_indices.fbs | 12 + .../rerun/components/value_range.fbs | 12 + .../definitions/rerun/components/vector2d.fbs | 13 + .../definitions/rerun/components/vector3d.fbs | 13 + .../rerun/components/video_codec.fbs | 64 + .../rerun/components/video_sample.fbs | 17 + .../rerun/components/video_timestamp.fbs | 13 + .../rerun/components/view_coordinates.fbs | 44 + .../definitions/rerun/components/visible.fbs | 13 + .../rerun/components/voxel_index.fbs | 15 + .../rerun/components/voxel_size.fbs | 14 + .../rerun/components/voxel_value.fbs | 13 + .../definitions/rerun/datatypes.fbs | 49 + .../definitions/rerun/datatypes/angle.fbs | 14 + .../rerun/datatypes/annotation_info.fbs | 22 + .../definitions/rerun/datatypes/blob.fbs | 17 + .../definitions/rerun/datatypes/bool.fbs | 15 + .../rerun/datatypes/channel_count_pair.fbs | 15 + .../rerun/datatypes/channel_datatype.fbs | 66 + .../rerun/datatypes/class_description.fbs | 39 + .../datatypes/class_description_map_elem.fbs | 18 + .../definitions/rerun/datatypes/class_id.fbs | 19 + .../rerun/datatypes/color_model.fbs | 24 + .../definitions/rerun/datatypes/dvec2d.fbs | 15 + .../rerun/datatypes/entity_path.fbs | 17 + .../definitions/rerun/datatypes/float32.fbs | 14 + .../definitions/rerun/datatypes/float64.fbs | 14 + .../rerun/datatypes/image_format.fbs | 31 + .../definitions/rerun/datatypes/ivec3d.fbs | 15 + .../rerun/datatypes/keypoint_id.fbs | 26 + .../rerun/datatypes/keypoint_pair.fbs | 15 + .../definitions/rerun/datatypes/mat3x3.fbs | 47 + .../definitions/rerun/datatypes/mat4x4.fbs | 47 + .../rerun/datatypes/pixel_format.fbs | 111 + .../definitions/rerun/datatypes/plane3d.fbs | 21 + .../rerun/datatypes/quaternion.fbs | 18 + .../definitions/rerun/datatypes/range1d.fbs | 15 + .../definitions/rerun/datatypes/range2d.fbs | 15 + .../definitions/rerun/datatypes/rgba32.fbs | 22 + .../rerun/datatypes/rotation_axis_angle.fbs | 19 + .../rerun/datatypes/tensor_buffer.fbs | 89 + .../rerun/datatypes/tensor_data.fbs | 37 + .../datatypes/tensor_dimension_selection.fbs | 27 + .../definitions/rerun/datatypes/time_int.fbs | 12 + .../rerun/datatypes/time_range.fbs | 14 + .../definitions/rerun/datatypes/uint16.fbs | 14 + .../definitions/rerun/datatypes/uint32.fbs | 14 + .../definitions/rerun/datatypes/uint64.fbs | 13 + .../definitions/rerun/datatypes/utf8.fbs | 18 + .../definitions/rerun/datatypes/utf8_pair.fbs | 14 + .../definitions/rerun/datatypes/uuid.fbs | 15 + .../definitions/rerun/datatypes/uvec2d.fbs | 15 + .../definitions/rerun/datatypes/uvec3d.fbs | 15 + .../definitions/rerun/datatypes/uvec4d.fbs | 15 + .../definitions/rerun/datatypes/vec2d.fbs | 15 + .../definitions/rerun/datatypes/vec3d.fbs | 15 + .../definitions/rerun/datatypes/vec4d.fbs | 15 + .../rerun/datatypes/video_timestamp.fbs | 18 + .../rerun/datatypes/view_coordinates.fbs | 45 + .../rerun/datatypes/visible_time_range.fbs | 45 + .../rerun/testing/archetypes/fuzzy.fbs | 107 + .../rerun/testing/components/enum_test.fbs | 53 + .../rerun/testing/components/fuzzy.fbs | 152 + .../rerun/testing/components/fuzzy_deps.fbs | 24 + .../rerun/testing/datatypes/fuzzy.fbs | 101 + .../definitions/rerun/unit_type.fbs | 9 + crates/store/re_sdk_types/src/any_values.rs | 110 + .../src/archetypes/.gitattributes | 53 + .../src/archetypes/annotation_context.rs | 264 + .../re_sdk_types/src/archetypes/arrows2d.rs | 619 + .../src/archetypes/arrows2d_ext.rs | 10 + .../re_sdk_types/src/archetypes/arrows3d.rs | 576 + .../src/archetypes/arrows3d_ext.rs | 10 + .../re_sdk_types/src/archetypes/asset3d.rs | 401 + .../src/archetypes/asset3d_ext.rs | 40 + .../src/archetypes/asset_video.rs | 390 + .../src/archetypes/asset_video_ext.rs | 76 + .../re_sdk_types/src/archetypes/bar_chart.rs | 422 + .../re_sdk_types/src/archetypes/boxes2d.rs | 608 + .../src/archetypes/boxes2d_ext.rs | 78 + .../re_sdk_types/src/archetypes/boxes3d.rs | 734 + .../src/archetypes/boxes3d_ext.rs | 82 + .../re_sdk_types/src/archetypes/capsules3d.rs | 800 + .../src/archetypes/capsules3d_ext.rs | 102 + .../src/archetypes/coordinate_frame.rs | 274 + .../src/archetypes/cylinders3d.rs | 795 + .../src/archetypes/cylinders3d_ext.rs | 16 + .../src/archetypes/depth_image.rs | 759 + .../src/archetypes/depth_image_ext.rs | 91 + .../re_sdk_types/src/archetypes/ellipses2d.rs | 638 + .../src/archetypes/ellipses2d_ext.rs | 19 + .../src/archetypes/ellipsoids3d.rs | 756 + .../src/archetypes/ellipsoids3d_ext.rs | 41 + .../src/archetypes/encoded_depth_image.rs | 714 + .../src/archetypes/encoded_depth_image_ext.rs | 33 + .../src/archetypes/encoded_image.rs | 519 + .../src/archetypes/encoded_image_ext.rs | 33 + .../src/archetypes/geo_line_strings.rs | 356 + .../src/archetypes/geo_line_strings_ext.rs | 11 + .../re_sdk_types/src/archetypes/geo_points.rs | 394 + .../src/archetypes/geo_points_ext.rs | 11 + .../src/archetypes/graph_edges.rs | 304 + .../src/archetypes/graph_edges_ext.rs | 15 + .../src/archetypes/graph_nodes.rs | 500 + .../re_sdk_types/src/archetypes/grid_map.rs | 780 + .../re_sdk_types/src/archetypes/image.rs | 597 + .../re_sdk_types/src/archetypes/image_ext.rs | 165 + .../src/archetypes/instance_poses3d.rs | 486 + .../src/archetypes/line_strips2d.rs | 612 + .../src/archetypes/line_strips3d.rs | 563 + .../src/archetypes/mcap_channel.rs | 442 + .../src/archetypes/mcap_message.rs | 228 + .../src/archetypes/mcap_schema.rs | 439 + .../src/archetypes/mcap_statistics.rs | 783 + .../re_sdk_types/src/archetypes/mesh3d.rs | 859 + .../re_sdk_types/src/archetypes/mesh3d_ext.rs | 106 + .../store/re_sdk_types/src/archetypes/mod.rs | 127 + .../re_sdk_types/src/archetypes/pinhole.rs | 852 + .../src/archetypes/pinhole_ext.rs | 110 + .../re_sdk_types/src/archetypes/points2d.rs | 683 + .../re_sdk_types/src/archetypes/points3d.rs | 781 + .../src/archetypes/points3d_ext.rs | 516 + .../src/archetypes/recording_info.rs | 276 + .../re_sdk_types/src/archetypes/scalars.rs | 268 + .../src/archetypes/scalars_ext.rs | 6 + .../src/archetypes/segmentation_image.rs | 459 + .../src/archetypes/segmentation_image_ext.rs | 37 + .../src/archetypes/series_lines.rs | 584 + .../src/archetypes/series_points.rs | 487 + .../src/archetypes/state_change.rs | 256 + .../src/archetypes/state_configuration.rs | 422 + .../re_sdk_types/src/archetypes/tensor.rs | 324 + .../re_sdk_types/src/archetypes/tensor_ext.rs | 78 + .../src/archetypes/text_document.rs | 355 + .../src/archetypes/text_document_ext.rs | 52 + .../re_sdk_types/src/archetypes/text_log.rs | 370 + .../src/archetypes/transform3d.rs | 941 + .../src/archetypes/transform3d_ext.rs | 107 + .../src/archetypes/transform_axes3d.rs | 346 + .../src/archetypes/video_frame_reference.rs | 559 + .../src/archetypes/video_stream.rs | 537 + .../src/archetypes/view_coordinates.rs | 252 + .../src/archetypes/view_coordinates_ext.rs | 144 + .../src/archetypes/voxel_grid_map.rs | 819 + .../src/blueprint/archetypes/.gitattributes | 41 + .../archetypes/active_visualizers.rs | 182 + .../src/blueprint/archetypes/background.rs | 201 + .../archetypes/container_blueprint.rs | 490 + .../blueprint/archetypes/dataframe_query.rs | 447 + .../blueprint/archetypes/entity_behavior.rs | 231 + .../blueprint/archetypes/eye_controls3d.rs | 443 + .../src/blueprint/archetypes/force_center.rs | 213 + .../archetypes/force_collision_radius.rs | 264 + .../src/blueprint/archetypes/force_link.rs | 264 + .../blueprint/archetypes/force_many_body.rs | 221 + .../blueprint/archetypes/force_position.rs | 255 + .../blueprint/archetypes/graph_background.rs | 156 + .../src/blueprint/archetypes/line_grid3d.rs | 349 + .../blueprint/archetypes/map_background.rs | 165 + .../src/blueprint/archetypes/map_zoom.rs | 162 + .../src/blueprint/archetypes/mod.rs | 78 + .../blueprint/archetypes/near_clip_plane.rs | 173 + .../blueprint/archetypes/panel_blueprint.rs | 159 + .../blueprint/archetypes/plot_background.rs | 208 + .../src/blueprint/archetypes/plot_legend.rs | 214 + .../src/blueprint/archetypes/scalar_axis.rs | 212 + .../archetypes/spatial_information.rs | 265 + .../blueprint/archetypes/table_blueprint.rs | 349 + .../archetypes/tensor_scalar_mapping.rs | 266 + .../archetypes/tensor_slice_selection.rs | 314 + .../blueprint/archetypes/tensor_view_fit.rs | 159 + .../archetypes/text_document_format.rs | 226 + .../blueprint/archetypes/text_log_columns.rs | 230 + .../blueprint/archetypes/text_log_format.rs | 170 + .../src/blueprint/archetypes/text_log_rows.rs | 172 + .../src/blueprint/archetypes/time_axis.rs | 259 + .../archetypes/time_panel_blueprint.rs | 425 + .../blueprint/archetypes/view_blueprint.rs | 316 + .../src/blueprint/archetypes/view_contents.rs | 204 + .../blueprint/archetypes/view_contents_ext.rs | 39 + .../archetypes/viewport_blueprint.rs | 375 + .../archetypes/visible_time_ranges.rs | 175 + .../blueprint/archetypes/visual_bounds2d.rs | 171 + .../archetypes/visualizer_instruction.rs | 219 + .../src/blueprint/components/.gitattributes | 58 + .../components/absolute_time_range.rs | 75 + .../src/blueprint/components/active_tab.rs | 79 + .../src/blueprint/components/angular_speed.rs | 77 + .../blueprint/components/apply_latest_at.rs | 77 + .../src/blueprint/components/auto_layout.rs | 75 + .../blueprint/components/auto_layout_ext.rs | 9 + .../src/blueprint/components/auto_scroll.rs | 77 + .../src/blueprint/components/auto_views.rs | 77 + .../blueprint/components/background_kind.rs | 167 + .../src/blueprint/components/column_name.rs | 75 + .../src/blueprint/components/column_order.rs | 223 + .../src/blueprint/components/column_share.rs | 77 + .../components/component_column_selector.rs | 79 + .../component_column_selector_ext.rs | 8 + .../blueprint/components/container_kind.rs | 164 + .../src/blueprint/components/corner2d.rs | 169 + .../src/blueprint/components/corner2d_ext.rs | 34 + .../src/blueprint/components/enabled.rs | 77 + .../src/blueprint/components/enabled_ext.rs | 8 + .../src/blueprint/components/eye3d_kind.rs | 168 + .../blueprint/components/filter_by_range.rs | 75 + .../components/filter_by_range_ext.rs | 19 + .../components/filter_is_not_null.rs | 75 + .../components/filter_is_not_null_ext.rs | 33 + .../blueprint/components/force_distance.rs | 77 + .../blueprint/components/force_iterations.rs | 77 + .../blueprint/components/force_strength.rs | 77 + .../src/blueprint/components/fps.rs | 75 + .../src/blueprint/components/grid_columns.rs | 77 + .../src/blueprint/components/grid_spacing.rs | 77 + .../blueprint/components/grid_spacing_ext.rs | 9 + .../blueprint/components/included_content.rs | 80 + .../src/blueprint/components/link_axis.rs | 154 + .../components/lock_range_during_zoom.rs | 79 + .../src/blueprint/components/loop_mode.rs | 161 + .../src/blueprint/components/map_provider.rs | 175 + .../src/blueprint/components/mod.rs | 127 + .../blueprint/components/near_clip_plane.rs | 80 + .../components/near_clip_plane_ext.rs | 11 + .../src/blueprint/components/panel_state.rs | 159 + .../blueprint/components/panel_state_ext.rs | 24 + .../src/blueprint/components/play_state.rs | 159 + .../blueprint/components/playback_speed.rs | 78 + .../blueprint/components/query_expression.rs | 84 + .../blueprint/components/root_container.rs | 77 + .../src/blueprint/components/row_share.rs | 77 + .../blueprint/components/selected_columns.rs | 75 + .../tensor_dimension_index_slider.rs | 79 + .../tensor_dimension_index_slider_ext.rs | 9 + .../blueprint/components/text_log_column.rs | 78 + .../src/blueprint/components/time_int.rs | 75 + .../src/blueprint/components/time_range.rs | 75 + .../blueprint/components/timeline_column.rs | 78 + .../src/blueprint/components/timeline_name.rs | 75 + .../blueprint/components/timeline_name_ext.rs | 40 + .../src/blueprint/components/view_class.rs | 75 + .../blueprint/components/view_class_ext.rs | 8 + .../src/blueprint/components/view_fit.rs | 163 + .../blueprint/components/view_maximized.rs | 74 + .../src/blueprint/components/view_origin.rs | 75 + .../blueprint/components/view_origin_ext.rs | 10 + .../components/viewer_recommendation_hash.rs | 77 + .../viewer_recommendation_hash_ext.rs | 19 + .../components/visible_time_range.rs | 77 + .../blueprint/components/visual_bounds2d.rs | 80 + .../components/visual_bounds2d_ext.rs | 20 + .../visualizer_component_mapping.rs | 81 + .../components/visualizer_instruction_id.rs | 83 + .../visualizer_instruction_id_ext.rs | 36 + .../blueprint/components/visualizer_type.rs | 77 + .../src/blueprint/components/zoom_level.rs | 77 + .../src/blueprint/datatypes/.gitattributes | 14 + .../datatypes/component_column_selector.rs | 338 + .../component_column_selector_ext.rs | 26 + .../datatypes/component_source_kind.rs | 171 + .../blueprint/datatypes/filter_by_range.rs | 225 + .../blueprint/datatypes/filter_is_not_null.rs | 216 + .../src/blueprint/datatypes/mod.rs | 28 + .../blueprint/datatypes/selected_columns.rs | 459 + .../tensor_dimension_index_slider.rs | 184 + .../blueprint/datatypes/text_log_column.rs | 216 + .../datatypes/text_log_column_ext.rs | 11 + .../datatypes/text_log_column_kind.rs | 152 + .../datatypes/text_log_column_kind_ext.rs | 12 + .../blueprint/datatypes/timeline_column.rs | 273 + .../datatypes/timeline_column_ext.rs | 11 + .../datatypes/visualizer_component_mapping.rs | 475 + .../visualizer_component_mapping_ext.rs | 97 + .../store/re_sdk_types/src/blueprint/mod.rs | 11 + .../src/blueprint/views/.gitattributes | 15 + .../src/blueprint/views/bar_chart_view.rs | 45 + .../src/blueprint/views/dataframe_view.rs | 75 + .../src/blueprint/views/graph_view.rs | 62 + .../src/blueprint/views/map_view.rs | 45 + .../re_sdk_types/src/blueprint/views/mod.rs | 25 + .../src/blueprint/views/spatial2d_view.rs | 54 + .../src/blueprint/views/spatial3d_view.rs | 57 + .../blueprint/views/state_timeline_view.rs | 39 + .../src/blueprint/views/tensor_view.rs | 48 + .../src/blueprint/views/text_document_view.rs | 73 + .../src/blueprint/views/text_log_view.rs | 48 + .../src/blueprint/views/time_series_view.rs | 57 + .../re_sdk_types/src/colormap_category.rs | 67 + .../src/components/.gitattributes | 87 + .../src/components/aggregation_policy.rs | 191 + .../src/components/albedo_factor.rs | 85 + .../src/components/albedo_factor_ext.rs | 9 + .../src/components/annotation_context.rs | 179 + .../src/components/axis_length.rs | 73 + .../src/components/axis_length_ext.rs | 15 + .../store/re_sdk_types/src/components/blob.rs | 75 + .../re_sdk_types/src/components/cell_size.rs | 84 + .../re_sdk_types/src/components/channel_id.rs | 75 + .../src/components/channel_message_counts.rs | 175 + .../re_sdk_types/src/components/class_id.rs | 88 + .../src/components/class_id_ext.rs | 15 + .../re_sdk_types/src/components/color.rs | 87 + .../re_sdk_types/src/components/color_ext.rs | 82 + .../re_sdk_types/src/components/colormap.rs | 275 + .../src/components/colormap_ext.rs | 9 + .../re_sdk_types/src/components/count.rs | 77 + .../src/components/depth_meter.rs | 91 + .../src/components/depth_meter_ext.rs | 8 + .../re_sdk_types/src/components/draw_order.rs | 78 + .../src/components/draw_order_ext.rs | 65 + .../src/components/entity_path.rs | 73 + .../re_sdk_types/src/components/fill_mode.rs | 193 + .../src/components/fill_mode_ext.rs | 29 + .../re_sdk_types/src/components/fill_ratio.rs | 87 + .../src/components/fill_ratio_ext.rs | 8 + .../src/components/gamma_correction.rs | 88 + .../src/components/gamma_correction_ext.rs | 8 + .../src/components/geo_line_string.rs | 248 + .../src/components/geo_line_string_ext.rs | 12 + .../re_sdk_types/src/components/graph_edge.rs | 73 + .../re_sdk_types/src/components/graph_node.rs | 75 + .../src/components/graph_node_ext.rs | 16 + .../re_sdk_types/src/components/graph_type.rs | 154 + .../src/components/half_size2d.rs | 80 + .../src/components/half_size2d_ext.rs | 72 + .../src/components/half_size3d.rs | 80 + .../src/components/half_size3d_ext.rs | 77 + .../src/components/image_buffer.rs | 75 + .../src/components/image_buffer_ext.rs | 96 + .../src/components/image_format.rs | 73 + .../src/components/image_format_ext.rs | 80 + .../src/components/image_plane_distance.rs | 74 + .../components/image_plane_distance_ext.rs | 15 + .../src/components/interactive.rs | 75 + .../src/components/interactive_ext.rs | 8 + .../src/components/interpolation_mode.rs | 181 + .../src/components/is_keyframe.rs | 79 + .../src/components/key_value_pairs.rs | 174 + .../src/components/keypoint_id.rs | 91 + .../src/components/keypoint_id_ext.rs | 8 + .../re_sdk_types/src/components/lat_lon.rs | 82 + .../src/components/lat_lon_ext.rs | 24 + .../re_sdk_types/src/components/length.rs | 85 + .../re_sdk_types/src/components/length_ext.rs | 10 + .../src/components/line_strip2d.rs | 258 + .../src/components/line_strip2d_ext.rs | 12 + .../src/components/line_strip3d.rs | 258 + .../src/components/line_strip3d_ext.rs | 12 + .../src/components/linear_speed.rs | 75 + .../src/components/magnification_filter.rs | 176 + .../components/magnification_filter_ext.rs | 21 + .../src/components/marker_shape.rs | 205 + .../src/components/marker_shape_ext.rs | 40 + .../src/components/marker_size.rs | 82 + .../src/components/marker_size_ext.rs | 8 + .../re_sdk_types/src/components/media_type.rs | 76 + .../src/components/media_type_ext.rs | 446 + .../src/components/mesh_face_rendering.rs | 170 + .../store/re_sdk_types/src/components/mod.rs | 227 + .../store/re_sdk_types/src/components/name.rs | 73 + .../re_sdk_types/src/components/name_ext.rs | 46 + .../re_sdk_types/src/components/opacity.rs | 85 + .../src/components/opacity_ext.rs | 8 + .../src/components/pinhole_projection.rs | 82 + .../src/components/pinhole_projection_ext.rs | 98 + .../re_sdk_types/src/components/plane3d.rs | 83 + .../src/components/plane3d_ext.rs | 32 + .../src/components/point_shading.rs | 154 + .../re_sdk_types/src/components/position2d.rs | 82 + .../src/components/position2d_ext.rs | 62 + .../re_sdk_types/src/components/position3d.rs | 82 + .../src/components/position3d_ext.rs | 61 + .../re_sdk_types/src/components/radius.rs | 89 + .../re_sdk_types/src/components/radius_ext.rs | 93 + .../re_sdk_types/src/components/range1d.rs | 75 + .../src/components/range1d_ext.rs | 60 + .../re_sdk_types/src/components/resolution.rs | 74 + .../src/components/resolution_ext.rs | 25 + .../src/components/rotation_axis_angle.rs | 76 + .../src/components/rotation_axis_angle_ext.rs | 26 + .../src/components/rotation_quat.rs | 86 + .../src/components/rotation_quat_ext.rs | 22 + .../re_sdk_types/src/components/scalar.rs | 84 + .../re_sdk_types/src/components/scalar_ext.rs | 16 + .../re_sdk_types/src/components/scale3d.rs | 79 + .../src/components/scale3d_ext.rs | 35 + .../re_sdk_types/src/components/schema_id.rs | 73 + .../src/components/show_labels.rs | 79 + .../src/components/show_labels_ext.rs | 8 + .../src/components/stroke_width.rs | 82 + .../src/components/stroke_width_ext.rs | 10 + .../src/components/tensor_data.rs | 80 + .../tensor_dimension_index_selection.rs | 77 + .../tensor_dimension_index_selection_ext.rs | 9 + .../src/components/tensor_height_dimension.rs | 73 + .../src/components/tensor_width_dimension.rs | 73 + .../re_sdk_types/src/components/texcoord2d.rs | 97 + .../src/components/texcoord2d_ext.rs | 57 + .../store/re_sdk_types/src/components/text.rs | 73 + .../re_sdk_types/src/components/text_ext.rs | 30 + .../src/components/text_log_level.rs | 81 + .../src/components/text_log_level_ext.rs | 55 + .../re_sdk_types/src/components/timestamp.rs | 75 + .../src/components/timestamp_ext.rs | 9 + .../src/components/transform_frame_id.rs | 81 + .../src/components/transform_frame_id_ext.rs | 79 + .../src/components/transform_mat3x3.rs | 94 + .../src/components/transform_mat3x3_ext.rs | 15 + .../src/components/transform_relation.rs | 166 + .../src/components/translation3d.rs | 82 + .../src/components/translation3d_ext.rs | 44 + .../src/components/triangle_indices.rs | 75 + .../src/components/triangle_indices_ext.rs | 27 + .../src/components/value_range.rs | 77 + .../src/components/value_range_ext.rs | 49 + .../re_sdk_types/src/components/vector2d.rs | 82 + .../src/components/vector2d_ext.rs | 25 + .../re_sdk_types/src/components/vector3d.rs | 82 + .../src/components/vector3d_ext.rs | 29 + .../src/components/video_codec.rs | 228 + .../src/components/video_codec_ext.rs | 58 + .../src/components/video_sample.rs | 78 + .../src/components/video_timestamp.rs | 73 + .../src/components/video_timestamp_ext.rs | 21 + .../src/components/view_coordinates.rs | 97 + .../src/components/view_coordinates_ext.rs | 408 + .../re_sdk_types/src/components/visible.rs | 73 + .../src/components/visible_ext.rs | 10 + .../src/components/voxel_index.rs | 85 + .../re_sdk_types/src/components/voxel_size.rs | 78 + .../src/components/voxel_value.rs | 82 + .../re_sdk_types/src/datatypes/.gitattributes | 41 + .../store/re_sdk_types/src/datatypes/angle.rs | 158 + .../re_sdk_types/src/datatypes/angle_ext.rs | 43 + .../src/datatypes/annotation_info.rs | 309 + .../src/datatypes/annotation_info_ext.rs | 31 + .../store/re_sdk_types/src/datatypes/blob.rs | 179 + .../re_sdk_types/src/datatypes/blob_ext.rs | 258 + .../src/datatypes/channel_count_pair.rs | 235 + .../src/datatypes/channel_datatype.rs | 217 + .../src/datatypes/channel_datatype_ext.rs | 88 + .../src/datatypes/class_description.rs | 450 + .../src/datatypes/class_description_ext.rs | 28 + .../datatypes/class_description_map_elem.rs | 227 + .../class_description_map_elem_ext.rs | 31 + .../re_sdk_types/src/datatypes/class_id.rs | 155 + .../src/datatypes/class_id_ext.rs | 8 + .../re_sdk_types/src/datatypes/color_model.rs | 168 + .../src/datatypes/color_model_ext.rs | 24 + .../re_sdk_types/src/datatypes/dvec2d.rs | 235 + .../re_sdk_types/src/datatypes/dvec2d_ext.rs | 103 + .../src/datatypes/image_format.rs | 364 + .../src/datatypes/image_format_ext.rs | 162 + .../re_sdk_types/src/datatypes/ivec3d.rs | 237 + .../re_sdk_types/src/datatypes/ivec3d_ext.rs | 98 + .../re_sdk_types/src/datatypes/keypoint_id.rs | 157 + .../src/datatypes/keypoint_id_ext.rs | 8 + .../src/datatypes/keypoint_pair.rs | 233 + .../src/datatypes/keypoint_pair_ext.rs | 26 + .../re_sdk_types/src/datatypes/mat3x3.rs | 247 + .../re_sdk_types/src/datatypes/mat3x3_ext.rs | 132 + .../re_sdk_types/src/datatypes/mat4x4.rs | 238 + .../re_sdk_types/src/datatypes/mat4x4_ext.rs | 107 + .../store/re_sdk_types/src/datatypes/mod.rs | 112 + .../src/datatypes/pixel_format.rs | 298 + .../src/datatypes/pixel_format_ext.rs | 221 + .../re_sdk_types/src/datatypes/plane3d.rs | 243 + .../re_sdk_types/src/datatypes/plane3d_ext.rs | 53 + .../re_sdk_types/src/datatypes/quaternion.rs | 238 + .../src/datatypes/quaternion_ext.rs | 73 + .../re_sdk_types/src/datatypes/range1d.rs | 235 + .../re_sdk_types/src/datatypes/range1d_ext.rs | 31 + .../re_sdk_types/src/datatypes/range2d.rs | 395 + .../re_sdk_types/src/datatypes/range2d_ext.rs | 37 + .../re_sdk_types/src/datatypes/rgba32.rs | 154 + .../re_sdk_types/src/datatypes/rgba32_ext.rs | 116 + .../src/datatypes/rotation_axis_angle.rs | 299 + .../src/datatypes/rotation_axis_angle_ext.rs | 60 + .../src/datatypes/tensor_buffer.rs | 1605 ++ .../src/datatypes/tensor_buffer_ext.rs | 61 + .../re_sdk_types/src/datatypes/tensor_data.rs | 477 + .../src/datatypes/tensor_data_ext.rs | 412 + .../tensor_dimension_index_selection.rs | 221 + .../datatypes/tensor_dimension_selection.rs | 217 + .../tensor_dimension_selection_ext.rs | 11 + .../re_sdk_types/src/datatypes/utf8pair.rs | 301 + .../src/datatypes/utf8pair_ext.rs | 21 + .../store/re_sdk_types/src/datatypes/uuid.rs | 237 + .../re_sdk_types/src/datatypes/uuid_ext.rs | 46 + .../re_sdk_types/src/datatypes/uvec2d.rs | 237 + .../re_sdk_types/src/datatypes/uvec2d_ext.rs | 102 + .../re_sdk_types/src/datatypes/uvec3d.rs | 237 + .../re_sdk_types/src/datatypes/uvec3d_ext.rs | 98 + .../re_sdk_types/src/datatypes/uvec4d.rs | 237 + .../re_sdk_types/src/datatypes/uvec4d_ext.rs | 112 + .../store/re_sdk_types/src/datatypes/vec2d.rs | 235 + .../re_sdk_types/src/datatypes/vec2d_ext.rs | 117 + .../store/re_sdk_types/src/datatypes/vec3d.rs | 235 + .../re_sdk_types/src/datatypes/vec3d_ext.rs | 157 + .../store/re_sdk_types/src/datatypes/vec4d.rs | 235 + .../re_sdk_types/src/datatypes/vec4d_ext.rs | 140 + .../src/datatypes/video_timestamp.rs | 146 + .../src/datatypes/video_timestamp_ext.rs | 21 + .../src/datatypes/view_coordinates.rs | 250 + .../src/datatypes/view_coordinates_ext.rs | 17 + crates/store/re_sdk_types/src/image.rs | 434 + crates/store/re_sdk_types/src/lib.rs | 314 + .../src/reflection/.gitattributes | 4 + .../store/re_sdk_types/src/reflection/mod.rs | 5058 +++++ crates/store/re_sdk_types/src/rotation3d.rs | 54 + crates/store/re_sdk_types/src/tensor_data.rs | 494 + .../src/testing/archetypes/.gitattributes | 8 + .../src/testing/archetypes/affix_fuzzer1.rs | 1382 ++ .../src/testing/archetypes/affix_fuzzer2.rs | 970 + .../src/testing/archetypes/affix_fuzzer3.rs | 1143 ++ .../src/testing/archetypes/affix_fuzzer4.rs | 909 + .../src/testing/archetypes/mod.rs | 11 + .../src/testing/components/.gitattributes | 27 + .../src/testing/components/affix_fuzzer1.rs | 71 + .../src/testing/components/affix_fuzzer10.rs | 170 + .../src/testing/components/affix_fuzzer11.rs | 190 + .../src/testing/components/affix_fuzzer12.rs | 237 + .../src/testing/components/affix_fuzzer13.rs | 237 + .../src/testing/components/affix_fuzzer14.rs | 71 + .../src/testing/components/affix_fuzzer15.rs | 149 + .../src/testing/components/affix_fuzzer16.rs | 169 + .../src/testing/components/affix_fuzzer17.rs | 169 + .../src/testing/components/affix_fuzzer18.rs | 169 + .../src/testing/components/affix_fuzzer19.rs | 71 + .../src/testing/components/affix_fuzzer2.rs | 71 + .../src/testing/components/affix_fuzzer20.rs | 71 + .../src/testing/components/affix_fuzzer21.rs | 71 + .../src/testing/components/affix_fuzzer22.rs | 128 + .../src/testing/components/affix_fuzzer23.rs | 132 + .../src/testing/components/affix_fuzzer3.rs | 71 + .../src/testing/components/affix_fuzzer4.rs | 159 + .../src/testing/components/affix_fuzzer5.rs | 159 + .../src/testing/components/affix_fuzzer6.rs | 159 + .../src/testing/components/affix_fuzzer7.rs | 167 + .../src/testing/components/affix_fuzzer8.rs | 132 + .../src/testing/components/affix_fuzzer9.rs | 170 + .../src/testing/components/mod.rs | 49 + .../src/testing/datatypes/.gitattributes | 18 + .../src/testing/datatypes/affix_fuzzer1.rs | 1059 ++ .../src/testing/datatypes/affix_fuzzer2.rs | 109 + .../src/testing/datatypes/affix_fuzzer20.rs | 266 + .../src/testing/datatypes/affix_fuzzer21.rs | 291 + .../src/testing/datatypes/affix_fuzzer22.rs | 268 + .../src/testing/datatypes/affix_fuzzer3.rs | 539 + .../testing/datatypes/affix_fuzzer3_ext.rs | 6 + .../src/testing/datatypes/affix_fuzzer4.rs | 359 + .../testing/datatypes/affix_fuzzer4_ext.rs | 6 + .../src/testing/datatypes/affix_fuzzer5.rs | 187 + .../src/testing/datatypes/enum_test.rs | 174 + .../src/testing/datatypes/flattened_scalar.rs | 174 + .../re_sdk_types/src/testing/datatypes/mod.rs | 33 + .../src/testing/datatypes/multi_enum.rs | 205 + .../testing/datatypes/primitive_component.rs | 138 + .../src/testing/datatypes/string_component.rs | 148 + .../src/testing/datatypes/valued_enum.rs | 160 + crates/store/re_sdk_types/src/testing/mod.rs | 42 + .../src/transform_frame_id_hash.rs | 201 + .../re_sdk_types/src/view_coordinates.rs | 245 + crates/store/re_sdk_types/src/visualizer.rs | 60 + .../tests/types/annotation_context.rs | 29 + .../re_sdk_types/tests/types/arrows3d.rs | 62 + .../store/re_sdk_types/tests/types/asset3d.rs | 33 + .../store/re_sdk_types/tests/types/box2d.rs | 92 + .../store/re_sdk_types/tests/types/box3d.rs | 106 + .../store/re_sdk_types/tests/types/clear.rs | 37 + .../re_sdk_types/tests/types/depth_image.rs | 61 + .../tests/types/dynamic_archetype.rs | 39 + .../store/re_sdk_types/tests/types/fuzzy.rs | 332 + .../store/re_sdk_types/tests/types/image.rs | 62 + .../re_sdk_types/tests/types/line_strips2d.rs | 61 + .../re_sdk_types/tests/types/line_strips3d.rs | 58 + crates/store/re_sdk_types/tests/types/main.rs | 32 + .../store/re_sdk_types/tests/types/mesh3d.rs | 74 + .../tests/types/mint_conversions.rs | 173 + .../re_sdk_types/tests/types/points2d.rs | 64 + .../re_sdk_types/tests/types/points3d.rs | 61 + .../tests/types/segmentation_image.rs | 43 + .../store/re_sdk_types/tests/types/tensor.rs | 240 + .../re_sdk_types/tests/types/text_document.rs | 30 + .../re_sdk_types/tests/types/transform3d.rs | 93 + .../re_sdk_types/tests/types/validity.rs | 37 + .../tests/types/view_coordinates.rs | 86 + .../tests/types/voxel_grid_map.rs | 62 + crates/store/re_server/Cargo.toml | 138 + crates/store/re_server/README.md | 16 + crates/store/re_server/build.rs | 3 + crates/store/re_server/src/entrypoint.rs | 202 + .../store/re_server/src/layers/bandwidth.rs | 146 + crates/store/re_server/src/layers/error.rs | 128 + crates/store/re_server/src/layers/latency.rs | 67 + crates/store/re_server/src/layers/mod.rs | 8 + crates/store/re_server/src/lib.rs | 31 + crates/store/re_server/src/named_path.rs | 35 + crates/store/re_server/src/opfs.rs | 314 + crates/store/re_server/src/rerun_cloud/mod.rs | 2391 +++ .../src/rerun_cloud/register_with_dataset.rs | 470 + crates/store/re_server/src/server.rs | 314 + crates/store/re_server/src/store/chunk_key.rs | 20 + crates/store/re_server/src/store/dataset.rs | 701 + crates/store/re_server/src/store/error.rs | 136 + .../re_server/src/store/in_memory_store.rs | 815 + .../store/re_server/src/store/layer_info.rs | 4 + crates/store/re_server/src/store/mod.rs | 25 + .../re_server/src/store/resolved_store.rs | 308 + crates/store/re_server/src/store/segment.rs | 140 + crates/store/re_server/src/store/source.rs | 515 + .../store/re_server/src/store/store_pool.rs | 152 + crates/store/re_server/src/store/table.rs | 322 + .../re_server/src/store/task_registry.rs | 56 + crates/store/re_server/src/store/tracked.rs | 82 + crates/store/re_server/tests/memory_url.rs | 193 + crates/store/re_server/tests/opfs.rs | 185 + crates/store/re_server/tests/redap_tests.rs | 45 + crates/store/re_sorbet/Cargo.toml | 40 + crates/store/re_sorbet/README.md | 12 + crates/store/re_sorbet/src/chunk_batch.rs | 179 + crates/store/re_sorbet/src/chunk_columns.rs | 174 + crates/store/re_sorbet/src/chunk_schema.rs | 153 + .../store/re_sorbet/src/column_descriptor.rs | 200 + .../re_sorbet/src/column_descriptor_ref.rs | 74 + crates/store/re_sorbet/src/column_kind.rs | 61 + .../src/component_column_descriptor.rs | 359 + .../re_sorbet/src/dataframe_to_chunks.rs | 1323 ++ crates/store/re_sorbet/src/error.rs | 45 + .../re_sorbet/src/index_column_descriptor.rs | 165 + crates/store/re_sorbet/src/ipc.rs | 26 + crates/store/re_sorbet/src/lib.rs | 107 + crates/store/re_sorbet/src/metadata.rs | 90 + .../src/migrations/make_list_arrays.rs | 61 + crates/store/re_sorbet/src/migrations/mod.rs | 167 + .../src/migrations/v0_0_1__to__v0_0_2.rs | 318 + .../src/migrations/v0_0_2__to__v0_1_0.rs | 250 + .../src/migrations/v0_1_0__to__v0_1_1.rs | 88 + .../src/migrations/v0_1_1__to__v0_1_2.rs | 197 + .../src/migrations/v0_1_2__to__v0_1_3.rs | 72 + .../re_sorbet/src/row_id_column_descriptor.rs | 85 + crates/store/re_sorbet/src/schema_builder.rs | 121 + crates/store/re_sorbet/src/selectors.rs | 207 + crates/store/re_sorbet/src/sorbet_batch.rs | 333 + crates/store/re_sorbet/src/sorbet_columns.rs | 172 + crates/store/re_sorbet/src/sorbet_schema.rs | 254 + .../store/re_sorbet/src/timestamp_metadata.rs | 162 + crates/store/re_tf/Cargo.toml | 53 + crates/store/re_tf/README.md | 17 + .../transform_resolution_cache_bench.rs | 149 + crates/store/re_tf/src/convert.rs | 69 + crates/store/re_tf/src/frame_id_registry.rs | 297 + crates/store/re_tf/src/lib.rs | 165 + ...ty_hierarchy__transform_from_to__root.snap | 206 + ...ity_hierarchy__transform_from_to__top.snap | 206 + ...y__transform_from_to__top_nonexistent.snap | 62 + ...archy__transform_from_to__top_pinhole.snap | 185 + ...ransform_from_to__top_pinhole_child2d.snap | 185 + ...nsform_from_to__top_pure_leaf_pinhole.snap | 164 + ...frame_hierarchy__all_on_single_entity.snap | 222 + ...le_frame_hierarchy__multiple_entities.snap | 330 + crates/store/re_tf/src/transform_aspect.rs | 48 + crates/store/re_tf/src/transform_forest.rs | 1489 ++ crates/store/re_tf/src/transform_queries.rs | 563 + .../src/transform_resolution_cache/cache.rs | 429 + .../cached_transform_value.rs | 74 + .../cached_transforms_for_timeline.rs | 554 + .../src/transform_resolution_cache/mod.rs | 249 + .../parent_from_child_transform.rs | 13 + .../pose_transform_for_entity.rs | 136 + .../resolved_pinhole_projection.rs | 37 + .../src/transform_resolution_cache/tests.rs | 2317 +++ .../transform_cache_snapshot.rs | 297 + .../transforms_for_child_frame_events.rs | 76 + .../tree_transforms_for_child_frame.rs | 342 + crates/store/re_types/Cargo.toml | 19 + crates/store/re_types/src/lib.rs | 4 + crates/store/re_types_core/.gitattributes | 129 + crates/store/re_types_core/Cargo.toml | 60 + crates/store/re_types_core/README.md | 10 + .../store/re_types_core/benches/bench_tuid.rs | 42 + crates/store/re_types_core/src/archetype.rs | 187 + .../src/archetypes/.gitattributes | 5 + .../re_types_core/src/archetypes/clear.rs | 271 + .../re_types_core/src/archetypes/clear_ext.rs | 20 + .../store/re_types_core/src/archetypes/mod.rs | 6 + .../store/re_types_core/src/arrow_helpers.rs | 6 + .../store/re_types_core/src/arrow_string.rs | 148 + .../re_types_core/src/arrow_zip_validity.rs | 207 + .../store/re_types_core/src/as_components.rs | 426 + crates/store/re_types_core/src/chunk_id.rs | 185 + .../re_types_core/src/component_batch.rs | 407 + .../re_types_core/src/component_descriptor.rs | 186 + .../src/components/.gitattributes | 5 + .../src/components/clear_is_recursive.rs | 75 + .../src/components/clear_is_recursive_ext.rs | 10 + .../store/re_types_core/src/components/mod.rs | 6 + .../src/datatypes/.gitattributes | 17 + .../src/datatypes/absolute_time_range.rs | 212 + .../store/re_types_core/src/datatypes/bool.rs | 113 + .../re_types_core/src/datatypes/bool_ext.rs | 17 + .../src/datatypes/entity_path.rs | 150 + .../src/datatypes/entity_path_ext.rs | 52 + .../re_types_core/src/datatypes/float32.rs | 149 + .../src/datatypes/float32_ext.rs | 24 + .../re_types_core/src/datatypes/float64.rs | 149 + .../src/datatypes/float64_ext.rs | 80 + .../store/re_types_core/src/datatypes/mod.rs | 40 + .../re_types_core/src/datatypes/time_int.rs | 138 + .../src/datatypes/time_int_ext.rs | 25 + .../re_types_core/src/datatypes/time_range.rs | 204 + .../src/datatypes/time_range_boundary.rs | 326 + .../src/datatypes/time_range_boundary_ext.rs | 24 + .../src/datatypes/time_range_ext.rs | 31 + .../re_types_core/src/datatypes/uint16.rs | 140 + .../re_types_core/src/datatypes/uint32.rs | 140 + .../re_types_core/src/datatypes/uint32_ext.rs | 17 + .../re_types_core/src/datatypes/uint64.rs | 140 + .../re_types_core/src/datatypes/uint64_ext.rs | 17 + .../store/re_types_core/src/datatypes/utf8.rs | 148 + .../re_types_core/src/datatypes/utf8_ext.rs | 67 + .../src/datatypes/visible_time_range.rs | 260 + .../src/datatypes/visible_time_range_ext.rs | 11 + .../re_types_core/src/dynamic_archetype.rs | 105 + crates/store/re_types_core/src/layer_name.rs | 135 + crates/store/re_types_core/src/lib.rs | 190 + crates/store/re_types_core/src/loggable.rs | 190 + crates/store/re_types_core/src/macros.rs | 19 + crates/store/re_types_core/src/reflection.rs | 546 + crates/store/re_types_core/src/result.rs | 373 + crates/store/re_types_core/src/row_id.rs | 207 + crates/store/re_types_core/src/segment_id.rs | 92 + .../store/re_types_core/src/timeline_name.rs | 28 + crates/store/re_types_core/src/tuid.rs | 136 + crates/store/re_types_core/src/view.rs | 21 + .../re_types_core/src/wrapper_component.rs | 76 + crates/store/re_uri/Cargo.toml | 29 + crates/store/re_uri/README.md | 10 + crates/store/re_uri/src/dataset_hierarchy.rs | 56 + crates/store/re_uri/src/endpoints/catalog.rs | 52 + crates/store/re_uri/src/endpoints/dataset.rs | 193 + crates/store/re_uri/src/endpoints/entry.rs | 37 + crates/store/re_uri/src/endpoints/folder.rs | 71 + crates/store/re_uri/src/endpoints/mod.rs | 5 + crates/store/re_uri/src/endpoints/proxy.rs | 51 + crates/store/re_uri/src/error.rs | 38 + crates/store/re_uri/src/fragment.rs | 285 + crates/store/re_uri/src/lib.rs | 71 + crates/store/re_uri/src/origin.rs | 220 + crates/store/re_uri/src/redap_uri.rs | 603 + crates/store/re_uri/src/scheme.rs | 68 + crates/store/re_uri/src/time_selection.rs | 184 + crates/top/README.md | 1 + crates/top/re_sdk/Cargo.toml | 97 + crates/top/re_sdk/README.md | 12 + crates/top/re_sdk/build.rs | 3 + crates/top/re_sdk/src/binary_stream_sink.rs | 114 + crates/top/re_sdk/src/blueprint/api.rs | 202 + crates/top/re_sdk/src/blueprint/container.rs | 384 + crates/top/re_sdk/src/blueprint/mod.rs | 27 + crates/top/re_sdk/src/blueprint/panel.rs | 181 + crates/top/re_sdk/src/blueprint/view.rs | 568 + crates/top/re_sdk/src/global.rs | 462 + crates/top/re_sdk/src/grpc_server.rs | 108 + crates/top/re_sdk/src/lenses/mod.rs | 19 + crates/top/re_sdk/src/lenses/sink.rs | 89 + crates/top/re_sdk/src/lib.rs | 243 + crates/top/re_sdk/src/log_sink.rs | 622 + crates/top/re_sdk/src/recording_stream.rs | 3566 ++++ ...cording_stream__tests__always_flush-2.snap | 9 + ...cording_stream__tests__always_flush-3.snap | 9 + ...cording_stream__tests__always_flush-4.snap | 9 + ...recording_stream__tests__always_flush.snap | 7 + ...ding_stream__tests__flush_hierarchy-2.snap | 9 + ...ording_stream__tests__flush_hierarchy.snap | 7 + ...ecording_stream__tests__never_flush-2.snap | 9 + ..._recording_stream__tests__never_flush.snap | 7 + crates/top/re_sdk/src/spawn.rs | 445 + crates/top/re_sdk/src/web_viewer.rs | 291 + crates/top/re_sdk/tests/flush.rs | 25 + crates/top/re_sdk/tests/lenses.rs | 4 + crates/top/re_sdk/tests/lenses/operations.rs | 571 + crates/top/re_sdk/tests/lenses/output_mode.rs | 159 + ..._lenses__operations__destructure_cast.snap | 34 + ..._lenses__operations__destructure_only.snap | 34 + ...__lenses__operations__scatter_columns.snap | 31 + ...s__operations__scatter_columns_static.snap | 30 + crates/top/rerun-cli/Cargo.toml | 134 + crates/top/rerun-cli/README.md | 38 + crates/top/rerun-cli/build.rs | 14 + crates/top/rerun-cli/src/bin/rerun.rs | 49 + crates/top/rerun/Cargo.toml | 218 + crates/top/rerun/README.md | 60 + crates/top/rerun/build.rs | 3 + crates/top/rerun/src/clap.rs | 259 + .../top/rerun/src/commands/analytics/mod.rs | 46 + crates/top/rerun/src/commands/auth.rs | 150 + crates/top/rerun/src/commands/download.rs | 271 + crates/top/rerun/src/commands/entrypoint.rs | 1929 ++ crates/top/rerun/src/commands/mcap/info.rs | 311 + crates/top/rerun/src/commands/mcap/mod.rs | 242 + crates/top/rerun/src/commands/mod.rs | 46 + crates/top/rerun/src/commands/rrd/compare.rs | 255 + crates/top/rerun/src/commands/rrd/filter.rs | 215 + .../rerun/src/commands/rrd/merge_optimize.rs | 684 + crates/top/rerun/src/commands/rrd/migrate.rs | 167 + crates/top/rerun/src/commands/rrd/mod.rs | 153 + crates/top/rerun/src/commands/rrd/print.rs | 306 + crates/top/rerun/src/commands/rrd/route.rs | 344 + crates/top/rerun/src/commands/rrd/split.rs | 1084 ++ crates/top/rerun/src/commands/rrd/stats.rs | 649 + crates/top/rerun/src/commands/rrd/verify.rs | 298 + crates/top/rerun/src/commands/stdio.rs | 174 + crates/top/rerun/src/demo_util.rs | 128 + crates/top/rerun/src/lib.rs | 202 + crates/top/rerun/src/log_integration.rs | 136 + crates/top/rerun/src/native_viewer.rs | 50 + crates/top/rerun/src/sdk.rs | 35 + crates/top/rerun/tests/rerun_tests.rs | 29 + crates/top/rerun_c/CMakeLists.txt | 53 + crates/top/rerun_c/Cargo.toml | 52 + crates/top/rerun_c/README.md | 10 + crates/top/rerun_c/build.rs | 3 + crates/top/rerun_c/src/arrow_utils.rs | 31 + .../rerun_c/src/component_type_registry.rs | 55 + crates/top/rerun_c/src/error.rs | 132 + crates/top/rerun_c/src/lib.rs | 1351 ++ crates/top/rerun_c/src/ptr.rs | 59 + crates/top/rerun_c/src/recording_streams.rs | 51 + crates/top/rerun_c/src/video.rs | 77 + crates/utils/README.md | 4 + crates/utils/re_analytics/Cargo.toml | 51 + crates/utils/re_analytics/README.md | 53 + .../utils/re_analytics/examples/end_to_end.rs | 48 + crates/utils/re_analytics/src/cli.rs | 120 + crates/utils/re_analytics/src/event.rs | 671 + crates/utils/re_analytics/src/lib.rs | 554 + .../utils/re_analytics/src/native/config.rs | 127 + crates/utils/re_analytics/src/native/mod.rs | 28 + .../utils/re_analytics/src/native/pipeline.rs | 410 + crates/utils/re_analytics/src/native/sink.rs | 67 + crates/utils/re_analytics/src/posthog.rs | 106 + crates/utils/re_analytics/src/web/config.rs | 98 + crates/utils/re_analytics/src/web/mod.rs | 5 + crates/utils/re_analytics/src/web/pipeline.rs | 84 + crates/utils/re_arrow_util/Cargo.toml | 49 + crates/utils/re_arrow_util/README.md | 10 + crates/utils/re_arrow_util/src/arrays.rs | 977 + crates/utils/re_arrow_util/src/batches.rs | 1291 ++ crates/utils/re_arrow_util/src/compare.rs | 148 + crates/utils/re_arrow_util/src/format.rs | 508 + crates/utils/re_arrow_util/src/lib.rs | 284 + ...arrays__tests__deep_slice_comparisons.snap | 48 + crates/utils/re_arrow_util/src/string_view.rs | 84 + .../re_arrow_util/src/test_extensions.rs | 435 + crates/utils/re_auth/Cargo.toml | 82 + crates/utils/re_auth/README.md | 8 + crates/utils/re_auth/src/callback_server.rs | 223 + crates/utils/re_auth/src/claims.rs | 237 + crates/utils/re_auth/src/cli.rs | 183 + crates/utils/re_auth/src/credentials.rs | 147 + crates/utils/re_auth/src/crypto_provider.rs | 139 + crates/utils/re_auth/src/error.rs | 28 + crates/utils/re_auth/src/lib.rs | 90 + crates/utils/re_auth/src/oauth.rs | 463 + crates/utils/re_auth/src/oauth/api.rs | 479 + crates/utils/re_auth/src/oauth/login_flow.rs | 229 + crates/utils/re_auth/src/oauth/storage.rs | 183 + crates/utils/re_auth/src/provider.rs | 283 + crates/utils/re_auth/src/service/client.rs | 109 + crates/utils/re_auth/src/service/mod.rs | 12 + crates/utils/re_auth/src/service/server.rs | 115 + crates/utils/re_auth/src/status_page.html | 57 + crates/utils/re_auth/src/token.rs | 259 + crates/utils/re_auth/src/wasm_compat.rs | 79 + crates/utils/re_auth/tests/tokens.rs | 62 + crates/utils/re_backoff/Cargo.toml | 41 + crates/utils/re_backoff/README.md | 14 + crates/utils/re_backoff/src/lib.rs | 259 + crates/utils/re_byte_size/Cargo.toml | 45 + crates/utils/re_byte_size/README.md | 10 + crates/utils/re_byte_size/src/arrow_sizes.rs | 156 + .../re_byte_size/src/bookkeeping_btreemap.rs | 447 + crates/utils/re_byte_size/src/egui_sizes.rs | 17 + crates/utils/re_byte_size/src/lib.rs | 54 + .../utils/re_byte_size/src/mem_usage_tree.rs | 155 + .../re_byte_size/src/parking_lot_sizes.rs | 23 + .../utils/re_byte_size/src/primitive_sizes.rs | 84 + .../utils/re_byte_size/src/smallvec_sizes.rs | 28 + crates/utils/re_byte_size/src/std_sizes.rs | 301 + crates/utils/re_byte_size/src/testing.rs | 73 + crates/utils/re_byte_size/src/tuple_sizes.rs | 55 + crates/utils/re_byte_size/tests/derive.rs | 147 + .../snapshots/test_byte_sizes__sizes.snap | 132 + .../re_byte_size/tests/test_byte_sizes.rs | 192 + crates/utils/re_byte_size_derive/Cargo.toml | 31 + crates/utils/re_byte_size_derive/README.md | 10 + crates/utils/re_byte_size_derive/src/lib.rs | 336 + crates/utils/re_capabilities/Cargo.toml | 36 + crates/utils/re_capabilities/README.md | 11 + crates/utils/re_capabilities/src/lib.rs | 19 + .../re_capabilities/src/main_thread_token.rs | 69 + crates/utils/re_case/Cargo.toml | 27 + crates/utils/re_case/README.md | 10 + crates/utils/re_case/src/lib.rs | 282 + crates/utils/re_crash_handler/Cargo.toml | 44 + crates/utils/re_crash_handler/README.md | 10 + crates/utils/re_crash_handler/src/lib.rs | 337 + crates/utils/re_crash_handler/src/sigint.rs | 49 + crates/utils/re_error/Cargo.toml | 22 + crates/utils/re_error/README.md | 10 + crates/utils/re_error/src/lib.rs | 163 + crates/utils/re_format/Cargo.toml | 27 + crates/utils/re_format/README.md | 11 + crates/utils/re_format/src/duration.rs | 336 + crates/utils/re_format/src/lib.rs | 865 + crates/utils/re_format/src/plural.rs | 59 + crates/utils/re_format/src/time.rs | 71 + crates/utils/re_grpc_headers/Cargo.toml | 23 + crates/utils/re_grpc_headers/README.md | 7 + crates/utils/re_grpc_headers/src/lib.rs | 343 + crates/utils/re_log/Cargo.toml | 45 + crates/utils/re_log/README.md | 10 + crates/utils/re_log/src/channel_logger.rs | 95 + crates/utils/re_log/src/debug_assert.rs | 63 + crates/utils/re_log/src/event_visitor.rs | 115 + crates/utils/re_log/src/lib.rs | 380 + crates/utils/re_log/src/result_extensions.rs | 74 + crates/utils/re_log/src/setup.rs | 194 + crates/utils/re_memory/Cargo.toml | 46 + crates/utils/re_memory/README.md | 17 + .../re_memory/src/accounting_allocator.rs | 412 + .../utils/re_memory/src/allocation_tracker.rs | 189 + .../utils/re_memory/src/backtrace_native.rs | 128 + crates/utils/re_memory/src/backtrace_web.rs | 63 + crates/utils/re_memory/src/lib.rs | 125 + crates/utils/re_memory/src/memory_limit.rs | 284 + crates/utils/re_memory/src/memory_use.rs | 83 + .../utils/re_memory/src/peak_memory_stats.rs | 97 + crates/utils/re_memory/src/ram_warner.rs | 74 + crates/utils/re_memory/src/util.rs | 10 + crates/utils/re_mutex/Cargo.toml | 26 + crates/utils/re_mutex/README.md | 10 + crates/utils/re_mutex/src/lib.rs | 366 + crates/utils/re_perf_telemetry/Cargo.toml | 99 + crates/utils/re_perf_telemetry/README.md | 138 + crates/utils/re_perf_telemetry/src/args.rs | 228 + crates/utils/re_perf_telemetry/src/grpc.rs | 961 + crates/utils/re_perf_telemetry/src/lib.rs | 246 + .../re_perf_telemetry/src/memory_telemetry.rs | 16 + .../re_perf_telemetry/src/metrics_server.rs | 105 + .../utils/re_perf_telemetry/src/prometheus.rs | 887 + .../re_perf_telemetry/src/shared_reader.rs | 60 + .../utils/re_perf_telemetry/src/telemetry.rs | 1333 ++ .../re_perf_telemetry/src/trace_id_format.rs | 401 + .../utils/re_perf_telemetry/src/tracestate.rs | 336 + .../re_perf_telemetry/src/tracing_session.rs | 500 + crates/utils/re_perf_telemetry/src/utils.rs | 51 + crates/utils/re_quota_channel/Cargo.toml | 42 + crates/utils/re_quota_channel/README.md | 40 + .../src/async_broadcast_channel.rs | 735 + .../src/async_mpsc_channel.rs | 98 + crates/utils/re_quota_channel/src/lib.rs | 72 + crates/utils/re_quota_channel/src/sync/mod.rs | 629 + .../utils/re_quota_channel/src/sync/select.rs | 298 + .../re_quota_channel/src/try_send_error.rs | 39 + crates/utils/re_ros_msg/Cargo.toml | 21 + .../utils/re_ros_msg/src/deserialize/mod.rs | 256 + .../src/deserialize/primitive_array.rs | 36 + crates/utils/re_ros_msg/src/lib.rs | 109 + crates/utils/re_ros_msg/src/message_spec.rs | 1037 ++ crates/utils/re_rvl/Cargo.toml | 19 + crates/utils/re_rvl/README.md | 11 + crates/utils/re_rvl/src/lib.rs | 412 + crates/utils/re_span/Cargo.toml | 23 + crates/utils/re_span/README.md | 15 + crates/utils/re_span/src/lib.rs | 109 + crates/utils/re_string_interner/Cargo.toml | 30 + crates/utils/re_string_interner/README.md | 18 + crates/utils/re_string_interner/src/lib.rs | 718 + crates/utils/re_test_mocks/Cargo.toml | 31 + crates/utils/re_test_mocks/README.md | 7 + crates/utils/re_test_mocks/src/assert.rs | 22 + crates/utils/re_test_mocks/src/lib.rs | 6 + crates/utils/re_test_mocks/src/otlp.rs | 487 + crates/utils/re_test_mocks/src/posthog.rs | 583 + crates/utils/re_tracing/Cargo.toml | 45 + crates/utils/re_tracing/README.md | 10 + crates/utils/re_tracing/src/lib.rs | 88 + .../utils/re_tracing/src/profile_capture.rs | 59 + crates/utils/re_tracing/src/server.rs | 63 + crates/utils/re_tuid/Cargo.toml | 51 + crates/utils/re_tuid/README.md | 34 + crates/utils/re_tuid/benches/bench_tuid.rs | 20 + crates/utils/re_tuid/src/lib.rs | 391 + crates/utils/re_video/Cargo.toml | 134 + crates/utils/re_video/README.md | 12 + .../re_video/benches/video_load_bench.rs | 30 + crates/utils/re_video/build.rs | 8 + crates/utils/re_video/examples/frames.rs | 171 + crates/utils/re_video/src/av1.rs | 234 + crates/utils/re_video/src/decode/av1.rs | 358 + .../re_video/src/decode/ffmpeg_cli/ffmpeg.rs | 1246 ++ .../re_video/src/decode/ffmpeg_cli/ivf.rs | 62 + .../re_video/src/decode/ffmpeg_cli/mod.rs | 18 + .../src/decode/ffmpeg_cli/transcode.rs | 203 + .../re_video/src/decode/ffmpeg_cli/version.rs | 294 + .../re_video/src/decode/image_decoder.rs | 138 + crates/utils/re_video/src/decode/mod.rs | 680 + .../utils/re_video/src/decode/rvl_decoder.rs | 61 + .../utils/re_video/src/decode/sync_decoder.rs | 18 + .../src/decode/sync_decoder_wrapper_native.rs | 157 + .../src/decode/sync_decoder_wrapper_wasm.rs | 59 + .../re_video/src/decode/web_image_decoder.rs | 196 + crates/utils/re_video/src/decode/webcodecs.rs | 577 + crates/utils/re_video/src/demux/mod.rs | 1639 ++ crates/utils/re_video/src/demux/mp4.rs | 359 + crates/utils/re_video/src/gop_detection.rs | 277 + crates/utils/re_video/src/h264.rs | 256 + crates/utils/re_video/src/h265.rs | 274 + crates/utils/re_video/src/lib.rs | 69 + crates/utils/re_video/src/nalu.rs | 92 + crates/utils/re_video/src/player/mod.rs | 1156 ++ .../re_video/src/player/sample_decoder.rs | 220 + .../utils/re_video/src/stable_index_deque.rs | 514 + crates/utils/re_video/src/time.rs | 131 + crates/utils/re_video/src/vp8.rs | 48 + crates/utils/re_video/src/vp9.rs | 178 + crates/viewer/README.md | 1 + crates/viewer/re_arrow_ui/Cargo.toml | 35 + crates/viewer/re_arrow_ui/README.md | 10 + crates/viewer/re_arrow_ui/src/arrow_node.rs | 183 + crates/viewer/re_arrow_ui/src/arrow_ui.rs | 75 + crates/viewer/re_arrow_ui/src/datatype_ui.rs | 178 + crates/viewer/re_arrow_ui/src/lib.rs | 22 + .../re_arrow_ui/src/list_item_ranges.rs | 46 + crates/viewer/re_arrow_ui/src/show_index.rs | 899 + .../re_arrow_ui/tests/arrow_test_data/mod.rs | 466 + .../viewer/re_arrow_ui/tests/arrow_ui_test.rs | 123 + .../re_arrow_ui/tests/snapshots/arrow_ui.png | 3 + .../arrow_ui_test__binary_array.snap | 5 + .../snapshots/arrow_ui_test__complex_map.snap | 5 + .../arrow_ui_test__coordinates_struct.snap | 5 + .../arrow_ui_test__deeply_nested_struct.snap | 5 + .../arrow_ui_test__dictionary_array.snap | 5 + .../arrow_ui_test__fixed_size_list.snap | 5 + .../arrow_ui_test__large_binary_array.snap | 5 + .../arrow_ui_test__list_of_long_strings.snap | 5 + .../snapshots/arrow_ui_test__long_string.snap | 5 + .../arrow_ui_test__metadata_struct.snap | 5 + .../snapshots/arrow_ui_test__mixed_lists.snap | 5 + .../arrow_ui_test__optional_struct.snap | 5 + .../snapshots/arrow_ui_test__simple_map.snap | 5 + .../snapshots/arrow_ui_test__union_array.snap | 5 + .../tests/snapshots/binary_array.png | 3 + .../tests/snapshots/complex_map.png | 3 + .../tests/snapshots/coordinates_struct.png | 3 + .../tests/snapshots/deeply_nested_struct.png | 3 + .../tests/snapshots/dictionary_array.png | 3 + .../tests/snapshots/fixed_size_list.png | 3 + .../tests/snapshots/large_binary_array.png | 3 + .../tests/snapshots/list_of_long_strings.png | 3 + .../tests/snapshots/long_string.png | 3 + .../tests/snapshots/metadata_struct.png | 3 + .../tests/snapshots/mixed_lists.png | 3 + .../tests/snapshots/optional_struct.png | 3 + .../tests/snapshots/simple_map.png | 3 + .../tests/snapshots/union_array.png | 3 + crates/viewer/re_blueprint_tree/Cargo.toml | 53 + crates/viewer/re_blueprint_tree/README.md | 10 + .../re_blueprint_tree/src/blueprint_tree.rs | 1326 ++ crates/viewer/re_blueprint_tree/src/data.rs | 656 + .../src/data_result_node_or_path.rs | 37 + crates/viewer/re_blueprint_tree/src/lib.rs | 14 + .../tests/blueprint_tree_tests.rs | 209 + .../tests/range_selection_test.rs | 104 + .../tests/snapshots/basic_blueprint_panel.png | 3 + ...print_panel_filter_active_above_origin.png | 3 + ...rint_panel_filter_active_inside_origin.png | 3 + ...int_panel_filter_active_outside_origin.png | 3 + .../collapse_all_blueprint_panel.png | 3 + .../snapshots/expand_all_blueprint_panel.png | 3 + .../range_selection_in_blueprint_tree.png | 3 + .../view_structure_test/no-query/empty.png | 3 + .../view_structure_test/no-query/empty.snap | 26 + .../no-query/multiple_proj.png | 3 + .../no-query/multiple_proj.snap | 59 + .../no-query/non_root_origin.png | 3 + .../no-query/non_root_origin.snap | 69 + .../no-query/proj_with_placeholder.png | 3 + .../no-query/proj_with_placeholder.snap | 140 + .../no-query/root_origin.png | 3 + .../no-query/root_origin.snap | 131 + .../no-query/single_proj.png | 3 + .../no-query/single_proj.snap | 78 + .../no-query/unknown_origin.png | 3 + .../no-query/unknown_origin.snap | 28 + .../view_structure_test/query-/empty.png | 3 + .../view_structure_test/query-/empty.snap | 26 + .../query-/multiple_proj.png | 3 + .../query-/multiple_proj.snap | 59 + .../query-/non_root_origin.png | 3 + .../query-/non_root_origin.snap | 69 + .../query-/proj_with_placeholder.png | 3 + .../query-/proj_with_placeholder.snap | 140 + .../query-/root_origin.png | 3 + .../query-/root_origin.snap | 131 + .../query-/single_proj.png | 3 + .../query-/single_proj.snap | 78 + .../query-/unknown_origin.png | 3 + .../query-/unknown_origin.snap | 28 + .../query-_path_to,_rig/empty.png | 3 + .../query-_path_to,_rig/empty.snap | 5 + .../query-_path_to,_rig/multiple_proj.png | 3 + .../query-_path_to,_rig/multiple_proj.snap | 5 + .../query-_path_to,_rig/non_root_origin.png | 3 + .../query-_path_to,_rig/non_root_origin.snap | 5 + .../proj_with_placeholder.png | 3 + .../proj_with_placeholder.snap | 5 + .../query-_path_to,_rig/root_origin.png | 3 + .../query-_path_to,_rig/root_origin.snap | 59 + .../query-_path_to,_rig/single_proj.png | 3 + .../query-_path_to,_rig/single_proj.snap | 5 + .../query-_path_to,_rig/unknown_origin.png | 3 + .../query-_path_to,_rig/unknown_origin.snap | 5 + .../query-_path_to_th/empty.png | 3 + .../query-_path_to_th/empty.snap | 5 + .../query-_path_to_th/multiple_proj.png | 3 + .../query-_path_to_th/multiple_proj.snap | 5 + .../query-_path_to_th/non_root_origin.png | 3 + .../query-_path_to_th/non_root_origin.snap | 5 + .../proj_with_placeholder.png | 3 + .../proj_with_placeholder.snap | 5 + .../query-_path_to_th/root_origin.png | 3 + .../query-_path_to_th/root_origin.snap | 70 + .../query-_path_to_th/single_proj.png | 3 + .../query-_path_to_th/single_proj.snap | 5 + .../query-_path_to_th/unknown_origin.png | 3 + .../query-_path_to_th/unknown_origin.snap | 5 + .../query-_to_the_/empty.png | 3 + .../query-_to_the_/empty.snap | 5 + .../query-_to_the_/multiple_proj.png | 3 + .../query-_to_the_/multiple_proj.snap | 5 + .../query-_to_the_/non_root_origin.png | 3 + .../query-_to_the_/non_root_origin.snap | 53 + .../query-_to_the_/proj_with_placeholder.png | 3 + .../query-_to_the_/proj_with_placeholder.snap | 53 + .../query-_to_the_/root_origin.png | 3 + .../query-_to_the_/root_origin.snap | 68 + .../query-_to_the_/single_proj.png | 3 + .../query-_to_the_/single_proj.snap | 53 + .../query-_to_the_/unknown_origin.png | 3 + .../query-_to_the_/unknown_origin.snap | 5 + .../query-ath,left/empty.png | 3 + .../query-ath,left/empty.snap | 5 + .../query-ath,left/multiple_proj.png | 3 + .../query-ath,left/multiple_proj.snap | 5 + .../query-ath,left/non_root_origin.png | 3 + .../query-ath,left/non_root_origin.snap | 5 + .../query-ath,left/proj_with_placeholder.png | 3 + .../query-ath,left/proj_with_placeholder.snap | 5 + .../query-ath,left/root_origin.png | 3 + .../query-ath,left/root_origin.snap | 57 + .../query-ath,left/single_proj.png | 3 + .../query-ath,left/single_proj.snap | 5 + .../query-ath,left/unknown_origin.png | 3 + .../query-ath,left/unknown_origin.snap | 5 + .../view_structure_test/query-ath,t/empty.png | 3 + .../query-ath,t/empty.snap | 5 + .../query-ath,t/multiple_proj.png | 3 + .../query-ath,t/multiple_proj.snap | 5 + .../query-ath,t/non_root_origin.png | 3 + .../query-ath,t/non_root_origin.snap | 5 + .../query-ath,t/proj_with_placeholder.png | 3 + .../query-ath,t/proj_with_placeholder.snap | 79 + .../query-ath,t/root_origin.png | 3 + .../query-ath,t/root_origin.snap | 128 + .../query-ath,t/single_proj.png | 3 + .../query-ath,t/single_proj.snap | 5 + .../query-ath,t/unknown_origin.png | 3 + .../query-ath,t/unknown_origin.snap | 30 + .../view_structure_test/query-path/empty.png | 3 + .../view_structure_test/query-path/empty.snap | 5 + .../query-path/multiple_proj.png | 3 + .../query-path/multiple_proj.snap | 5 + .../query-path/non_root_origin.png | 3 + .../query-path/non_root_origin.snap | 5 + .../query-path/proj_with_placeholder.png | 3 + .../query-path/proj_with_placeholder.snap | 75 + .../query-path/root_origin.png | 3 + .../query-path/root_origin.snap | 116 + .../query-path/single_proj.png | 3 + .../query-path/single_proj.snap | 5 + .../query-path/unknown_origin.png | 3 + .../query-path/unknown_origin.snap | 30 + .../view_structure_test/query-t/empty.png | 3 + .../view_structure_test/query-t/empty.snap | 5 + .../query-t/multiple_proj.png | 3 + .../query-t/multiple_proj.snap | 54 + .../query-t/non_root_origin.png | 3 + .../query-t/non_root_origin.snap | 77 + .../query-t/proj_with_placeholder.png | 3 + .../query-t/proj_with_placeholder.snap | 156 + .../query-t/root_origin.png | 3 + .../query-t/root_origin.snap | 147 + .../query-t/single_proj.png | 3 + .../query-t/single_proj.snap | 77 + .../query-t/unknown_origin.png | 3 + .../query-t/unknown_origin.snap | 30 + .../query-to_the,oid/empty.png | 3 + .../query-to_the,oid/empty.snap | 5 + .../query-to_the,oid/multiple_proj.png | 3 + .../query-to_the,oid/multiple_proj.snap | 5 + .../query-to_the,oid/non_root_origin.png | 3 + .../query-to_the,oid/non_root_origin.snap | 55 + .../proj_with_placeholder.png | 3 + .../proj_with_placeholder.snap | 55 + .../query-to_the,oid/root_origin.png | 3 + .../query-to_the,oid/root_origin.snap | 70 + .../query-to_the,oid/single_proj.png | 3 + .../query-to_the,oid/single_proj.snap | 55 + .../query-to_the,oid/unknown_origin.png | 3 + .../query-to_the,oid/unknown_origin.snap | 5 + .../query-to_the/empty.png | 3 + .../query-to_the/empty.snap | 5 + .../query-to_the/multiple_proj.png | 3 + .../query-to_the/multiple_proj.snap | 5 + .../query-to_the/non_root_origin.png | 3 + .../query-to_the/non_root_origin.snap | 53 + .../query-to_the/proj_with_placeholder.png | 3 + .../query-to_the/proj_with_placeholder.snap | 102 + .../query-to_the/root_origin.png | 3 + .../query-to_the/root_origin.snap | 102 + .../query-to_the/single_proj.png | 3 + .../query-to_the/single_proj.snap | 53 + .../query-to_the/unknown_origin.png | 3 + .../query-to_the/unknown_origin.snap | 5 + .../view_structure_test/query-void/empty.png | 3 + .../view_structure_test/query-void/empty.snap | 5 + .../query-void/multiple_proj.png | 3 + .../query-void/multiple_proj.snap | 42 + .../query-void/non_root_origin.png | 3 + .../query-void/non_root_origin.snap | 51 + .../query-void/proj_with_placeholder.png | 3 + .../query-void/proj_with_placeholder.snap | 51 + .../query-void/root_origin.png | 3 + .../query-void/root_origin.snap | 66 + .../query-void/single_proj.png | 3 + .../query-void/single_proj.snap | 51 + .../query-void/unknown_origin.png | 3 + .../query-void/unknown_origin.snap | 5 + .../tests/view_structure_test.rs | 262 + crates/viewer/re_chunk_store_ui/Cargo.toml | 36 + crates/viewer/re_chunk_store_ui/README.md | 10 + .../re_chunk_store_ui/src/chunk_list_mode.rs | 210 + .../re_chunk_store_ui/src/chunk_store_ui.rs | 931 + .../viewer/re_chunk_store_ui/src/chunk_ui.rs | 367 + crates/viewer/re_chunk_store_ui/src/lib.rs | 11 + crates/viewer/re_chunk_store_ui/src/sort.rs | 75 + .../re_chunk_store_ui/src/toolbar_ui.rs | 39 + .../viewer/re_component_fallbacks/Cargo.toml | 25 + .../viewer/re_component_fallbacks/README.md | 10 + .../src/blueprint_component_fallbacks.rs | 32 + .../src/component_fallbacks.rs | 580 + .../viewer/re_component_fallbacks/src/lib.rs | 35 + crates/viewer/re_component_ui/Cargo.toml | 48 + crates/viewer/re_component_ui/README.md | 10 + crates/viewer/re_component_ui/src/color.rs | 82 + .../re_component_ui/src/color_swatch.rs | 75 + .../src/datatype_uis/bool_toggle.rs | 28 + .../src/datatype_uis/enum_ui.rs | 172 + .../src/datatype_uis/float_drag.rs | 173 + .../src/datatype_uis/int_drag.rs | 57 + .../re_component_ui/src/datatype_uis/mod.rs | 30 + .../src/datatype_uis/range1d.rs | 52 + .../src/datatype_uis/singleline_string.rs | 64 + .../re_component_ui/src/datatype_uis/vec.rs | 127 + .../src/datatype_uis/view_id.rs | 21 + .../src/datatype_uis/view_timestamp.rs | 18 + .../src/datatype_uis/view_uuid.rs | 14 + .../viewer/re_component_ui/src/entity_path.rs | 20 + .../re_component_ui/src/geo_line_string.rs | 77 + .../re_component_ui/src/image_format.rs | 15 + crates/viewer/re_component_ui/src/lat_lon.rs | 24 + crates/viewer/re_component_ui/src/lib.rs | 254 + .../viewer/re_component_ui/src/line_strip.rs | 137 + .../re_component_ui/src/map_provider.rs | 33 + .../re_component_ui/src/marker_shape.rs | 90 + crates/viewer/re_component_ui/src/pinhole.rs | 59 + crates/viewer/re_component_ui/src/plane3d.rs | 175 + crates/viewer/re_component_ui/src/radius.rs | 73 + .../viewer/re_component_ui/src/resolution.rs | 19 + .../re_component_ui/src/response_utils.rs | 11 + .../re_component_ui/src/text_log_columns.rs | 58 + .../viewer/re_component_ui/src/time_range.rs | 212 + .../re_component_ui/src/timeline_columns.rs | 83 + .../re_component_ui/src/transform_frame_id.rs | 178 + .../viewer/re_component_ui/src/transforms.rs | 48 + .../re_component_ui/src/variant_uis/mod.rs | 7 + .../src/variant_uis/redap_entry_kind.rs | 32 + .../src/variant_uis/redap_thumbnail.rs | 41 + .../src/variant_uis/redap_uri_button.rs | 141 + .../re_component_ui/src/video_timestamp.rs | 32 + .../re_component_ui/src/view_coordinates.rs | 16 + .../viewer/re_component_ui/src/visible_dnd.rs | 73 + .../re_component_ui/src/visual_bounds2d.rs | 154 + .../viewer/re_component_ui/src/zoom_level.rs | 27 + .../AbsoluteTimeRange_placeholder.png | 3 + .../AggregationPolicy_placeholder.png | 3 + .../AlbedoFactor_placeholder.png | 3 + .../AngularSpeed_placeholder.png | 3 + .../ApplyLatestAt_placeholder.png | 3 + .../AutoScroll_placeholder.png | 3 + .../AxisLength_placeholder.png | 3 + .../BackgroundKind_placeholder.png | 3 + .../CellSize_placeholder.png | 3 + .../ChannelId_placeholder.png | 3 + .../ChannelMessageCounts_placeholder.png | 3 + .../ClearIsRecursive_placeholder.png | 3 + .../Color_placeholder.png | 3 + .../Colormap_placeholder.png | 3 + .../ColumnName_placeholder.png | 3 + .../ColumnOrder_placeholder.png | 3 + .../ComponentColumnSelector_simple.png | 3 + .../ContainerKind_placeholder.png | 3 + .../Corner2D_placeholder.png | 3 + .../Count_placeholder.png | 3 + .../DepthMeter_placeholder.png | 3 + .../DrawOrder_placeholder.png | 3 + .../Enabled_placeholder.png | 3 + .../EntityPath_simple.png | 3 + .../Eye3DKind_placeholder.png | 3 + .../FillMode_placeholder.png | 3 + .../FillRatio_placeholder.png | 3 + .../FilterByRange_placeholder.png | 3 + .../FilterIsNotNull_placeholder.png | 3 + .../ForceDistance_placeholder.png | 3 + .../ForceIterations_placeholder.png | 3 + .../ForceStrength_placeholder.png | 3 + .../Fps_placeholder.png | 3 + .../GammaCorrection_placeholder.png | 3 + .../GeoLineString_placeholder.png | 3 + .../GraphEdge_simple.png | 3 + .../GraphNode_simple.png | 3 + .../GraphType_placeholder.png | 3 + .../GridColumns_placeholder.png | 3 + .../GridSpacing_placeholder.png | 3 + .../HalfSize2D_placeholder.png | 3 + .../HalfSize3D_placeholder.png | 3 + .../ImageFormat_depth_f32.png | 3 + .../ImageFormat_nv12.png | 3 + .../ImageFormat_rgb8.png | 3 + .../ImageFormat_rgba8.png | 3 + .../ImageFormat_segmentation_u32.png | 3 + .../ImagePlaneDistance_placeholder.png | 3 + .../Interactive_placeholder.png | 3 + .../InterpolationMode_placeholder.png | 3 + .../IsKeyframe_placeholder.png | 3 + .../KeyValuePairs_placeholder.png | 3 + .../LatLon_placeholder.png | 3 + .../Length_placeholder.png | 3 + .../LineStrip2D_placeholder.png | 3 + .../LineStrip3D_placeholder.png | 3 + .../LinearSpeed_placeholder.png | 3 + .../LinkAxis_placeholder.png | 3 + .../LockRangeDuringZoom_placeholder.png | 3 + .../LoopMode_placeholder.png | 3 + .../MagnificationFilter_placeholder.png | 3 + .../MapProvider_placeholder.png | 3 + .../MarkerShape_placeholder.png | 3 + .../MarkerSize_placeholder.png | 3 + .../MediaType_placeholder.png | 3 + .../MeshFaceRendering_placeholder.png | 3 + .../Name_placeholder.png | 3 + .../NearClipPlane_placeholder.png | 3 + .../Opacity_placeholder.png | 3 + .../PinholeProjection_placeholder.png | 3 + .../Plane3D_placeholder.png | 3 + .../PlayState_placeholder.png | 3 + .../PlaybackSpeed_placeholder.png | 3 + .../PointShading_placeholder.png | 3 + .../Position2D_placeholder.png | 3 + .../Position3D_placeholder.png | 3 + .../QueryExpression_simple.png | 3 + .../Radius_placeholder.png | 3 + .../Range1D_placeholder.png | 3 + .../Resolution_placeholder.png | 3 + .../RotationAxisAngle_placeholder.png | 3 + .../RotationQuat_placeholder.png | 3 + .../Scalar_placeholder.png | 3 + .../Scale3D_placeholder.png | 3 + .../SchemaId_placeholder.png | 3 + .../SelectedColumns_placeholder.png | 3 + .../ShowLabels_placeholder.png | 3 + .../StrokeWidth_placeholder.png | 3 + ...sorDimensionIndexSelection_placeholder.png | 3 + ...TensorDimensionIndexSlider_placeholder.png | 3 + .../TensorHeightDimension_placeholder.png | 3 + .../TensorWidthDimension_placeholder.png | 3 + .../Texcoord2D_placeholder.png | 3 + .../TextLogColumn_placeholder.png | 3 + .../TextLogLevel_placeholder.png | 3 + .../Text_simple.png | 3 + .../TimeInt_placeholder.png | 3 + .../TimeRange_placeholder.png | 3 + .../TimelineColumn_placeholder.png | 3 + .../TimelineName_placeholder.png | 3 + .../Timestamp_placeholder.png | 3 + .../TransformFrameId_placeholder.png | 3 + .../TransformMat3x3_placeholder.png | 3 + .../TransformRelation_placeholder.png | 3 + .../Translation3D_placeholder.png | 3 + .../TriangleIndices_placeholder.png | 3 + .../ValueRange_placeholder.png | 3 + .../Vector2D_placeholder.png | 3 + .../Vector3D_placeholder.png | 3 + .../VideoCodec_placeholder.png | 3 + .../VideoSample_placeholder.png | 3 + .../VideoTimestamp_placeholder.png | 3 + .../ViewClass_placeholder.png | 3 + .../ViewCoordinates_placeholder.png | 3 + .../ViewFit_placeholder.png | 3 + .../VisibleTimeRange_placeholder.png | 3 + .../Visible_placeholder.png | 3 + .../VisualBounds2D_placeholder.png | 3 + ...VisualizerComponentMapping_placeholder.png | 3 + .../VisualizerType_placeholder.png | 3 + .../VoxelIndex_placeholder.png | 3 + .../VoxelSize_placeholder.png | 3 + .../VoxelValue_placeholder.png | 3 + .../ZoomLevel_placeholder.png | 3 + .../any_value_any_value_f64.png | 3 + ...om_catalog_string_any_value_url_string.png | 3 + ...stom_empty_array_any_value_empty_array.png | 3 + ...custom_large_blob_any_value_large_blob.png | 3 + ...stom_small_array_any_value_small_array.png | 3 + .../custom_string_any_value_string.png | 3 + ...om_struct_array_any_value_struct_array.png | 3 + ..._any_value_struct_array_single_element.png | 3 + ...custom_url_string_any_value_url_string.png | 3 + .../AbsoluteTimeRange_placeholder.png | 3 + .../AggregationPolicy_placeholder.png | 3 + .../AlbedoFactor_placeholder.png | 3 + .../AngularSpeed_placeholder.png | 3 + .../ApplyLatestAt_placeholder.png | 3 + .../AutoScroll_placeholder.png | 3 + .../AxisLength_placeholder.png | 3 + .../BackgroundKind_placeholder.png | 3 + .../CellSize_placeholder.png | 3 + .../ChannelId_placeholder.png | 3 + .../ChannelMessageCounts_placeholder.png | 3 + .../ClearIsRecursive_placeholder.png | 3 + .../Color_placeholder.png | 3 + .../Colormap_placeholder.png | 3 + .../ColumnName_placeholder.png | 3 + .../ColumnOrder_placeholder.png | 3 + .../ComponentColumnSelector_simple.png | 3 + .../ContainerKind_placeholder.png | 3 + .../Corner2D_placeholder.png | 3 + .../Count_placeholder.png | 3 + .../DepthMeter_placeholder.png | 3 + .../DrawOrder_placeholder.png | 3 + .../Enabled_placeholder.png | 3 + .../EntityPath_simple.png | 3 + .../Eye3DKind_placeholder.png | 3 + .../FillMode_placeholder.png | 3 + .../FillRatio_placeholder.png | 3 + .../FilterByRange_placeholder.png | 3 + .../FilterIsNotNull_placeholder.png | 3 + .../ForceDistance_placeholder.png | 3 + .../ForceIterations_placeholder.png | 3 + .../ForceStrength_placeholder.png | 3 + .../Fps_placeholder.png | 3 + .../GammaCorrection_placeholder.png | 3 + .../GeoLineString_placeholder.png | 3 + .../GraphEdge_simple.png | 3 + .../GraphNode_simple.png | 3 + .../GraphType_placeholder.png | 3 + .../GridColumns_placeholder.png | 3 + .../GridSpacing_placeholder.png | 3 + .../HalfSize2D_placeholder.png | 3 + .../HalfSize3D_placeholder.png | 3 + .../ImageFormat_depth_f32.png | 3 + .../ImageFormat_nv12.png | 3 + .../ImageFormat_rgb8.png | 3 + .../ImageFormat_rgba8.png | 3 + .../ImageFormat_segmentation_u32.png | 3 + .../ImagePlaneDistance_placeholder.png | 3 + .../Interactive_placeholder.png | 3 + .../InterpolationMode_placeholder.png | 3 + .../IsKeyframe_placeholder.png | 3 + .../KeyValuePairs_placeholder.png | 3 + .../LatLon_placeholder.png | 3 + .../Length_placeholder.png | 3 + .../LineStrip2D_placeholder.png | 3 + .../LineStrip3D_placeholder.png | 3 + .../LinearSpeed_placeholder.png | 3 + .../LinkAxis_placeholder.png | 3 + .../LockRangeDuringZoom_placeholder.png | 3 + .../LoopMode_placeholder.png | 3 + .../MagnificationFilter_placeholder.png | 3 + .../MapProvider_placeholder.png | 3 + .../MarkerShape_placeholder.png | 3 + .../MarkerSize_placeholder.png | 3 + .../MediaType_placeholder.png | 3 + .../MeshFaceRendering_placeholder.png | 3 + .../Name_placeholder.png | 3 + .../NearClipPlane_placeholder.png | 3 + .../Opacity_placeholder.png | 3 + .../PinholeProjection_placeholder.png | 3 + .../Plane3D_placeholder.png | 3 + .../PlayState_placeholder.png | 3 + .../PlaybackSpeed_placeholder.png | 3 + .../PointShading_placeholder.png | 3 + .../Position2D_placeholder.png | 3 + .../Position3D_placeholder.png | 3 + .../QueryExpression_simple.png | 3 + .../Radius_placeholder.png | 3 + .../Range1D_placeholder.png | 3 + .../Resolution_placeholder.png | 3 + .../RotationAxisAngle_placeholder.png | 3 + .../RotationQuat_placeholder.png | 3 + .../Scalar_placeholder.png | 3 + .../Scale3D_placeholder.png | 3 + .../SchemaId_placeholder.png | 3 + .../SelectedColumns_placeholder.png | 3 + .../ShowLabels_placeholder.png | 3 + .../StrokeWidth_placeholder.png | 3 + ...sorDimensionIndexSelection_placeholder.png | 3 + ...TensorDimensionIndexSlider_placeholder.png | 3 + .../TensorHeightDimension_placeholder.png | 3 + .../TensorWidthDimension_placeholder.png | 3 + .../Texcoord2D_placeholder.png | 3 + .../TextLogColumn_placeholder.png | 3 + .../TextLogLevel_placeholder.png | 3 + .../Text_simple.png | 3 + .../TimeInt_placeholder.png | 3 + .../TimeRange_placeholder.png | 3 + .../TimelineColumn_placeholder.png | 3 + .../TimelineName_placeholder.png | 3 + .../Timestamp_placeholder.png | 3 + .../TransformFrameId_placeholder.png | 3 + .../TransformMat3x3_placeholder.png | 3 + .../TransformRelation_placeholder.png | 3 + .../Translation3D_placeholder.png | 3 + .../TriangleIndices_placeholder.png | 3 + .../ValueRange_placeholder.png | 3 + .../Vector2D_placeholder.png | 3 + .../Vector3D_placeholder.png | 3 + .../VideoCodec_placeholder.png | 3 + .../VideoSample_placeholder.png | 3 + .../VideoTimestamp_placeholder.png | 3 + .../ViewClass_placeholder.png | 3 + .../ViewCoordinates_placeholder.png | 3 + .../ViewFit_placeholder.png | 3 + .../VisibleTimeRange_placeholder.png | 3 + .../Visible_placeholder.png | 3 + .../VisualBounds2D_placeholder.png | 3 + ...VisualizerComponentMapping_placeholder.png | 3 + .../VisualizerType_placeholder.png | 3 + .../VoxelIndex_placeholder.png | 3 + .../VoxelSize_placeholder.png | 3 + .../VoxelValue_placeholder.png | 3 + .../ZoomLevel_placeholder.png | 3 + .../any_value_any_value_f64.png | 3 + ...om_catalog_string_any_value_url_string.png | 3 + ...stom_empty_array_any_value_empty_array.png | 3 + ...custom_large_blob_any_value_large_blob.png | 3 + ...stom_small_array_any_value_small_array.png | 3 + .../custom_string_any_value_string.png | 3 + ...om_struct_array_any_value_struct_array.png | 3 + ..._any_value_struct_array_single_element.png | 3 + ...custom_url_string_any_value_url_string.png | 3 + .../tests/test_all_components_ui.rs | 442 + crates/viewer/re_context_menu/Cargo.toml | 37 + crates/viewer/re_context_menu/README.md | 10 + .../src/actions/add_container.rs | 48 + .../src/actions/add_entities_to_new_view.rs | 175 + .../re_context_menu/src/actions/add_view.rs | 39 + .../re_context_menu/src/actions/clone_view.rs | 29 + .../src/actions/collapse_expand_all.rs | 180 + .../src/actions/copy_entity_path.rs | 52 + .../viewer/re_context_menu/src/actions/mod.rs | 17 + .../actions/move_contents_to_new_container.rs | 76 + .../re_context_menu/src/actions/remove.rs | 54 + .../src/actions/screenshot_action.rs | 66 + .../re_context_menu/src/actions/show_hide.rs | 140 + .../src/actions/show_hide_in_all_views.rs | 78 + .../src/actions/track_entity.rs | 64 + .../re_context_menu/src/collapse_expand.rs | 93 + crates/viewer/re_context_menu/src/lib.rs | 459 + crates/viewer/re_context_menu/src/sub_menu.rs | 40 + .../re_context_menu/src/visibility_actions.rs | 80 + crates/viewer/re_data_ui/Cargo.toml | 53 + crates/viewer/re_data_ui/README.md | 10 + .../re_data_ui/src/annotation_context_ui.rs | 360 + crates/viewer/re_data_ui/src/app_id_ui.rs | 69 + crates/viewer/re_data_ui/src/blob_ui.rs | 270 + .../re_data_ui/src/component_path_ui.rs | 56 + .../re_data_ui/src/component_type_ui.rs | 43 + .../re_data_ui/src/component_ui_registry.rs | 57 + .../viewer/re_data_ui/src/data_source_ui.rs | 72 + crates/viewer/re_data_ui/src/entity_db_ui.rs | 385 + .../viewer/re_data_ui/src/entity_path_ui.rs | 10 + crates/viewer/re_data_ui/src/extra_data_ui.rs | 87 + crates/viewer/re_data_ui/src/image_ui.rs | 532 + .../viewer/re_data_ui/src/instance_path_ui.rs | 481 + crates/viewer/re_data_ui/src/item_ui.rs | 805 + .../re_data_ui/src/latest_all_instance_ui.rs | 149 + .../re_data_ui/src/latest_at_instance_ui.rs | 185 + crates/viewer/re_data_ui/src/lib.rs | 165 + crates/viewer/re_data_ui/src/store_id_ui.rs | 13 + crates/viewer/re_data_ui/src/tensor_ui.rs | 146 + .../re_data_ui/src/transform_frames_ui.rs | 258 + crates/viewer/re_data_ui/src/video_ui.rs | 964 + crates/viewer/re_dataframe_ui/Cargo.toml | 72 + crates/viewer/re_dataframe_ui/README.md | 10 + .../re_dataframe_ui/src/datafusion_adapter.rs | 599 + .../src/datafusion_table_widget.rs | 1348 ++ .../src/display_record_batch.rs | 510 + .../re_dataframe_ui/src/filters/boolean.rs | 307 + .../src/filters/column_filter.rs | 100 + .../src/filters/column_filter_ui.rs | 615 + .../re_dataframe_ui/src/filters/filter.rs | 255 + .../re_dataframe_ui/src/filters/filter_udf.rs | 179 + .../viewer/re_dataframe_ui/src/filters/mod.rs | 21 + .../re_dataframe_ui/src/filters/numerical.rs | 402 + .../src/filters/parse_timestamp.rs | 476 + .../re_dataframe_ui/src/filters/string.rs | 193 + .../re_dataframe_ui/src/filters/timestamp.rs | 1150 ++ .../src/filters/timestamp_formatted.rs | 30 + .../viewer/re_dataframe_ui/src/grid_view.rs | 343 + .../re_dataframe_ui/src/header_tooltip.rs | 174 + crates/viewer/re_dataframe_ui/src/lib.rs | 63 + .../re_dataframe_ui/src/preview_renderer.rs | 472 + crates/viewer/re_dataframe_ui/src/re_table.rs | 331 + .../re_dataframe_ui/src/re_table_utils.rs | 292 + .../re_dataframe_ui/src/requested_object.rs | 125 + .../re_dataframe_ui/src/streaming_cache.rs | 430 + .../re_dataframe_ui/src/table_blueprint.rs | 398 + .../re_dataframe_ui/src/table_selection.rs | 74 + .../tests/ascending_descending.rs | 162 + .../tests/column_header_tooltips.rs | 140 + crates/viewer/re_dataframe_ui/tests/common.rs | 29 + .../re_dataframe_ui/tests/filter_tests.rs | 820 + .../viewer/re_dataframe_ui/tests/grid_view.rs | 418 + ...uals_list_non_nullable@both_null_true.snap | 60 + ...als_list_non_nullable@inner_null_true.snap | 62 + ...equals_list_non_nullable@no_null_true.snap | 61 + ...als_list_non_nullable@outer_null_true.snap | 59 + ...s_list_nullable@both_null_is_not_true.snap | 52 + ...quals_list_nullable@both_null_is_null.snap | 57 + ...quals_list_nullable@both_null_is_true.snap | 60 + ..._list_nullable@inner_null_is_not_true.snap | 57 + ...uals_list_nullable@inner_null_is_null.snap | 58 + ...uals_list_nullable@inner_null_is_true.snap | 62 + ..._list_nullable@outer_null_is_not_true.snap | 51 + ...uals_list_nullable@outer_null_is_null.snap | 46 + ...uals_list_nullable@outer_null_is_true.snap | 59 + ...er_tests__float_all_types@Float32Type.snap | 30 + ...er_tests__float_all_types@Float64Type.snap | 30 + .../filter_tests__float_compares@eq_3.0.snap | 30 + .../filter_tests__float_compares@ge_3.0.snap | 32 + .../filter_tests__float_compares@gt_3.0.snap | 31 + .../filter_tests__float_compares@le_3.0.snap | 32 + .../filter_tests__float_compares@lt_3.0.snap | 31 + .../filter_tests__float_compares@ne_3.0.snap | 33 + ...lter_tests__float_compares@nulls_eq_4.snap | 31 + ...lter_tests__float_compares@nulls_ge_4.snap | 32 + ...lter_tests__float_compares@nulls_gt_4.snap | 31 + ...lter_tests__float_compares@nulls_le_4.snap | 33 + ...lter_tests__float_compares@nulls_lt_4.snap | 32 + ...lter_tests__float_compares@nulls_ne_4.snap | 34 + .../filter_tests__float_lists@eq_2.0.snap | 83 + .../filter_tests__float_lists@ge_2.0.snap | 95 + .../filter_tests__float_lists@gt_2.0.snap | 86 + .../filter_tests__float_lists@le_2.0.snap | 83 + .../filter_tests__float_lists@lt_2.0.snap | 74 + .../filter_tests__float_lists@ne_2.0.snap | 74 + ...ilter_tests__float_lists@nulls_eq_2.0.snap | 117 + ...ilter_tests__float_lists@nulls_ge_2.0.snap | 129 + ...ilter_tests__float_lists@nulls_gt_2.0.snap | 120 + ...ilter_tests__float_lists@nulls_le_2.0.snap | 117 + ...ilter_tests__float_lists@nulls_lt_2.0.snap | 108 + ...ilter_tests__float_lists@nulls_ne_2.0.snap | 99 + ...filter_tests__int_all_types@Int16Type.snap | 30 + ...filter_tests__int_all_types@Int32Type.snap | 30 + ...filter_tests__int_all_types@Int64Type.snap | 30 + .../filter_tests__int_all_types@Int8Type.snap | 30 + ...ilter_tests__int_all_types@UInt16Type.snap | 30 + ...ilter_tests__int_all_types@UInt32Type.snap | 30 + ...ilter_tests__int_all_types@UInt64Type.snap | 30 + ...filter_tests__int_all_types@UInt8Type.snap | 30 + .../filter_tests__int_compares@eq_3.snap | 30 + .../filter_tests__int_compares@ge_3.snap | 32 + .../filter_tests__int_compares@gt_3.snap | 31 + .../filter_tests__int_compares@le_3.snap | 32 + .../filter_tests__int_compares@lt_3.snap | 31 + .../filter_tests__int_compares@ne_3.snap | 33 + ...filter_tests__int_compares@nulls_eq_4.snap | 31 + ...ts__int_compares@nulls_eq_unspecified.snap | 33 + ...filter_tests__int_compares@nulls_ge_4.snap | 32 + ...ts__int_compares@nulls_ge_unspecified.snap | 33 + ...filter_tests__int_compares@nulls_gt_4.snap | 31 + ...ts__int_compares@nulls_gt_unspecified.snap | 33 + ...filter_tests__int_compares@nulls_le_4.snap | 33 + ...ts__int_compares@nulls_le_unspecified.snap | 33 + ...filter_tests__int_compares@nulls_lt_4.snap | 32 + ...ts__int_compares@nulls_lt_unspecified.snap | 33 + ...filter_tests__int_compares@nulls_ne_4.snap | 34 + ...ts__int_compares@nulls_ne_unspecified.snap | 33 + .../filter_tests__int_lists@eq_2.snap | 83 + .../filter_tests__int_lists@ge_2.snap | 95 + .../filter_tests__int_lists@gt_2.snap | 86 + .../filter_tests__int_lists@le_2.snap | 83 + .../filter_tests__int_lists@lt_2.snap | 74 + .../filter_tests__int_lists@ne_2.snap | 74 + .../filter_tests__int_lists@nulls_eq_2.snap | 117 + .../filter_tests__int_lists@nulls_ge_2.snap | 129 + .../filter_tests__int_lists@nulls_gt_2.snap | 120 + .../filter_tests__int_lists@nulls_le_2.snap | 117 + .../filter_tests__int_lists@nulls_lt_2.snap | 108 + .../filter_tests__int_lists@nulls_ne_2.snap | 99 + ...ts__non_nullable_boolean_equals@false.snap | 23 + ...n_nullable_boolean_equals@nulls_false.snap | 25 + ...on_nullable_boolean_equals@nulls_true.snap | 26 + ...sts__non_nullable_boolean_equals@true.snap | 24 + ...__nullable_boolean_equals@nulls_false.snap | 25 + ...able_boolean_equals@nulls_is_not_null.snap | 27 + ...able_boolean_equals@nulls_is_not_true.snap | 26 + ...s__nullable_boolean_equals@nulls_null.snap | 25 + ...s__nullable_boolean_equals@nulls_true.snap | 26 + .../filter_tests__string_contains@a.snap | 32 + ...er_tests__string_contains@a_uppercase.snap | 32 + .../filter_tests__string_contains@ab.snap | 32 + ...s__string_contains@does_not_contain_b.snap | 30 + .../filter_tests__string_contains@empty.snap | 34 + ...er_tests__string_contains@ends_with_c.snap | 30 + ...filter_tests__string_contains@nulls_a.snap | 33 + ...ing_contains@nulls_does_not_contain_b.snap | 31 + ...er_tests__string_contains@nulls_empty.snap | 35 + ...ts__string_contains@nulls_ends_with_c.snap | 30 + ...__string_contains@nulls_starts_with_b.snap | 30 + ..._tests__string_contains@starts_with_b.snap | 29 + ...ts__string_list@both_null_Contains_ab.snap | 50 + ...ring_list@both_null_DoesNotContain_ab.snap | 41 + ...ts__string_list@both_null_EndsWith_ab.snap | 50 + ...__string_list@both_null_StartsWith_ab.snap | 45 + ...s__string_list@inner_null_Contains_ab.snap | 53 + ...ing_list@inner_null_DoesNotContain_ab.snap | 48 + ...s__string_list@inner_null_EndsWith_ab.snap | 53 + ..._string_list@inner_null_StartsWith_ab.snap | 48 + ...ests__string_list@no_null_Contains_ab.snap | 52 + ...string_list@no_null_DoesNotContain_ab.snap | 47 + ...ests__string_list@no_null_EndsWith_ab.snap | 52 + ...ts__string_list@no_null_StartsWith_ab.snap | 47 + ...s__string_list@outer_null_Contains_ab.snap | 49 + ...ing_list@outer_null_DoesNotContain_ab.snap | 40 + ...s__string_list@outer_null_EndsWith_ab.snap | 49 + ..._string_list@outer_null_StartsWith_ab.snap | 44 + ...r_tests__timestamps@after_Microsecond.snap | 33 + ...s__timestamps@after_Microsecond_nulls.snap | 36 + ...r_tests__timestamps@after_Millisecond.snap | 33 + ...s__timestamps@after_Millisecond_nulls.snap | 36 + ...er_tests__timestamps@after_Nanosecond.snap | 33 + ...ts__timestamps@after_Nanosecond_nulls.snap | 36 + ...filter_tests__timestamps@after_Second.snap | 33 + ..._tests__timestamps@after_Second_nulls.snap | 36 + ...__timestamps@after_strict_Microsecond.snap | 32 + ...stamps@after_strict_Microsecond_nulls.snap | 35 + ...__timestamps@after_strict_Millisecond.snap | 32 + ...stamps@after_strict_Millisecond_nulls.snap | 35 + ...s__timestamps@after_strict_Nanosecond.snap | 32 + ...estamps@after_strict_Nanosecond_nulls.snap | 35 + ...tests__timestamps@after_strict_Second.snap | 32 + ..._timestamps@after_strict_Second_nulls.snap | 35 + ...tests__timestamps@between_Microsecond.snap | 30 + ..._timestamps@between_Microsecond_nulls.snap | 33 + ...tests__timestamps@between_Millisecond.snap | 30 + ..._timestamps@between_Millisecond_nulls.snap | 33 + ..._tests__timestamps@between_Nanosecond.snap | 30 + ...__timestamps@between_Nanosecond_nulls.snap | 33 + ...lter_tests__timestamps@between_Second.snap | 30 + ...ests__timestamps@between_Second_nulls.snap | 33 + ...sts__timestamps@not_after_Microsecond.snap | 32 + ...imestamps@not_after_Microsecond_nulls.snap | 37 + ...sts__timestamps@not_after_Millisecond.snap | 32 + ...imestamps@not_after_Millisecond_nulls.snap | 37 + ...ests__timestamps@not_after_Nanosecond.snap | 32 + ...timestamps@not_after_Nanosecond_nulls.snap | 37 + ...er_tests__timestamps@not_after_Second.snap | 32 + ...ts__timestamps@not_after_Second_nulls.snap | 37 + ...ests__timestamps_list@after_both_null.snap | 115 + ...sts__timestamps_list@after_inner_null.snap | 113 + ..._tests__timestamps_list@after_no_null.snap | 89 + ...sts__timestamps_list@after_outer_null.snap | 91 + ...imestamps_list@after_strict_both_null.snap | 95 + ...mestamps_list@after_strict_inner_null.snap | 93 + ..._timestamps_list@after_strict_no_null.snap | 79 + ...mestamps_list@after_strict_outer_null.snap | 81 + ...ts__timestamps_list@between_both_null.snap | 89 + ...s__timestamps_list@between_inner_null.snap | 87 + ...ests__timestamps_list@between_no_null.snap | 73 + ...s__timestamps_list@between_outer_null.snap | 75 + ...__timestamps_list@not_after_both_null.snap | 91 + ..._timestamps_list@not_after_inner_null.snap | 88 + ...ts__timestamps_list@not_after_no_null.snap | 70 + ..._timestamps_list@not_after_outer_null.snap | 73 + .../filter_ui_boolean_equals_false.png | 3 + .../filter_ui_boolean_equals_null.png | 3 + .../filter_ui_boolean_equals_true.png | 3 + .../snapshots/filter_ui_float_compares.png | 3 + .../filter_ui_float_compares_none.png | 3 + .../tests/snapshots/filter_ui_int_compare.png | 3 + .../snapshots/filter_ui_int_compare_none.png | 3 + ...ilter_ui_nullable_boolean_equals_false.png | 3 + ...filter_ui_nullable_boolean_equals_null.png | 3 + ...filter_ui_nullable_boolean_equals_true.png | 3 + ...er_ui_nullable_boolean_not_equals_true.png | 3 + .../snapshots/filter_ui_string_contains.png | 3 + .../filter_ui_string_contains_empty.png | 3 + .../filter_ui_string_starts_with.png | 3 + .../snapshots/filter_ui_timestamp_after.png | 3 + .../snapshots/filter_ui_timestamp_between.png | 3 + .../filter_ui_timestamp_not_after.png | 3 + .../tests/snapshots/filter_wrapping.png | 3 + .../tests/snapshots/grid_view_basic_dark.png | 3 + .../tests/snapshots/grid_view_basic_light.png | 3 + .../snapshots/grid_view_flagging_dark.png | 3 + .../snapshots/grid_view_flagging_light.png | 3 + .../grid_view_flagging_toggled_dark.png | 3 + .../grid_view_flagging_toggled_light.png | 3 + .../snapshots/grid_view_non_uniform_cards.png | 3 + .../snapshots/grid_view_resize_narrow.png | 3 + .../tests/snapshots/grid_view_resize_wide.png | 3 + .../header_tooltip_chunk_component_column.png | 3 + ...tip_chunk_component_column_with_extras.png | 3 + ...der_tooltip_dataframe_component_column.png | 3 + ...dataframe_component_column_with_extras.png | 3 + .../snapshots/header_tooltip_index_column.png | 3 + ...eader_tooltip_index_column_with_extras.png | 3 + .../snapshots/header_tooltip_raw_field.png | 3 + ...tip_raw_field_user_and_sorbet_metadata.png | 3 + ...d_user_and_sorbet_metadata_with_extras.png | 3 + ...header_tooltip_raw_field_user_metadata.png | 3 + ...ip_raw_field_user_metadata_with_extras.png | 3 + .../header_tooltip_raw_field_with_extras.png | 3 + .../header_tooltip_row_field_nullable.png | 3 + ...tooltip_row_field_nullable_with_extras.png | 3 + .../header_tooltip_row_id_column.png | 3 + ...ader_tooltip_row_id_column_with_extras.png | 3 + .../popup_ui_boolean_equals_false.png | 3 + .../popup_ui_boolean_equals_true.png | 3 + .../snapshots/popup_ui_float_compares.png | 3 + .../popup_ui_float_compares_none.png | 3 + .../tests/snapshots/popup_ui_int_compare.png | 3 + .../snapshots/popup_ui_int_compare_none.png | 3 + ...popup_ui_nullable_boolean_equals_false.png | 3 + .../popup_ui_nullable_boolean_equals_null.png | 3 + .../popup_ui_nullable_boolean_equals_true.png | 3 + ...up_ui_nullable_boolean_not_equals_true.png | 3 + .../snapshots/popup_ui_string_contains.png | 3 + .../popup_ui_string_contains_empty.png | 3 + .../snapshots/popup_ui_string_starts_with.png | 3 + .../snapshots/popup_ui_timestamp_after.png | 3 + .../snapshots/popup_ui_timestamp_between.png | 3 + .../popup_ui_timestamp_not_after.png | 3 + .../tests/snapshots/test_ascending.png | 3 + .../snapshots/test_column_menu_button.png | 3 + .../tests/snapshots/test_descending.png | 3 + .../tests/snapshots/test_no_sort.png | 3 + .../tests/snapshots/test_text_truncation.png | 3 + .../snapshots/timestamp_filter_on_commit.png | 3 + .../re_dataframe_ui/tests/text_truncation.rs | 81 + crates/viewer/re_gamepad/Cargo.toml | 31 + crates/viewer/re_gamepad/README.md | 3 + crates/viewer/re_gamepad/src/lib.rs | 258 + crates/viewer/re_gamepad/src/native.rs | 279 + crates/viewer/re_gamepad/src/web.rs | 13 + crates/viewer/re_memory_view/Cargo.toml | 29 + crates/viewer/re_memory_view/README.md | 23 + crates/viewer/re_memory_view/examples/demo.rs | 209 + .../viewer/re_memory_view/src/flamegraph.rs | 416 + crates/viewer/re_memory_view/src/lib.rs | 21 + crates/viewer/re_plot/Cargo.toml | 25 + crates/viewer/re_plot/README.md | 10 + crates/viewer/re_plot/src/legend.rs | 260 + crates/viewer/re_plot/src/lib.rs | 4 + crates/viewer/re_plot/src/tooltip.rs | 103 + crates/viewer/re_recording_panel/Cargo.toml | 48 + crates/viewer/re_recording_panel/README.md | 10 + crates/viewer/re_recording_panel/src/data.rs | 672 + crates/viewer/re_recording_panel/src/lib.rs | 23 + .../src/recording_panel_ui.rs | 903 + .../tests/snapshot_tests.rs | 66 + .../snapshot_tests__empty_context_test.snap | 18 + ...ake_local_and_example_recordings_test.snap | 34 + crates/viewer/re_redap_browser/Cargo.toml | 62 + crates/viewer/re_redap_browser/README.md | 10 + crates/viewer/re_redap_browser/src/context.rs | 7 + crates/viewer/re_redap_browser/src/entries.rs | 479 + .../re_redap_browser/src/folder_card_ui.rs | 165 + crates/viewer/re_redap_browser/src/lib.rs | 39 + .../re_redap_browser/src/server_modal.rs | 485 + .../src/server_modal/login_flow.rs | 168 + .../src/server_modal/login_flow/native.rs | 120 + .../src/server_modal/login_flow/web.rs | 253 + crates/viewer/re_redap_browser/src/servers.rs | 1179 ++ crates/viewer/re_renderer/Cargo.toml | 138 + crates/viewer/re_renderer/README.md | 65 + .../re_renderer/benches/bench_bounding_box.rs | 49 + .../benches/bench_voxel_grid_draw_data.rs | 253 + crates/viewer/re_renderer/build.rs | 254 + .../viewer/re_renderer/shader/colormap.wgsl | 254 + .../viewer/re_renderer/shader/composite.wgsl | 101 + .../shader/conversions/yuv_converter.wgsl | 199 + .../re_renderer/shader/copy_texture.wgsl | 15 + .../re_renderer/shader/debug_overlay.wgsl | 69 + .../re_renderer/shader/depth_cloud.wgsl | 260 + .../re_renderer/shader/generic_skybox.wgsl | 72 + .../re_renderer/shader/global_bindings.wgsl | 50 + .../re_renderer/shader/instanced_mesh.wgsl | 112 + crates/viewer/re_renderer/shader/lines.wgsl | 400 + .../re_renderer/shader/mesh_vertex.wgsl | 22 + .../shader/outlines/jumpflooding_init.wgsl | 85 + .../outlines/jumpflooding_init_msaa.wgsl | 134 + .../outlines/jumpflooding_init_shared.wgsl | 26 + .../shader/outlines/jumpflooding_step.wgsl | 51 + .../re_renderer/shader/point_cloud.wgsl | 204 + .../viewer/re_renderer/shader/rectangle.wgsl | 109 + .../re_renderer/shader/rectangle_fs.wgsl | 194 + .../re_renderer/shader/rectangle_vs.wgsl | 20 + .../re_renderer/shader/screen_triangle.wgsl | 18 + .../shader/screen_triangle_vertex.wgsl | 16 + .../re_renderer/shader/test_triangle.wgsl | 34 + crates/viewer/re_renderer/shader/types.wgsl | 38 + .../re_renderer/shader/utils/camera.wgsl | 133 + .../shader/utils/depth_offset.wgsl | 98 + .../re_renderer/shader/utils/encoding.wgsl | 6 + .../re_renderer/shader/utils/flags.wgsl | 3 + .../shader/utils/interpolation.wgsl | 26 + .../re_renderer/shader/utils/lighting.wgsl | 9 + .../re_renderer/shader/utils/plane.wgsl | 30 + .../re_renderer/shader/utils/quaternion.wgsl | 7 + .../viewer/re_renderer/shader/utils/size.wgsl | 35 + .../re_renderer/shader/utils/sphere_quad.wgsl | 120 + .../viewer/re_renderer/shader/utils/srgb.wgsl | 34 + .../viewer/re_renderer/shader/voxel_grid.wgsl | 107 + .../viewer/re_renderer/shader/world_grid.wgsl | 151 + .../src/allocator/cpu_write_gpu_read_belt.rs | 778 + .../src/allocator/data_texture_source.rs | 428 + .../src/allocator/gpu_readback_belt.rs | 515 + .../viewer/re_renderer/src/allocator/mod.rs | 20 + .../src/allocator/uniform_buffer_fill.rs | 99 + crates/viewer/re_renderer/src/color.rs | 44 + crates/viewer/re_renderer/src/colormap.rs | 333 + crates/viewer/re_renderer/src/context.rs | 729 + crates/viewer/re_renderer/src/context_test.rs | 62 + crates/viewer/re_renderer/src/depth_offset.rs | 16 + crates/viewer/re_renderer/src/device_caps.rs | 617 + .../src/draw_phases/draw_phase_manager.rs | 774 + .../viewer/re_renderer/src/draw_phases/mod.rs | 62 + .../re_renderer/src/draw_phases/outlines.rs | 571 + .../src/draw_phases/picking_layer.rs | 603 + .../re_renderer/src/draw_phases/screenshot.rs | 146 + .../src/error_handling/error_tracker.rs | 125 + .../re_renderer/src/error_handling/mod.rs | 4 + .../src/error_handling/wgpu_core_error.rs | 219 + .../viewer/re_renderer/src/file_resolver.rs | 874 + crates/viewer/re_renderer/src/file_server.rs | 318 + crates/viewer/re_renderer/src/file_system.rs | 159 + .../viewer/re_renderer/src/global_bindings.rs | 166 + .../re_renderer/src/importer/cpu_model.rs | 105 + crates/viewer/re_renderer/src/importer/dae.rs | 445 + .../viewer/re_renderer/src/importer/gltf.rs | 331 + crates/viewer/re_renderer/src/importer/mod.rs | 15 + crates/viewer/re_renderer/src/importer/obj.rs | 106 + crates/viewer/re_renderer/src/importer/stl.rs | 84 + crates/viewer/re_renderer/src/label.rs | 56 + crates/viewer/re_renderer/src/lib.rs | 157 + .../re_renderer/src/line_drawable_builder.rs | 578 + crates/viewer/re_renderer/src/mesh.rs | 414 + .../re_renderer/src/point_cloud_builder.rs | 311 + .../re_renderer/src/queueable_draw_data.rs | 68 + crates/viewer/re_renderer/src/rect.rs | 109 + .../re_renderer/src/renderer/compositor.rs | 256 + .../re_renderer/src/renderer/debug_overlay.rs | 255 + .../re_renderer/src/renderer/depth_cloud.rs | 523 + .../src/renderer/generic_skybox.rs | 184 + .../viewer/re_renderer/src/renderer/lines.rs | 891 + .../re_renderer/src/renderer/mesh_renderer.rs | 1062 ++ crates/viewer/re_renderer/src/renderer/mod.rs | 227 + .../src/renderer/plane_clustering.rs | 269 + .../re_renderer/src/renderer/point_cloud.rs | 664 + .../re_renderer/src/renderer/rectangles.rs | 840 + .../re_renderer/src/renderer/test_triangle.rs | 104 + .../re_renderer/src/renderer/voxel_grid.rs | 635 + .../re_renderer/src/renderer/world_grid.rs | 208 + .../image_data_to_texture.rs | 396 + .../re_renderer/src/resource_managers/mod.rs | 19 + .../src/resource_managers/texture_manager.rs | 507 + .../src/resource_managers/yuv_converter.rs | 566 + .../viewer/re_renderer/src/shape_builder.rs | 100 + crates/viewer/re_renderer/src/size.rs | 132 + crates/viewer/re_renderer/src/texture_info.rs | 214 + .../re_renderer/src/texture_readback.rs | 89 + crates/viewer/re_renderer/src/transform.rs | 179 + crates/viewer/re_renderer/src/util.rs | 165 + .../re_renderer/src/video/chunk_decoder.rs | 280 + crates/viewer/re_renderer/src/video/mod.rs | 299 + crates/viewer/re_renderer/src/view_builder.rs | 938 + .../re_renderer/src/wgpu_buffer_types.rs | 335 + .../wgpu_resources/bind_group_layout_pool.rs | 49 + .../src/wgpu_resources/bind_group_pool.rs | 224 + .../src/wgpu_resources/buffer_pool.rs | 89 + .../wgpu_resources/dynamic_resource_pool.rs | 398 + .../re_renderer/src/wgpu_resources/mod.rs | 112 + .../wgpu_resources/pipeline_layout_pool.rs | 61 + .../wgpu_resources/render_pipeline_pool.rs | 282 + .../src/wgpu_resources/resource.rs | 23 + .../src/wgpu_resources/sampler_pool.rs | 81 + .../src/wgpu_resources/shader_module_pool.rs | 180 + .../wgpu_resources/static_resource_pool.rs | 209 + .../src/wgpu_resources/texture_pool.rs | 149 + .../re_renderer/src/workspace_shaders.rs | 231 + .../re_renderer/tests/shader_validation.rs | 165 + crates/viewer/re_renderer_examples/2d.rs | 374 + crates/viewer/re_renderer_examples/Cargo.toml | 81 + crates/viewer/re_renderer_examples/README.md | 19 + .../re_renderer_examples/assets/rerun.obj.zip | Bin 0 -> 36797 bytes .../re_renderer_examples/depth_cloud.rs | 483 + .../re_renderer_examples/depth_offset.rs | 157 + .../viewer/re_renderer_examples/framework.rs | 436 + .../viewer/re_renderer_examples/multiview.rs | 428 + .../viewer/re_renderer_examples/outlines.rs | 153 + crates/viewer/re_renderer_examples/picking.rs | 212 + .../re_renderer_examples/point_cloud_bench.rs | 885 + .../viewer/re_renderer_examples/world_grid.rs | 137 + crates/viewer/re_selection_panel/Cargo.toml | 49 + crates/viewer/re_selection_panel/README.md | 10 + .../re_selection_panel/src/defaults_ui.rs | 397 + .../src/item_heading_no_breadcrumbs.rs | 102 + .../src/item_heading_with_breadcrumbs.rs | 331 + .../re_selection_panel/src/item_title.rs | 265 + crates/viewer/re_selection_panel/src/lib.rs | 48 + .../re_selection_panel/src/selection_panel.rs | 2018 ++ .../src/view_entity_picker.rs | 446 + .../src/view_space_origin_ui.rs | 219 + .../src/visible_time_range_ui.rs | 419 + .../re_selection_panel/src/visualizer_ui.rs | 1453 ++ ...ction_panel_component_hybrid_overwrite.png | 3 + .../selection_panel_component_static.png | 3 + ...ction_panel_component_static_overwrite.png | 3 + ...on_panel_component_temporal_latest_all.png | 3 + ...ent_temporal_latest_all_multi_instance.png | 3 + ...lection_panel_entity_static_latest_all.png | 3 + ...ction_panel_entity_temporal_latest_all.png | 3 + .../snapshots/selection_panel_recording.png | 3 + ...selection_panel_recording_hover_app_id.png | 3 + .../tests/snapshots/selection_panel_view.png | 3 + .../selection_panel_view_entity_no_match.png | 3 + ...tion_panel_view_entity_no_visualizable.png | 3 + crates/viewer/re_test_context/Cargo.toml | 45 + crates/viewer/re_test_context/README.md | 13 + crates/viewer/re_test_context/src/lib.rs | 1054 ++ crates/viewer/re_test_viewport/Cargo.toml | 38 + crates/viewer/re_test_viewport/README.md | 13 + crates/viewer/re_test_viewport/src/lib.rs | 202 + .../viewer/re_test_viewport/src/test_view.rs | 122 + .../tests/show_hide_in_all_views.rs | 151 + .../tests/view_query_tests.rs | 98 + crates/viewer/re_time_panel/Cargo.toml | 66 + crates/viewer/re_time_panel/README.md | 10 + .../benches/bench_density_graph.rs | 226 + .../re_time_panel/src/data_density_graph.rs | 919 + crates/viewer/re_time_panel/src/lib.rs | 32 + ...ecursive_chunks_per_timeline_subscriber.rs | 377 + .../re_time_panel/src/streams_tree_data.rs | 303 + crates/viewer/re_time_panel/src/time_axis.rs | 183 + .../re_time_panel/src/time_control_ui.rs | 298 + crates/viewer/re_time_panel/src/time_panel.rs | 2053 +++ .../re_time_panel/src/time_selection_ui.rs | 582 + .../snapshots/focused_item_is_focused.png | 3 + .../snapshots/help_view_timeline_mac.png | 3 + .../snapshots/help_view_timeline_windows.png | 3 + .../tests/snapshots/time_panel_dense_data.png | 3 + ...time_panel_filter_test_active_no_query.png | 3 + .../time_panel_filter_test_active_query.png | 3 + .../time_panel_filter_test_inactive.png | 3 + .../time_panel_loading_unloaded_chunks.png | 3 + .../time_panel_only_unloaded_chunks.png | 3 + .../time_panel_partially_unloaded_chunks.png | 3 + .../snapshots/time_panel_two_sections.png | 3 + ...nel_two_sections_with_two_valid_ranges.png | 3 + ...tions_with_two_valid_ranges_zoomed_out.png | 3 + ...me_panel_two_sections_with_valid_range.png | 3 + ...o_sections_with_valid_range_zoomed_out.png | 3 + .../various_entity_kinds_timeline_a_0.png | 3 + .../various_entity_kinds_timeline_a_5.png | 3 + ...y_kinds_timeline_a_9223372036854775807.png | 3 + .../various_entity_kinds_timeline_b_0.png | 3 + .../various_entity_kinds_timeline_b_5.png | 3 + ...y_kinds_timeline_b_9223372036854775807.png | 3 + .../various_filters-_path_to,_rig.png | 3 + .../various_filters-_path_to,_rig.snap | 37 + .../snapshots/various_filters-_to_the.png | 3 + .../snapshots/various_filters-_to_the.snap | 44 + .../snapshots/various_filters-_to_the_.png | 3 + .../snapshots/various_filters-_to_the_.snap | 44 + .../snapshots/various_filters-ath,left.png | 3 + .../snapshots/various_filters-ath,left.snap | 35 + .../tests/snapshots/various_filters-ath,t.png | 3 + .../snapshots/various_filters-ath,t.snap | 94 + .../tests/snapshots/various_filters-none.png | 3 + .../tests/snapshots/various_filters-none.snap | 106 + .../tests/snapshots/various_filters-path.png | 3 + .../tests/snapshots/various_filters-path.snap | 82 + .../tests/snapshots/various_filters-t.png | 3 + .../tests/snapshots/various_filters-t.snap | 124 + .../snapshots/various_filters-to_the,oid.png | 3 + .../snapshots/various_filters-to_the,oid.snap | 46 + .../snapshots/various_filters-to_the.png | 3 + .../snapshots/various_filters-to_the.snap | 72 + .../snapshots/various_filters-to_the_.png | 3 + .../snapshots/various_filters-to_the_.snap | 44 + .../tests/snapshots/various_filters-void.png | 3 + .../tests/snapshots/various_filters-void.snap | 42 + .../tests/time_panel_filter_tests.rs | 154 + .../re_time_panel/tests/time_panel_tests.rs | 508 + crates/viewer/re_time_ruler/Cargo.toml | 34 + crates/viewer/re_time_ruler/README.md | 14 + crates/viewer/re_time_ruler/src/lib.rs | 24 + crates/viewer/re_time_ruler/src/paint_gaps.rs | 158 + .../viewer/re_time_ruler/src/paint_ticks.rs | 227 + .../re_time_ruler/src/time_ranges_ui.rs | 508 + crates/viewer/re_ui/Cargo.toml | 97 + crates/viewer/re_ui/README.md | 16 + crates/viewer/re_ui/build.rs | 25 + crates/viewer/re_ui/data/Inter-Medium.otf | Bin 0 -> 269692 bytes crates/viewer/re_ui/data/Inter-README.txt | 43 + crates/viewer/re_ui/data/OFL.txt | 93 + crates/viewer/re_ui/data/color_table.ron | 940 + crates/viewer/re_ui/data/dark_theme.ron | 514 + crates/viewer/re_ui/data/icons/add.svg | 10 + crates/viewer/re_ui/data/icons/app.svg | 10 + .../viewer/re_ui/data/icons/application.svg | 12 + crates/viewer/re_ui/data/icons/arrow_down.svg | 3 + crates/viewer/re_ui/data/icons/arrow_left.svg | 10 + .../viewer/re_ui/data/icons/arrow_right.svg | 10 + crates/viewer/re_ui/data/icons/arrow_up.svg | 3 + crates/viewer/re_ui/data/icons/blueprint.svg | 3 + .../re_ui/data/icons/bottom_panel_toggle.svg | 3 + .../data/icons/breadcrumbs_separator.svg | 3 + crates/viewer/re_ui/data/icons/checked.svg | 3 + crates/viewer/re_ui/data/icons/chevron.svg | 3 + .../viewer/re_ui/data/icons/chrome_close.svg | 3 + .../re_ui/data/icons/chrome_maximize.svg | 3 + .../re_ui/data/icons/chrome_minimize.svg | 3 + .../re_ui/data/icons/chrome_restore.svg | 3 + crates/viewer/re_ui/data/icons/close.svg | 3 + .../viewer/re_ui/data/icons/close_small.svg | 3 + .../re_ui/data/icons/column_visibility.svg | 10 + crates/viewer/re_ui/data/icons/columns.svg | 3 + .../viewer/re_ui/data/icons/combo_arrow.svg | 3 + crates/viewer/re_ui/data/icons/command.svg | 3 + crates/viewer/re_ui/data/icons/component.svg | 3 + .../re_ui/data/icons/component_static.svg | 3 + .../re_ui/data/icons/container_grid.svg | 10 + .../re_ui/data/icons/container_horizontal.svg | 10 + .../re_ui/data/icons/container_tabs.svg | 10 + .../re_ui/data/icons/container_vertical.svg | 10 + crates/viewer/re_ui/data/icons/control.svg | 3 + crates/viewer/re_ui/data/icons/copy.svg | 3 + .../viewer/re_ui/data/icons/data_source.svg | 3 + crates/viewer/re_ui/data/icons/dataset.svg | 3 + crates/viewer/re_ui/data/icons/discord.svg | 3 + .../viewer/re_ui/data/icons/dnd_add_new.svg | 3 + .../re_ui/data/icons/dnd_add_to_existing.svg | 10 + crates/viewer/re_ui/data/icons/dnd_denied.svg | 3 + crates/viewer/re_ui/data/icons/dnd_handle.svg | 8 + crates/viewer/re_ui/data/icons/dnd_move.svg | 10 + crates/viewer/re_ui/data/icons/download.svg | 12 + .../re_ui/data/icons/dropdown_arrow.svg | 3 + crates/viewer/re_ui/data/icons/edit.svg | 3 + crates/viewer/re_ui/data/icons/entity.svg | 3 + .../viewer/re_ui/data/icons/entity_empty.svg | 3 + .../re_ui/data/icons/entity_reserved.svg | 10 + .../data/icons/entity_reserved_empty.svg | 10 + crates/viewer/re_ui/data/icons/error.svg | 3 + crates/viewer/re_ui/data/icons/expand.svg | 3 + .../viewer/re_ui/data/icons/external_link.svg | 3 + crates/viewer/re_ui/data/icons/filter.svg | 3 + .../viewer/re_ui/data/icons/flag_toggled.svg | 4 + .../re_ui/data/icons/flag_untoggled.svg | 3 + crates/viewer/re_ui/data/icons/follow.svg | 3 + crates/viewer/re_ui/data/icons/github.svg | 3 + crates/viewer/re_ui/data/icons/group.svg | 10 + crates/viewer/re_ui/data/icons/help.svg | 3 + crates/viewer/re_ui/data/icons/home.svg | 4 + crates/viewer/re_ui/data/icons/info.svg | 3 + .../viewer/re_ui/data/icons/internal_link.svg | 4 + crates/viewer/re_ui/data/icons/invisible.svg | 3 + .../re_ui/data/icons/left_panel_toggle.svg | 3 + crates/viewer/re_ui/data/icons/link.svg | 3 + crates/viewer/re_ui/data/icons/lmc.svg | 3 + crates/viewer/re_ui/data/icons/loop.svg | 4 + crates/viewer/re_ui/data/icons/maximize.svg | 10 + crates/viewer/re_ui/data/icons/minimize.svg | 10 + crates/viewer/re_ui/data/icons/more.svg | 3 + .../viewer/re_ui/data/icons/notification.svg | 3 + .../re_ui/data/icons/open_recording.svg | 3 + crates/viewer/re_ui/data/icons/option.svg | 3 + crates/viewer/re_ui/data/icons/pause.svg | 3 + crates/viewer/re_ui/data/icons/play.svg | 3 + crates/viewer/re_ui/data/icons/recording.svg | 10 + crates/viewer/re_ui/data/icons/remove.svg | 10 + crates/viewer/re_ui/data/icons/rerun_logo.png | Bin 0 -> 83924 bytes .../re_ui/data/icons/rerun_wordmark.svg | 3 + crates/viewer/re_ui/data/icons/reset.svg | 3 + .../re_ui/data/icons/right_panel_toggle.svg | 3 + crates/viewer/re_ui/data/icons/rmc.svg | 3 + crates/viewer/re_ui/data/icons/scroll.svg | 10 + crates/viewer/re_ui/data/icons/search.svg | 3 + crates/viewer/re_ui/data/icons/settings.svg | 4 + crates/viewer/re_ui/data/icons/shift.svg | 3 + crates/viewer/re_ui/data/icons/success.svg | 3 + crates/viewer/re_ui/data/icons/table.svg | 3 + .../re_ui/data/icons/table_grid_view.svg | 6 + .../re_ui/data/icons/table_row_view.svg | 5 + crates/viewer/re_ui/data/icons/trash.svg | 3 + crates/viewer/re_ui/data/icons/url.svg | 11 + .../viewer/re_ui/data/icons/video_error.svg | 3 + crates/viewer/re_ui/data/icons/view_2d.svg | 10 + crates/viewer/re_ui/data/icons/view_3d.svg | 10 + .../re_ui/data/icons/view_dataframe.svg | 10 + .../viewer/re_ui/data/icons/view_generic.svg | 10 + crates/viewer/re_ui/data/icons/view_graph.svg | 13 + .../re_ui/data/icons/view_histogram.svg | 10 + crates/viewer/re_ui/data/icons/view_log.svg | 10 + crates/viewer/re_ui/data/icons/view_map.svg | 12 + .../re_ui/data/icons/view_state_timeline.svg | 7 + .../viewer/re_ui/data/icons/view_tensor.svg | 10 + crates/viewer/re_ui/data/icons/view_text.svg | 10 + .../re_ui/data/icons/view_timeseries.svg | 3 + .../viewer/re_ui/data/icons/view_unknown.svg | 10 + crates/viewer/re_ui/data/icons/visible.svg | 3 + crates/viewer/re_ui/data/icons/warn.svg | 3 + crates/viewer/re_ui/data/light_theme.ron | 507 + crates/viewer/re_ui/data/logo_dark_mode.png | Bin 0 -> 12227 bytes crates/viewer/re_ui/data/logo_light_mode.png | Bin 0 -> 12287 bytes .../re_ui/examples/cmd_palette_example.rs | 263 + .../examples/re_ui_example/drag_and_drop.rs | 121 + .../hierarchical_drag_and_drop.rs | 437 + .../re_ui/examples/re_ui_example/main.rs | 631 + .../examples/re_ui_example/right_panel.rs | 501 + crates/viewer/re_ui/src/alert.rs | 168 + crates/viewer/re_ui/src/button.rs | 314 + crates/viewer/re_ui/src/color_table.rs | 234 + crates/viewer/re_ui/src/combo_item.rs | 247 + .../viewer/re_ui/src/command/environment.rs | 17 + crates/viewer/re_ui/src/command/mod.rs | 262 + .../re_ui/src/command/recording_command.rs | 541 + .../re_ui/src/command/redap_server_command.rs | 171 + .../viewer/re_ui/src/command/table_command.rs | 98 + crates/viewer/re_ui/src/command/ui_command.rs | 481 + crates/viewer/re_ui/src/command_palette.rs | 457 + crates/viewer/re_ui/src/context_ext.rs | 212 + crates/viewer/re_ui/src/design_tokens.rs | 1188 ++ crates/viewer/re_ui/src/drag_and_drop.rs | 367 + .../viewer/re_ui/src/egui_ext/boxed_widget.rs | 40 + .../viewer/re_ui/src/egui_ext/card_layout.rs | 238 + crates/viewer/re_ui/src/egui_ext/group.rs | 63 + .../re_ui/src/egui_ext/kb_shortcut_ext.rs | 25 + .../re_ui/src/egui_ext/layout_job_ext.rs | 18 + crates/viewer/re_ui/src/egui_ext/mod.rs | 15 + .../viewer/re_ui/src/egui_ext/response_ext.rs | 68 + .../viewer/re_ui/src/egui_ext/widget_ext.rs | 190 + .../re_ui/src/egui_ext/widget_text_ext.rs | 31 + crates/viewer/re_ui/src/filter_widget.rs | 864 + crates/viewer/re_ui/src/fuzzy.rs | 281 + crates/viewer/re_ui/src/help.rs | 203 + .../re_ui/src/hot_reload_design_tokens.rs | 166 + crates/viewer/re_ui/src/icon_text.rs | 100 + crates/viewer/re_ui/src/icons.rs | 264 + crates/viewer/re_ui/src/lib.rs | 308 + .../re_ui/src/list_item/button_content.rs | 74 + .../re_ui/src/list_item/custom_content.rs | 212 + .../re_ui/src/list_item/debug_content.rs | 35 + .../re_ui/src/list_item/item_buttons.rs | 264 + .../re_ui/src/list_item/label_content.rs | 286 + .../viewer/re_ui/src/list_item/list_item.rs | 682 + crates/viewer/re_ui/src/list_item/mod.rs | 88 + .../viewer/re_ui/src/list_item/navigation.rs | 165 + .../re_ui/src/list_item/property_content.rs | 370 + crates/viewer/re_ui/src/list_item/scope.rs | 312 + crates/viewer/re_ui/src/loading_indicator.rs | 119 + crates/viewer/re_ui/src/markdown_utils.rs | 39 + crates/viewer/re_ui/src/menu.rs | 38 + crates/viewer/re_ui/src/modal.rs | 421 + crates/viewer/re_ui/src/notifications.rs | 630 + crates/viewer/re_ui/src/re_form/fields.rs | 67 + crates/viewer/re_ui/src/re_form/form_strip.rs | 132 + crates/viewer/re_ui/src/re_form/mod.rs | 7 + crates/viewer/re_ui/src/re_form/selectable.rs | 122 + .../viewer/re_ui/src/relative_time_range.rs | 415 + .../re_ui/src/section_collapsing_header.rs | 89 + .../viewer/re_ui/src/syntax_highlighting.rs | 511 + crates/viewer/re_ui/src/testing.rs | 52 + crates/viewer/re_ui/src/text_edit.rs | 168 + crates/viewer/re_ui/src/time.rs | 61 + crates/viewer/re_ui/src/time_drag_value.rs | 271 + crates/viewer/re_ui/src/ui_ext.rs | 1433 ++ crates/viewer/re_ui/src/ui_layout.rs | 223 + crates/viewer/re_ui/src/wayland.rs | 218 + .../re_ui/tests/command_palette_test.rs | 213 + .../viewer/re_ui/tests/filter_widget_test.rs | 35 + crates/viewer/re_ui/tests/help_ui_test.rs | 63 + crates/viewer/re_ui/tests/list_item_tests.rs | 242 + crates/viewer/re_ui/tests/modal_tests.rs | 66 + .../viewer/re_ui/tests/notification_test.rs | 44 + .../re_ui/tests/snapshots/alert_dark.png | 3 + .../re_ui/tests/snapshots/alert_light.png | 3 + .../re_ui/tests/snapshots/combo_item.png | 3 + .../command_palette_enabled_vs_disabled.png | 3 + .../command_palette_expanded_group.png | 3 + .../command_palette_truncated_group.png | 3 + .../command_palette_wraps_long_paths.png | 3 + .../re_ui/tests/snapshots/filter_widget.png | 3 + .../viewer/re_ui/tests/snapshots/help_Mac.png | 3 + .../re_ui/tests/snapshots/help_Windows.png | 3 + .../re_ui/tests/snapshots/list_items.png | 3 + .../re_ui/tests/snapshots/modal_list_item.png | 3 + .../re_ui/tests/snapshots/modal_normal.png | 3 + .../snapshots/notification_with_fields.png | 3 + .../relative_time_range_absolute_duration.png | 3 + .../relative_time_range_absolute_sequence.png | 3 + ...relative_time_range_absolute_timestamp.png | 3 + ...ve_time_range_absolute_to_end_duration.png | 3 + ...ve_time_range_absolute_to_end_sequence.png | 3 + ...e_time_range_absolute_to_end_timestamp.png | 3 + ...tive_time_range_around_cursor_duration.png | 3 + ...tive_time_range_around_cursor_sequence.png | 3 + ...ive_time_range_around_cursor_timestamp.png | 3 + ...relative_time_range_at_cursor_duration.png | 3 + ...relative_time_range_at_cursor_sequence.png | 3 + ...elative_time_range_at_cursor_timestamp.png | 3 + ...tive_time_range_cursor_to_end_duration.png | 3 + ...tive_time_range_cursor_to_end_sequence.png | 3 + ...ive_time_range_cursor_to_end_timestamp.png | 3 + ...elative_time_range_everything_duration.png | 3 + ...elative_time_range_everything_sequence.png | 3 + ...lative_time_range_everything_timestamp.png | 3 + ..._time_range_start_to_absolute_duration.png | 3 + ..._time_range_start_to_absolute_sequence.png | 3 + ...time_range_start_to_absolute_timestamp.png | 3 + ...ve_time_range_start_to_cursor_duration.png | 3 + ...ve_time_range_start_to_cursor_sequence.png | 3 + ...e_time_range_start_to_cursor_timestamp.png | 3 + crates/viewer/re_view/Cargo.toml | 44 + crates/viewer/re_view/README.md | 10 + .../re_view/src/annotation_context_utils.rs | 133 + .../re_view/src/annotation_scene_context.rs | 47 + .../re_view/src/blueprint_resolved_results.rs | 744 + .../re_view/src/chunks_with_component.rs | 168 + crates/viewer/re_view/src/clears.rs | 88 + crates/viewer/re_view/src/component_drop.rs | 268 + crates/viewer/re_view/src/controls.rs | 45 + .../re_view/src/instance_hash_conversions.rs | 24 + crates/viewer/re_view/src/lib.rs | 232 + crates/viewer/re_view/src/outlines.rs | 28 + crates/viewer/re_view/src/query.rs | 794 + crates/viewer/re_view/src/view_property_ui.rs | 298 + crates/viewer/re_view/src/visualizer_query.rs | 185 + crates/viewer/re_view_bar_chart/Cargo.toml | 41 + crates/viewer/re_view_bar_chart/README.md | 11 + crates/viewer/re_view_bar_chart/src/lib.rs | 8 + .../re_view_bar_chart/src/view_class.rs | 516 + .../src/visualizer_system.rs | 123 + .../re_view_bar_chart/tests/bar_chart_test.rs | 38 + .../tests/snapshots/bar_chart_1d.png | 3 + .../help_view_bar_chart_view_mac.png | 3 + .../help_view_bar_chart_view_windows.png | 3 + crates/viewer/re_view_dataframe/Cargo.toml | 46 + crates/viewer/re_view_dataframe/README.md | 10 + .../re_view_dataframe/src/dataframe_ui.rs | 840 + .../re_view_dataframe/src/expanded_rows.rs | 152 + crates/viewer/re_view_dataframe/src/lib.rs | 13 + .../re_view_dataframe/src/view_class.rs | 261 + .../src/view_query/blueprint.rs | 585 + .../re_view_dataframe/src/view_query/mod.rs | 57 + .../re_view_dataframe/src/view_query/ui.rs | 683 + .../src/visualizer_system.rs | 35 + .../viewer/re_view_dataframe/tests/basic.rs | 136 + .../help_view_dataframe_view_mac.png | 3 + .../help_view_dataframe_view_windows.png | 3 + .../tests/snapshots/null_timeline.png | 3 + .../unknown_timeline_selection_panel_ui.png | 3 + .../snapshots/unknown_timeline_view_ui.png | 3 + crates/viewer/re_view_graph/Cargo.toml | 43 + crates/viewer/re_view_graph/README.md | 11 + crates/viewer/re_view_graph/src/graph/hash.rs | 43 + crates/viewer/re_view_graph/src/graph/ids.rs | 56 + crates/viewer/re_view_graph/src/graph/mod.rs | 152 + .../re_view_graph/src/layout/geometry.rs | 76 + crates/viewer/re_view_graph/src/layout/mod.rs | 12 + .../viewer/re_view_graph/src/layout/params.rs | 101 + .../re_view_graph/src/layout/provider.rs | 395 + .../re_view_graph/src/layout/request.rs | 100 + .../viewer/re_view_graph/src/layout/result.rs | 61 + .../viewer/re_view_graph/src/layout/slots.rs | 63 + crates/viewer/re_view_graph/src/lib.rs | 12 + crates/viewer/re_view_graph/src/ui/draw.rs | 419 + crates/viewer/re_view_graph/src/ui/mod.rs | 7 + .../viewer/re_view_graph/src/ui/selection.rs | 74 + crates/viewer/re_view_graph/src/ui/state.rs | 176 + crates/viewer/re_view_graph/src/view.rs | 310 + .../re_view_graph/src/visualizers/edges.rs | 137 + .../re_view_graph/src/visualizers/mod.rs | 24 + .../re_view_graph/src/visualizers/nodes.rs | 177 + crates/viewer/re_view_graph/tests/basic.rs | 161 + .../tests/snapshots/coincident_nodes.png | 3 + .../snapshots/help_view_graph_view_mac.png | 3 + .../help_view_graph_view_windows.png | 3 + .../tests/snapshots/multi_graphs.png | 3 + .../tests/snapshots/self_and_multi_edges.png | 3 + crates/viewer/re_view_map/Cargo.toml | 44 + crates/viewer/re_view_map/README.md | 10 + crates/viewer/re_view_map/src/lib.rs | 9 + crates/viewer/re_view_map/src/map_overlays.rs | 25 + crates/viewer/re_view_map/src/map_view.rs | 679 + .../src/visualizers/geo_line_strings.rs | 202 + .../re_view_map/src/visualizers/geo_points.rs | 209 + .../viewer/re_view_map/src/visualizers/mod.rs | 156 + .../snapshots/help_view_map_view_mac.png | 3 + .../snapshots/help_view_map_view_windows.png | 3 + crates/viewer/re_view_spatial/Cargo.toml | 88 + crates/viewer/re_view_spatial/README.md | 10 + .../re_view_spatial/src/caches/mesh_cache.rs | 203 + .../viewer/re_view_spatial/src/caches/mod.rs | 3 + .../src/contexts/depth_offsets.rs | 123 + .../re_view_spatial/src/contexts/mod.rs | 34 + .../src/contexts/transform_tree_context.rs | 950 + crates/viewer/re_view_spatial/src/eye.rs | 1251 ++ .../viewer/re_view_spatial/src/heuristics.rs | 158 + crates/viewer/re_view_spatial/src/lib.rs | 92 + .../src/max_image_dimension_subscriber.rs | 327 + .../viewer/re_view_spatial/src/mesh_loader.rs | 275 + .../src/pickable_textured_rect.rs | 56 + crates/viewer/re_view_spatial/src/picking.rs | 347 + .../viewer/re_view_spatial/src/picking_ui.rs | 360 + .../re_view_spatial/src/picking_ui_pixel.rs | 792 + crates/viewer/re_view_spatial/src/pinhole.rs | 73 + .../re_view_spatial/src/pinhole_wrapper.rs | 74 + .../viewer/re_view_spatial/src/proc_mesh.rs | 802 + .../src/scene_bounding_boxes.rs | 166 + .../re_view_spatial/src/shared_fallbacks.rs | 278 + .../re_view_spatial/src/spatial_topology.rs | 710 + crates/viewer/re_view_spatial/src/ui.rs | 511 + crates/viewer/re_view_spatial/src/ui_2d.rs | 567 + crates/viewer/re_view_spatial/src/ui_3d.rs | 734 + crates/viewer/re_view_spatial/src/view_2d.rs | 427 + crates/viewer/re_view_spatial/src/view_3d.rs | 639 + .../src/visualizers/arrows2d.rs | 276 + .../src/visualizers/arrows3d.rs | 278 + .../src/visualizers/assets3d.rs | 190 + .../src/visualizers/boxes2d.rs | 285 + .../src/visualizers/boxes3d.rs | 235 + .../src/visualizers/cameras.rs | 339 + .../src/visualizers/capsules3d.rs | 269 + .../src/visualizers/cylinders3d.rs | 265 + .../src/visualizers/depth_images.rs | 385 + .../src/visualizers/ellipses2d.rs | 290 + .../src/visualizers/ellipsoids.rs | 236 + .../src/visualizers/grid_map.rs | 386 + .../re_view_spatial/src/visualizers/images.rs | 178 + .../src/visualizers/lines2d.rs | 264 + .../src/visualizers/lines3d.rs | 275 + .../re_view_spatial/src/visualizers/meshes.rs | 263 + .../re_view_spatial/src/visualizers/mod.rs | 310 + .../src/visualizers/points2d.rs | 305 + .../src/visualizers/points3d.rs | 506 + .../src/visualizers/segmentation_images.rs | 157 + .../src/visualizers/transform_axes_3d.rs | 322 + .../visualizers/utilities/entity_iterator.rs | 103 + .../src/visualizers/utilities/labels.rs | 187 + .../src/visualizers/utilities/mod.rs | 18 + .../visualizers/utilities/proc_mesh_vis.rs | 422 + .../utilities/spatial_view_visualizer.rs | 124 + .../visualizers/utilities/textured_rect.rs | 82 + .../utilities/transform_retrieval.rs | 348 + .../visualizers/video/encoded_depth_image.rs | 165 + .../src/visualizers/video/encoded_image.rs | 83 + .../src/visualizers/video/mod.rs | 813 + .../video/video_frame_reference.rs | 297 + .../src/visualizers/video/video_stream.rs | 81 + .../src/visualizers/voxel_grid_map.rs | 400 + .../tests/annotation_context_update.rs | 141 + .../re_view_spatial/tests/annotations.rs | 175 + .../re_view_spatial/tests/bgr_images.rs | 154 + .../re_view_spatial/tests/blueprint_2d.rs | 124 + .../tests/chroma_subsampling.rs | 114 + .../viewer/re_view_spatial/tests/dae_mesh.rs | 95 + .../re_view_spatial/tests/draw_order.rs | 170 + .../viewer/re_view_spatial/tests/grid_map.rs | 198 + .../tests/latest_at_partial_updates.rs | 157 + .../tests/magnification_filter.rs | 125 + crates/viewer/re_view_spatial/tests/mesh.rs | 52 + .../tests/mesh_face_rendering.rs | 139 + .../re_view_spatial/tests/opacity_2d.rs | 84 + .../tests/partial_view_visibility.rs | 104 + .../re_view_spatial/tests/pinhole_camera.rs | 56 + .../tests/pinhole_draw_order.rs | 273 + .../re_view_spatial/tests/point_shading.rs | 72 + .../tests/points2d_ui_radius.rs | 79 + .../tests/project_2d_and_3d.rs | 268 + .../tests/segmentation_image_transparency.rs | 92 + .../tests/select_box_instances.rs | 83 + .../tests/snapshots/2d_in_3d_at_origin.png | 3 + .../tests/snapshots/2d_in_3d_at_root.png | 3 + ...d_in_3d_with_explicit_frames_at_origin.png | 3 + .../2d_in_3d_with_explicit_frames_at_root.png | 3 + .../tests/snapshots/3d_in_2d.png | 3 + .../3d_in_2d_with_explicit_frames.png | 3 + .../annotation_context_update_frame1.png | 3 + .../annotation_context_update_frame2.png | 3 + .../annotations_hover_background.png | 3 + .../annotations_hover_rect_green.png | 3 + .../snapshots/annotations_hover_rect_red.png | 3 + .../annotations_hover_region_green.png | 3 + .../annotations_hover_region_red.png | 3 + .../tests/snapshots/annotations_overview.png | 3 + .../tests/snapshots/bgr_images_bgr_f16.png | 3 + .../tests/snapshots/bgr_images_bgr_f32.png | 3 + .../tests/snapshots/bgr_images_bgr_f64.png | 3 + .../tests/snapshots/bgr_images_bgr_i16.png | 3 + .../tests/snapshots/bgr_images_bgr_i32.png | 3 + .../tests/snapshots/bgr_images_bgr_i64.png | 3 + .../tests/snapshots/bgr_images_bgr_u16.png | 3 + .../tests/snapshots/bgr_images_bgr_u32.png | 3 + .../tests/snapshots/bgr_images_bgr_u64.png | 3 + .../tests/snapshots/bgr_images_bgr_u8.png | 3 + .../tests/snapshots/bgr_images_bgra_f16.png | 3 + .../tests/snapshots/bgr_images_bgra_f32.png | 3 + .../tests/snapshots/bgr_images_bgra_f64.png | 3 + .../tests/snapshots/bgr_images_bgra_i16.png | 3 + .../tests/snapshots/bgr_images_bgra_i32.png | 3 + .../tests/snapshots/bgr_images_bgra_i64.png | 3 + .../tests/snapshots/bgr_images_bgra_u16.png | 3 + .../tests/snapshots/bgr_images_bgra_u32.png | 3 + .../tests/snapshots/bgr_images_bgra_u64.png | 3 + .../tests/snapshots/bgr_images_bgra_u8.png | 3 + .../blueprint_defaults_with_spatial_2d.png | 3 + ..._overrides_or_defaults_with_spatial_2d.png | 3 + .../blueprint_overrides_with_spatial_2d.png | 3 + .../tests/snapshots/chroma_nv12.png | 3 + .../tests/snapshots/chroma_y8_full.png | 3 + .../tests/snapshots/chroma_y8_limited.png | 3 + .../tests/snapshots/chroma_y_u_v12_full.png | 3 + .../snapshots/chroma_y_u_v12_limited.png | 3 + .../tests/snapshots/chroma_y_u_v16_full.png | 3 + .../snapshots/chroma_y_u_v16_limited.png | 3 + .../tests/snapshots/chroma_y_u_v24_full.png | 3 + .../snapshots/chroma_y_u_v24_limited.png | 3 + .../tests/snapshots/chroma_yuy2.png | 3 + .../tests/snapshots/dae_mesh_import.png | 3 + .../snapshots/dae_multi_triangle_groups.png | 3 + .../tests/snapshots/draw_order.png | 3 + .../tests/snapshots/grid_map_rviz_costmap.png | 3 + .../tests/snapshots/grid_map_rviz_map.png | 3 + .../snapshots/grid_map_texel_accuracy.png | 3 + .../tests/snapshots/help_view_2d_view_mac.png | 3 + .../snapshots/help_view_2d_view_windows.png | 3 + .../tests/snapshots/help_view_3d_view_mac.png | 3 + .../snapshots/help_view_3d_view_windows.png | 3 + .../tests/snapshots/image_from_tensor_1d.png | 3 + .../tests/snapshots/intra_timestamp/42_42.png | 3 + .../tests/snapshots/intra_timestamp/42_44.png | 3 + .../tests/snapshots/intra_timestamp/43_44.png | 3 + .../tests/snapshots/intra_timestamp/43_45.png | 3 + .../tests/snapshots/intra_timestamp/46_46.png | 3 + .../intra_timestamp/infinity_infinity.png | 3 + .../latest_at_partial_updates/frame_42.png | 3 + .../latest_at_partial_updates/frame_43.png | 3 + .../latest_at_partial_updates/frame_44.png | 3 + .../latest_at_partial_updates/frame_45.png | 3 + .../latest_at_partial_updates/frame_46.png | 3 + .../magnification_filter_bicubic.png | 3 + ...gnification_filter_depth_image_bicubic.png | 3 + ...agnification_filter_depth_image_linear.png | 3 + ...gnification_filter_depth_image_nearest.png | 3 + .../snapshots/magnification_filter_linear.png | 3 + .../magnification_filter_nearest.png | 3 + .../snapshots/mesh3d_grayscale_texture.png | 3 + .../mesh_face_rendering_back_opaque.png | 3 + .../mesh_face_rendering_back_transparent.png | 3 + ...esh_face_rendering_double_sided_opaque.png | 3 + ...ace_rendering_double_sided_transparent.png | 3 + .../mesh_face_rendering_front_opaque.png | 3 + .../mesh_face_rendering_front_transparent.png | 3 + .../tests/snapshots/opacity_2d.png | 3 + .../snapshots/partial_view_visibility_2d.png | 3 + .../snapshots/partial_view_visibility_3d.png | 3 + .../tests/snapshots/pinhole_camera.png | 3 + .../pinhole_draw_order_black_above_white.png | 3 + ...aw_order_black_above_white_transparent.png | 3 + ...nhole_draw_order_sandwiched_opaque_red.png | 3 + ..._order_selection_outline_single_entity.png | 3 + .../pinhole_draw_order_white_above_black.png | 3 + ...aw_order_white_above_black_transparent.png | 3 + .../tests/snapshots/point_shading.png | 3 + ...2d_ui_radius_constant_across_positions.png | 3 + .../segmentation_image_transparency.png | 3 + .../snapshots/select_box_instances_0.png | 3 + .../snapshots/select_box_instances_1.png | 3 + .../snapshots/select_box_instances_all.png | 3 + ...tics__2d_and_3d_view_nothing_excluded.snap | 32 + ..._objects_like_scene_2d_view_heuristic.snap | 31 + ...four_color_views_and_one_segmentation.snap | 49 + ...four_space_views_with_one_overlapping.snap | 32 + ...n_heuristics__one_3d_view_one_2d_view.snap | 32 + ...n_heuristics__should_be_a_single_view.snap | 25 + ...istics__should_be_three_2d_and_one_3d.snap | 44 + ...eparate_views_because_differing_sizes.snap | 31 + ...ws_because_we_cant_stack_color_images.snap | 31 + ..._2d_views_and_one_3d_excluding_images.snap | 46 + .../static_overwrite_color_override.png | 3 + .../snapshots/static_overwrite_original.png | 3 + .../static_overwrite_radius_default.png | 3 + .../topology_errors__2d_view_at_pinhole.snap | 6 + .../topology_errors__2d_view_at_root.snap | 8 + .../topology_errors__3d_view_at_pinhole.snap | 10 + .../topology_errors__3d_view_at_root.snap | 8 + ...ogy_error_empty_coordinate_frame_name.snap | 6 + ...transform_axes_for_explicit_transforms.png | 3 + ...h_base_transform_EntityHierarchy_boxes.png | 3 + ..._base_transform_EntityHierarchy_points.png | 3 + ...base_transform_EntityHierarchy_spheres.png | 3 + ...ansform_EntityHierarchy_transform_axes.png | 3 + ...th_base_transform_FrameHierarchy_boxes.png | 3 + ...h_base_transform_FrameHierarchy_points.png | 3 + ..._base_transform_FrameHierarchy_spheres.png | 3 + ...ransform_FrameHierarchy_transform_axes.png | 3 + ...lamping_with_base_transform_None_boxes.png | 3 + ...amping_with_base_transform_None_points.png | 3 + ...mping_with_base_transform_None_spheres.png | 3 + ...ith_base_transform_None_transform_axes.png | 3 + ..._frame_overrides_fall_through_to_store.png | 3 + .../snapshots/transform_hierarchy_step_0.png | 3 + .../snapshots/transform_hierarchy_step_1.png | 3 + .../snapshots/transform_hierarchy_step_2.png | 3 + .../snapshots/transform_hierarchy_step_3.png | 3 + .../snapshots/transform_hierarchy_step_4.png | 3 + .../snapshots/transform_hierarchy_step_5.png | 3 + .../snapshots/transform_hierarchy_step_6.png | 3 + .../snapshots/transform_hierarchy_step_7.png | 3 + ...nt_relations_on_single_time_and_entity.png | 3 + ...entity_with_coordinate_frame_overrides.png | 3 + .../snapshots/transform_tree_origins__sun.png | 3 + .../transform_tree_origins__sun_planet.png | 3 + ...ransform_tree_origins__sun_planet_moon.png | 3 + .../transform_tree_visualization.png | 3 + .../tests/snapshots/transparent_boxes3d_0.png | 3 + .../tests/snapshots/transparent_boxes3d_1.png | 3 + .../snapshots/transparent_capsules3d_0.png | 3 + .../snapshots/transparent_capsules3d_1.png | 3 + .../snapshots/transparent_cylinders3d_0.png | 3 + .../snapshots/transparent_cylinders3d_1.png | 3 + .../snapshots/transparent_ellipsoids3d_0.png | 3 + .../snapshots/transparent_ellipsoids3d_1.png | 3 + .../tests/snapshots/transparent_mesh_0.png | 3 + .../tests/snapshots/transparent_mesh_1.png | 3 + .../video_asset_AV1_before_start.png | 3 + .../snapshots/video_asset_AV1_beyond_end.png | 3 + .../video_asset_AV1_not_on_frame_boundary.png | 3 + .../tests/snapshots/video_asset_AV1_start.png | 3 + .../video_asset_H264_before_start.png | 3 + .../snapshots/video_asset_H264_beyond_end.png | 3 + ...video_asset_H264_not_on_frame_boundary.png | 3 + .../snapshots/video_asset_H264_start.png | 3 + .../video_asset_H265_before_start.png | 3 + .../snapshots/video_asset_H265_beyond_end.png | 3 + ...video_asset_H265_not_on_frame_boundary.png | 3 + .../snapshots/video_asset_H265_start.png | 3 + .../video_asset_VP8_before_start.png | 3 + .../snapshots/video_asset_VP8_beyond_end.png | 3 + .../video_asset_VP8_not_on_frame_boundary.png | 3 + .../tests/snapshots/video_asset_VP8_start.png | 3 + .../video_asset_VP9_before_start.png | 3 + .../snapshots/video_asset_VP9_beyond_end.png | 3 + .../video_asset_VP9_not_on_frame_boundary.png | 3 + .../tests/snapshots/video_asset_VP9_start.png | 3 + .../video_stream_AV1_before_start.png | 3 + .../snapshots/video_stream_AV1_beyond_end.png | 3 + ...video_stream_AV1_not_on_frame_boundary.png | 3 + .../snapshots/video_stream_AV1_start.png | 3 + .../video_stream_H264_before_start.png | 3 + .../video_stream_H264_beyond_end.png | 3 + ...ideo_stream_H264_not_on_frame_boundary.png | 3 + .../snapshots/video_stream_H264_start.png | 3 + .../video_stream_H265_before_start.png | 3 + .../video_stream_H265_beyond_end.png | 3 + ...ideo_stream_H265_not_on_frame_boundary.png | 3 + .../snapshots/video_stream_H265_start.png | 3 + .../video_stream_VP8_before_start.png | 3 + .../snapshots/video_stream_VP8_beyond_end.png | 3 + ...video_stream_VP8_not_on_frame_boundary.png | 3 + .../snapshots/video_stream_VP8_start.png | 3 + .../video_stream_VP9_before_start.png | 3 + .../snapshots/video_stream_VP9_beyond_end.png | 3 + ...video_stream_VP9_not_on_frame_boundary.png | 3 + .../snapshots/video_stream_VP9_start.png | 3 + .../visible_time_range_2d/absolute.png | 3 + .../visible_time_range_2d/cursor_relative.png | 3 + .../visible_time_range_2d/infinite.png | 3 + .../visible_time_range_2d/latest_at.png | 3 + .../visible_time_range_2d/override.png | 3 + .../visible_time_range_3d/absolute.png | 3 + .../visible_time_range_3d/cursor_relative.png | 3 + .../visible_time_range_3d/infinite.png | 3 + .../visible_time_range_3d/latest_at.png | 3 + .../visible_time_range_3d/override.png | 3 + .../sliding_window_cursor_1.png | 3 + .../sliding_window_cursor_2.png | 3 + .../sliding_window_cursor_3.png | 3 + .../tests/snapshots/voxel_grid_map.png | 3 + .../voxel_grid_map_transparent_opacity.png | 3 + .../re_view_spatial/tests/spawn_heuristics.rs | 288 + .../re_view_spatial/tests/static_overwrite.rs | 145 + .../re_view_spatial/tests/topology_errors.rs | 307 + .../transform_child_parent_single_time.rs | 322 + .../tests/transform_clamping.rs | 463 + .../tests/transform_hierarchy.rs | 282 + .../tests/transform_tree_origins.rs | 214 + .../tests/transform_tree_visualization.rs | 108 + .../tests/transparent_geometry.rs | 161 + crates/viewer/re_view_spatial/tests/video.rs | 402 + .../tests/visible_time_range.rs | 668 + .../re_view_spatial/tests/voxel_grid_map.rs | 183 + .../viewer/re_view_state_timeline/Cargo.toml | 41 + .../viewer/re_view_state_timeline/README.md | 10 + .../viewer/re_view_state_timeline/src/data.rs | 54 + .../viewer/re_view_state_timeline/src/lib.rs | 12 + .../re_view_state_timeline/src/view_class.rs | 1427 ++ .../re_view_state_timeline/src/visualizer.rs | 685 + .../src/visualizer_ui.rs | 385 + .../re_view_state_timeline/tests/basic.rs | 881 + .../help_view_state_timeline_view_mac.png | 3 + .../help_view_state_timeline_view_windows.png | 3 + .../tests/snapshots/state_cast_bool.png | 3 + .../tests/snapshots/state_cast_float64.png | 3 + .../tests/snapshots/state_cast_int32.png | 3 + .../state_cast_multi_different_types.png | 3 + .../snapshots/state_cast_multi_same_type.png | 3 + .../tests/snapshots/state_cast_string.png | 3 + .../tests/snapshots/state_cast_textlog.png | 3 + .../tests/snapshots/state_configuration.png | 3 + .../tests/snapshots/state_timeline_basic.png | 3 + .../snapshots/state_timeline_edge_cases.png | 3 + .../state_timeline_empty_and_clear.png | 3 + .../state_timeline_merge_small_phases.png | 3 + .../state_timeline_null_is_reset.png | 3 + .../state_timeline_pan_before_data.png | 3 + .../state_timeline_pan_past_data.png | 3 + .../state_timeline_recursive_clear.png | 3 + .../snapshots/state_timeline_time_cursor.png | 3 + ...tate_timeline_timeline_switch_sequence.png | 3 + ...ate_timeline_timeline_switch_timestamp.png | 3 + .../snapshots/state_timeline_zoom_after.png | 3 + .../snapshots/state_timeline_zoom_before.png | 3 + .../tests/state_casting.rs | 808 + crates/viewer/re_view_tensor/Cargo.toml | 45 + crates/viewer/re_view_tensor/README.md | 11 + .../re_view_tensor/src/dimension_mapping.rs | 470 + crates/viewer/re_view_tensor/src/lib.rs | 46 + .../src/tensor_dimension_mapper.rs | 306 + .../re_view_tensor/src/tensor_slice_to_gpu.rs | 171 + .../viewer/re_view_tensor/src/tensor_tests.rs | 106 + .../viewer/re_view_tensor/src/view_class.rs | 736 + .../re_view_tensor/src/visualizer_system.rs | 119 + .../snapshots/help_view_tensor_view_mac.png | 3 + .../help_view_tensor_view_windows.png | 3 + .../tests/snapshots/tensor_1d.png | 3 + .../tests/snapshots/tensor_2d_both.png | 3 + .../tests/snapshots/tensor_2d_root.png | 3 + .../tests/snapshots/tensor_2d_t1.png | 3 + .../tests/snapshots/tensor_2d_t2.png | 3 + .../viewer/re_view_tensor/tests/tensor_1d.rs | 38 + .../viewer/re_view_tensor/tests/tensor_2d.rs | 83 + .../viewer/re_view_text_document/Cargo.toml | 40 + crates/viewer/re_view_text_document/README.md | 10 + .../viewer/re_view_text_document/src/lib.rs | 8 + .../re_view_text_document/src/view_class.rs | 251 + .../src/visualizer_system.rs | 76 + .../help_view_text_document_view_mac.png | 3 + .../help_view_text_document_view_windows.png | 3 + .../tests/snapshots/text_view_both.png | 3 + .../tests/snapshots/text_view_one.png | 3 + .../tests/snapshots/text_view_root.png | 3 + .../tests/snapshots/text_view_two.png | 3 + .../tests/text_document_test.rs | 78 + crates/viewer/re_view_text_log/Cargo.toml | 43 + crates/viewer/re_view_text_log/README.md | 11 + crates/viewer/re_view_text_log/src/lib.rs | 8 + .../viewer/re_view_text_log/src/view_class.rs | 625 + .../re_view_text_log/src/visualizer_system.rs | 163 + crates/viewer/re_view_text_log/tests/basic.rs | 67 + .../snapshots/help_view_text_log_view_mac.png | 3 + .../help_view_text_log_view_windows.png | 3 + ...poral_anchor_between_steps_first_chunk.png | 3 + ...log_temporal_anchor_between_steps_rest.png | 3 + crates/viewer/re_view_time_series/Cargo.toml | 54 + crates/viewer/re_view_time_series/README.md | 11 + .../re_view_time_series/src/aggregation.rs | 527 + .../re_view_time_series/src/fallbacks.rs | 223 + crates/viewer/re_view_time_series/src/lib.rs | 157 + .../src/line_visualizer_system.rs | 579 + .../viewer/re_view_time_series/src/markers.rs | 257 + .../viewer/re_view_time_series/src/naming.rs | 270 + .../src/point_visualizer_system.rs | 460 + .../re_view_time_series/src/series_query.rs | 428 + crates/viewer/re_view_time_series/src/util.rs | 334 + .../re_view_time_series/src/view_class.rs | 1922 ++ .../re_view_time_series/src/visualizer_ui.rs | 396 + .../tests/automatic_mapping.rs | 793 + .../viewer/re_view_time_series/tests/basic.rs | 758 + .../re_view_time_series/tests/blueprint.rs | 766 + .../tests/component_drop.rs | 240 + .../tests/interpolation.rs | 73 + .../tests/snapshots/all_neg_inf.png | 3 + .../tests/snapshots/all_pos_inf.png | 3 + ...verrides_and_defaults_with_time_series.png | 3 + ...and_defaults_with_time_series_absolute.png | 3 + ...ts_with_time_series_absolute_until_end.png | 3 + ...efaults_with_time_series_around_cursor.png | 3 + ...nd_defaults_with_time_series_at_cursor.png | 3 + ...d_defaults_with_time_series_everything.png | 3 + ..._with_time_series_start_until_absolute.png | 3 + .../bootstrapped_secondaries_full.png | 3 + .../bootstrapped_secondaries_partial.png | 3 + .../clear_series_points_and_line.png | 3 + ..._points_and_line_two_series_per_entity.png | 3 + .../custom_scalar_component_identifier.png | 3 + .../snapshots/explicit_component_mapping.png | 3 + .../explicit_component_mapping_nested.png | 3 + .../help_view_time_series_view_mac.png | 3 + .../help_view_time_series_view_windows.png | 3 + .../snapshots/interpolation_mode_Linear.png | 3 + .../interpolation_mode_StepAfter.png | 3 + .../interpolation_mode_StepBefore.png | 3 + .../snapshots/interpolation_mode_StepMid.png | 3 + ...tiple_properties_two_series_per_entity.png | 3 + .../line_properties_two_series_per_entity.png | 3 + .../multi_channel_scalars_per_entity.png | 3 + .../tests/snapshots/non_finite_islands.png | 3 + ...per_series_visibility_show_second_only.png | 3 + .../per_series_visibility_splat_false.png | 3 + .../per_series_visibility_splat_true.png | 3 + .../tests/snapshots/point_properties.png | 3 + ...tiple_properties_two_series_per_entity.png | 3 + ...point_properties_two_series_per_entity.png | 3 + .../special_characters_in_entity_path.png | 3 + ...poral_anchor_between_steps_first_chunk.png | 3 + ...ies_temporal_anchor_between_steps_rest.png | 3 + .../snapshots/transform3d_time_series.png | 3 + ...ime_range_absolute_until_end_view_data.png | 3 + ...range_absolute_until_end_view_timeline.png | 3 + .../visible_time_range_absolute_view_data.png | 3 + ...ible_time_range_absolute_view_timeline.png | 3 + ...ble_time_range_around_cursor_view_data.png | 3 + ...time_range_around_cursor_view_timeline.png | 3 + ...isible_time_range_everything_view_data.png | 3 + ...le_time_range_everything_view_timeline.png | 3 + ...e_range_start_until_absolute_view_data.png | 3 + ...nge_start_until_absolute_view_timeline.png | 3 + crates/viewer/re_viewer/Cargo.toml | 214 + crates/viewer/re_viewer/README.md | 14 + crates/viewer/re_viewer/build.rs | 3 + crates/viewer/re_viewer/data/app_icon.png | Bin 0 -> 99475 bytes crates/viewer/re_viewer/data/app_icon_mac.png | Bin 0 -> 270325 bytes .../data/quick_start_guides/cpp_connect.md | 47 + .../data/quick_start_guides/cpp_spawn.md | 45 + .../quick_start_guides/how_does_it_work.md | 9 + .../data/quick_start_guides/python_connect.md | 26 + .../data/quick_start_guides/python_spawn.md | 25 + .../quick_start_connect.cpp | 17 + .../quick_start_guides/quick_start_connect.py | 28 + .../quick_start_guides/quick_start_connect.rs | 24 + .../quick_start_guides/quick_start_spawn.cpp | 17 + .../quick_start_guides/quick_start_spawn.py | 24 + .../quick_start_guides/quick_start_spawn.rs | 25 + .../data/quick_start_guides/rust_connect.md | 33 + .../data/quick_start_guides/rust_spawn.md | 33 + crates/viewer/re_viewer/data/user_image.jpg | Bin 0 -> 2624 bytes crates/viewer/re_viewer/src/.gitattributes | 4 + .../re_viewer/src/app/add_data_source.rs | 392 + .../re_viewer/src/app/command_handling.rs | 1976 ++ crates/viewer/re_viewer/src/app/logic.rs | 1160 ++ crates/viewer/re_viewer/src/app/mod.rs | 1780 ++ crates/viewer/re_viewer/src/app/ui.rs | 576 + crates/viewer/re_viewer/src/app_blueprint.rs | 332 + crates/viewer/re_viewer/src/app_state.rs | 1212 ++ .../viewer/re_viewer/src/background_tasks.rs | 81 + .../viewer/re_viewer/src/bin/viewer/main.rs | 41 + crates/viewer/re_viewer/src/blueprint/mod.rs | 5 + .../re_viewer/src/blueprint/validation.rs | 21 + .../blueprint/validation_gen/.gitattributes | 4 + .../src/blueprint/validation_gen/mod.rs | 120 + .../viewer/re_viewer/src/command_palette.rs | 428 + crates/viewer/re_viewer/src/default_views.rs | 163 + .../viewer/re_viewer/src/docker_detection.rs | 38 + crates/viewer/re_viewer/src/env_vars.rs | 4 + crates/viewer/re_viewer/src/event.rs | 444 + .../viewer/re_viewer/src/external_memory.rs | 75 + crates/viewer/re_viewer/src/headless.rs | 142 + crates/viewer/re_viewer/src/history.rs | 72 + .../viewer/re_viewer/src/internal_catalog.rs | 54 + .../viewer/re_viewer/src/latency_tracker.rs | 142 + crates/viewer/re_viewer/src/lib.rs | 349 + crates/viewer/re_viewer/src/loading.rs | 41 + crates/viewer/re_viewer/src/native.rs | 89 + crates/viewer/re_viewer/src/navigation.rs | 42 + .../re_viewer/src/open_url_description.rs | 100 + .../viewer/re_viewer/src/prefetch_chunks.rs | 256 + crates/viewer/re_viewer/src/saving.rs | 85 + crates/viewer/re_viewer/src/screenshotter.rs | 129 + .../viewer/re_viewer/src/startup_options.rs | 206 + .../viewer/re_viewer/src/texture_readback.rs | 239 + .../src/ui/dev_panel/chunk_event_stats.rs | 67 + .../src/ui/dev_panel/memory_history.rs | 124 + .../viewer/re_viewer/src/ui/dev_panel/mod.rs | 700 + .../re_viewer/src/ui/dev_panel/plot_utils.rs | 16 + .../src/ui/dev_panel/server_streaming_tab.rs | 613 + .../src/ui/dev_panel/streaming_history.rs | 91 + .../ui/dev_panel/transform_cache_ui/layout.rs | 215 + .../ui/dev_panel/transform_cache_ui/mod.rs | 250 + .../ui/dev_panel/transform_cache_ui/model.rs | 229 + .../ui/dev_panel/transform_cache_ui/paint.rs | 843 + .../re_viewer/src/ui/mobile_warning_ui.rs | 30 + crates/viewer/re_viewer/src/ui/mod.rs | 22 + .../viewer/re_viewer/src/ui/open_url_modal.rs | 154 + crates/viewer/re_viewer/src/ui/rerun_menu.rs | 622 + .../re_viewer/src/ui/settings_screen.rs | 493 + crates/viewer/re_viewer/src/ui/share_modal.rs | 461 + crates/viewer/re_viewer/src/ui/top_panel.rs | 770 + .../src/ui/welcome_screen/example_section.rs | 542 + .../src/ui/welcome_screen/intro_section.rs | 229 + .../src/ui/welcome_screen/loading_data_ui.rs | 34 + .../re_viewer/src/ui/welcome_screen/mod.rs | 81 + .../src/ui/welcome_screen/no_data_ui.rs | 56 + .../src/ui/welcome_screen/welcome_section.rs | 30 + .../re_viewer/src/viewer_analytics/event.rs | 171 + .../re_viewer/src/viewer_analytics/mod.rs | 9 + .../re_viewer/src/viewer_analytics/wsl.rs | 17 + .../src/viewer_test_utils/app_testing_ext.rs | 37 + .../re_viewer/src/viewer_test_utils/mod.rs | 144 + crates/viewer/re_viewer/src/web.rs | 965 + crates/viewer/re_viewer/src/web_history.rs | 307 + crates/viewer/re_viewer/src/web_tools.rs | 155 + .../tests/all_component_fallbacks.rs | 58 + crates/viewer/re_viewer/tests/app_kittest.rs | 186 + .../viewer/re_viewer/tests/blueprint_test.rs | 253 + .../re_viewer/tests/snapshots/about_rerun.png | 3 + ...ck_rerun.archetypes.AnnotationContext.snap | 5 + ...ch_fallback_rerun.archetypes.Arrows2D.snap | 12 + ...ch_fallback_rerun.archetypes.Arrows3D.snap | 11 + ...rch_fallback_rerun.archetypes.Asset3D.snap | 7 + ..._fallback_rerun.archetypes.AssetVideo.snap | 6 + ...ch_fallback_rerun.archetypes.BarChart.snap | 8 + ...rch_fallback_rerun.archetypes.Boxes2D.snap | 12 + ...rch_fallback_rerun.archetypes.Boxes3D.snap | 14 + ..._fallback_rerun.archetypes.Capsules3D.snap | 15 + ..._arch_fallback_rerun.archetypes.Clear.snap | 5 + ...back_rerun.archetypes.CoordinateFrame.snap | 5 + ...fallback_rerun.archetypes.Cylinders3D.snap | 15 + ..._fallback_rerun.archetypes.DepthImage.snap | 12 + ..._fallback_rerun.archetypes.Ellipses2D.snap | 12 + ...allback_rerun.archetypes.Ellipsoids3D.snap | 14 + ...ck_rerun.archetypes.EncodedDepthImage.snap | 12 + ...allback_rerun.archetypes.EncodedImage.snap | 9 + ...lback_rerun.archetypes.GeoLineStrings.snap | 7 + ...h_fallback_rerun.archetypes.GeoPoints.snap | 8 + ..._fallback_rerun.archetypes.GraphEdges.snap | 6 + ..._fallback_rerun.archetypes.GraphNodes.snap | 10 + ...rch_fallback_rerun.archetypes.GridMap.snap | 13 + ..._arch_fallback_rerun.archetypes.Image.snap | 9 + ...back_rerun.archetypes.InstancePoses3D.snap | 9 + ...allback_rerun.archetypes.LineStrips2D.snap | 11 + ...allback_rerun.archetypes.LineStrips3D.snap | 10 + ...fallback_rerun.archetypes.McapChannel.snap | 8 + ...fallback_rerun.archetypes.McapMessage.snap | 5 + ..._fallback_rerun.archetypes.McapSchema.snap | 8 + ...lback_rerun.archetypes.McapStatistics.snap | 13 + ...arch_fallback_rerun.archetypes.Mesh3D.snap | 14 + ...rch_fallback_rerun.archetypes.Pinhole.snap | 13 + ...ch_fallback_rerun.archetypes.Points2D.snap | 12 + ...ch_fallback_rerun.archetypes.Points3D.snap | 12 + ...llback_rerun.archetypes.RecordingInfo.snap | 6 + ...rch_fallback_rerun.archetypes.Scalars.snap | 5 + ...ck_rerun.archetypes.SegmentationImage.snap | 8 + ...fallback_rerun.archetypes.SeriesLines.snap | 10 + ...allback_rerun.archetypes.SeriesPoints.snap | 9 + ...fallback_rerun.archetypes.StateChange.snap | 5 + ...k_rerun.archetypes.StateConfiguration.snap | 8 + ...arch_fallback_rerun.archetypes.Tensor.snap | 6 + ...allback_rerun.archetypes.TextDocument.snap | 6 + ...rch_fallback_rerun.archetypes.TextLog.snap | 7 + ...fallback_rerun.archetypes.Transform3D.snap | 12 + ...back_rerun.archetypes.TransformAxes3D.snap | 6 + ..._rerun.archetypes.VideoFrameReference.snap | 8 + ...fallback_rerun.archetypes.VideoStream.snap | 9 + ...back_rerun.archetypes.ViewCoordinates.snap | 5 + ...allback_rerun.archetypes.VoxelGridMap.snap | 15 + ...lueprint.archetypes.ActiveVisualizers.snap | 5 + ...rerun.blueprint.archetypes.Background.snap | 6 + ...ueprint.archetypes.ContainerBlueprint.snap | 12 + ...n.blueprint.archetypes.DataframeQuery.snap | 11 + ...n.blueprint.archetypes.EntityBehavior.snap | 6 + ...un.blueprint.archetypes.EyeControls3D.snap | 11 + ...erun.blueprint.archetypes.ForceCenter.snap | 6 + ...print.archetypes.ForceCollisionRadius.snap | 7 + ..._rerun.blueprint.archetypes.ForceLink.snap | 7 + ...un.blueprint.archetypes.ForceManyBody.snap | 6 + ...un.blueprint.archetypes.ForcePosition.snap | 7 + ....blueprint.archetypes.GraphBackground.snap | 5 + ...rerun.blueprint.archetypes.LineGrid3D.snap | 9 + ...un.blueprint.archetypes.MapBackground.snap | 5 + ...ck_rerun.blueprint.archetypes.MapZoom.snap | 5 + ...un.blueprint.archetypes.NearClipPlane.snap | 5 + ...n.blueprint.archetypes.PanelBlueprint.snap | 5 + ...n.blueprint.archetypes.PlotBackground.snap | 6 + ...rerun.blueprint.archetypes.PlotLegend.snap | 6 + ...rerun.blueprint.archetypes.ScalarAxis.snap | 6 + ...ueprint.archetypes.SpatialInformation.snap | 7 + ...n.blueprint.archetypes.TableBlueprint.snap | 8 + ...eprint.archetypes.TensorScalarMapping.snap | 7 + ...print.archetypes.TensorSliceSelection.snap | 8 + ...un.blueprint.archetypes.TensorViewFit.snap | 5 + ...ueprint.archetypes.TextDocumentFormat.snap | 7 + ...n.blueprint.archetypes.TextLogColumns.snap | 6 + ...un.blueprint.archetypes.TextLogFormat.snap | 5 + ...erun.blueprint.archetypes.TextLogRows.snap | 5 + ...k_rerun.blueprint.archetypes.TimeAxis.snap | 7 + ...ueprint.archetypes.TimePanelBlueprint.snap | 11 + ...un.blueprint.archetypes.ViewBlueprint.snap | 8 + ...run.blueprint.archetypes.ViewContents.snap | 5 + ...lueprint.archetypes.ViewportBlueprint.snap | 9 + ...lueprint.archetypes.VisibleTimeRanges.snap | 5 + ...n.blueprint.archetypes.VisualBounds2D.snap | 5 + ...rint.archetypes.VisualizerInstruction.snap | 6 + ...eprint.archetypes.VisualizerOverrides.snap | 5 + .../all_view_selection_uis/Dark/2D.png | 3 + .../all_view_selection_uis/Dark/3D.png | 3 + .../all_view_selection_uis/Dark/BarChart.png | 3 + .../all_view_selection_uis/Dark/Dataframe.png | 3 + .../all_view_selection_uis/Dark/Graph.png | 3 + .../all_view_selection_uis/Dark/Map.png | 3 + .../Dark/StateTimeline.png | 3 + .../all_view_selection_uis/Dark/Tensor.png | 3 + .../Dark/TextDocument.png | 3 + .../all_view_selection_uis/Dark/TextLog.png | 3 + .../Dark/TimeSeries.png | 3 + .../all_view_selection_uis/Light/2D.png | 3 + .../all_view_selection_uis/Light/3D.png | 3 + .../all_view_selection_uis/Light/BarChart.png | 3 + .../Light/Dataframe.png | 3 + .../all_view_selection_uis/Light/Graph.png | 3 + .../all_view_selection_uis/Light/Map.png | 3 + .../Light/StateTimeline.png | 3 + .../all_view_selection_uis/Light/Tensor.png | 3 + .../Light/TextDocument.png | 3 + .../all_view_selection_uis/Light/TextLog.png | 3 + .../Light/TimeSeries.png | 3 + .../blueprint_change_and_restore.png | 3 + .../blueprint_load_into_new_context_1.png | 3 + .../blueprint_load_into_new_context_2.png | 3 + .../snapshots/colormap_selector_closed.png | 3 + .../snapshots/colormap_selector_open.png | 3 + .../snapshots/menu_without_recording.png | 3 + .../snapshots/open_url_modal__invalid_url.png | 3 + .../snapshots/open_url_modal__no_url.png | 3 + .../snapshots/open_url_modal__valid_url.png | 3 + .../tests/snapshots/settings_screen_linux.png | 3 + .../tests/snapshots/settings_screen_mac.png | 3 + .../snapshots/settings_screen_windows.png | 3 + .../share_modal__dataset_segment_url.png | 3 + ...l__dataset_segment_url_with_time_range.png | 3 + .../snapshots/share_modal__server_url.png | 3 + .../tests/time_control_blueprint_test.rs | 136 + crates/viewer/re_viewer_context/Cargo.toml | 99 + crates/viewer/re_viewer_context/README.md | 12 + .../src/active_store_context.rs | 128 + .../re_viewer_context/src/annotations.rs | 341 + .../re_viewer_context/src/app_context.rs | 445 + .../re_viewer_context/src/app_options.rs | 215 + .../src/async_runtime_handle.rs | 88 + .../src/blueprint_helpers.rs | 394 + .../re_viewer_context/src/blueprint_id.rs | 228 + .../src/cache/cache_trait.rs | 63 + .../src/cache/image_decode_cache.rs | 216 + .../src/cache/image_histogram_cache.rs | 149 + .../src/cache/image_stats_cache.rs | 73 + .../re_viewer_context/src/cache/memoizers.rs | 266 + .../viewer/re_viewer_context/src/cache/mod.rs | 57 + .../src/cache/store_cache.rs | 189 + .../src/cache/tensor_stats_cache.rs | 84 + .../src/cache/transform_database_store.rs | 190 + .../src/cache/video_asset_cache.rs | 167 + .../src/cache/video_stream_cache.rs | 2642 +++ .../test_player/encoded_depth_image.rs | 273 + .../test_player/encoded_image.rs | 371 + .../video_stream_cache/test_player/mod.rs | 833 + .../test_player/video_stream.rs | 779 + .../re_viewer_context/src/collapsed_id.rs | 158 + .../re_viewer_context/src/command_sender.rs | 408 + .../src/component_fallbacks.rs | 314 + .../src/component_ui_registry.rs | 1023 ++ .../viewer/re_viewer_context/src/contents.rs | 152 + .../re_viewer_context/src/drag_and_drop.rs | 381 + .../re_viewer_context/src/file_dialog.rs | 79 + .../re_viewer_context/src/focus_target.rs | 31 + .../src/gpu_bridge/colormap.rs | 211 + .../src/gpu_bridge/image_to_gpu.rs | 714 + .../re_viewer_context/src/gpu_bridge/mod.rs | 190 + .../src/gpu_bridge/re_renderer_callback.rs | 91 + .../re_viewer_context/src/heuristics.rs | 45 + .../re_viewer_context/src/image_info.rs | 626 + crates/viewer/re_viewer_context/src/item.rs | 437 + .../re_viewer_context/src/item_collection.rs | 301 + crates/viewer/re_viewer_context/src/lib.rs | 255 + .../re_viewer_context/src/maybe_mut_ref.rs | 55 + .../viewer/re_viewer_context/src/open_url.rs | 1535 ++ .../re_viewer_context/src/query_context.rs | 314 + .../re_viewer_context/src/query_range.rs | 24 + .../src/recording_or_table.rs | 52 + crates/viewer/re_viewer_context/src/route.rs | 225 + .../re_viewer_context/src/selection_state.rs | 262 + .../re_viewer_context/src/storage_context.rs | 8 + .../viewer/re_viewer_context/src/store_hub.rs | 1618 ++ .../src/store_view_context.rs | 104 + crates/viewer/re_viewer_context/src/tables.rs | 47 + .../src/tensor/image_stats.rs | 190 + .../re_viewer_context/src/tensor/mod.rs | 7 + .../src/tensor/tensor_stats.rs | 177 + .../src/time_control/blueprint_ext.rs | 180 + .../src/time_control/command.rs | 708 + .../re_viewer_context/src/time_control/mod.rs | 880 + .../src/typed_entity_collections.rs | 274 + crates/viewer/re_viewer_context/src/undo.rs | 370 + .../re_viewer_context/src/utils/color.rs | 15 + .../viewer/re_viewer_context/src/utils/mod.rs | 7 + .../re_viewer_context/src/utils/text.rs | 26 + .../re_viewer_context/src/utils/video.rs | 27 + .../re_viewer_context/src/view/highlights.rs | 156 + .../viewer/re_viewer_context/src/view/mod.rs | 117 + .../src/view/named_system.rs | 31 + .../src/view/spawn_heuristics.rs | 149 + .../src/view/system_execution_output.rs | 193 + .../re_viewer_context/src/view/view_class.rs | 444 + .../src/view/view_class_placeholder.rs | 83 + .../src/view/view_class_registry.rs | 518 + .../src/view/view_context.rs | 214 + .../src/view/view_context_system.rs | 92 + .../re_viewer_context/src/view/view_query.rs | 515 + .../re_viewer_context/src/view/view_states.rs | 228 + .../src/view/visualizability_constraints.rs | 337 + .../src/view/visualizer_entity_subscriber.rs | 821 + .../src/view/visualizer_system.rs | 411 + .../re_viewer_context/src/viewer_context.rs | 333 + .../src/visitor_flow_control.rs | 30 + crates/viewer/re_viewer_mcp/Cargo.toml | 39 + crates/viewer/re_viewer_mcp/README.md | 15 + crates/viewer/re_viewer_mcp/src/lib.rs | 581 + crates/viewer/re_viewer_mcp/src/main.rs | 11 + .../re_viewer_mcp__tests__agent_surface.snap | 1144 ++ crates/viewer/re_viewport/Cargo.toml | 46 + crates/viewer/re_viewport/README.md | 10 + crates/viewer/re_viewport/src/lib.rs | 20 + .../re_viewport/src/system_execution.rs | 207 + .../viewer/re_viewport/src/view_highlights.rs | 158 + .../re_viewport/src/view_loading_indicator.rs | 33 + crates/viewer/re_viewport/src/viewport_ui.rs | 1271 ++ .../viewer/re_viewport_blueprint/Cargo.toml | 55 + crates/viewer/re_viewport_blueprint/README.md | 10 + .../benches/data_query.rs | 221 + .../re_viewport_blueprint/src/auto_layout.rs | 137 + .../re_viewport_blueprint/src/container.rs | 465 + .../src/entity_add_info.rs | 110 + .../viewer/re_viewport_blueprint/src/lib.rs | 83 + .../src/test_view_class.rs | 98 + .../src/ui/add_view_or_container_modal.rs | 259 + .../re_viewport_blueprint/src/ui/mod.rs | 29 + .../viewer/re_viewport_blueprint/src/view.rs | 707 + .../src/view_contents.rs | 987 + .../src/view_properties.rs | 293 + .../src/viewport_blueprint.rs | 1227 ++ .../src/viewport_command.rs | 55 + crates/viewer/re_web_viewer_server/Cargo.toml | 81 + crates/viewer/re_web_viewer_server/README.md | 19 + crates/viewer/re_web_viewer_server/build.rs | 35 + crates/viewer/re_web_viewer_server/src/lib.rs | 335 + .../re_web_viewer_server/src/trailing_data.rs | 245 + .../web_viewer/.gitignore | 2 + .../re_web_viewer_server/web_viewer/README.md | 5 + .../web_viewer/apple-touch-icon.png | Bin 0 -> 47459 bytes .../web_viewer/favicon.ico | Bin 0 -> 7970 bytes .../web_viewer/index.html | 505 + .../web_viewer/manifest.json | 16 + .../web_viewer/signed-in.html | 57 + .../web_viewer/signed-out.html | 50 + .../re_web_viewer_server/web_viewer/sw.js | 25 + deny.toml | 145 + docs/README.md | 172 + docs/content/_redirects.yaml | 122 + docs/content/concepts.md | 13 + docs/content/concepts/how-does-rerun-work.md | 191 + .../content/concepts/logging-and-ingestion.md | 20 + .../concepts/logging-and-ingestion/batches.md | 103 + .../chunk-processing-api.md | 201 + .../concepts/logging-and-ingestion/chunks.md | 190 + .../logging-and-ingestion/entity-component.md | 77 + .../logging-and-ingestion/entity-path.md | 68 + .../logging-and-ingestion/importers.md | 5 + .../logging-and-ingestion/importers/cpp.md | 5 + .../importers/overview.md | 93 + .../logging-and-ingestion/importers/python.md | 5 + .../logging-and-ingestion/importers/rust.md | 5 + .../logging-and-ingestion/latest-at.md | 65 + .../concepts/logging-and-ingestion/mcap.md | 15 + .../mcap/cli-reference.md | 97 + .../mcap/decoders-explained.md | 97 + .../mcap/message-formats.md | 137 + .../logging-and-ingestion/recordings.md | 92 + .../logging-and-ingestion/rrd-format.md | 378 + .../concepts/logging-and-ingestion/sinks.md | 45 + .../concepts/logging-and-ingestion/static.md | 97 + .../logging-and-ingestion/timelines.md | 68 + .../logging-and-ingestion/transforms.md | 220 + .../concepts/logging-and-ingestion/video.md | 185 + docs/content/concepts/query-and-transform.md | 8 + .../catalog-object-model.md | 109 + .../query-and-transform/dataframe-queries.md | 162 + .../concepts/query-and-transform/lenses.md | 133 + .../properties-and-segments.md | 155 + docs/content/concepts/train.md | 48 + docs/content/concepts/visualization.md | 11 + .../visualization/annotation-context.md | 81 + .../concepts/visualization/blueprints.md | 167 + .../concepts/visualization/customize-views.md | 167 + .../concepts/visualization/entity-queries.md | 95 + docs/content/development.md | 6 + docs/content/development/architecture.md | 5 + docs/content/development/code_of_conduct.md | 5 + docs/content/development/contributing.md | 5 + docs/content/development/roadmap.md | 39 + docs/content/getting-started.md | 78 + .../getting-started/configure-the-viewer.md | 228 + .../navigating-the-viewer.md | 224 + docs/content/getting-started/data-in.md | 240 + .../getting-started/data-in/open-any-file.md | 37 + docs/content/getting-started/data-out.md | 17 + .../data-out/analyze-and-send.md | 61 + .../data-out/explore-as-dataframe.md | 65 + .../data-out/export-dataframe.md | 155 + docs/content/getting-started/install-rerun.md | 14 + .../getting-started/install-rerun/cpp.md | 21 + .../getting-started/install-rerun/python.md | 18 + .../getting-started/install-rerun/rust.md | 12 + .../install-rerun/troubleshooting.md | 138 + .../getting-started/install-rerun/viewer.md | 27 + docs/content/getting-started/project-setup.md | 12 + .../getting-started/project-setup/cpp.md | 50 + .../getting-started/project-setup/python.md | 15 + .../getting-started/project-setup/rust.md | 16 + docs/content/getting-started/train.md | 71 + docs/content/howto.md | 12 + docs/content/howto/extend.md | 15 + docs/content/howto/integrations.md | 6 + .../howto/integrations/embed-notebooks.md | 212 + docs/content/howto/integrations/embed-web.md | 144 + .../integrations/integrate-host-loggers.md | 19 + .../howto/integrations/ros2-nav-turtlebot.md | 254 + docs/content/howto/logging-and-ingestion.md | 8 + .../howto/logging-and-ingestion/clears.md | 92 + .../convert-existing-data.md | 105 + .../logging-and-ingestion/custom-data.md | 86 + .../howto/logging-and-ingestion/layers.md | 192 + .../howto/logging-and-ingestion/mcap.md | 92 + .../logging-and-ingestion/optimize-chunks.md | 176 + .../logging-and-ingestion/send-columns.md | 141 + .../send-partial-updates.md | 63 + .../howto/logging-and-ingestion/send-table.md | 129 + .../shared-recordings.md | 44 + .../howto/logging-and-ingestion/urdf.md | 117 + docs/content/howto/query-and-transform.md | 8 + .../dataframe_operations.md | 45 + .../query-and-transform/dataset_resampling.md | 45 + .../howto/query-and-transform/get-data-out.md | 195 + .../howto/query-and-transform/overview.md | 12 + .../howto/query-and-transform/query_images.md | 29 + .../query_performance_tuning.md | 41 + .../howto/query-and-transform/query_videos.md | 103 + .../howto/query-and-transform/segment_url.md | 105 + .../howto/query-and-transform/sub_dataset.md | 43 + .../query-and-transform/time_alignment.md | 32 + .../query-and-transform/view_operations.md | 33 + docs/content/howto/train.md | 5 + docs/content/howto/train/dataloader.md | 124 + docs/content/howto/train/lerobot_export.md | 123 + docs/content/howto/visualization.md | 8 + .../build-a-blueprint-programmatically.md | 630 + docs/content/howto/visualization/callbacks.md | 16 + .../howto/visualization/component-mappings.md | 79 + docs/content/howto/visualization/extend-ui.md | 67 + .../howto/visualization/fixed-window-plot.md | 61 + .../howto/visualization/geospatial-data.md | 72 + docs/content/howto/visualization/limit-ram.md | 13 + .../howto/visualization/multiple-viewers.md | 55 + .../howto/visualization/plot-any-scalar.md | 106 + .../howto/visualization/state-timeline.md | 79 + docs/content/index.md | 5 + docs/content/overview.md | 5 + docs/content/overview/resources.md | 31 + docs/content/overview/what-is-rerun.md | 97 + docs/content/reference.md | 15 + docs/content/reference/about.md | 27 + docs/content/reference/cli.md | 918 + docs/content/reference/cpp.md | 5 + docs/content/reference/migration.md | 5 + .../reference/migration/migration-0-13.md | 40 + .../reference/migration/migration-0-15.md | 32 + .../reference/migration/migration-0-16.md | 72 + .../reference/migration/migration-0-17.md | 79 + .../reference/migration/migration-0-18.md | 272 + .../reference/migration/migration-0-19.md | 15 + .../reference/migration/migration-0-20.md | 64 + .../reference/migration/migration-0-21.md | 92 + .../reference/migration/migration-0-22.md | 501 + .../reference/migration/migration-0-23.md | 425 + .../reference/migration/migration-0-24.md | 128 + .../reference/migration/migration-0-25.md | 94 + .../reference/migration/migration-0-26.md | 80 + .../reference/migration/migration-0-27.md | 24 + .../reference/migration/migration-0-28.md | 402 + .../reference/migration/migration-0-29.md | 89 + .../reference/migration/migration-0-30.md | 74 + .../reference/migration/migration-0-31.md | 78 + .../reference/migration/migration-0-32.md | 153 + .../reference/migration/migration-0-33.md | 16 + .../reference/migration/migration-0-34.md | 79 + .../reference/migration/migration-0-9.md | 270 + docs/content/reference/npm.md | 5 + docs/content/reference/python.md | 5 + docs/content/reference/rust.md | 5 + docs/content/reference/sdk.md | 5 + .../content/reference/sdk/logging-controls.md | 57 + docs/content/reference/sdk/micro-batching.md | 36 + docs/content/reference/sdk/operating-modes.md | 146 + docs/content/reference/snippets.md | 5 + docs/content/reference/store-compaction.md | 32 + docs/content/reference/types.md | 16 + docs/content/reference/types/.gitattributes | 7 + docs/content/reference/types/archetypes.md | 96 + .../reference/types/archetypes/.gitattributes | 53 + .../types/archetypes/annotation_context.md | 69 + .../reference/types/archetypes/arrows2d.md | 47 + .../reference/types/archetypes/arrows3d.md | 46 + .../reference/types/archetypes/asset3d.md | 47 + .../reference/types/archetypes/asset_video.md | 57 + .../reference/types/archetypes/bar_chart.md | 42 + .../reference/types/archetypes/boxes2d.md | 47 + .../reference/types/archetypes/boxes3d.md | 64 + .../reference/types/archetypes/capsules3d.md | 58 + .../reference/types/archetypes/clear.md | 51 + .../types/archetypes/coordinate_frame.md | 49 + .../reference/types/archetypes/cylinders3d.md | 55 + .../reference/types/archetypes/depth_image.md | 59 + .../reference/types/archetypes/ellipses2d.md | 46 + .../types/archetypes/ellipsoids3d.md | 56 + .../types/archetypes/encoded_depth_image.md | 50 + .../types/archetypes/encoded_image.md | 47 + .../types/archetypes/geo_line_strings.md | 41 + .../reference/types/archetypes/geo_points.md | 42 + .../reference/types/archetypes/graph_edges.md | 52 + .../reference/types/archetypes/graph_nodes.md | 54 + .../reference/types/archetypes/grid_map.md | 52 + .../reference/types/archetypes/image.md | 103 + .../types/archetypes/instance_poses3d.md | 71 + .../types/archetypes/line_strips2d.md | 74 + .../types/archetypes/line_strips3d.md | 93 + .../types/archetypes/mcap_channel.md | 40 + .../types/archetypes/mcap_message.md | 36 + .../reference/types/archetypes/mcap_schema.md | 39 + .../types/archetypes/mcap_statistics.md | 46 + .../reference/types/archetypes/mesh3d.md | 82 + .../reference/types/archetypes/pinhole.md | 77 + .../reference/types/archetypes/points2d.md | 71 + .../reference/types/archetypes/points3d.md | 109 + .../types/archetypes/recording_info.md | 27 + .../reference/types/archetypes/scalars.md | 80 + .../types/archetypes/segmentation_image.md | 48 + .../types/archetypes/series_lines.md | 47 + .../types/archetypes/series_points.md | 48 + .../types/archetypes/state_change.md | 41 + .../types/archetypes/state_configuration.md | 43 + .../reference/types/archetypes/tensor.md | 39 + .../types/archetypes/text_document.md | 40 + .../reference/types/archetypes/text_log.md | 41 + .../reference/types/archetypes/transform3d.md | 107 + .../types/archetypes/transform_axes3d.md | 38 + .../types/archetypes/video_frame_reference.md | 60 + .../types/archetypes/video_stream.md | 53 + .../types/archetypes/view_coordinates.md | 47 + .../types/archetypes/voxel_grid_map.md | 47 + docs/content/reference/types/components.md | 101 + .../reference/types/components/.gitattributes | 87 + .../types/components/aggregation_policy.md | 47 + .../types/components/albedo_factor.md | 26 + .../types/components/annotation_context.md | 47 + .../reference/types/components/axis_length.md | 25 + .../reference/types/components/blob.md | 30 + .../reference/types/components/cell_size.md | 27 + .../reference/types/components/channel_id.md | 27 + .../components/channel_message_counts.md | 28 + .../reference/types/components/class_id.md | 38 + .../types/components/clear_is_recursive.md | 25 + .../reference/types/components/color.md | 50 + .../reference/types/components/colormap.md | 101 + .../reference/types/components/count.md | 28 + .../reference/types/components/depth_meter.md | 34 + .../reference/types/components/draw_order.md | 42 + .../reference/types/components/entity_path.md | 25 + .../reference/types/components/fill_mode.md | 52 + .../reference/types/components/fill_ratio.md | 31 + .../types/components/gamma_correction.md | 28 + .../types/components/geo_line_string.md | 22 + .../reference/types/components/graph_edge.md | 28 + .../reference/types/components/graph_node.md | 25 + .../reference/types/components/graph_type.md | 29 + .../reference/types/components/half_size2d.md | 31 + .../reference/types/components/half_size3d.md | 31 + .../types/components/image_buffer.md | 31 + .../types/components/image_format.md | 35 + .../types/components/image_plane_distance.md | 27 + .../reference/types/components/interactive.md | 24 + .../types/components/interpolation_mode.md | 41 + .../reference/types/components/is_keyframe.md | 31 + .../types/components/key_value_pairs.md | 29 + .../reference/types/components/keypoint_id.md | 26 + .../reference/types/components/lat_lon.md | 25 + .../reference/types/components/length.md | 30 + .../types/components/line_strip2d.md | 33 + .../types/components/line_strip3d.md | 33 + .../types/components/linear_speed.md | 22 + .../types/components/magnification_filter.md | 46 + .../types/components/marker_shape.md | 53 + .../reference/types/components/marker_size.md | 25 + .../reference/types/components/media_type.md | 32 + .../types/components/mesh_face_rendering.md | 39 + .../reference/types/components/name.md | 27 + .../reference/types/components/opacity.md | 34 + .../types/components/pinhole_projection.md | 35 + .../reference/types/components/plane3d.md | 30 + .../types/components/point_shading.md | 29 + .../reference/types/components/position2d.md | 29 + .../reference/types/components/position3d.md | 27 + .../reference/types/components/radius.md | 47 + .../reference/types/components/range1d.md | 22 + .../reference/types/components/resolution.md | 27 + .../types/components/rotation_axis_angle.md | 38 + .../types/components/rotation_quat.md | 36 + .../reference/types/components/scalar.md | 27 + .../reference/types/components/scale3d.md | 30 + .../reference/types/components/schema_id.md | 25 + .../reference/types/components/show_labels.md | 42 + .../types/components/stroke_width.md | 25 + .../reference/types/components/tensor_data.md | 50 + .../tensor_dimension_index_selection.md | 25 + .../components/tensor_height_dimension.md | 25 + .../components/tensor_width_dimension.md | 25 + .../reference/types/components/texcoord2d.md | 40 + .../reference/types/components/text.md | 43 + .../types/components/text_log_level.md | 33 + .../reference/types/components/timestamp.md | 28 + .../types/components/transform_frame_id.md | 35 + .../types/components/transform_mat3x3.md | 38 + .../types/components/transform_relation.md | 37 + .../types/components/translation3d.md | 32 + .../types/components/triangle_indices.md | 25 + .../reference/types/components/value_range.md | 29 + .../reference/types/components/vector2d.md | 25 + .../reference/types/components/vector3d.md | 26 + .../reference/types/components/video_codec.md | 79 + .../types/components/video_sample.md | 30 + .../types/components/video_timestamp.md | 25 + .../types/components/view_coordinates.md | 44 + .../reference/types/components/visible.md | 27 + .../reference/types/components/voxel_index.md | 27 + .../reference/types/components/voxel_size.md | 28 + .../reference/types/components/voxel_value.md | 25 + docs/content/reference/types/datatypes.md | 61 + .../reference/types/datatypes/.gitattributes | 53 + .../types/datatypes/absolute_time_range.md | 33 + .../reference/types/datatypes/angle.md | 22 + .../types/datatypes/annotation_info.md | 45 + .../content/reference/types/datatypes/blob.md | 24 + .../content/reference/types/datatypes/bool.md | 26 + .../types/datatypes/channel_count_pair.md | 36 + .../types/datatypes/channel_datatype.md | 58 + .../types/datatypes/class_description.md | 66 + .../datatypes/class_description_map_elem.md | 54 + .../reference/types/datatypes/class_id.md | 23 + .../reference/types/datatypes/color_model.md | 40 + .../reference/types/datatypes/dvec2d.md | 23 + .../reference/types/datatypes/entity_path.md | 22 + .../reference/types/datatypes/float32.md | 34 + .../reference/types/datatypes/float64.md | 23 + .../reference/types/datatypes/image_format.md | 60 + .../reference/types/datatypes/ivec3d.md | 22 + .../reference/types/datatypes/keypoint_id.md | 23 + .../types/datatypes/keypoint_pair.md | 36 + .../reference/types/datatypes/mat3x3.md | 32 + .../reference/types/datatypes/mat4x4.md | 29 + .../reference/types/datatypes/pixel_format.md | 113 + .../reference/types/datatypes/plane3d.md | 30 + .../reference/types/datatypes/quaternion.md | 25 + .../reference/types/datatypes/range1d.md | 24 + .../reference/types/datatypes/range2d.md | 33 + .../reference/types/datatypes/rgba32.md | 27 + .../types/datatypes/rotation_axis_angle.md | 41 + .../types/datatypes/tensor_buffer.md | 93 + .../reference/types/datatypes/tensor_data.md | 68 + .../tensor_dimension_index_selection.md | 38 + .../datatypes/tensor_dimension_selection.md | 37 + .../reference/types/datatypes/time_int.md | 24 + .../reference/types/datatypes/time_range.md | 46 + .../types/datatypes/time_range_boundary.md | 43 + .../reference/types/datatypes/uint16.md | 24 + .../reference/types/datatypes/uint32.md | 19 + .../reference/types/datatypes/uint64.md | 23 + .../content/reference/types/datatypes/utf8.md | 30 + .../reference/types/datatypes/utf8pair.md | 37 + .../content/reference/types/datatypes/uuid.md | 19 + .../reference/types/datatypes/uvec2d.md | 19 + .../reference/types/datatypes/uvec3d.md | 22 + .../reference/types/datatypes/uvec4d.md | 19 + .../reference/types/datatypes/vec2d.md | 27 + .../reference/types/datatypes/vec3d.md | 29 + .../reference/types/datatypes/vec4d.md | 19 + .../types/datatypes/video_timestamp.md | 25 + .../types/datatypes/view_coordinates.md | 40 + .../types/datatypes/visible_time_range.md | 60 + docs/content/reference/types/views.md | 22 + .../reference/types/views/.gitattributes | 14 + .../reference/types/views/bar_chart_view.md | 44 + .../reference/types/views/dataframe_view.md | 47 + .../reference/types/views/graph_view.md | 68 + .../content/reference/types/views/map_view.md | 38 + .../reference/types/views/spatial2d_view.md | 76 + .../reference/types/views/spatial3d_view.md | 98 + .../types/views/state_timeline_view.md | 32 + .../reference/types/views/tensor_view.md | 48 + .../types/views/text_document_view.md | 38 + .../reference/types/views/text_log_view.md | 42 + .../reference/types/views/time_series_view.md | 62 + docs/content/reference/viewer.md | 5 + docs/content/reference/viewer/blueprints.md | 62 + docs/content/reference/viewer/mcp.md | 57 + docs/content/reference/viewer/overview.md | 56 + docs/content/reference/viewer/selection.md | 51 + docs/content/reference/viewer/timeline.md | 53 + docs/content/reference/viewer/viewport.md | 33 + docs/snippets/.gitattributes | 4 + docs/snippets/CMakeLists.txt | 127 + docs/snippets/Cargo.toml | 39 + docs/snippets/INDEX.md | 383 + docs/snippets/README.md | 42 + docs/snippets/all/.clang-format | 4 + docs/snippets/all/__init__.py | 0 .../annotation_context_connections.cpp | 37 + .../annotation_context_connections.py | 37 + .../annotation_context_connections.rs | 44 + .../archetypes/annotation_context_rects.cpp | 27 + .../archetypes/annotation_context_rects.py | 18 + .../archetypes/annotation_context_rects.rs | 29 + .../annotation_context_segmentation.cpp | 41 + .../annotation_context_segmentation.py | 21 + .../annotation_context_segmentation.rs | 31 + .../all/archetypes/arrows2d_simple.cpp | 19 + .../all/archetypes/arrows2d_simple.py | 16 + .../all/archetypes/arrows2d_simple.rs | 17 + .../archetypes/arrows3d_column_updates.cpp | 58 + .../all/archetypes/arrows3d_column_updates.py | 33 + .../all/archetypes/arrows3d_column_updates.rs | 41 + .../all/archetypes/arrows3d_row_updates.cpp | 52 + .../all/archetypes/arrows3d_row_updates.py | 32 + .../all/archetypes/arrows3d_row_updates.rs | 42 + .../all/archetypes/arrows3d_simple.cpp | 35 + .../all/archetypes/arrows3d_simple.py | 21 + .../all/archetypes/arrows3d_simple.rs | 34 + .../all/archetypes/asset3d_simple.cpp | 25 + .../snippets/all/archetypes/asset3d_simple.py | 16 + .../snippets/all/archetypes/asset3d_simple.rs | 18 + docs/snippets/all/archetypes/bar_chart.cpp | 27 + docs/snippets/all/archetypes/bar_chart.py | 18 + docs/snippets/all/archetypes/bar_chart.rs | 24 + .../all/archetypes/boxes2d_simple.cpp | 13 + .../snippets/all/archetypes/boxes2d_simple.py | 7 + .../snippets/all/archetypes/boxes2d_simple.rs | 13 + .../snippets/all/archetypes/boxes3d_batch.cpp | 29 + docs/snippets/all/archetypes/boxes3d_batch.py | 23 + docs/snippets/all/archetypes/boxes3d_batch.rs | 28 + .../all/archetypes/boxes3d_simple.cpp | 10 + .../snippets/all/archetypes/boxes3d_simple.py | 7 + .../snippets/all/archetypes/boxes3d_simple.rs | 13 + .../all/archetypes/capsules3d_batch.cpp | 52 + .../all/archetypes/capsules3d_batch.py | 34 + .../all/archetypes/capsules3d_batch.rs | 39 + .../all/archetypes/clear_recursive.cpp | 46 + .../all/archetypes/clear_recursive.py | 25 + .../all/archetypes/clear_recursive.rs | 35 + docs/snippets/all/archetypes/clear_simple.cpp | 49 + docs/snippets/all/archetypes/clear_simple.py | 26 + docs/snippets/all/archetypes/clear_simple.rs | 36 + .../coordinate_frame_builtin_frames.cpp | 33 + .../coordinate_frame_builtin_frames.py | 27 + .../coordinate_frame_builtin_frames.rs | 45 + .../all/archetypes/cylinders3d_batch.cpp | 52 + .../all/archetypes/cylinders3d_batch.py | 34 + .../all/archetypes/cylinders3d_batch.rs | 39 + .../all/archetypes/depth_image_3d.cpp | 46 + .../snippets/all/archetypes/depth_image_3d.py | 28 + .../snippets/all/archetypes/depth_image_3d.rs | 31 + .../all/archetypes/depth_image_simple.cpp | 35 + .../all/archetypes/depth_image_simple.py | 14 + .../all/archetypes/depth_image_simple.rs | 19 + .../all/archetypes/ellipses2d_batch.cpp | 23 + .../all/archetypes/ellipses2d_batch.py | 16 + .../all/archetypes/ellipses2d_batch.rs | 24 + .../all/archetypes/ellipses2d_simple.cpp | 16 + .../all/archetypes/ellipses2d_simple.py | 7 + .../all/archetypes/ellipses2d_simple.rs | 16 + .../all/archetypes/ellipsoids3d_batch.cpp | 39 + .../all/archetypes/ellipsoids3d_batch.py | 36 + .../all/archetypes/ellipsoids3d_batch.rs | 40 + .../all/archetypes/ellipsoids3d_simple.cpp | 51 + .../all/archetypes/ellipsoids3d_simple.py | 21 + .../all/archetypes/ellipsoids3d_simple.rs | 41 + .../all/archetypes/encoded_depth_image.cpp | 51 + .../all/archetypes/encoded_depth_image.py | 31 + .../all/archetypes/encoded_depth_image.rs | 27 + .../snippets/all/archetypes/encoded_image.cpp | 22 + docs/snippets/all/archetypes/encoded_image.py | 11 + docs/snippets/all/archetypes/encoded_image.rs | 15 + .../all/archetypes/entity_behavior.py | 27 + docs/snippets/all/archetypes/entity_path.cpp | 27 + docs/snippets/all/archetypes/entity_path.py | 19 + docs/snippets/all/archetypes/entity_path.rs | 19 + docs/snippets/all/archetypes/ferris.png | Bin 0 -> 46286 bytes .../archetypes/geo_line_strings_simple.cpp | 23 + .../all/archetypes/geo_line_strings_simple.py | 20 + .../all/archetypes/geo_line_strings_simple.rs | 22 + .../all/archetypes/geo_points_simple.cpp | 15 + .../all/archetypes/geo_points_simple.py | 14 + .../all/archetypes/geo_points_simple.rs | 15 + .../all/archetypes/graph_directed.cpp | 18 + .../snippets/all/archetypes/graph_directed.py | 17 + .../snippets/all/archetypes/graph_directed.rs | 21 + .../all/archetypes/graph_undirected.cpp | 18 + .../all/archetypes/graph_undirected.py | 19 + .../all/archetypes/graph_undirected.rs | 22 + docs/snippets/all/archetypes/grid_map_pose.py | 63 + .../all/archetypes/grid_map_simple.cpp | 46 + .../all/archetypes/grid_map_simple.py | 36 + .../all/archetypes/grid_map_simple.rs | 45 + .../snippets/all/archetypes/image_advanced.py | 37 + .../all/archetypes/image_column_updates.cpp | 55 + .../all/archetypes/image_column_updates.py | 42 + .../all/archetypes/image_column_updates.rs | 52 + .../snippets/all/archetypes/image_formats.cpp | 83 + docs/snippets/all/archetypes/image_formats.py | 34 + docs/snippets/all/archetypes/image_formats.rs | 58 + .../all/archetypes/image_row_updates.cpp | 31 + .../all/archetypes/image_row_updates.py | 21 + .../all/archetypes/image_row_updates.rs | 31 + docs/snippets/all/archetypes/image_simple.cpp | 27 + docs/snippets/all/archetypes/image_simple.py | 14 + docs/snippets/all/archetypes/image_simple.rs | 23 + .../archetypes/instance_poses3d_combined.cpp | 41 + .../archetypes/instance_poses3d_combined.py | 35 + .../archetypes/instance_poses3d_combined.rs | 51 + .../all/archetypes/line_strips2d_batch.cpp | 33 + .../all/archetypes/line_strips2d_batch.py | 26 + .../all/archetypes/line_strips2d_batch.rs | 22 + .../line_strips2d_segments_simple.cpp | 16 + .../line_strips2d_segments_simple.py | 20 + .../line_strips2d_segments_simple.rs | 14 + .../all/archetypes/line_strips2d_simple.cpp | 14 + .../all/archetypes/line_strips2d_simple.py | 18 + .../all/archetypes/line_strips2d_simple.rs | 13 + .../archetypes/line_strips2d_ui_radius.cpp | 37 + .../all/archetypes/line_strips2d_ui_radius.py | 41 + .../all/archetypes/line_strips2d_ui_radius.rs | 34 + .../all/archetypes/line_strips3d_batch.cpp | 34 + .../all/archetypes/line_strips3d_batch.py | 32 + .../all/archetypes/line_strips3d_batch.rs | 28 + .../line_strips3d_segments_simple.cpp | 20 + .../line_strips3d_segments_simple.py | 22 + .../line_strips3d_segments_simple.rs | 21 + .../all/archetypes/line_strips3d_simple.cpp | 20 + .../all/archetypes/line_strips3d_simple.py | 18 + .../all/archetypes/line_strips3d_simple.rs | 20 + .../archetypes/line_strips3d_time_window.py | 46 + .../archetypes/line_strips3d_ui_radius.cpp | 35 + .../all/archetypes/line_strips3d_ui_radius.py | 33 + .../all/archetypes/line_strips3d_ui_radius.rs | 32 + .../all/archetypes/mcap_channel_simple.cpp | 19 + .../all/archetypes/mcap_channel_simple.py | 15 + .../all/archetypes/mcap_channel_simple.rs | 14 + .../all/archetypes/mcap_message_simple.cpp | 19 + .../all/archetypes/mcap_message_simple.py | 18 + .../all/archetypes/mcap_message_simple.rs | 18 + .../all/archetypes/mcap_schema_simple.cpp | 22 + .../all/archetypes/mcap_schema_simple.py | 20 + .../all/archetypes/mcap_schema_simple.rs | 21 + .../all/archetypes/mcap_statistics_simple.cpp | 25 + .../all/archetypes/mcap_statistics_simple.py | 21 + .../all/archetypes/mcap_statistics_simple.rs | 22 + .../all/archetypes/mesh3d_indexed.cpp | 29 + .../snippets/all/archetypes/mesh3d_indexed.py | 15 + .../snippets/all/archetypes/mesh3d_indexed.rs | 21 + .../all/archetypes/mesh3d_instancing.cpp | 41 + .../all/archetypes/mesh3d_instancing.py | 37 + .../all/archetypes/mesh3d_instancing.rs | 50 + .../all/archetypes/mesh3d_partial_updates.cpp | 54 + .../all/archetypes/mesh3d_partial_updates.py | 31 + .../all/archetypes/mesh3d_partial_updates.rs | 40 + .../snippets/all/archetypes/mesh3d_simple.cpp | 26 + docs/snippets/all/archetypes/mesh3d_simple.py | 14 + docs/snippets/all/archetypes/mesh3d_simple.rs | 19 + .../all/archetypes/pinhole_perspective.cpp | 27 + .../all/archetypes/pinhole_perspective.py | 24 + .../all/archetypes/pinhole_perspective.rs | 30 + .../all/archetypes/pinhole_projections.py | 72 + .../all/archetypes/pinhole_simple.cpp | 24 + .../snippets/all/archetypes/pinhole_simple.py | 12 + .../snippets/all/archetypes/pinhole_simple.rs | 27 + .../all/archetypes/points2d_random.cpp | 40 + .../all/archetypes/points2d_random.py | 22 + .../all/archetypes/points2d_random.rs | 27 + .../all/archetypes/points2d_simple.cpp | 12 + .../all/archetypes/points2d_simple.py | 15 + .../all/archetypes/points2d_simple.rs | 12 + .../all/archetypes/points2d_ui_radius.cpp | 33 + .../all/archetypes/points2d_ui_radius.py | 39 + .../all/archetypes/points2d_ui_radius.rs | 34 + .../archetypes/points3d_column_updates.cpp | 44 + .../all/archetypes/points3d_column_updates.py | 43 + .../all/archetypes/points3d_column_updates.rs | 43 + .../archetypes/points3d_partial_updates.cpp | 61 + .../archetypes/points3d_partial_updates.py | 25 + .../archetypes/points3d_partial_updates.rs | 44 + .../all/archetypes/points3d_random.cpp | 38 + .../all/archetypes/points3d_random.py | 14 + .../all/archetypes/points3d_random.rs | 27 + .../all/archetypes/points3d_row_updates.cpp | 40 + .../all/archetypes/points3d_row_updates.py | 36 + .../all/archetypes/points3d_row_updates.rs | 38 + .../all/archetypes/points3d_simple.cpp | 13 + .../all/archetypes/points3d_simple.py | 7 + .../all/archetypes/points3d_simple.rs | 13 + .../all/archetypes/points3d_ui_radius.cpp | 31 + .../all/archetypes/points3d_ui_radius.py | 31 + .../all/archetypes/points3d_ui_radius.rs | 32 + .../all/archetypes/scalars_column_updates.cpp | 30 + .../all/archetypes/scalars_column_updates.py | 23 + .../all/archetypes/scalars_column_updates.rs | 23 + .../all/archetypes/scalars_multiple_plots.cpp | 60 + .../all/archetypes/scalars_multiple_plots.py | 49 + .../all/archetypes/scalars_multiple_plots.rs | 60 + .../all/archetypes/scalars_row_updates.cpp | 20 + .../all/archetypes/scalars_row_updates.py | 18 + .../all/archetypes/scalars_row_updates.rs | 19 + .../all/archetypes/scalars_simple.cpp | 19 + .../snippets/all/archetypes/scalars_simple.py | 12 + .../snippets/all/archetypes/scalars_simple.rs | 17 + .../archetypes/segmentation_image_simple.cpp | 35 + .../archetypes/segmentation_image_simple.py | 21 + .../archetypes/segmentation_image_simple.rs | 27 + .../all/archetypes/series_lines_style.cpp | 44 + .../all/archetypes/series_lines_style.py | 30 + .../all/archetypes/series_lines_style.rs | 41 + .../all/archetypes/series_points_style.cpp | 40 + .../all/archetypes/series_points_style.py | 40 + .../all/archetypes/series_points_style.rs | 37 + docs/snippets/all/archetypes/state_change.cpp | 17 + docs/snippets/all/archetypes/state_change.py | 14 + docs/snippets/all/archetypes/state_change.rs | 17 + .../all/archetypes/state_configuration.cpp | 27 + .../all/archetypes/state_configuration.py | 26 + .../all/archetypes/state_configuration.rs | 27 + .../snippets/all/archetypes/tensor_simple.cpp | 27 + docs/snippets/all/archetypes/tensor_simple.py | 17 + docs/snippets/all/archetypes/tensor_simple.rs | 19 + .../snippets/all/archetypes/text_document.cpp | 48 + docs/snippets/all/archetypes/text_document.py | 49 + docs/snippets/all/archetypes/text_document.rs | 54 + docs/snippets/all/archetypes/text_log.cpp | 14 + docs/snippets/all/archetypes/text_log.py | 8 + docs/snippets/all/archetypes/text_log.rs | 13 + .../all/archetypes/text_log_integration.cpp | 61 + .../all/archetypes/text_log_integration.py | 18 + .../all/archetypes/text_log_integration.rs | 31 + .../all/archetypes/transform3d_axes.cpp | 33 + .../all/archetypes/transform3d_axes.py | 31 + .../all/archetypes/transform3d_axes.rs | 45 + .../archetypes/transform3d_column_updates.cpp | 52 + .../archetypes/transform3d_column_updates.py | 40 + .../archetypes/transform3d_column_updates.rs | 48 + .../all/archetypes/transform3d_hierarchy.cpp | 97 + .../all/archetypes/transform3d_hierarchy.py | 91 + .../all/archetypes/transform3d_hierarchy.rs | 97 + .../transform3d_hierarchy_frames.cpp | 108 + .../transform3d_hierarchy_frames.py | 100 + .../transform3d_hierarchy_frames.rs | 121 + .../transform3d_partial_updates.cpp | 60 + .../archetypes/transform3d_partial_updates.py | 57 + .../archetypes/transform3d_partial_updates.rs | 67 + .../archetypes/transform3d_row_updates.cpp | 39 + .../all/archetypes/transform3d_row_updates.py | 38 + .../all/archetypes/transform3d_row_updates.rs | 42 + .../all/archetypes/transform3d_simple.cpp | 33 + .../all/archetypes/transform3d_simple.py | 24 + .../all/archetypes/transform3d_simple.rs | 35 + .../all/archetypes/video_auto_frames.cpp | 51 + .../all/archetypes/video_auto_frames.py | 25 + .../all/archetypes/video_auto_frames.rs | 43 + .../all/archetypes/video_manual_frames.cpp | 40 + .../all/archetypes/video_manual_frames.py | 34 + .../all/archetypes/video_manual_frames.rs | 38 + .../archetypes/video_stream_query_and_mux.py | 147 + .../all/archetypes/video_stream_synthetic.py | 74 + .../archetypes/view_coordinates_simple.cpp | 17 + .../all/archetypes/view_coordinates_simple.py | 16 + .../all/archetypes/view_coordinates_simple.rs | 18 + .../all/archetypes/voxel_grid_map_simple.cpp | 43 + .../all/archetypes/voxel_grid_map_simple.py | 32 + .../all/archetypes/voxel_grid_map_simple.rs | 29 + docs/snippets/all/concepts/build_chunk.py | 23 + .../concepts/build_chunk_from_record_batch.py | 37 + .../snippets/all/concepts/chunk_processing.py | 104 + .../all/concepts/chunk_processing_intro.py | 32 + .../all/concepts/chunk_processing_query.py | 21 + .../concepts/different_data_per_timeline.cpp | 31 + .../concepts/different_data_per_timeline.py | 28 + .../concepts/different_data_per_timeline.rs | 32 + .../all/concepts/explicit_recording.py | 14 + docs/snippets/all/concepts/file_sink.cpp | 9 + docs/snippets/all/concepts/file_sink.py | 7 + docs/snippets/all/concepts/file_sink.rs | 10 + docs/snippets/all/concepts/grpc_sink.cpp | 12 + docs/snippets/all/concepts/grpc_sink.py | 9 + docs/snippets/all/concepts/grpc_sink.rs | 14 + .../how-does-rerun-work/log-to-grpc.cpp | 13 + .../how-does-rerun-work/log-to-grpc.py | 10 + .../how-does-rerun-work/log-to-grpc.rs | 11 + .../how-does-rerun-work/log-to-rrd.cpp | 12 + .../how-does-rerun-work/log-to-rrd.py | 10 + .../how-does-rerun-work/log-to-rrd.rs | 10 + .../all/concepts/how_helix_was_logged.py | 8 + docs/snippets/all/concepts/indices.cpp | 19 + docs/snippets/all/concepts/indices.py | 20 + docs/snippets/all/concepts/indices.rs | 21 + docs/snippets/all/concepts/lenses.py | 73 + docs/snippets/all/concepts/lenses.rs | 131 + .../dataframe_query_example.py | 51 + .../query-and-transform/segment_properties.py | 79 + .../all/concepts/recording_properties.cpp | 69 + .../all/concepts/recording_properties.py | 31 + .../all/concepts/recording_properties.rs | 48 + docs/snippets/all/concepts/rrd_format.py | 42 + docs/snippets/all/concepts/send_chunks.py | 20 + docs/snippets/all/concepts/send_chunks.rs | 27 + docs/snippets/all/concepts/send_dataframe.py | 56 + .../all/concepts/static/log_static.cpp | 1 + .../all/concepts/static/log_static.py | 1 + .../all/concepts/static/log_static.rs | 1 + .../all/concepts/static/log_static_10x.py | 2 + .../all/concepts/static/log_temporal_10x.py | 3 + .../all/concepts/static/send_static.cpp | 1 + .../all/concepts/static/send_static.py | 1 + .../all/concepts/static/send_static.rs | 1 + .../transform3d_hierarchy_named_frames.cpp | 56 + .../transform3d_hierarchy_named_frames.py | 51 + .../transform3d_hierarchy_named_frames.rs | 63 + .../concepts/transform3d_hierarchy_simple.cpp | 44 + .../concepts/transform3d_hierarchy_simple.py | 33 + .../concepts/transform3d_hierarchy_simple.rs | 42 + docs/snippets/all/concepts/viscomp-base.py | 12 + .../all/concepts/viscomp-component-default.py | 18 + .../concepts/viscomp-component-override.py | 19 + .../descriptors/descr_builtin_archetype.cpp | 14 + .../descriptors/descr_builtin_archetype.py | 13 + .../descriptors/descr_builtin_archetype.rs | 77 + .../descriptors/descr_builtin_component.cpp | 22 + .../descriptors/descr_builtin_component.py | 25 + .../descriptors/descr_builtin_component.rs | 82 + .../descriptors/descr_custom_archetype.cpp | 80 + .../all/descriptors/descr_custom_archetype.py | 41 + .../all/descriptors/descr_custom_archetype.rs | 120 + .../descriptors/descr_custom_component.cpp | 43 + .../all/descriptors/descr_custom_component.py | 20 + .../all/descriptors/descr_custom_component.rs | 75 + .../howto/any_batch_value_column_updates.cpp | 66 + .../howto/any_batch_value_column_updates.py | 44 + .../howto/any_batch_value_column_updates.rs | 45 + .../all/howto/any_values_column_updates.cpp | 63 + .../all/howto/any_values_column_updates.py | 24 + .../all/howto/any_values_column_updates.rs | 45 + .../all/howto/any_values_row_updates.cpp | 56 + .../all/howto/any_values_row_updates.py | 20 + .../all/howto/any_values_row_updates.rs | 35 + .../all/howto/check_connection_status.rs | 43 + docs/snippets/all/howto/component_mapping.py | 134 + docs/snippets/all/howto/component_mapping.rs | 140 + .../all/howto/convert_mcap_protobuf.py | 229 + .../convert_mcap_protobuf_send_column.py | 368 + .../all/howto/dataframe_operations.py | 214 + .../all/howto/dataframe_performance.py | 74 + docs/snippets/all/howto/dataloader.py | 161 + docs/snippets/all/howto/dataset_resampling.py | 104 + .../all/howto/dual_color_point_cloud.py | 113 + .../all/howto/dual_color_point_cloud.rs | 133 + docs/snippets/all/howto/layers.py | 176 + docs/snippets/all/howto/lerobot_export.py | 171 + docs/snippets/all/howto/load_mcap.cpp | 21 + docs/snippets/all/howto/load_mcap.py | 16 + docs/snippets/all/howto/load_mcap.rs | 15 + docs/snippets/all/howto/load_urdf.py | 32 + docs/snippets/all/howto/micro_batching.py | 27 + docs/snippets/all/howto/micro_batching.rs | 27 + docs/snippets/all/howto/minimal.urdf | 3 + docs/snippets/all/howto/optimize_chunks.py | 29 + .../howto/query-and-transform/segment_url.py | 136 + docs/snippets/all/howto/query_images.py | 57 + .../all/howto/query_video_keyframes.py | 175 + docs/snippets/all/howto/query_videos.py | 129 + docs/snippets/all/howto/screenshot.py | 22 + docs/snippets/all/howto/send_table.py | 18 + docs/snippets/all/howto/serve_web_viewer.py | 23 + docs/snippets/all/howto/serve_web_viewer.rs | 29 + docs/snippets/all/howto/set_sinks.cpp | 27 + docs/snippets/all/howto/set_sinks.py | 32 + docs/snippets/all/howto/set_sinks.rs | 28 + docs/snippets/all/howto/state_remapping.py | 53 + docs/snippets/all/howto/state_timeline.cpp | 39 + docs/snippets/all/howto/state_timeline.py | 49 + docs/snippets/all/howto/state_timeline.rs | 40 + docs/snippets/all/howto/sub_dataset.py | 103 + docs/snippets/all/howto/time_alignment.py | 56 + docs/snippets/all/howto/view_operations.py | 46 + .../howto/visualization/load_blueprint.cpp | 28 + .../all/howto/visualization/load_blueprint.py | 19 + .../all/howto/visualization/load_blueprint.rs | 30 + .../all/howto/visualization/save_blueprint.py | 14 + docs/snippets/all/migration/log_line.py | 7 + docs/snippets/all/migration/log_line.rs | 13 + .../all/migration/log_tick_enabled.cpp | 2 + .../all/migration/log_tick_enabled.py | 7 + .../all/migration/log_tick_enabled.rs | 2 + .../migration/transactional_transforms.cpp | 7 + .../all/migration/transactional_transforms.py | 9 + .../all/migration/transactional_transforms.rs | 13 + .../all/quick_start/quick_start_connect.cpp | 23 + .../all/quick_start/quick_start_connect.py | 29 + .../all/quick_start/quick_start_connect.rs | 25 + .../all/quick_start/quick_start_spawn.cpp | 22 + .../all/quick_start/quick_start_spawn.py | 25 + .../all/quick_start/quick_start_spawn.rs | 27 + .../all/reference/dataframe_view_query.py | 24 + docs/snippets/all/ruff.toml | 9 + .../all/tutorials/annotation_context.cpp | 40 + .../all/tutorials/annotation_context.py | 29 + .../all/tutorials/annotation_context.rs | 46 + docs/snippets/all/tutorials/any_values.cpp | 66 + docs/snippets/all/tutorials/any_values.py | 22 + docs/snippets/all/tutorials/any_values.rs | 38 + .../all/tutorials/custom-application-id.cpp | 1 + .../all/tutorials/custom-application-id.py | 1 + .../all/tutorials/custom-application-id.rs | 1 + .../all/tutorials/custom-recording-id.cpp | 3 + .../all/tutorials/custom-recording-id.py | 1 + .../all/tutorials/custom-recording-id.rs | 2 + docs/snippets/all/tutorials/custom_data.cpp | 95 + docs/snippets/all/tutorials/custom_data.py | 84 + docs/snippets/all/tutorials/custom_data.rs | 112 + docs/snippets/all/tutorials/data_out.py | 92 + .../all/tutorials/default-off-session.py | 3 + .../all/tutorials/default-off-session.rs | 1 + docs/snippets/all/tutorials/dna.cpp | 154 + docs/snippets/all/tutorials/dna.py | 101 + docs/snippets/all/tutorials/dna.rs | 123 + .../all/tutorials/dna_connect_grpc.cpp | 11 + .../all/tutorials/dna_connect_grpc.py | 8 + .../all/tutorials/dna_connect_grpc.rs | 11 + .../all/tutorials/dynamic_archetype.cpp | 70 + .../all/tutorials/dynamic_archetype.py | 25 + .../all/tutorials/dynamic_archetype.rs | 39 + docs/snippets/all/tutorials/extra_values.cpp | 36 + docs/snippets/all/tutorials/extra_values.py | 23 + docs/snippets/all/tutorials/extra_values.rs | 28 + .../all/tutorials/fixed_window_plot.py | 39 + .../snippets/all/tutorials/getting_started.py | 104 + .../all/tutorials/getting_started_convert.py | 7 + .../all/tutorials/getting_started_log.cpp | 16 + .../all/tutorials/getting_started_log.py | 12 + .../all/tutorials/getting_started_log.rs | 15 + docs/snippets/all/tutorials/log-file.cpp | 4 + docs/snippets/all/tutorials/log-file.py | 7 + docs/snippets/all/tutorials/log-file.rs | 5 + .../all/tutorials/timelines_example.cpp | 6 + .../all/tutorials/timelines_example.py | 5 + .../all/tutorials/timelines_example.rs | 6 + .../tutorials/visualization/load_blueprint.py | 12 + .../tutorials/visualization/save_blueprint.py | 23 + .../all/tutorials/visualizer-overrides.py | 24 + docs/snippets/all/views/bar_chart.py | 21 + docs/snippets/all/views/dataframe.py | 41 + docs/snippets/all/views/graph.py | 31 + docs/snippets/all/views/map.py | 27 + docs/snippets/all/views/spatial2d.py | 41 + docs/snippets/all/views/spatial3d.py | 60 + docs/snippets/all/views/state_timeline.py | 26 + docs/snippets/all/views/tensor.py | 42 + docs/snippets/all/views/text_document.py | 53 + docs/snippets/all/views/text_log.py | 40 + docs/snippets/all/views/timeseries.py | 83 + docs/snippets/build.rs | 158 + docs/snippets/compare_snippet_output.py | 465 + docs/snippets/rustfmt.toml | 2 + docs/snippets/snippet_dispatcher.cpp.in | 40 + docs/snippets/snippets.toml | 731 + docs/snippets/src/lib.rs | 5 + docs/snippets/src/main.rs | 6 + docs/snippets/src/snippets/.gitignore | 1 + docs/snippets/src/snippets/encoded_depth.png | Bin 0 -> 707 bytes docs/snippets/src/snippets/ferris.png | Bin 0 -> 46286 bytes examples/.gitignore | 1 + examples/.rerun_examples | 1 + examples/README.md | 55 + examples/assets/.gitignore | 1 + examples/assets/example.cpp | 4 + examples/assets/example.glb | Bin 0 -> 1936 bytes examples/assets/example.gltf | 121 + examples/assets/example.jpg | Bin 0 -> 15390 bytes examples/assets/example.md | 21 + examples/assets/example.mtl | 12 + examples/assets/example.obj | 40 + examples/assets/example.ply | 51 + examples/assets/example.png | Bin 0 -> 15016 bytes examples/assets/example.py | 4 + examples/assets/example.rrd | 3 + examples/assets/example.rs | 4 + examples/assets/example.txt | 9 + examples/c/README.md | 8 + examples/c/minimal/.gitignore | 2 + examples/c/minimal/README.md | 5 + examples/c/minimal/main.c | 29 + examples/c/spawn_viewer/.gitignore | 2 + examples/c/spawn_viewer/README.md | 11 + examples/c/spawn_viewer/main.c | 12 + examples/cpp/CMakeLists.txt | 23 + examples/cpp/README.md | 14 + examples/cpp/clock/CMakeLists.txt | 24 + examples/cpp/clock/README.md | 24 + examples/cpp/clock/main.cpp | 56 + .../custom_collection_adapter/CMakeLists.txt | 24 + .../cpp/custom_collection_adapter/README.md | 29 + .../cpp/custom_collection_adapter/main.cpp | 61 + examples/cpp/dna/CMakeLists.txt | 24 + examples/cpp/dna/README.md | 24 + examples/cpp/dna/main.cpp | 81 + examples/cpp/eigen_opencv/README.md | 95 + examples/cpp/external_importer/CMakeLists.txt | 29 + examples/cpp/external_importer/README.md | 24 + examples/cpp/external_importer/main.cpp | 137 + .../cpp/incremental_logging/CMakeLists.txt | 24 + examples/cpp/incremental_logging/README.md | 26 + examples/cpp/incremental_logging/main.cpp | 72 + examples/cpp/kiss-icp/README.md | 43 + examples/cpp/log_file/CMakeLists.txt | 29 + examples/cpp/log_file/README.md | 12 + examples/cpp/log_file/main.cpp | 80 + examples/cpp/minimal/CMakeLists.txt | 29 + examples/cpp/minimal/README.md | 24 + examples/cpp/minimal/main.cpp | 18 + examples/cpp/ros2_bridge/README.md | 27 + examples/cpp/ros_bridge/README.md | 36 + examples/cpp/shared_recording/CMakeLists.txt | 29 + examples/cpp/shared_recording/README.md | 25 + examples/cpp/shared_recording/main.cpp | 24 + examples/cpp/spawn_viewer/CMakeLists.txt | 24 + examples/cpp/spawn_viewer/README.md | 13 + examples/cpp/spawn_viewer/main.cpp | 5 + examples/cpp/stdio/CMakeLists.txt | 29 + examples/cpp/stdio/README.md | 23 + examples/cpp/stdio/main.cpp | 17 + examples/cpp/stereo_vision_slam/README.md | 182 + examples/cpp/vrs/README.md | 78 + examples/manifest.toml | 213 + examples/notebook/notebook/.gitignore | 1 + examples/notebook/notebook/README.md | 68 + examples/notebook/notebook/cube.ipynb | 527 + .../notebook/notebook/partial_updates.ipynb | 96 + examples/notebook/notebook/requirements.txt | 10 + examples/notebook/notebook/send_table.ipynb | 172 + .../notebook/set_application_blueprint.ipynb | 79 + .../notebook/notebook_callbacks/README.md | 43 + .../notebook_callbacks.ipynb | 101 + .../notebook_callbacks/requirements.txt | 3 + .../notebook_neural_field_2d/.gitignore | 1 + .../notebook_neural_field_2d/README.md | 47 + .../neural_field_2d.ipynb | 247 + .../notebook_neural_field_2d/requirements.txt | 11 + examples/notebook/notebook_viewer/README.md | 40 + .../notebook_viewer/notebook_viewer.ipynb | 29 + .../notebook/notebook_viewer/requirements.txt | 1 + examples/python/README.md | 83 + examples/python/_isolated/mypy.ini | 8 + examples/python/air_traffic_data/.gitignore | 1 + examples/python/air_traffic_data/README.md | 49 + .../air_traffic_data/air_traffic_data.py | 485 + .../python/air_traffic_data/pyproject.toml | 22 + examples/python/animated_urdf/README.md | 47 + .../python/animated_urdf/animated_urdf.py | 140 + examples/python/animated_urdf/pyproject.toml | 12 + examples/python/annotation_gradio/README.md | 35 + examples/python/any_scalar/README.md | 144 + .../python/any_scalar/any_scalar/__init__.py | 0 .../python/any_scalar/any_scalar/__main__.py | 46 + .../any_scalar/any_scalar/market_demo.py | 161 + .../any_scalar/any_scalar/robotics_demo.py | 189 + examples/python/any_scalar/pyproject.toml | 12 + examples/python/arflow/README.md | 52 + examples/python/arkit_scenes/.gitignore | 1 + examples/python/arkit_scenes/README.md | 132 + .../arkit_scenes/arkit_scenes/__init__.py | 0 .../arkit_scenes/arkit_scenes/__main__.py | 322 + .../arkit_scenes/download_dataset.py | 324 + examples/python/arkit_scenes/pyproject.toml | 22 + examples/python/blueprint/blueprint.py | 76 + examples/python/blueprint/pyproject.toml | 12 + examples/python/blueprint_stocks/README.md | 38 + .../blueprint_stocks/blueprint_stocks.py | 222 + .../python/blueprint_stocks/pyproject.toml | 16 + examples/python/camera_video_stream/README.md | 58 + .../camera_video_stream.py | 154 + .../python/camera_video_stream/pyproject.toml | 12 + examples/python/clock/README.md | 76 + examples/python/clock/clock.py | 81 + examples/python/clock/pyproject.toml | 16 + examples/python/controlnet/README.md | 92 + examples/python/controlnet/controlnet.py | 158 + examples/python/controlnet/pyproject.toml | 22 + examples/python/dataframe_query/README.md | 16 + .../python/dataframe_query/dataframe_query.py | 53 + .../python/dataframe_query/pyproject.toml | 13 + examples/python/dataloader/.gitignore | 3 + examples/python/dataloader/README.md | 77 + examples/python/dataloader/prepare_dataset.py | 152 + examples/python/dataloader/pyproject.toml | 45 + examples/python/dataloader/train.py | 286 + examples/python/dataloader/uv.lock | 1490 ++ examples/python/depth_compare/README.md | 23 + .../detect_and_track_objects/.gitignore | 2 + .../python/detect_and_track_objects/README.md | 172 + .../detect_and_track_objects.py | 506 + .../panoptic_coco_categories.json | 1465 ++ .../detect_and_track_objects/pyproject.toml | 25 + examples/python/dicom_mri/.gitignore | 1 + examples/python/dicom_mri/README.md | 63 + examples/python/dicom_mri/dicom_mri.py | 92 + examples/python/dicom_mri/pyproject.toml | 20 + .../differentiable_blocks_world/README.md | 43 + examples/python/dna/README.md | 22 + examples/python/dna/dna.py | 95 + examples/python/dna/pyproject.toml | 13 + examples/python/droid_dataset/README.md | 19 + .../python/droid_semantic_search/.gitignore | 10 + .../python/droid_semantic_search/README.md | 162 + .../droid_semantic_search/embeddings.py | 121 + .../python/droid_semantic_search/ingest.py | 330 + .../droid_semantic_search/prepare_dataset.py | 222 + .../droid_semantic_search/pyproject.toml | 66 + .../python/droid_semantic_search/search.py | 128 + examples/python/droid_semantic_search/uv.lock | 1298 ++ .../droid_semantic_search/vector_store.py | 161 + examples/python/drone_lidar/.gitignore | 1 + examples/python/drone_lidar/README.md | 40 + examples/python/drone_lidar/drone_lidar.py | 180 + examples/python/drone_lidar/pyproject.toml | 13 + examples/python/egoexo_forge/README.md | 35 + examples/python/external_importer/README.md | 30 + .../rerun-importer-python-file.py | 114 + examples/python/eye_control/README.md | 65 + examples/python/face_tracking/.gitignore | 2 + examples/python/face_tracking/README.md | 183 + .../python/face_tracking/face_tracking.py | 518 + examples/python/face_tracking/pyproject.toml | 24 + examples/python/gesture_detection/.gitignore | 2 + examples/python/gesture_detection/README.md | 134 + .../gesture_detection/gesture_detection.py | 346 + .../python/gesture_detection/pyproject.toml | 21 + examples/python/glomap/README.md | 17 + examples/python/graph_lattice/README.md | 28 + .../python/graph_lattice/graph_lattice.py | 75 + examples/python/graph_lattice/pyproject.toml | 12 + examples/python/graphs/README.md | 52 + examples/python/graphs/graphs.py | 206 + examples/python/graphs/pyproject.toml | 12 + examples/python/hloc_glomap/README.md | 24 + .../python/human_pose_tracking/.gitignore | 2 + examples/python/human_pose_tracking/README.md | 149 + .../human_pose_tracking.py | 263 + .../python/human_pose_tracking/pyproject.toml | 25 + examples/python/imu_signals/.gitignore | 2 + examples/python/imu_signals/README.md | 69 + examples/python/imu_signals/imu_signals.py | 183 + examples/python/imu_signals/pyproject.toml | 17 + examples/python/incremental_logging/README.md | 21 + .../incremental_logging.py | 62 + .../python/incremental_logging/pyproject.toml | 12 + examples/python/instant_splat/README.md | 24 + examples/python/kiss-icp/README.md | 43 + examples/python/lerobot/README.md | 39 + examples/python/lerobot_loader/README.md | 37 + examples/python/lidar/.gitignore | 1 + examples/python/lidar/README.md | 60 + examples/python/lidar/lidar/__init__.py | 0 examples/python/lidar/lidar/__main__.py | 104 + .../python/lidar/lidar/download_dataset.py | 66 + examples/python/lidar/pyproject.toml | 13 + examples/python/limap/README.md | 44 + .../live_camera_edge_detection/README.md | 76 + .../live_camera_edge_detection.py | 89 + .../live_camera_edge_detection/pyproject.toml | 16 + examples/python/live_depth_sensor/README.md | 113 + .../live_depth_sensor/live_depth_sensor.py | 107 + .../python/live_depth_sensor/pyproject.toml | 21 + examples/python/live_scrolling_plot/README.md | 68 + .../live_scrolling_plot.py | 91 + .../python/live_scrolling_plot/pyproject.toml | 12 + examples/python/llm_embedding_ner/README.md | 102 + .../llm_embedding_ner/llm_embedding_ner.py | 182 + .../python/llm_embedding_ner/pyproject.toml | 13 + examples/python/log_file/README.md | 14 + examples/python/log_file/log_file.py | 48 + examples/python/log_file/pyproject.toml | 12 + examples/python/mast3r_slam/README.md | 24 + examples/python/mcap/README.md | 32 + examples/python/mcc/README.md | 41 + examples/python/mini_nvs_solver/README.md | 24 + examples/python/minimal/README.md | 61 + examples/python/minimal/minimal.py | 26 + examples/python/minimal/pyproject.toml | 12 + .../python/minimal_options/minimal_options.py | 31 + .../python/minimal_options/pyproject.toml | 11 + examples/python/ml_depth_pro/README.md | 26 + .../python/multiprocess_logging/README.md | 91 + .../multiprocess_logging.py | 65 + .../multiprocess_logging/pyproject.toml | 12 + examples/python/multithreading/README.md | 72 + .../python/multithreading/multithreading.py | 44 + examples/python/multithreading/pyproject.toml | 12 + examples/python/nuscenes_dataset/.gitignore | 1 + examples/python/nuscenes_dataset/README.md | 194 + .../nuscenes_dataset/__init__.py | 0 .../nuscenes_dataset/__main__.py | 369 + .../nuscenes_dataset/download_dataset.py | 66 + .../nuscenes_dataset/export_gps.py | 87 + .../python/nuscenes_dataset/pyproject.toml | 12 + examples/python/nv12/README.md | 18 + examples/python/nv12/nv12.py | 61 + examples/python/nv12/pyproject.toml | 12 + examples/python/objectron/README.md | 134 + .../python/objectron/objectron/__init__.py | 0 .../python/objectron/objectron/__main__.py | 252 + .../objectron/objectron/download_dataset.py | 109 + .../objectron/objectron/proto/LICENSE.txt | 49 + .../objectron/objectron/proto/__init__.py | 0 .../proto/a_r_capture_metadata.proto | 621 + .../objectron/proto/annotation_data.proto | 81 + .../objectron/objectron/proto/object.proto | 114 + .../objectron/proto/objectron/__init__.py | 0 .../objectron/proto/objectron/proto.py | 795 + examples/python/objectron/pyproject.toml | 19 + examples/python/ocr/README.md | 182 + examples/python/ocr/ocr.py | 509 + examples/python/ocr/pyproject.toml | 24 + .../open_photogrammetry_format/README.md | 98 + .../open_photogrammetry_format.py | 239 + .../open_photogrammetry_format/pyproject.toml | 13 + examples/python/openstreetmap_data/.gitignore | 1 + examples/python/openstreetmap_data/README.md | 42 + .../openstreetmap_data/openstreetmap_data.py | 117 + .../python/openstreetmap_data/pyproject.toml | 12 + examples/python/plots/README.md | 142 + examples/python/plots/plots.py | 182 + examples/python/plots/pyproject.toml | 13 + .../python/prompt_depth_anything/README.md | 24 + examples/python/raw_mesh/README.md | 90 + examples/python/raw_mesh/pyproject.toml | 13 + examples/python/raw_mesh/raw_mesh/__init__.py | 0 examples/python/raw_mesh/raw_mesh/__main__.py | 155 + .../raw_mesh/raw_mesh/download_dataset.py | 80 + examples/python/rerun_export/README.md | 34 + examples/python/rgbd/.gitignore | 3 + examples/python/rgbd/README.md | 104 + examples/python/rgbd/pyproject.toml | 13 + examples/python/rgbd/rgbd.py | 221 + .../robot_data_preprocessing/.gitattributes | 2 + .../robot_data_preprocessing/.gitignore | 1 + .../python/robot_data_preprocessing/README.md | 176 + .../input_data/episode.mcap | 3 + .../input_data/meshes/angled_extrusion.stl | 3 + .../input_data/meshes/base_link.stl | 3 + .../input_data/meshes/camera_mount_d405.stl | 3 + .../input_data/meshes/carriage_left.stl | 3 + .../input_data/meshes/carriage_right.stl | 3 + .../input_data/meshes/corner_bracket.stl | 3 + .../input_data/meshes/d405_solid.stl | 3 + .../input_data/meshes/extrusion_1000.stl | 3 + .../input_data/meshes/extrusion_1220.stl | 3 + .../input_data/meshes/extrusion_150.stl | 3 + .../input_data/meshes/extrusion_2040_1000.stl | 3 + .../input_data/meshes/extrusion_2040_880.stl | 3 + .../input_data/meshes/extrusion_600.stl | 3 + .../input_data/meshes/gripper_left.stl | 3 + .../input_data/meshes/gripper_right.stl | 3 + .../input_data/meshes/link_1.stl | 3 + .../input_data/meshes/link_2.stl | 3 + .../input_data/meshes/link_3.stl | 3 + .../input_data/meshes/link_4.stl | 3 + .../input_data/meshes/link_5.stl | 3 + .../input_data/meshes/link_6.stl | 3 + .../input_data/meshes/overhead_mount.stl | 3 + .../input_data/meshes/tablelegs.obj | 3 + .../input_data/meshes/tabletop.obj | 3 + .../input_data/meshes/wormseye_mount.stl | 3 + .../input_data/offsets.json | 16 + .../input_data/robot.urdf | 3 + .../input_data/scene.urdf | 3 + .../robot_data_preprocessing/pyproject.toml | 15 + .../robot_data_preprocessing.py | 196 + examples/python/ros_node/README.md | 98 + examples/python/ros_node/main.py | 311 + examples/python/ros_node/requirements.txt | 10 + examples/python/ros_tf/README.md | 21 + examples/python/rrt_star/README.md | 123 + examples/python/rrt_star/pyproject.toml | 12 + examples/python/rrt_star/rrt_star.py | 308 + examples/python/sam2_depthanything/README.md | 24 + examples/python/sam3d_body/README.md | 43 + .../python/segment_anything_model/.gitignore | 1 + .../python/segment_anything_model/README.md | 84 + .../segment_anything_model/pyproject.toml | 27 + .../segment_anything_model.py | 222 + examples/python/server_tables/README.md | 48 + examples/python/server_tables/pyproject.toml | 12 + .../python/server_tables/server_tables.py | 179 + examples/python/shape_pointe/README.md | 49 + examples/python/shared_recording/README.md | 19 + .../python/shared_recording/pyproject.toml | 12 + .../shared_recording/shared_recording.py | 24 + examples/python/simplerecon/README.md | 42 + examples/python/slahmr/README.md | 49 + examples/python/stdio/README.md | 20 + examples/python/stdio/pyproject.toml | 12 + examples/python/stdio/requirements.txt | 1 + examples/python/stdio/stdio.py | 22 + .../python/structure_from_motion/.gitignore | 1 + .../python/structure_from_motion/README.md | 123 + .../structure_from_motion/pyproject.toml | 13 + .../structure_from_motion/__init__.py | 0 .../structure_from_motion/__main__.py | 216 + .../structure_from_motion/read_write_model.py | 510 + examples/python/table_blueprints/README.md | 96 + .../python/table_blueprints/pyproject.toml | 12 + .../table_blueprints/table_blueprints.py | 453 + .../python/table_grid_with_flags/README.md | 33 + .../table_grid_with_flags/pyproject.toml | 12 + .../table_grid_with_flags.py | 75 + examples/python/table_zoo/README.md | 19 + examples/python/table_zoo/pyproject.toml | 12 + examples/python/table_zoo/table_zoo.py | 379 + examples/python/tapir/README.md | 36 + examples/python/template/README.md | 32 + examples/python/template/pyproject.toml | 18 + examples/python/template/template.py | 24 + examples/python/tfrecord_loader/README.md | 49 + examples/python/using_index_values/README.md | 36 + .../python/using_index_values/pyproject.toml | 12 + .../using_index_values/using_index_values.py | 149 + examples/python/vista/README.md | 23 + examples/python/vistadream/README.md | 38 + examples/python/webpage/README.md | 23 + examples/python/widebaseline/README.md | 36 + examples/rust/README.md | 74 + examples/rust/animated_urdf/Cargo.toml | 14 + examples/rust/animated_urdf/README.md | 22 + examples/rust/animated_urdf/data/LICENSE | 201 + examples/rust/animated_urdf/data/README.md | 1 + .../rust/animated_urdf/data/assets/Base.stl | 3 + .../animated_urdf/data/assets/Base_Motor.stl | 3 + .../animated_urdf/data/assets/Fixed_Jaw.stl | 3 + .../data/assets/Fixed_Jaw_Motor.stl | 3 + .../animated_urdf/data/assets/Lower_Arm.stl | 3 + .../data/assets/Lower_Arm_Motor.stl | 3 + .../animated_urdf/data/assets/Moving_Jaw.stl | 3 + .../data/assets/Rotation_Pitch.stl | 3 + .../data/assets/Rotation_Pitch_Motor.stl | 3 + .../animated_urdf/data/assets/Upper_Arm.stl | 3 + .../data/assets/Upper_Arm_Motor.stl | 3 + .../data/assets/Wrist_Pitch_Roll.stl | 3 + .../data/assets/Wrist_Pitch_Roll_Motor.stl | 3 + examples/rust/animated_urdf/data/so100.urdf | 3 + examples/rust/animated_urdf/src/main.rs | 62 + examples/rust/blueprint/Cargo.toml | 12 + examples/rust/blueprint/README.md | 17 + examples/rust/blueprint/src/main.rs | 103 + examples/rust/blueprint_stocks/Cargo.toml | 18 + examples/rust/blueprint_stocks/README.md | 17 + .../blueprint_stocks/src/data/info/aapl.json | 6 + .../blueprint_stocks/src/data/info/amzn.json | 6 + .../blueprint_stocks/src/data/info/googl.json | 6 + .../blueprint_stocks/src/data/info/meta.json | 6 + .../blueprint_stocks/src/data/info/msft.json | 6 + .../src/data/quotes/aapl.json | 3521 ++++ .../src/data/quotes/amzn.json | 3521 ++++ .../src/data/quotes/googl.json | 3521 ++++ .../src/data/quotes/meta.json | 3521 ++++ .../src/data/quotes/msft.json | 3521 ++++ examples/rust/blueprint_stocks/src/main.rs | 416 + examples/rust/chess_robby_fischer/README.md | 336 + examples/rust/clock/Cargo.toml | 13 + examples/rust/clock/README.md | 20 + examples/rust/clock/src/main.rs | 95 + examples/rust/custom_callback/Cargo.toml | 42 + examples/rust/custom_callback/README.md | 41 + examples/rust/custom_callback/src/app.rs | 113 + .../rust/custom_callback/src/comms/app.rs | 187 + .../rust/custom_callback/src/comms/mod.rs | 3 + .../custom_callback/src/comms/protocol.rs | 38 + .../rust/custom_callback/src/comms/viewer.rs | 226 + examples/rust/custom_callback/src/lib.rs | 2 + examples/rust/custom_callback/src/panel.rs | 232 + examples/rust/custom_callback/src/viewer.rs | 76 + examples/rust/custom_importer/Cargo.toml | 15 + examples/rust/custom_importer/README.md | 20 + examples/rust/custom_importer/build.rs | 3 + examples/rust/custom_importer/src/main.rs | 89 + .../rust/custom_store_subscriber/Cargo.toml | 13 + .../rust/custom_store_subscriber/README.md | 24 + .../rust/custom_store_subscriber/build.rs | 3 + .../rust/custom_store_subscriber/src/main.rs | 238 + examples/rust/custom_view/Cargo.toml | 23 + examples/rust/custom_view/README.md | 29 + .../src/color_coordinate_config.rs | 181 + examples/rust/custom_view/src/main.rs | 88 + .../custom_view/src/points3d_color_view.rs | 281 + .../src/points3d_color_visualizer.rs | 103 + examples/rust/custom_visualizer/Cargo.toml | 26 + examples/rust/custom_visualizer/README.md | 31 + .../shader/height_field.wgsl | 93 + .../src/height_field_archetype.rs | 117 + .../src/height_field_renderer.rs | 381 + .../src/height_field_visualizer.rs | 139 + examples/rust/custom_visualizer/src/main.rs | 181 + examples/rust/dataframe_query/Cargo.toml | 13 + examples/rust/dataframe_query/README.md | 17 + examples/rust/dataframe_query/src/main.rs | 69 + examples/rust/dna/Cargo.toml | 13 + examples/rust/dna/README.md | 22 + examples/rust/dna/src/main.rs | 80 + examples/rust/extend_viewer_ui/Cargo.toml | 23 + examples/rust/extend_viewer_ui/README.md | 31 + examples/rust/extend_viewer_ui/src/main.rs | 202 + examples/rust/external_importer/Cargo.toml | 13 + examples/rust/external_importer/README.md | 24 + examples/rust/external_importer/src/main.rs | 148 + examples/rust/graph_lattice/Cargo.toml | 13 + examples/rust/graph_lattice/README.md | 28 + examples/rust/graph_lattice/src/main.rs | 47 + examples/rust/incremental_logging/Cargo.toml | 14 + examples/rust/incremental_logging/README.md | 21 + examples/rust/incremental_logging/src/main.rs | 99 + examples/rust/lenses/Cargo.toml | 13 + examples/rust/lenses/README.md | 13 + examples/rust/lenses/src/main.rs | 144 + examples/rust/log_file/Cargo.toml | 13 + examples/rust/log_file/README.md | 10 + examples/rust/log_file/src/main.rs | 62 + examples/rust/minimal/Cargo.toml | 10 + examples/rust/minimal/README.md | 21 + examples/rust/minimal/src/main.rs | 21 + examples/rust/minimal_options/Cargo.toml | 14 + examples/rust/minimal_options/src/main.rs | 56 + examples/rust/minimal_serve/Cargo.toml | 10 + examples/rust/minimal_serve/README.md | 20 + examples/rust/minimal_serve/src/main.rs | 30 + examples/rust/objectron/.gitattributes | 1 + examples/rust/objectron/Cargo.toml | 22 + examples/rust/objectron/README.md | 23 + examples/rust/objectron/build.rs | 71 + examples/rust/objectron/proto | 1 + examples/rust/objectron/src/main.rs | 461 + examples/rust/objectron/src/objectron.rs | 1355 ++ examples/rust/raw_mesh/Cargo.toml | 15 + examples/rust/raw_mesh/README.md | 24 + examples/rust/raw_mesh/src/main.rs | 304 + examples/rust/revy/README.md | 89 + examples/rust/shared_recording/Cargo.toml | 10 + examples/rust/shared_recording/README.md | 19 + examples/rust/shared_recording/src/main.rs | 14 + examples/rust/spawn_viewer/Cargo.toml | 10 + examples/rust/spawn_viewer/README.md | 11 + examples/rust/spawn_viewer/src/main.rs | 6 + examples/rust/state_timeline/Cargo.toml | 16 + examples/rust/state_timeline/src/main.rs | 113 + examples/rust/stdio/Cargo.toml | 11 + examples/rust/stdio/README.md | 20 + examples/rust/stdio/src/main.rs | 20 + examples/rust/template/Cargo.toml | 10 + examples/rust/template/README.md | 31 + examples/rust/template/src/main.rs | 10 + examples/rust/viewer_callbacks/Cargo.toml | 22 + examples/rust/viewer_callbacks/README.md | 31 + examples/rust/viewer_callbacks/src/main.rs | 202 + examples/schema.json | 3 + hooks/README.md | 16 + hooks/pre-push | 12 + lychee.toml | 217 + pixi.lock | 14854 +++++++++++++++ pixi.toml | 688 + pyproject.toml | 453 + pyrightconfig.json | 23 + rerun_cpp/.gitattributes | 257 + rerun_cpp/.gitignore | 2 + rerun_cpp/CMakeLists.txt | 256 + rerun_cpp/Config.cmake.in | 73 + rerun_cpp/README.md | 174 + rerun_cpp/arrow_cpp_install.md | 86 + rerun_cpp/cmake_setup_in_detail.md | 122 + rerun_cpp/docs/Doxyfile | 2299 +++ rerun_cpp/docs/doxygen-awesome/README.md | 6 + .../doxygen-awesome-darkmode-toggle.js | 157 + .../doxygen-awesome-fragment-copy-button.js | 85 + .../doxygen-awesome-interactive-toc.js | 81 + .../doxygen-awesome-paragraph-link.js | 51 + ...n-awesome-sidebar-only-darkmode-toggle.css | 40 + .../doxygen-awesome-sidebar-only.css | 116 + .../doxygen-awesome/doxygen-awesome-tabs.js | 70 + .../docs/doxygen-awesome/doxygen-awesome.css | 2530 +++ rerun_cpp/docs/header.html | 91 + rerun_cpp/docs/readme_snippets.cpp | 71 + rerun_cpp/docs/writing_docs.md | 41 + rerun_cpp/download_and_build_arrow.cmake | 161 + rerun_cpp/patches/mimalloc_cmake4.patch | 29 + rerun_cpp/src/rerun.hpp | 97 + rerun_cpp/src/rerun/.gitattributes | 6 + rerun_cpp/src/rerun/archetypes.hpp | 54 + rerun_cpp/src/rerun/archetypes/.gitattributes | 103 + .../rerun/archetypes/annotation_context.cpp | 49 + .../rerun/archetypes/annotation_context.hpp | 159 + rerun_cpp/src/rerun/archetypes/arrows2d.cpp | 128 + rerun_cpp/src/rerun/archetypes/arrows2d.hpp | 272 + .../src/rerun/archetypes/arrows2d_ext.cpp | 19 + rerun_cpp/src/rerun/archetypes/arrows3d.cpp | 116 + rerun_cpp/src/rerun/archetypes/arrows3d.hpp | 258 + .../src/rerun/archetypes/arrows3d_ext.cpp | 20 + rerun_cpp/src/rerun/archetypes/asset3d.cpp | 72 + rerun_cpp/src/rerun/archetypes/asset3d.hpp | 262 + .../src/rerun/archetypes/asset3d_ext.cpp | 92 + .../src/rerun/archetypes/asset_video.cpp | 60 + .../src/rerun/archetypes/asset_video.hpp | 284 + .../src/rerun/archetypes/asset_video_ext.cpp | 134 + rerun_cpp/src/rerun/archetypes/bar_chart.cpp | 82 + rerun_cpp/src/rerun/archetypes/bar_chart.hpp | 311 + .../src/rerun/archetypes/bar_chart_ext.cpp | 125 + rerun_cpp/src/rerun/archetypes/boxes2d.cpp | 129 + rerun_cpp/src/rerun/archetypes/boxes2d.hpp | 295 + .../src/rerun/archetypes/boxes2d_ext.cpp | 90 + rerun_cpp/src/rerun/archetypes/boxes3d.cpp | 156 + rerun_cpp/src/rerun/archetypes/boxes3d.hpp | 365 + .../src/rerun/archetypes/boxes3d_ext.cpp | 99 + rerun_cpp/src/rerun/archetypes/capsules3d.cpp | 167 + rerun_cpp/src/rerun/archetypes/capsules3d.hpp | 390 + .../src/rerun/archetypes/capsules3d_ext.cpp | 38 + rerun_cpp/src/rerun/archetypes/clear.cpp | 49 + rerun_cpp/src/rerun/archetypes/clear.hpp | 175 + rerun_cpp/src/rerun/archetypes/clear_ext.cpp | 35 + .../src/rerun/archetypes/coordinate_frame.cpp | 49 + .../src/rerun/archetypes/coordinate_frame.hpp | 149 + .../src/rerun/archetypes/cylinders3d.cpp | 167 + .../src/rerun/archetypes/cylinders3d.hpp | 370 + .../src/rerun/archetypes/cylinders3d_ext.cpp | 21 + .../src/rerun/archetypes/depth_image.cpp | 131 + .../src/rerun/archetypes/depth_image.hpp | 475 + .../src/rerun/archetypes/depth_image_ext.cpp | 76 + rerun_cpp/src/rerun/archetypes/ellipses2d.cpp | 130 + rerun_cpp/src/rerun/archetypes/ellipses2d.hpp | 305 + .../src/rerun/archetypes/ellipses2d_ext.cpp | 31 + .../src/rerun/archetypes/ellipsoids3d.cpp | 157 + .../src/rerun/archetypes/ellipsoids3d.hpp | 382 + .../src/rerun/archetypes/ellipsoids3d_ext.cpp | 70 + .../rerun/archetypes/encoded_depth_image.cpp | 132 + .../rerun/archetypes/encoded_depth_image.hpp | 392 + .../src/rerun/archetypes/encoded_image.cpp | 97 + .../src/rerun/archetypes/encoded_image.hpp | 285 + .../rerun/archetypes/encoded_image_ext.cpp | 69 + .../src/rerun/archetypes/geo_line_strings.cpp | 71 + .../src/rerun/archetypes/geo_line_strings.hpp | 162 + rerun_cpp/src/rerun/archetypes/geo_points.cpp | 82 + rerun_cpp/src/rerun/archetypes/geo_points.hpp | 170 + .../src/rerun/archetypes/geo_points_ext.cpp | 19 + .../src/rerun/archetypes/graph_edges.cpp | 60 + .../src/rerun/archetypes/graph_edges.hpp | 145 + .../src/rerun/archetypes/graph_nodes.cpp | 106 + .../src/rerun/archetypes/graph_nodes.hpp | 206 + rerun_cpp/src/rerun/archetypes/grid_map.cpp | 142 + rerun_cpp/src/rerun/archetypes/grid_map.hpp | 396 + rerun_cpp/src/rerun/archetypes/image.cpp | 96 + rerun_cpp/src/rerun/archetypes/image.hpp | 498 + rerun_cpp/src/rerun/archetypes/image_ext.cpp | 165 + .../src/rerun/archetypes/instance_poses3d.cpp | 98 + .../src/rerun/archetypes/instance_poses3d.hpp | 225 + .../src/rerun/archetypes/line_strips2d.cpp | 117 + .../src/rerun/archetypes/line_strips2d.hpp | 304 + .../src/rerun/archetypes/line_strips3d.cpp | 105 + .../src/rerun/archetypes/line_strips3d.hpp | 271 + .../src/rerun/archetypes/mcap_channel.cpp | 83 + .../src/rerun/archetypes/mcap_channel.hpp | 228 + .../src/rerun/archetypes/mcap_message.cpp | 48 + .../src/rerun/archetypes/mcap_message.hpp | 120 + .../src/rerun/archetypes/mcap_schema.cpp | 81 + .../src/rerun/archetypes/mcap_schema.hpp | 223 + .../src/rerun/archetypes/mcap_statistics.cpp | 148 + .../src/rerun/archetypes/mcap_statistics.hpp | 424 + rerun_cpp/src/rerun/archetypes/mesh3d.cpp | 157 + rerun_cpp/src/rerun/archetypes/mesh3d.hpp | 433 + rerun_cpp/src/rerun/archetypes/pinhole.cpp | 135 + rerun_cpp/src/rerun/archetypes/pinhole.hpp | 537 + .../src/rerun/archetypes/pinhole_ext.cpp | 79 + rerun_cpp/src/rerun/archetypes/points2d.cpp | 130 + rerun_cpp/src/rerun/archetypes/points2d.hpp | 336 + rerun_cpp/src/rerun/archetypes/points3d.cpp | 130 + rerun_cpp/src/rerun/archetypes/points3d.hpp | 426 + .../src/rerun/archetypes/recording_info.cpp | 60 + .../src/rerun/archetypes/recording_info.hpp | 126 + rerun_cpp/src/rerun/archetypes/scalars.cpp | 48 + rerun_cpp/src/rerun/archetypes/scalars.hpp | 152 + .../rerun/archetypes/segmentation_image.cpp | 82 + .../rerun/archetypes/segmentation_image.hpp | 301 + .../archetypes/segmentation_image_ext.cpp | 77 + .../src/rerun/archetypes/series_lines.cpp | 108 + .../src/rerun/archetypes/series_lines.hpp | 311 + .../src/rerun/archetypes/series_lines_ext.cpp | 21 + .../src/rerun/archetypes/series_points.cpp | 95 + .../src/rerun/archetypes/series_points.hpp | 245 + .../rerun/archetypes/series_points_ext.cpp | 21 + .../src/rerun/archetypes/state_change.cpp | 48 + .../src/rerun/archetypes/state_change.hpp | 131 + .../rerun/archetypes/state_configuration.cpp | 81 + .../rerun/archetypes/state_configuration.hpp | 198 + rerun_cpp/src/rerun/archetypes/tensor.cpp | 60 + rerun_cpp/src/rerun/archetypes/tensor.hpp | 210 + rerun_cpp/src/rerun/archetypes/tensor_ext.cpp | 153 + .../src/rerun/archetypes/text_document.cpp | 60 + .../src/rerun/archetypes/text_document.hpp | 194 + rerun_cpp/src/rerun/archetypes/text_log.cpp | 70 + rerun_cpp/src/rerun/archetypes/text_log.hpp | 212 + .../src/rerun/archetypes/transform3d.cpp | 133 + .../src/rerun/archetypes/transform3d.hpp | 935 + .../src/rerun/archetypes/transform3d_ext.cpp | 382 + .../src/rerun/archetypes/transform_axes3d.cpp | 61 + .../src/rerun/archetypes/transform_axes3d.hpp | 178 + .../archetypes/video_frame_reference.cpp | 84 + .../archetypes/video_frame_reference.hpp | 336 + .../src/rerun/archetypes/video_stream.cpp | 94 + .../src/rerun/archetypes/video_stream.hpp | 287 + .../src/rerun/archetypes/view_coordinates.cpp | 48 + .../src/rerun/archetypes/view_coordinates.hpp | 389 + .../rerun/archetypes/view_coordinates_ext.cpp | 396 + .../src/rerun/archetypes/voxel_grid_map.cpp | 154 + .../src/rerun/archetypes/voxel_grid_map.hpp | 438 + rerun_cpp/src/rerun/arrow_utils.hpp | 32 + rerun_cpp/src/rerun/as_components.hpp | 89 + rerun_cpp/src/rerun/blueprint/.gitattributes | 6 + rerun_cpp/src/rerun/blueprint/archetypes.hpp | 41 + .../rerun/blueprint/archetypes/.gitattributes | 77 + .../archetypes/active_visualizers.cpp | 52 + .../archetypes/active_visualizers.hpp | 110 + .../rerun/blueprint/archetypes/background.cpp | 60 + .../rerun/blueprint/archetypes/background.hpp | 107 + .../archetypes/container_blueprint.cpp | 137 + .../archetypes/container_blueprint.hpp | 253 + .../blueprint/archetypes/dataframe_query.cpp | 129 + .../blueprint/archetypes/dataframe_query.hpp | 223 + .../blueprint/archetypes/entity_behavior.cpp | 61 + .../blueprint/archetypes/entity_behavior.hpp | 124 + .../blueprint/archetypes/eye_controls3d.cpp | 120 + .../blueprint/archetypes/eye_controls3d.hpp | 223 + .../blueprint/archetypes/force_center.cpp | 61 + .../blueprint/archetypes/force_center.hpp | 109 + .../archetypes/force_collision_radius.cpp | 76 + .../archetypes/force_collision_radius.hpp | 135 + .../rerun/blueprint/archetypes/force_link.cpp | 74 + .../rerun/blueprint/archetypes/force_link.hpp | 130 + .../blueprint/archetypes/force_many_body.cpp | 62 + .../blueprint/archetypes/force_many_body.hpp | 118 + .../blueprint/archetypes/force_position.cpp | 74 + .../blueprint/archetypes/force_position.hpp | 126 + .../blueprint/archetypes/graph_background.cpp | 49 + .../blueprint/archetypes/graph_background.hpp | 89 + .../blueprint/archetypes/line_grid3d.cpp | 94 + .../blueprint/archetypes/line_grid3d.hpp | 171 + .../blueprint/archetypes/map_background.cpp | 50 + .../blueprint/archetypes/map_background.hpp | 98 + .../rerun/blueprint/archetypes/map_zoom.cpp | 49 + .../rerun/blueprint/archetypes/map_zoom.hpp | 97 + .../blueprint/archetypes/near_clip_plane.cpp | 52 + .../blueprint/archetypes/near_clip_plane.hpp | 103 + .../blueprint/archetypes/panel_blueprint.cpp | 50 + .../blueprint/archetypes/panel_blueprint.hpp | 89 + .../blueprint/archetypes/plot_background.cpp | 61 + .../blueprint/archetypes/plot_background.hpp | 104 + .../blueprint/archetypes/plot_legend.cpp | 60 + .../blueprint/archetypes/plot_legend.hpp | 111 + .../blueprint/archetypes/scalar_axis.cpp | 62 + .../blueprint/archetypes/scalar_axis.hpp | 110 + .../archetypes/spatial_information.cpp | 75 + .../archetypes/spatial_information.hpp | 138 + .../blueprint/archetypes/table_blueprint.cpp | 91 + .../blueprint/archetypes/table_blueprint.hpp | 183 + .../archetypes/tensor_scalar_mapping.cpp | 73 + .../archetypes/tensor_scalar_mapping.hpp | 140 + .../archetypes/tensor_slice_selection.cpp | 90 + .../archetypes/tensor_slice_selection.hpp | 160 + .../blueprint/archetypes/tensor_view_fit.cpp | 50 + .../blueprint/archetypes/tensor_view_fit.hpp | 89 + .../archetypes/text_document_format.cpp | 62 + .../archetypes/text_document_format.hpp | 118 + .../blueprint/archetypes/text_log_columns.cpp | 66 + .../blueprint/archetypes/text_log_columns.hpp | 120 + .../blueprint/archetypes/text_log_format.cpp | 50 + .../blueprint/archetypes/text_log_format.hpp | 97 + .../blueprint/archetypes/text_log_rows.cpp | 49 + .../blueprint/archetypes/text_log_rows.hpp | 97 + .../rerun/blueprint/archetypes/time_axis.cpp | 75 + .../rerun/blueprint/archetypes/time_axis.hpp | 126 + .../archetypes/time_panel_blueprint.cpp | 125 + .../archetypes/time_panel_blueprint.hpp | 203 + .../blueprint/archetypes/view_blueprint.cpp | 86 + .../blueprint/archetypes/view_blueprint.hpp | 168 + .../blueprint/archetypes/view_contents.cpp | 50 + .../blueprint/archetypes/view_contents.hpp | 136 + .../archetypes/viewport_blueprint.cpp | 104 + .../archetypes/viewport_blueprint.hpp | 193 + .../archetypes/visible_time_ranges.cpp | 50 + .../archetypes/visible_time_ranges.hpp | 110 + .../blueprint/archetypes/visual_bounds2d.cpp | 50 + .../blueprint/archetypes/visual_bounds2d.hpp | 103 + .../archetypes/visualizer_instruction.cpp | 67 + .../archetypes/visualizer_instruction.hpp | 120 + rerun_cpp/src/rerun/blueprint/components.hpp | 58 + .../rerun/blueprint/components/.gitattributes | 68 + .../components/absolute_time_range.hpp | 73 + .../rerun/blueprint/components/active_tab.hpp | 81 + .../blueprint/components/angular_speed.hpp | 77 + .../blueprint/components/apply_latest_at.hpp | 78 + .../blueprint/components/auto_layout.hpp | 76 + .../blueprint/components/auto_scroll.hpp | 76 + .../rerun/blueprint/components/auto_views.hpp | 76 + .../blueprint/components/background_kind.cpp | 60 + .../blueprint/components/background_kind.hpp | 65 + .../blueprint/components/column_name.hpp | 75 + .../blueprint/components/column_order.cpp | 74 + .../blueprint/components/column_order.hpp | 67 + .../blueprint/components/column_share.hpp | 77 + .../components/component_column_selector.hpp | 80 + .../blueprint/components/container_kind.cpp | 60 + .../blueprint/components/container_kind.hpp | 64 + .../rerun/blueprint/components/corner2d.cpp | 58 + .../rerun/blueprint/components/corner2d.hpp | 63 + .../rerun/blueprint/components/enabled.hpp | 76 + .../rerun/blueprint/components/eye3d_kind.cpp | 58 + .../rerun/blueprint/components/eye3d_kind.hpp | 67 + .../blueprint/components/filter_by_range.hpp | 73 + .../components/filter_is_not_null.hpp | 76 + .../blueprint/components/force_distance.hpp | 81 + .../blueprint/components/force_iterations.hpp | 81 + .../blueprint/components/force_strength.hpp | 81 + .../src/rerun/blueprint/components/fps.hpp | 76 + .../blueprint/components/grid_columns.hpp | 77 + .../blueprint/components/grid_spacing.hpp | 77 + .../blueprint/components/included_content.hpp | 85 + .../rerun/blueprint/components/link_axis.cpp | 58 + .../rerun/blueprint/components/link_axis.hpp | 57 + .../components/lock_range_during_zoom.hpp | 81 + .../rerun/blueprint/components/loop_mode.cpp | 58 + .../rerun/blueprint/components/loop_mode.hpp | 62 + .../blueprint/components/map_provider.cpp | 58 + .../blueprint/components/map_provider.hpp | 66 + .../blueprint/components/near_clip_plane.hpp | 81 + .../blueprint/components/panel_state.cpp | 58 + .../blueprint/components/panel_state.hpp | 60 + .../rerun/blueprint/components/play_state.cpp | 58 + .../rerun/blueprint/components/play_state.hpp | 60 + .../blueprint/components/playback_speed.hpp | 80 + .../blueprint/components/query_expression.hpp | 88 + .../blueprint/components/root_container.hpp | 76 + .../rerun/blueprint/components/row_share.hpp | 77 + .../blueprint/components/selected_columns.hpp | 75 + .../tensor_dimension_index_slider.hpp | 89 + .../blueprint/components/text_log_column.hpp | 75 + .../rerun/blueprint/components/time_int.hpp | 76 + .../rerun/blueprint/components/time_range.hpp | 69 + .../blueprint/components/timeline_column.hpp | 76 + .../blueprint/components/timeline_name.hpp | 75 + .../rerun/blueprint/components/view_class.hpp | 75 + .../rerun/blueprint/components/view_fit.cpp | 58 + .../rerun/blueprint/components/view_fit.hpp | 60 + .../blueprint/components/view_maximized.hpp | 78 + .../blueprint/components/view_origin.hpp | 80 + .../components/viewer_recommendation_hash.hpp | 81 + .../components/visible_time_range.hpp | 76 + .../blueprint/components/visual_bounds2d.hpp | 73 + .../visualizer_component_mapping.hpp | 82 + .../components/visualizer_instruction_id.hpp | 84 + .../blueprint/components/visualizer_type.hpp | 81 + .../rerun/blueprint/components/zoom_level.hpp | 77 + rerun_cpp/src/rerun/blueprint/datatypes.hpp | 14 + .../rerun/blueprint/datatypes/.gitattributes | 23 + .../datatypes/component_column_selector.cpp | 91 + .../datatypes/component_column_selector.hpp | 63 + .../datatypes/component_source_kind.cpp | 61 + .../datatypes/component_source_kind.hpp | 75 + .../blueprint/datatypes/filter_by_range.cpp | 85 + .../blueprint/datatypes/filter_by_range.hpp | 58 + .../datatypes/filter_is_not_null.cpp | 89 + .../datatypes/filter_is_not_null.hpp | 60 + .../blueprint/datatypes/selected_columns.cpp | 118 + .../blueprint/datatypes/selected_columns.hpp | 61 + .../tensor_dimension_index_slider.cpp | 68 + .../tensor_dimension_index_slider.hpp | 62 + .../blueprint/datatypes/text_log_column.cpp | 89 + .../blueprint/datatypes/text_log_column.hpp | 61 + .../datatypes/text_log_column_kind.cpp | 61 + .../datatypes/text_log_column_kind.hpp | 61 + .../blueprint/datatypes/timeline_column.cpp | 86 + .../blueprint/datatypes/timeline_column.hpp | 62 + .../visualizer_component_mapping.cpp | 116 + .../visualizer_component_mapping.hpp | 76 + rerun_cpp/src/rerun/c/.gitattributes | 1 + .../src/rerun/c/arrow_c_data_interface.h | 111 + rerun_cpp/src/rerun/c/compiler_utils.h | 10 + rerun_cpp/src/rerun/c/rerun.h | 723 + rerun_cpp/src/rerun/c/sdk_info.h | 28 + rerun_cpp/src/rerun/collection.hpp | 496 + rerun_cpp/src/rerun/collection_adapter.hpp | 43 + .../src/rerun/collection_adapter_builtins.hpp | 138 + rerun_cpp/src/rerun/compiler_utils.hpp | 61 + rerun_cpp/src/rerun/component_batch.cpp | 62 + rerun_cpp/src/rerun/component_batch.hpp | 154 + rerun_cpp/src/rerun/component_column.cpp | 56 + rerun_cpp/src/rerun/component_column.hpp | 98 + rerun_cpp/src/rerun/component_descriptor.hpp | 129 + rerun_cpp/src/rerun/component_type.cpp | 23 + rerun_cpp/src/rerun/component_type.hpp | 35 + .../src/rerun/component_type_registry.cpp | 42 + .../src/rerun/component_type_registry.hpp | 38 + rerun_cpp/src/rerun/components.hpp | 88 + rerun_cpp/src/rerun/components/.gitattributes | 104 + .../rerun/components/aggregation_policy.cpp | 58 + .../rerun/components/aggregation_policy.hpp | 75 + .../src/rerun/components/albedo_factor.hpp | 73 + .../rerun/components/annotation_context.cpp | 78 + .../rerun/components/annotation_context.hpp | 101 + .../components/annotation_context_ext.cpp | 42 + .../src/rerun/components/axis_length.hpp | 73 + rerun_cpp/src/rerun/components/blob.hpp | 72 + rerun_cpp/src/rerun/components/cell_size.hpp | 75 + rerun_cpp/src/rerun/components/channel_id.hpp | 72 + .../components/channel_message_counts.cpp | 78 + .../components/channel_message_counts.hpp | 69 + rerun_cpp/src/rerun/components/class_id.hpp | 70 + .../rerun/components/clear_is_recursive.hpp | 74 + rerun_cpp/src/rerun/components/color.hpp | 98 + rerun_cpp/src/rerun/components/color_ext.cpp | 40 + rerun_cpp/src/rerun/components/colormap.cpp | 56 + rerun_cpp/src/rerun/components/colormap.hpp | 125 + rerun_cpp/src/rerun/components/count.hpp | 78 + .../src/rerun/components/depth_meter.hpp | 83 + rerun_cpp/src/rerun/components/draw_order.hpp | 78 + .../src/rerun/components/entity_path.hpp | 82 + .../src/rerun/components/entity_path_ext.cpp | 14 + rerun_cpp/src/rerun/components/fill_mode.cpp | 56 + rerun_cpp/src/rerun/components/fill_mode.hpp | 76 + rerun_cpp/src/rerun/components/fill_ratio.hpp | 78 + .../src/rerun/components/gamma_correction.hpp | 79 + .../src/rerun/components/geo_line_string.cpp | 72 + .../src/rerun/components/geo_line_string.hpp | 62 + .../rerun/components/geo_line_string_ext.cpp | 21 + rerun_cpp/src/rerun/components/graph_edge.hpp | 74 + .../src/rerun/components/graph_edge_ext.cpp | 20 + rerun_cpp/src/rerun/components/graph_node.hpp | 78 + .../src/rerun/components/graph_node_ext.cpp | 19 + rerun_cpp/src/rerun/components/graph_type.cpp | 56 + rerun_cpp/src/rerun/components/graph_type.hpp | 56 + .../src/rerun/components/half_size2d.hpp | 90 + .../src/rerun/components/half_size2d_ext.cpp | 31 + .../src/rerun/components/half_size3d.hpp | 94 + .../src/rerun/components/half_size3d_ext.cpp | 35 + .../src/rerun/components/image_buffer.hpp | 85 + .../src/rerun/components/image_buffer_ext.cpp | 25 + .../src/rerun/components/image_format.hpp | 83 + .../src/rerun/components/image_format_ext.cpp | 23 + .../rerun/components/image_plane_distance.hpp | 76 + .../src/rerun/components/interactive.hpp | 75 + .../rerun/components/interpolation_mode.cpp | 58 + .../rerun/components/interpolation_mode.hpp | 69 + .../src/rerun/components/is_keyframe.hpp | 79 + .../src/rerun/components/key_value_pairs.cpp | 72 + .../src/rerun/components/key_value_pairs.hpp | 68 + .../src/rerun/components/keypoint_id.hpp | 73 + rerun_cpp/src/rerun/components/lat_lon.hpp | 88 + .../src/rerun/components/lat_lon_ext.cpp | 31 + rerun_cpp/src/rerun/components/length.hpp | 76 + .../src/rerun/components/line_strip2d.cpp | 72 + .../src/rerun/components/line_strip2d.hpp | 72 + .../src/rerun/components/line_strip3d.cpp | 72 + .../src/rerun/components/line_strip3d.hpp | 72 + .../src/rerun/components/linear_speed.hpp | 74 + .../rerun/components/magnification_filter.cpp | 58 + .../rerun/components/magnification_filter.hpp | 71 + .../src/rerun/components/marker_shape.cpp | 56 + .../src/rerun/components/marker_shape.hpp | 81 + .../src/rerun/components/marker_size.hpp | 73 + rerun_cpp/src/rerun/components/media_type.hpp | 167 + .../src/rerun/components/media_type_ext.cpp | 152 + .../rerun/components/mesh_face_rendering.cpp | 58 + .../rerun/components/mesh_face_rendering.hpp | 67 + rerun_cpp/src/rerun/components/name.hpp | 82 + rerun_cpp/src/rerun/components/name_ext.cpp | 29 + rerun_cpp/src/rerun/components/opacity.hpp | 76 + .../rerun/components/pinhole_projection.hpp | 93 + .../components/pinhole_projection_ext.cpp | 24 + rerun_cpp/src/rerun/components/plane3d.hpp | 74 + .../src/rerun/components/point_shading.cpp | 56 + .../src/rerun/components/point_shading.hpp | 57 + rerun_cpp/src/rerun/components/position2d.hpp | 85 + .../src/rerun/components/position2d_ext.cpp | 31 + rerun_cpp/src/rerun/components/position3d.hpp | 89 + .../src/rerun/components/position3d_ext.cpp | 35 + rerun_cpp/src/rerun/components/radius.hpp | 97 + rerun_cpp/src/rerun/components/radius_ext.cpp | 30 + rerun_cpp/src/rerun/components/range1d.hpp | 74 + rerun_cpp/src/rerun/components/resolution.hpp | 87 + .../src/rerun/components/resolution_ext.cpp | 34 + .../rerun/components/rotation_axis_angle.hpp | 71 + .../src/rerun/components/rotation_quat.hpp | 70 + rerun_cpp/src/rerun/components/scalar.hpp | 75 + rerun_cpp/src/rerun/components/scale3d.hpp | 101 + .../src/rerun/components/scale3d_ext.cpp | 27 + rerun_cpp/src/rerun/components/schema_id.hpp | 70 + .../src/rerun/components/show_labels.hpp | 78 + .../src/rerun/components/stroke_width.hpp | 73 + .../src/rerun/components/tensor_data.hpp | 93 + .../src/rerun/components/tensor_data_ext.cpp | 31 + .../tensor_dimension_index_selection.hpp | 76 + .../components/tensor_height_dimension.hpp | 70 + .../components/tensor_width_dimension.hpp | 70 + rerun_cpp/src/rerun/components/texcoord2d.hpp | 100 + .../src/rerun/components/texcoord2d_ext.cpp | 27 + rerun_cpp/src/rerun/components/text.hpp | 82 + rerun_cpp/src/rerun/components/text_ext.cpp | 29 + .../src/rerun/components/text_log_level.hpp | 109 + .../rerun/components/text_log_level_ext.cpp | 63 + rerun_cpp/src/rerun/components/timestamp.hpp | 75 + .../rerun/components/transform_frame_id.hpp | 87 + .../components/transform_frame_id_ext.cpp | 14 + .../src/rerun/components/transform_mat3x3.hpp | 91 + .../rerun/components/transform_mat3x3_ext.cpp | 9 + .../rerun/components/transform_relation.cpp | 58 + .../rerun/components/transform_relation.hpp | 65 + .../src/rerun/components/translation3d.hpp | 95 + .../rerun/components/translation3d_ext.cpp | 25 + .../src/rerun/components/triangle_indices.hpp | 84 + .../rerun/components/triangle_indices_ext.cpp | 27 + .../src/rerun/components/value_range.hpp | 77 + rerun_cpp/src/rerun/components/vector2d.hpp | 91 + .../src/rerun/components/vector2d_ext.cpp | 34 + rerun_cpp/src/rerun/components/vector3d.hpp | 95 + .../src/rerun/components/vector3d_ext.cpp | 38 + .../src/rerun/components/video_codec.cpp | 56 + .../src/rerun/components/video_codec.hpp | 109 + .../src/rerun/components/video_sample.hpp | 80 + .../src/rerun/components/video_timestamp.hpp | 119 + .../rerun/components/video_timestamp_ext.cpp | 60 + .../src/rerun/components/view_coordinates.hpp | 345 + .../rerun/components/view_coordinates_ext.cpp | 530 + rerun_cpp/src/rerun/components/visible.hpp | 73 + .../src/rerun/components/voxel_index.hpp | 82 + .../src/rerun/components/voxel_index_ext.cpp | 23 + rerun_cpp/src/rerun/components/voxel_size.hpp | 74 + .../src/rerun/components/voxel_value.hpp | 73 + rerun_cpp/src/rerun/config.cpp | 11 + rerun_cpp/src/rerun/config.hpp | 52 + rerun_cpp/src/rerun/datatypes.hpp | 54 + rerun_cpp/src/rerun/datatypes/.gitattributes | 103 + .../rerun/datatypes/absolute_time_range.cpp | 83 + .../rerun/datatypes/absolute_time_range.hpp | 55 + rerun_cpp/src/rerun/datatypes/angle.cpp | 57 + rerun_cpp/src/rerun/datatypes/angle.hpp | 75 + rerun_cpp/src/rerun/datatypes/angle_ext.cpp | 29 + .../src/rerun/datatypes/annotation_info.cpp | 101 + .../src/rerun/datatypes/annotation_info.hpp | 75 + .../rerun/datatypes/annotation_info_ext.cpp | 34 + rerun_cpp/src/rerun/datatypes/blob.cpp | 66 + rerun_cpp/src/rerun/datatypes/blob.hpp | 66 + rerun_cpp/src/rerun/datatypes/blob_ext.cpp | 25 + rerun_cpp/src/rerun/datatypes/bool.cpp | 58 + rerun_cpp/src/rerun/datatypes/bool.hpp | 56 + .../rerun/datatypes/channel_count_pair.cpp | 88 + .../rerun/datatypes/channel_count_pair.hpp | 56 + .../src/rerun/datatypes/channel_datatype.cpp | 57 + .../src/rerun/datatypes/channel_datatype.hpp | 86 + .../src/rerun/datatypes/class_description.cpp | 136 + .../src/rerun/datatypes/class_description.hpp | 91 + .../rerun/datatypes/class_description_ext.cpp | 26 + .../datatypes/class_description_map_elem.cpp | 90 + .../datatypes/class_description_map_elem.hpp | 68 + .../class_description_map_elem_ext.cpp | 28 + rerun_cpp/src/rerun/datatypes/class_id.cpp | 56 + rerun_cpp/src/rerun/datatypes/class_id.hpp | 61 + rerun_cpp/src/rerun/datatypes/color_model.cpp | 56 + rerun_cpp/src/rerun/datatypes/color_model.hpp | 67 + rerun_cpp/src/rerun/datatypes/dvec2d.cpp | 63 + rerun_cpp/src/rerun/datatypes/dvec2d.hpp | 75 + rerun_cpp/src/rerun/datatypes/dvec2d_ext.cpp | 34 + rerun_cpp/src/rerun/datatypes/entity_path.cpp | 57 + rerun_cpp/src/rerun/datatypes/entity_path.hpp | 59 + rerun_cpp/src/rerun/datatypes/float32.cpp | 57 + rerun_cpp/src/rerun/datatypes/float32.hpp | 61 + rerun_cpp/src/rerun/datatypes/float64.cpp | 57 + rerun_cpp/src/rerun/datatypes/float64.hpp | 61 + .../src/rerun/datatypes/image_format.cpp | 144 + .../src/rerun/datatypes/image_format.hpp | 106 + .../src/rerun/datatypes/image_format_ext.cpp | 61 + rerun_cpp/src/rerun/datatypes/ivec3d.cpp | 63 + rerun_cpp/src/rerun/datatypes/ivec3d.hpp | 79 + rerun_cpp/src/rerun/datatypes/ivec3d_ext.cpp | 38 + rerun_cpp/src/rerun/datatypes/keypoint_id.cpp | 56 + rerun_cpp/src/rerun/datatypes/keypoint_id.hpp | 62 + .../src/rerun/datatypes/keypoint_pair.cpp | 89 + .../src/rerun/datatypes/keypoint_pair.hpp | 64 + .../src/rerun/datatypes/keypoint_pair_ext.cpp | 30 + rerun_cpp/src/rerun/datatypes/mat3x3.cpp | 63 + rerun_cpp/src/rerun/datatypes/mat3x3.hpp | 104 + rerun_cpp/src/rerun/datatypes/mat3x3_ext.cpp | 62 + rerun_cpp/src/rerun/datatypes/mat4x4.cpp | 63 + rerun_cpp/src/rerun/datatypes/mat4x4.hpp | 118 + rerun_cpp/src/rerun/datatypes/mat4x4_ext.cpp | 70 + .../src/rerun/datatypes/pixel_format.cpp | 56 + .../src/rerun/datatypes/pixel_format.hpp | 141 + rerun_cpp/src/rerun/datatypes/plane3d.cpp | 64 + rerun_cpp/src/rerun/datatypes/plane3d.hpp | 59 + rerun_cpp/src/rerun/datatypes/quaternion.cpp | 64 + rerun_cpp/src/rerun/datatypes/quaternion.hpp | 109 + .../src/rerun/datatypes/quaternion_ext.cpp | 74 + rerun_cpp/src/rerun/datatypes/range1d.cpp | 64 + rerun_cpp/src/rerun/datatypes/range1d.hpp | 58 + rerun_cpp/src/rerun/datatypes/range2d.cpp | 83 + rerun_cpp/src/rerun/datatypes/range2d.hpp | 54 + rerun_cpp/src/rerun/datatypes/rgba32.cpp | 57 + rerun_cpp/src/rerun/datatypes/rgba32.hpp | 93 + rerun_cpp/src/rerun/datatypes/rgba32_ext.cpp | 47 + .../rerun/datatypes/rotation_axis_angle.cpp | 85 + .../rerun/datatypes/rotation_axis_angle.hpp | 66 + .../datatypes/rotation_axis_angle_ext.cpp | 26 + .../src/rerun/datatypes/tensor_buffer.cpp | 207 + .../src/rerun/datatypes/tensor_buffer.hpp | 528 + .../src/rerun/datatypes/tensor_buffer_ext.cpp | 78 + rerun_cpp/src/rerun/datatypes/tensor_data.cpp | 110 + rerun_cpp/src/rerun/datatypes/tensor_data.hpp | 99 + .../src/rerun/datatypes/tensor_data_ext.cpp | 33 + .../tensor_dimension_index_selection.cpp | 76 + .../tensor_dimension_index_selection.hpp | 57 + .../datatypes/tensor_dimension_selection.cpp | 75 + .../datatypes/tensor_dimension_selection.hpp | 55 + rerun_cpp/src/rerun/datatypes/time_int.cpp | 57 + rerun_cpp/src/rerun/datatypes/time_int.hpp | 61 + rerun_cpp/src/rerun/datatypes/time_range.cpp | 93 + rerun_cpp/src/rerun/datatypes/time_range.hpp | 54 + .../rerun/datatypes/time_range_boundary.cpp | 107 + .../rerun/datatypes/time_range_boundary.hpp | 174 + rerun_cpp/src/rerun/datatypes/uint16.cpp | 57 + rerun_cpp/src/rerun/datatypes/uint16.hpp | 61 + rerun_cpp/src/rerun/datatypes/uint32.cpp | 57 + rerun_cpp/src/rerun/datatypes/uint32.hpp | 61 + rerun_cpp/src/rerun/datatypes/uint64.cpp | 57 + rerun_cpp/src/rerun/datatypes/uint64.hpp | 61 + rerun_cpp/src/rerun/datatypes/utf8.cpp | 57 + rerun_cpp/src/rerun/datatypes/utf8.hpp | 75 + rerun_cpp/src/rerun/datatypes/utf8_ext.cpp | 36 + rerun_cpp/src/rerun/datatypes/utf8pair.cpp | 81 + rerun_cpp/src/rerun/datatypes/utf8pair.hpp | 61 + .../src/rerun/datatypes/utf8pair_ext.cpp | 19 + rerun_cpp/src/rerun/datatypes/uuid.cpp | 63 + rerun_cpp/src/rerun/datatypes/uuid.hpp | 59 + rerun_cpp/src/rerun/datatypes/uvec2d.cpp | 63 + rerun_cpp/src/rerun/datatypes/uvec2d.hpp | 75 + rerun_cpp/src/rerun/datatypes/uvec2d_ext.cpp | 34 + rerun_cpp/src/rerun/datatypes/uvec3d.cpp | 63 + rerun_cpp/src/rerun/datatypes/uvec3d.hpp | 79 + rerun_cpp/src/rerun/datatypes/uvec3d_ext.cpp | 38 + rerun_cpp/src/rerun/datatypes/uvec4d.cpp | 63 + rerun_cpp/src/rerun/datatypes/uvec4d.hpp | 58 + rerun_cpp/src/rerun/datatypes/vec2d.cpp | 63 + rerun_cpp/src/rerun/datatypes/vec2d.hpp | 75 + rerun_cpp/src/rerun/datatypes/vec2d_ext.cpp | 34 + rerun_cpp/src/rerun/datatypes/vec3d.cpp | 63 + rerun_cpp/src/rerun/datatypes/vec3d.hpp | 79 + rerun_cpp/src/rerun/datatypes/vec3d_ext.cpp | 38 + rerun_cpp/src/rerun/datatypes/vec4d.cpp | 63 + rerun_cpp/src/rerun/datatypes/vec4d.hpp | 83 + rerun_cpp/src/rerun/datatypes/vec4d_ext.cpp | 42 + .../src/rerun/datatypes/video_timestamp.cpp | 57 + .../src/rerun/datatypes/video_timestamp.hpp | 66 + .../src/rerun/datatypes/view_coordinates.cpp | 64 + .../src/rerun/datatypes/view_coordinates.hpp | 86 + .../rerun/datatypes/view_coordinates_ext.cpp | 24 + .../rerun/datatypes/visible_time_range.cpp | 84 + .../rerun/datatypes/visible_time_range.hpp | 56 + rerun_cpp/src/rerun/demo_utils.cpp | 75 + rerun_cpp/src/rerun/demo_utils.hpp | 75 + rerun_cpp/src/rerun/entity_path.cpp | 36 + rerun_cpp/src/rerun/entity_path.hpp | 20 + rerun_cpp/src/rerun/error.cpp | 138 + rerun_cpp/src/rerun/error.hpp | 184 + rerun_cpp/src/rerun/half.hpp | 10 + rerun_cpp/src/rerun/image_utils.hpp | 187 + rerun_cpp/src/rerun/log_sink.cpp | 29 + rerun_cpp/src/rerun/log_sink.hpp | 69 + rerun_cpp/src/rerun/loggable.hpp | 54 + rerun_cpp/src/rerun/recording_stream.cpp | 388 + rerun_cpp/src/rerun/recording_stream.hpp | 994 + rerun_cpp/src/rerun/rerun_sdk_export.hpp | 25 + rerun_cpp/src/rerun/result.hpp | 86 + rerun_cpp/src/rerun/rotation3d.hpp | 33 + rerun_cpp/src/rerun/sdk_info.cpp | 33 + rerun_cpp/src/rerun/sdk_info.hpp | 20 + rerun_cpp/src/rerun/spawn.cpp | 15 + rerun_cpp/src/rerun/spawn.hpp | 21 + rerun_cpp/src/rerun/spawn_options.cpp | 15 + rerun_cpp/src/rerun/spawn_options.hpp | 65 + rerun_cpp/src/rerun/string_utils.cpp | 31 + rerun_cpp/src/rerun/string_utils.hpp | 16 + rerun_cpp/src/rerun/third_party/cxxopts.hpp | 2198 +++ rerun_cpp/src/rerun/time_column.cpp | 68 + rerun_cpp/src/rerun/time_column.hpp | 288 + rerun_cpp/src/rerun/timeline.cpp | 28 + rerun_cpp/src/rerun/timeline.hpp | 38 + rerun_cpp/src/rerun/type_traits.hpp | 40 + rerun_cpp/tests/CMakeLists.txt | 37 + .../tests/archetypes/annotation_context.cpp | 96 + rerun_cpp/tests/archetypes/archetype_test.hpp | 39 + rerun_cpp/tests/archetypes/arrows3d.cpp | 56 + rerun_cpp/tests/archetypes/boxes2d.cpp | 130 + rerun_cpp/tests/archetypes/boxes3d.cpp | 135 + rerun_cpp/tests/archetypes/clear.cpp | 17 + rerun_cpp/tests/archetypes/image.cpp | 133 + rerun_cpp/tests/archetypes/lines_strips2d.cpp | 63 + rerun_cpp/tests/archetypes/lines_strips3d.cpp | 58 + rerun_cpp/tests/archetypes/mesh3d.cpp | 61 + rerun_cpp/tests/archetypes/pinhole.cpp | 67 + rerun_cpp/tests/archetypes/points2d.cpp | 57 + rerun_cpp/tests/archetypes/points3d.cpp | 63 + .../segmentation_and_depth_image.cpp | 64 + rerun_cpp/tests/archetypes/tensor.cpp | 39 + rerun_cpp/tests/archetypes/transform3d.cpp | 247 + .../tests/archetypes/view_coordinates.cpp | 45 + rerun_cpp/tests/collection.cpp | 716 + rerun_cpp/tests/color.cpp | 78 + rerun_cpp/tests/component_type.cpp | 35 + rerun_cpp/tests/config.cpp | 31 + rerun_cpp/tests/error_check.hpp | 41 + rerun_cpp/tests/generated/.gitattributes | 6 + rerun_cpp/tests/generated/archetypes.hpp | 8 + .../tests/generated/archetypes/.gitattributes | 11 + .../generated/archetypes/affix_fuzzer1.cpp | 301 + .../generated/archetypes/affix_fuzzer1.hpp | 691 + .../generated/archetypes/affix_fuzzer2.cpp | 265 + .../generated/archetypes/affix_fuzzer2.hpp | 415 + .../generated/archetypes/affix_fuzzer3.cpp | 253 + .../generated/archetypes/affix_fuzzer3.hpp | 529 + .../generated/archetypes/affix_fuzzer4.cpp | 253 + .../generated/archetypes/affix_fuzzer4.hpp | 340 + rerun_cpp/tests/generated/components.hpp | 27 + .../tests/generated/components/.gitattributes | 42 + .../generated/components/affix_fuzzer1.hpp | 67 + .../generated/components/affix_fuzzer10.cpp | 63 + .../generated/components/affix_fuzzer10.hpp | 59 + .../generated/components/affix_fuzzer11.cpp | 70 + .../generated/components/affix_fuzzer11.hpp | 59 + .../generated/components/affix_fuzzer12.cpp | 65 + .../generated/components/affix_fuzzer12.hpp | 59 + .../generated/components/affix_fuzzer13.cpp | 70 + .../generated/components/affix_fuzzer13.hpp | 62 + .../generated/components/affix_fuzzer14.hpp | 67 + .../generated/components/affix_fuzzer15.cpp | 55 + .../generated/components/affix_fuzzer15.hpp | 67 + .../generated/components/affix_fuzzer16.cpp | 72 + .../generated/components/affix_fuzzer16.hpp | 62 + .../generated/components/affix_fuzzer17.cpp | 78 + .../generated/components/affix_fuzzer17.hpp | 65 + .../generated/components/affix_fuzzer18.cpp | 78 + .../generated/components/affix_fuzzer18.hpp | 65 + .../generated/components/affix_fuzzer19.hpp | 79 + .../generated/components/affix_fuzzer2.hpp | 67 + .../generated/components/affix_fuzzer20.hpp | 67 + .../generated/components/affix_fuzzer21.hpp | 67 + .../generated/components/affix_fuzzer22.cpp | 55 + .../generated/components/affix_fuzzer22.hpp | 75 + .../generated/components/affix_fuzzer23.cpp | 55 + .../generated/components/affix_fuzzer23.hpp | 64 + .../generated/components/affix_fuzzer3.hpp | 67 + .../generated/components/affix_fuzzer4.cpp | 54 + .../generated/components/affix_fuzzer4.hpp | 65 + .../generated/components/affix_fuzzer5.cpp | 54 + .../generated/components/affix_fuzzer5.hpp | 65 + .../generated/components/affix_fuzzer6.cpp | 54 + .../generated/components/affix_fuzzer6.hpp | 65 + .../generated/components/affix_fuzzer7.cpp | 78 + .../generated/components/affix_fuzzer7.hpp | 64 + .../generated/components/affix_fuzzer8.cpp | 62 + .../generated/components/affix_fuzzer8.hpp | 62 + .../generated/components/affix_fuzzer9.cpp | 57 + .../generated/components/affix_fuzzer9.hpp | 58 + rerun_cpp/tests/generated/datatypes.hpp | 18 + .../tests/generated/datatypes/.gitattributes | 31 + .../generated/datatypes/affix_fuzzer1.cpp | 207 + .../generated/datatypes/affix_fuzzer1.hpp | 69 + .../generated/datatypes/affix_fuzzer2.cpp | 62 + .../generated/datatypes/affix_fuzzer2.hpp | 62 + .../generated/datatypes/affix_fuzzer20.cpp | 90 + .../generated/datatypes/affix_fuzzer20.hpp | 53 + .../generated/datatypes/affix_fuzzer21.cpp | 87 + .../generated/datatypes/affix_fuzzer21.hpp | 52 + .../generated/datatypes/affix_fuzzer22.cpp | 73 + .../generated/datatypes/affix_fuzzer22.hpp | 57 + .../generated/datatypes/affix_fuzzer3.cpp | 122 + .../generated/datatypes/affix_fuzzer3.hpp | 240 + .../generated/datatypes/affix_fuzzer4.cpp | 110 + .../generated/datatypes/affix_fuzzer4.hpp | 199 + .../generated/datatypes/affix_fuzzer5.cpp | 80 + .../generated/datatypes/affix_fuzzer5.hpp | 61 + .../tests/generated/datatypes/enum_test.cpp | 56 + .../tests/generated/datatypes/enum_test.hpp | 67 + .../generated/datatypes/flattened_scalar.cpp | 64 + .../generated/datatypes/flattened_scalar.hpp | 55 + .../tests/generated/datatypes/multi_enum.cpp | 89 + .../tests/generated/datatypes/multi_enum.hpp | 55 + .../datatypes/primitive_component.cpp | 59 + .../datatypes/primitive_component.hpp | 61 + .../generated/datatypes/string_component.cpp | 58 + .../generated/datatypes/string_component.hpp | 57 + .../tests/generated/datatypes/valued_enum.cpp | 56 + .../tests/generated/datatypes/valued_enum.hpp | 61 + rerun_cpp/tests/header_checks.cpp | 22 + rerun_cpp/tests/log_empty.cpp | 28 + rerun_cpp/tests/main.cpp | 11 + rerun_cpp/tests/mat.cpp | 111 + rerun_cpp/tests/recording_stream.cpp | 569 + rerun_cpp/tests/sdk_info.cpp | 37 + rerun_cpp/tests/test_types.cpp | 3 + rerun_cpp/tests/vec_and_quaternion.cpp | 109 + .../tests/windows_min_max_robustness.cpp | 10 + rerun_js/.gitignore | 3 + rerun_js/package.json | 26 + rerun_js/scripts/common.mjs | 91 + rerun_js/scripts/docs.mjs | 35 + rerun_js/scripts/publish.mjs | 79 + rerun_js/scripts/serve-docs.mjs | 80 + rerun_js/scripts/version.mjs | 79 + rerun_js/web-viewer-react/.gitignore | 3 + rerun_js/web-viewer-react/README.md | 49 + rerun_js/web-viewer-react/index.js | 275 + rerun_js/web-viewer-react/package.json | 60 + rerun_js/web-viewer-react/tsconfig.json | 16 + rerun_js/web-viewer-react/typedoc.json | 10 + rerun_js/web-viewer-react/types.d.ts | 21 + rerun_js/web-viewer/.gitignore | 12 + rerun_js/web-viewer/README.md | 65 + rerun_js/web-viewer/build-wasm.mjs | 217 + rerun_js/web-viewer/index.ts | 1355 ++ rerun_js/web-viewer/package.json | 68 + rerun_js/web-viewer/tsconfig.json | 14 + rerun_js/web-viewer/typedoc.json | 9 + rerun_js/yarn.lock | 279 + rerun_notebook/.gitignore | 11 + rerun_notebook/README.md | 101 + rerun_notebook/build.mjs | 44 + rerun_notebook/package-lock.json | 517 + rerun_notebook/package.json | 15 + rerun_notebook/pyproject.toml | 46 + rerun_notebook/src/js/widget.css | 19 + rerun_notebook/src/js/widget.ts | 221 + rerun_notebook/src/rerun_notebook/__init__.py | 286 + rerun_notebook/src/rerun_notebook/__main__.py | 26 + .../src/rerun_notebook/asset_server.py | 107 + .../src/rerun_notebook/error_widget.js | 55 + rerun_notebook/tests/__init__.py | 0 rerun_notebook/tests/conftest.py | 23 + rerun_notebook/tests/test_send_table.py | 105 + rerun_notebook/tests/test_viewer.py | 105 + rerun_notebook/tsconfig.json | 25 + rerun_pixi_env/pyproject.toml | 19 + rerun_pixi_env/src/rerun_pixi_env/__init__.py | 170 + .../src/rerun_pixi_env/pyo3_config.py | 145 + rerun_py/.gitignore | 9 + rerun_py/.non_sdk_mypy.ini | 65 + rerun_py/ARCHITECTURE.md | 187 + rerun_py/Cargo.toml | 136 + rerun_py/README.md | 111 + rerun_py/build.rs | 111 + rerun_py/docs/css/mkdocstrings.css | 67 + rerun_py/docs/gen_common_index.py | 608 + .../python/material/class.html.jinja | 126 + .../python/material/function.html.jinja | 142 + rerun_py/docs/writing_docs.md | 95 + rerun_py/mkdocs.yml | 129 + rerun_py/pyproject.toml | 286 + rerun_py/rerun_bindings/__init__.py | 22 + rerun_py/rerun_bindings/py.typed | 0 rerun_py/rerun_bindings/rerun_bindings.pyi | 1806 ++ rerun_py/rerun_bindings/types.py | 28 + rerun_py/rerun_dev_fixup/pyproject.toml | 22 + .../rerun_dev_fixup/__init__.py | 46 + rerun_py/rerun_dev_fixup/rerun_sdk_fixup.pth | 1 + rerun_py/rerun_sdk.pth | 1 + rerun_py/rerun_sdk/rerun/.gitattributes | 95 + rerun_py/rerun_sdk/rerun/__init__.py | 538 + rerun_py/rerun_sdk/rerun/__main__.py | 27 + rerun_py/rerun_sdk/rerun/_arrow.py | 23 + rerun_py/rerun_sdk/rerun/_baseclasses.py | 559 + rerun_py/rerun_sdk/rerun/_color_conversion.py | 108 + rerun_py/rerun_sdk/rerun/_converters.py | 170 + rerun_py/rerun_sdk/rerun/_event.py | 239 + rerun_py/rerun_sdk/rerun/_legacy_notebook.py | 183 + rerun_py/rerun_sdk/rerun/_loading_widget.css | 30 + rerun_py/rerun_sdk/rerun/_log.py | 369 + rerun_py/rerun_sdk/rerun/_logging_handler.py | 52 + rerun_py/rerun_sdk/rerun/_memory.py | 64 + .../rerun_sdk/rerun/_numpy_compatibility.py | 33 + rerun_py/rerun_sdk/rerun/_properties.py | 86 + rerun_py/rerun_sdk/rerun/_script_helpers.py | 145 + rerun_py/rerun_sdk/rerun/_send_columns.py | 242 + rerun_py/rerun_sdk/rerun/_send_dataframe.py | 110 + rerun_py/rerun_sdk/rerun/_spawn.py | 80 + rerun_py/rerun_sdk/rerun/_tracing.py | 211 + rerun_py/rerun_sdk/rerun/_tracing_session.py | 209 + rerun_py/rerun_sdk/rerun/_unions.py | 35 + rerun_py/rerun_sdk/rerun/_validators.py | 126 + rerun_py/rerun_sdk/rerun/any_batch_value.py | 356 + rerun_py/rerun_sdk/rerun/any_value.py | 156 + .../rerun_sdk/rerun/archetypes/.gitattributes | 54 + .../rerun_sdk/rerun/archetypes/__init__.py | 107 + .../rerun/archetypes/annotation_context.py | 230 + .../rerun_sdk/rerun/archetypes/arrows2d.py | 456 + .../rerun/archetypes/arrows2d_ext.py | 73 + .../rerun_sdk/rerun/archetypes/arrows3d.py | 428 + .../rerun/archetypes/arrows3d_ext.py | 67 + .../rerun_sdk/rerun/archetypes/asset3d.py | 313 + .../rerun_sdk/rerun/archetypes/asset3d_ext.py | 70 + .../rerun_sdk/rerun/archetypes/asset_video.py | 305 + .../rerun/archetypes/asset_video_ext.py | 85 + .../rerun_sdk/rerun/archetypes/bar_chart.py | 335 + .../rerun/archetypes/bar_chart_ext.py | 33 + .../rerun_sdk/rerun/archetypes/boxes2d.py | 435 + .../rerun_sdk/rerun/archetypes/boxes2d_ext.py | 178 + .../rerun_sdk/rerun/archetypes/boxes3d.py | 523 + .../rerun_sdk/rerun/archetypes/boxes3d_ext.py | 142 + .../rerun_sdk/rerun/archetypes/capsules3d.py | 557 + .../rerun/archetypes/capsules3d_ext.py | 83 + rerun_py/rerun_sdk/rerun/archetypes/clear.py | 201 + .../rerun_sdk/rerun/archetypes/clear_ext.py | 52 + .../rerun/archetypes/coordinate_frame.py | 239 + .../rerun_sdk/rerun/archetypes/cylinders3d.py | 554 + .../rerun/archetypes/cylinders3d_ext.py | 83 + .../rerun_sdk/rerun/archetypes/depth_image.py | 524 + .../rerun/archetypes/depth_image_ext.py | 223 + .../rerun_sdk/rerun/archetypes/ellipses2d.py | 447 + .../rerun/archetypes/ellipses2d_ext.py | 68 + .../rerun/archetypes/ellipsoids3d.py | 522 + .../rerun/archetypes/ellipsoids3d_ext.py | 92 + .../rerun/archetypes/encoded_depth_image.py | 530 + .../rerun/archetypes/encoded_image.py | 363 + .../rerun/archetypes/encoded_image_ext.py | 106 + .../rerun/archetypes/geo_line_strings.py | 300 + .../rerun/archetypes/geo_line_strings_ext.py | 43 + .../rerun_sdk/rerun/archetypes/geo_points.py | 322 + .../rerun/archetypes/geo_points_ext.py | 52 + .../rerun_sdk/rerun/archetypes/graph_edges.py | 275 + .../rerun_sdk/rerun/archetypes/graph_nodes.py | 410 + .../rerun_sdk/rerun/archetypes/grid_map.py | 642 + rerun_py/rerun_sdk/rerun/archetypes/image.py | 403 + .../rerun_sdk/rerun/archetypes/image_ext.py | 364 + .../rerun/archetypes/instance_poses3d.py | 385 + .../rerun/archetypes/line_strips2d.py | 525 + .../rerun/archetypes/line_strips3d.py | 541 + .../rerun/archetypes/mcap_channel.py | 355 + .../rerun/archetypes/mcap_message.py | 216 + .../rerun_sdk/rerun/archetypes/mcap_schema.py | 364 + .../rerun/archetypes/mcap_statistics.py | 524 + rerun_py/rerun_sdk/rerun/archetypes/mesh3d.py | 567 + .../rerun_sdk/rerun/archetypes/mesh3d_ext.py | 138 + .../rerun_sdk/rerun/archetypes/pinhole.py | 619 + .../rerun_sdk/rerun/archetypes/pinhole_ext.py | 197 + .../rerun_sdk/rerun/archetypes/points2d.py | 530 + .../rerun/archetypes/points2d_ext.py | 78 + .../rerun_sdk/rerun/archetypes/points3d.py | 591 + .../rerun/archetypes/points3d_ext.py | 77 + .../rerun/archetypes/recording_info.py | 221 + .../rerun_sdk/rerun/archetypes/scalars.py | 250 + .../rerun/archetypes/segmentation_image.py | 330 + .../archetypes/segmentation_image_ext.py | 77 + .../rerun/archetypes/series_lines.py | 506 + .../rerun/archetypes/series_points.py | 403 + .../rerun/archetypes/series_points_ext.py | 68 + .../rerun/archetypes/state_change.py | 256 + .../rerun/archetypes/state_configuration.py | 394 + rerun_py/rerun_sdk/rerun/archetypes/tensor.py | 281 + .../rerun_sdk/rerun/archetypes/tensor_ext.py | 62 + .../rerun/archetypes/text_document.py | 321 + .../rerun_sdk/rerun/archetypes/text_log.py | 306 + .../rerun_sdk/rerun/archetypes/transform3d.py | 660 + .../rerun/archetypes/transform3d_ext.py | 161 + .../rerun/archetypes/transform_axes3d.py | 291 + .../rerun/archetypes/video_frame_reference.py | 424 + .../archetypes/video_frame_reference_ext.py | 145 + .../rerun/archetypes/video_stream.py | 578 + .../rerun/archetypes/view_coordinates.py | 232 + .../rerun/archetypes/view_coordinates_ext.py | 143 + .../rerun/archetypes/voxel_grid_map.py | 646 + rerun_py/rerun_sdk/rerun/auth.py | 52 + .../rerun_sdk/rerun/blueprint/.gitattributes | 4 + .../rerun_sdk/rerun/blueprint/__init__.py | 75 + rerun_py/rerun_sdk/rerun/blueprint/api.py | 853 + .../rerun/blueprint/archetypes/.gitattributes | 41 + .../rerun/blueprint/archetypes/__init__.py | 81 + .../archetypes/active_visualizers.py | 129 + .../rerun/blueprint/archetypes/background.py | 128 + .../blueprint/archetypes/background_ext.py | 58 + .../archetypes/container_blueprint.py | 356 + .../blueprint/archetypes/dataframe_query.py | 264 + .../archetypes/dataframe_query_ext.py | 82 + .../blueprint/archetypes/entity_behavior.py | 216 + .../blueprint/archetypes/eye_controls3d.py | 338 + .../blueprint/archetypes/force_center.py | 154 + .../archetypes/force_collision_radius.py | 188 + .../rerun/blueprint/archetypes/force_link.py | 188 + .../blueprint/archetypes/force_many_body.py | 165 + .../blueprint/archetypes/force_position.py | 180 + .../blueprint/archetypes/graph_background.py | 119 + .../rerun/blueprint/archetypes/line_grid3d.py | 218 + .../blueprint/archetypes/line_grid3d_ext.py | 57 + .../blueprint/archetypes/map_background.py | 125 + .../rerun/blueprint/archetypes/map_zoom.py | 128 + .../blueprint/archetypes/near_clip_plane.py | 128 + .../blueprint/archetypes/panel_blueprint.py | 119 + .../blueprint/archetypes/plot_background.py | 146 + .../rerun/blueprint/archetypes/plot_legend.py | 136 + .../blueprint/archetypes/plot_legend_ext.py | 41 + .../rerun/blueprint/archetypes/scalar_axis.py | 152 + .../archetypes/spatial_information.py | 180 + .../blueprint/archetypes/table_blueprint.py | 260 + .../archetypes/tensor_scalar_mapping.py | 197 + .../archetypes/tensor_slice_selection.py | 229 + .../blueprint/archetypes/tensor_view_fit.py | 105 + .../archetypes/tensor_view_fit_ext.py | 28 + .../archetypes/text_document_format.py | 162 + .../blueprint/archetypes/text_log_columns.py | 160 + .../blueprint/archetypes/text_log_format.py | 128 + .../blueprint/archetypes/text_log_rows.py | 125 + .../rerun/blueprint/archetypes/time_axis.py | 182 + .../archetypes/time_panel_blueprint.py | 296 + .../blueprint/archetypes/view_blueprint.py | 231 + .../blueprint/archetypes/view_contents.py | 165 + .../archetypes/viewport_blueprint.py | 268 + .../archetypes/visible_time_ranges.py | 120 + .../archetypes/visible_time_ranges_ext.py | 93 + .../blueprint/archetypes/visual_bounds2d.py | 118 + .../archetypes/visual_bounds2d_ext.py | 45 + .../archetypes/visualizer_instruction.py | 151 + .../rerun/blueprint/components/.gitattributes | 58 + .../rerun/blueprint/components/__init__.py | 191 + .../components/absolute_time_range.py | 35 + .../rerun/blueprint/components/active_tab.py | 35 + .../blueprint/components/angular_speed.py | 35 + .../blueprint/components/apply_latest_at.py | 35 + .../rerun/blueprint/components/auto_layout.py | 35 + .../rerun/blueprint/components/auto_scroll.py | 35 + .../rerun/blueprint/components/auto_views.py | 35 + .../blueprint/components/background_kind.py | 92 + .../rerun/blueprint/components/column_name.py | 35 + .../blueprint/components/column_order.py | 72 + .../blueprint/components/column_order_ext.py | 31 + .../blueprint/components/column_share.py | 35 + .../components/component_column_selector.py | 35 + .../blueprint/components/container_kind.py | 85 + .../rerun/blueprint/components/corner2d.py | 87 + .../rerun/blueprint/components/enabled.py | 35 + .../rerun/blueprint/components/eye3d_kind.py | 90 + .../blueprint/components/filter_by_range.py | 35 + .../components/filter_is_not_null.py | 35 + .../blueprint/components/force_distance.py | 37 + .../blueprint/components/force_iterations.py | 37 + .../blueprint/components/force_strength.py | 37 + .../rerun/blueprint/components/fps.py | 35 + .../blueprint/components/grid_columns.py | 35 + .../blueprint/components/grid_spacing.py | 35 + .../blueprint/components/included_content.py | 35 + .../rerun/blueprint/components/link_axis.py | 74 + .../components/lock_range_during_zoom.py | 37 + .../rerun/blueprint/components/loop_mode.py | 81 + .../blueprint/components/map_provider.py | 112 + .../blueprint/components/near_clip_plane.py | 35 + .../rerun/blueprint/components/panel_state.py | 80 + .../rerun/blueprint/components/play_state.py | 80 + .../blueprint/components/playback_speed.py | 35 + .../blueprint/components/query_expression.py | 44 + .../blueprint/components/root_container.py | 35 + .../rerun/blueprint/components/row_share.py | 35 + .../blueprint/components/selected_columns.py | 35 + .../tensor_dimension_index_slider.py | 35 + .../blueprint/components/text_log_column.py | 35 + .../rerun/blueprint/components/time_int.py | 35 + .../rerun/blueprint/components/time_range.py | 35 + .../blueprint/components/timeline_column.py | 35 + .../blueprint/components/timeline_name.py | 35 + .../rerun/blueprint/components/view_class.py | 35 + .../rerun/blueprint/components/view_fit.py | 82 + .../blueprint/components/view_maximized.py | 35 + .../rerun/blueprint/components/view_origin.py | 35 + .../components/viewer_recommendation_hash.py | 37 + .../components/visible_time_range.py | 37 + .../blueprint/components/visual_bounds2d.py | 36 + .../components/visual_bounds2d_ext.py | 30 + .../visualizer_component_mapping.py | 35 + .../components/visualizer_instruction_id.py | 38 + .../blueprint/components/visualizer_type.py | 35 + .../rerun/blueprint/components/zoom_level.py | 35 + .../rerun_sdk/rerun/blueprint/containers.py | 187 + .../rerun/blueprint/datatypes/.gitattributes | 14 + .../rerun/blueprint/datatypes/__init__.py | 82 + .../datatypes/component_column_selector.py | 88 + .../component_column_selector_ext.py | 88 + .../datatypes/component_source_kind.py | 102 + .../blueprint/datatypes/filter_by_range.py | 94 + .../datatypes/filter_by_range_ext.py | 24 + .../blueprint/datatypes/filter_is_not_null.py | 95 + .../datatypes/filter_is_not_null_ext.py | 54 + .../blueprint/datatypes/selected_columns.py | 86 + .../datatypes/selected_columns_ext.py | 105 + .../tensor_dimension_index_slider.py | 84 + .../tensor_dimension_index_slider_ext.py | 35 + .../blueprint/datatypes/text_log_column.py | 89 + .../datatypes/text_log_column_ext.py | 27 + .../datatypes/text_log_column_kind.py | 80 + .../blueprint/datatypes/timeline_column.py | 93 + .../datatypes/timeline_column_ext.py | 26 + .../datatypes/visualizer_component_mapping.py | 134 + .../visualizer_component_mapping_ext.py | 47 + .../rerun_sdk/rerun/blueprint/experimental.py | 7 + .../rerun/blueprint/views/.gitattributes | 15 + .../rerun/blueprint/views/__init__.py | 29 + .../rerun/blueprint/views/bar_chart_view.py | 143 + .../rerun/blueprint/views/dataframe_view.py | 159 + .../rerun/blueprint/views/graph_view.py | 195 + .../rerun/blueprint/views/map_view.py | 149 + .../rerun/blueprint/views/spatial2d_view.py | 183 + .../rerun/blueprint/views/spatial3d_view.py | 215 + .../blueprint/views/state_timeline_view.py | 132 + .../rerun/blueprint/views/tensor_view.py | 172 + .../blueprint/views/text_document_view.py | 167 + .../rerun/blueprint/views/text_log_view.py | 170 + .../rerun/blueprint/views/time_series_view.py | 235 + .../rerun/blueprint/visualizers/__init__.py | 3 + .../rerun/blueprint/visualizers/_base.py | 57 + rerun_py/rerun_sdk/rerun/catalog/__init__.py | 34 + .../rerun/catalog/_catalog_client.py | 471 + .../rerun/catalog/_content_filter.py | 120 + rerun_py/rerun_sdk/rerun/catalog/_entry.py | 1575 ++ .../rerun/catalog/_registration_handle.py | 120 + rerun_py/rerun_sdk/rerun/catalog/_schema.py | 263 + .../rerun/catalog/_unregistration_handle.py | 46 + .../rerun_sdk/rerun/components/.gitattributes | 88 + .../rerun_sdk/rerun/components/__init__.py | 328 + .../rerun/components/aggregation_policy.py | 129 + .../rerun/components/albedo_factor.py | 31 + .../rerun/components/annotation_context.py | 149 + .../components/annotation_context_ext.py | 45 + .../rerun_sdk/rerun/components/axis_length.py | 31 + rerun_py/rerun_sdk/rerun/components/blob.py | 31 + .../rerun_sdk/rerun/components/cell_size.py | 35 + .../rerun_sdk/rerun/components/channel_id.py | 35 + .../components/channel_message_counts.py | 101 + .../rerun_sdk/rerun/components/class_id.py | 31 + .../rerun/components/clear_is_recursive.py | 32 + .../components/clear_is_recursive_ext.py | 22 + rerun_py/rerun_sdk/rerun/components/color.py | 41 + .../rerun_sdk/rerun/components/color_ext.py | 28 + .../rerun_sdk/rerun/components/colormap.py | 220 + rerun_py/rerun_sdk/rerun/components/count.py | 37 + .../rerun_sdk/rerun/components/depth_meter.py | 42 + .../rerun_sdk/rerun/components/draw_order.py | 38 + .../rerun_sdk/rerun/components/entity_path.py | 31 + .../rerun_sdk/rerun/components/fill_mode.py | 125 + .../rerun_sdk/rerun/components/fill_ratio.py | 38 + .../rerun/components/gamma_correction.py | 39 + .../rerun/components/geo_line_string.py | 69 + .../rerun/components/geo_line_string_ext.py | 94 + .../rerun_sdk/rerun/components/graph_edge.py | 31 + .../rerun_sdk/rerun/components/graph_node.py | 31 + .../rerun_sdk/rerun/components/graph_type.py | 74 + .../rerun_sdk/rerun/components/half_size2d.py | 38 + .../rerun_sdk/rerun/components/half_size3d.py | 38 + .../rerun/components/image_buffer.py | 35 + .../rerun/components/image_format.py | 31 + .../rerun/components/image_plane_distance.py | 35 + .../rerun_sdk/rerun/components/interactive.py | 35 + .../rerun/components/interpolation_mode.py | 99 + .../rerun_sdk/rerun/components/is_keyframe.py | 39 + .../rerun/components/key_value_pairs.py | 96 + .../rerun/components/key_value_pairs_ext.py | 85 + .../rerun_sdk/rerun/components/keypoint_id.py | 38 + .../rerun_sdk/rerun/components/lat_lon.py | 31 + rerun_py/rerun_sdk/rerun/components/length.py | 36 + .../rerun/components/line_strip2d.py | 87 + .../rerun/components/line_strip2d_ext.py | 87 + .../rerun/components/line_strip3d.py | 87 + .../rerun/components/line_strip3d_ext.py | 87 + .../rerun/components/linear_speed.py | 31 + .../rerun/components/magnification_filter.py | 101 + .../rerun/components/marker_shape.py | 147 + .../rerun_sdk/rerun/components/marker_size.py | 31 + .../rerun_sdk/rerun/components/media_type.py | 39 + .../rerun/components/media_type_ext.py | 135 + .../rerun/components/mesh_face_rendering.py | 95 + rerun_py/rerun_sdk/rerun/components/name.py | 31 + .../rerun_sdk/rerun/components/opacity.py | 36 + .../rerun/components/pinhole_projection.py | 44 + .../rerun_sdk/rerun/components/plane3d.py | 41 + .../rerun/components/point_shading.py | 74 + .../rerun_sdk/rerun/components/position2d.py | 31 + .../rerun_sdk/rerun/components/position3d.py | 31 + rerun_py/rerun_sdk/rerun/components/radius.py | 41 + .../rerun_sdk/rerun/components/radius_ext.py | 28 + .../rerun_sdk/rerun/components/range1d.py | 31 + .../rerun_sdk/rerun/components/resolution.py | 35 + .../rerun/components/rotation_axis_angle.py | 36 + .../rerun/components/rotation_quat.py | 37 + rerun_py/rerun_sdk/rerun/components/scalar.py | 35 + .../rerun_sdk/rerun/components/scale3d.py | 38 + .../rerun_sdk/rerun/components/scale3d_ext.py | 34 + .../rerun_sdk/rerun/components/schema_id.py | 31 + .../rerun_sdk/rerun/components/show_labels.py | 37 + .../rerun/components/stroke_width.py | 31 + .../rerun_sdk/rerun/components/tensor_data.py | 40 + .../tensor_dimension_index_selection.py | 31 + .../components/tensor_height_dimension.py | 31 + .../components/tensor_width_dimension.py | 31 + .../rerun_sdk/rerun/components/texcoord2d.py | 48 + rerun_py/rerun_sdk/rerun/components/text.py | 31 + .../rerun/components/text_log_level.py | 44 + .../rerun/components/text_log_level_ext.py | 37 + .../rerun_sdk/rerun/components/timestamp.py | 35 + .../rerun/components/transform_frame_id.py | 41 + .../rerun/components/transform_mat3x3.py | 67 + .../rerun/components/transform_relation.py | 91 + .../rerun/components/translation3d.py | 31 + .../rerun/components/triangle_indices.py | 31 + .../rerun_sdk/rerun/components/value_range.py | 35 + .../rerun_sdk/rerun/components/vector2d.py | 31 + .../rerun_sdk/rerun/components/vector3d.py | 31 + .../rerun_sdk/rerun/components/video_codec.py | 140 + .../rerun/components/video_sample.py | 38 + .../rerun/components/video_timestamp.py | 32 + .../rerun/components/video_timestamp_ext.py | 94 + .../rerun/components/view_coordinates.py | 55 + .../rerun/components/view_coordinates_ext.py | 348 + .../rerun_sdk/rerun/components/visible.py | 31 + .../rerun_sdk/rerun/components/voxel_index.py | 35 + .../rerun_sdk/rerun/components/voxel_size.py | 36 + .../rerun_sdk/rerun/components/voxel_value.py | 31 + .../rerun_sdk/rerun/datatypes/.gitattributes | 54 + .../rerun_sdk/rerun/datatypes/__init__.py | 287 + .../rerun/datatypes/absolute_time_range.py | 72 + .../datatypes/absolute_time_range_ext.py | 35 + rerun_py/rerun_sdk/rerun/datatypes/angle.py | 63 + .../rerun_sdk/rerun/datatypes/angle_ext.py | 33 + .../rerun/datatypes/annotation_info.py | 111 + .../rerun/datatypes/annotation_info_ext.py | 41 + rerun_py/rerun_sdk/rerun/datatypes/blob.py | 64 + .../rerun_sdk/rerun/datatypes/blob_ext.py | 75 + rerun_py/rerun_sdk/rerun/datatypes/bool.py | 54 + .../rerun/datatypes/channel_count_pair.py | 88 + .../rerun/datatypes/channel_count_pair_ext.py | 43 + .../rerun/datatypes/channel_datatype.py | 157 + .../rerun/datatypes/channel_datatype_ext.py | 49 + .../rerun/datatypes/class_description.py | 130 + .../rerun/datatypes/class_description_ext.py | 160 + .../datatypes/class_description_map_elem.py | 143 + .../class_description_map_elem_ext.py | 50 + .../rerun_sdk/rerun/datatypes/class_id.py | 63 + .../rerun_sdk/rerun/datatypes/color_model.py | 89 + .../rerun/datatypes/color_model_ext.py | 18 + rerun_py/rerun_sdk/rerun/datatypes/dvec2d.py | 66 + .../rerun_sdk/rerun/datatypes/dvec2d_ext.py | 22 + .../rerun_sdk/rerun/datatypes/entity_path.py | 66 + rerun_py/rerun_sdk/rerun/datatypes/float32.py | 65 + rerun_py/rerun_sdk/rerun/datatypes/float64.py | 65 + .../rerun_sdk/rerun/datatypes/image_format.py | 149 + .../rerun/datatypes/image_format_ext.py | 43 + rerun_py/rerun_sdk/rerun/datatypes/ivec3d.py | 66 + .../rerun_sdk/rerun/datatypes/ivec3d_ext.py | 19 + .../rerun_sdk/rerun/datatypes/keypoint_id.py | 70 + .../rerun/datatypes/keypoint_pair.py | 86 + .../rerun/datatypes/keypoint_pair_ext.py | 47 + rerun_py/rerun_sdk/rerun/datatypes/mat3x3.py | 96 + .../rerun_sdk/rerun/datatypes/mat3x3_ext.py | 66 + rerun_py/rerun_sdk/rerun/datatypes/mat4x4.py | 100 + .../rerun_sdk/rerun/datatypes/mat4x4_ext.py | 60 + .../rerun_sdk/rerun/datatypes/pixel_format.py | 227 + rerun_py/rerun_sdk/rerun/datatypes/plane3d.py | 70 + .../rerun_sdk/rerun/datatypes/plane3d_ext.py | 74 + .../rerun_sdk/rerun/datatypes/quaternion.py | 64 + .../rerun/datatypes/quaternion_ext.py | 39 + rerun_py/rerun_sdk/rerun/datatypes/range1d.py | 66 + .../rerun_sdk/rerun/datatypes/range1d_ext.py | 24 + rerun_py/rerun_sdk/rerun/datatypes/range2d.py | 107 + rerun_py/rerun_sdk/rerun/datatypes/rgba32.py | 74 + .../rerun_sdk/rerun/datatypes/rgba32_ext.py | 131 + .../rerun/datatypes/rotation_axis_angle.py | 88 + .../datatypes/rotation_axis_angle_ext.py | 58 + .../rerun/datatypes/tensor_buffer.py | 167 + .../rerun/datatypes/tensor_buffer_ext.py | 15 + .../rerun_sdk/rerun/datatypes/tensor_data.py | 172 + .../rerun/datatypes/tensor_data_ext.py | 245 + .../tensor_dimension_index_selection.py | 91 + .../datatypes/tensor_dimension_selection.py | 63 + .../tensor_dimension_selection_ext.py | 52 + .../rerun_sdk/rerun/datatypes/time_int.py | 60 + .../rerun_sdk/rerun/datatypes/time_int_ext.py | 49 + .../rerun_sdk/rerun/datatypes/time_range.py | 121 + .../rerun/datatypes/time_range_boundary.py | 135 + .../datatypes/time_range_boundary_ext.py | 157 + rerun_py/rerun_sdk/rerun/datatypes/uint16.py | 63 + rerun_py/rerun_sdk/rerun/datatypes/uint32.py | 63 + rerun_py/rerun_sdk/rerun/datatypes/uint64.py | 63 + rerun_py/rerun_sdk/rerun/datatypes/utf8.py | 66 + .../rerun_sdk/rerun/datatypes/utf8pair.py | 88 + .../rerun_sdk/rerun/datatypes/utf8pair_ext.py | 55 + rerun_py/rerun_sdk/rerun/datatypes/uuid.py | 83 + .../rerun_sdk/rerun/datatypes/uuid_ext.py | 24 + rerun_py/rerun_sdk/rerun/datatypes/uvec2d.py | 66 + .../rerun_sdk/rerun/datatypes/uvec2d_ext.py | 23 + rerun_py/rerun_sdk/rerun/datatypes/uvec3d.py | 66 + .../rerun_sdk/rerun/datatypes/uvec3d_ext.py | 23 + rerun_py/rerun_sdk/rerun/datatypes/uvec4d.py | 67 + rerun_py/rerun_sdk/rerun/datatypes/vec2d.py | 66 + .../rerun_sdk/rerun/datatypes/vec2d_ext.py | 23 + rerun_py/rerun_sdk/rerun/datatypes/vec3d.py | 66 + .../rerun_sdk/rerun/datatypes/vec3d_ext.py | 24 + rerun_py/rerun_sdk/rerun/datatypes/vec4d.py | 66 + .../rerun_sdk/rerun/datatypes/vec4d_ext.py | 23 + .../rerun/datatypes/video_timestamp.py | 79 + .../rerun/datatypes/view_coordinates.py | 96 + .../rerun/datatypes/view_coordinates_ext.py | 46 + .../rerun/datatypes/visible_time_range.py | 166 + .../rerun/datatypes/visible_time_range_ext.py | 44 + rerun_py/rerun_sdk/rerun/dynamic_archetype.py | 258 + rerun_py/rerun_sdk/rerun/error_utils.py | 298 + .../rerun_sdk/rerun/experimental/__init__.py | 30 + .../rerun_sdk/rerun/experimental/_chunk.py | 428 + .../rerun/experimental/_chunk_store.py | 180 + .../rerun/experimental/_indexed_reader.py | 27 + .../rerun/experimental/_lazy_chunk_stream.py | 374 + .../rerun/experimental/_lazy_store.py | 92 + .../rerun_sdk/rerun/experimental/_lens.py | 364 + .../rerun/experimental/_mcap_reader.py | 81 + .../rerun/experimental/_mp4_reader.py | 141 + .../experimental/_optimization_profile.py | 97 + .../rerun/experimental/_parquet_reader.py | 139 + .../rerun/experimental/_query_metrics.py | 287 + .../rerun/experimental/_rrd_reader.py | 85 + .../rerun_sdk/rerun/experimental/_selector.py | 126 + .../rerun/experimental/_send_chunks.py | 70 + .../rerun/experimental/_store_entry.py | 45 + .../rerun/experimental/_streaming_reader.py | 22 + .../rerun/experimental/_viewer_client.py | 314 + .../rerun/experimental/dataloader/__init__.py | 60 + .../rerun/experimental/dataloader/_config.py | 82 + .../experimental/dataloader/_decoders.py | 401 + .../dataloader/_iterable_dataset.py | 192 + .../experimental/dataloader/_map_dataset.py | 126 + .../experimental/dataloader/_sample_index.py | 389 + .../rerun/experimental/dataloader/_utils.py | 541 + rerun_py/rerun_sdk/rerun/notebook.py | 569 + rerun_py/rerun_sdk/rerun/py.typed | 0 rerun_py/rerun_sdk/rerun/recording_stream.py | 1605 ++ rerun_py/rerun_sdk/rerun/server.py | 208 + rerun_py/rerun_sdk/rerun/sinks.py | 546 + rerun_py/rerun_sdk/rerun/time.py | 252 + rerun_py/rerun_sdk/rerun/urdf.py | 415 + .../rerun_sdk/rerun/utilities/__init__.py | 13 + rerun_py/rerun_sdk/rerun/utilities/_data.py | 103 + rerun_py/rerun_sdk/rerun/utilities/_turbo.py | 262 + rerun_py/rerun_sdk/rerun/utilities/_util.py | 33 + .../rerun/utilities/datafusion/__init__.py | 1 + .../rerun/utilities/datafusion/collect.py | 38 + .../datafusion/functions/__init__.py | 0 .../datafusion/functions/url_generation.py | 134 + rerun_py/rerun_sdk/rerun/web.py | 38 + rerun_py/rerun_sdk/rerun_cli/__init__.py | 0 rerun_py/rerun_sdk/rerun_cli/__main__.py | 46 + rerun_py/src/arrow.rs | 167 + rerun_py/src/catalog/catalog_client.rs | 428 + rerun_py/src/catalog/component_columns.rs | 181 + rerun_py/src/catalog/connection_handle.rs | 635 + rerun_py/src/catalog/dataframe_rendering.rs | 198 + rerun_py/src/catalog/datafusion_catalog.rs | 55 + rerun_py/src/catalog/dataset_entry.rs | 745 + rerun_py/src/catalog/dataset_view.rs | 442 + rerun_py/src/catalog/entry.rs | 214 + rerun_py/src/catalog/errors.rs | 293 + rerun_py/src/catalog/index_columns.rs | 114 + rerun_py/src/catalog/mod.rs | 75 + rerun_py/src/catalog/registration_handle.rs | 395 + rerun_py/src/catalog/schema.rs | 157 + rerun_py/src/catalog/segment_url_udf.rs | 431 + rerun_py/src/catalog/table_entry.rs | 284 + .../src/catalog/table_provider_adapter.rs | 76 + rerun_py/src/catalog/type_aliases.rs | 273 + rerun_py/src/catalog/unregistration_handle.rs | 156 + rerun_py/src/chunk/mod.rs | 13 + rerun_py/src/chunk/types.rs | 253 + rerun_py/src/chunk_stream/chunk_store.rs | 246 + rerun_py/src/chunk_stream/engine.rs | 690 + rerun_py/src/chunk_stream/error.rs | 115 + rerun_py/src/chunk_stream/lazy_store.rs | 704 + rerun_py/src/chunk_stream/mcap_reader.rs | 245 + rerun_py/src/chunk_stream/mod.rs | 96 + rerun_py/src/chunk_stream/mp4_reader.rs | 192 + rerun_py/src/chunk_stream/parquet_reader.rs | 232 + rerun_py/src/chunk_stream/py_stream.rs | 459 + rerun_py/src/chunk_stream/rrd_reader.rs | 370 + rerun_py/src/chunk_stream/stream.rs | 728 + rerun_py/src/chunk_stream/summary.rs | 53 + rerun_py/src/chunk_stream/urdf_tree_stream.rs | 73 + rerun_py/src/lenses.rs | 239 + rerun_py/src/lib.rs | 39 + rerun_py/src/python_bridge.rs | 2698 +++ rerun_py/src/query_metrics.rs | 369 + rerun_py/src/selector.rs | 140 + rerun_py/src/server.rs | 158 + rerun_py/src/trace_context.rs | 166 + rerun_py/src/tracing_session.rs | 172 + rerun_py/src/urdf.rs | 496 + rerun_py/src/utils.rs | 61 + rerun_py/src/video.rs | 49 + rerun_py/src/viewer.rs | 133 + rerun_py/tests/api_sandbox/README.md | 47 + rerun_py/tests/api_sandbox/__init__.py | 0 rerun_py/tests/api_sandbox/conftest.py | 114 + .../tests/api_sandbox/rerun_draft/__init__.py | 3 + .../tests/api_sandbox/rerun_draft/catalog.py | 435 + .../tests/api_sandbox/rerun_draft/server.py | 51 + .../api_sandbox/test_current/__init__.py | 0 .../api_sandbox/test_current/conftest.py | 94 + .../test_current/test_catalog_basics.py | 72 + .../test_current/test_dataframe_api.py | 165 + .../test_current/test_dataset_basics.py | 182 + .../test_current/test_polars_interop.py | 155 + .../test_current/test_table_api.py | 88 + .../test_current/test_table_basics.py | 224 + .../tests/api_sandbox/test_draft/__init__.py | 0 .../tests/api_sandbox/test_draft/conftest.py | 94 + .../test_draft/test_catalog_basics.py | 52 + .../test_draft/test_dataframe_api.py | 61 + .../test_draft/test_dataset_basics.py | 291 + .../test_draft/test_dataset_blueprints.py | 50 + .../test_draft/test_dataset_views.py | 163 + .../test_draft/test_index_ranges.py | 101 + .../test_draft/test_polars_interop.py | 117 + .../test_draft/test_removed_apis.py | 47 + .../api_sandbox/test_draft/test_table_api.py | 91 + .../test_draft/test_table_basics.py | 251 + .../tests/api_sandbox/test_draft/utils.py | 39 + rerun_py/tests/e2e_redap_tests/README.md | 55 + rerun_py/tests/e2e_redap_tests/__init__.py | 0 .../test_dataset_query_select_pushdown.ambr | 149 + .../__snapshots__/test_dataset_views.ambr | 659 + .../__snapshots__/test_entries.ambr | 33 + .../__snapshots__/test_segment_id.ambr | 54 + .../__snapshots__/test_table_write.ambr | 11 + rerun_py/tests/e2e_redap_tests/_helpers.py | 13 + rerun_py/tests/e2e_redap_tests/conftest.py | 431 + .../e2e_redap_tests/resources/.gitattributes | 5 + .../tests/e2e_redap_tests/resources/README.md | 43 + .../blueprints/generate_blueprints.py | 25 + .../resources/blueprints/table_blueprint.rbl | 3 + .../resources/blueprints/table_blueprint2.rbl | 3 + ...0-828e81a3-bb94-44a2-bb8a-7cb9ea3e10b2.txn | 3 + .../simple_datatypes/_versions/1.manifest | 3 + ...00101111100713b14fa38c9a63c90f59698d.lance | 3 + .../e2e_redap_tests/test_asset_dataset.py | 110 + .../e2e_redap_tests/test_blueprint_dataset.py | 145 + .../test_catalog_navigation.py | 124 + rerun_py/tests/e2e_redap_tests/test_client.py | 61 + .../test_dataframe_query_view.py | 27 + .../e2e_redap_tests/test_datafusion_tables.py | 40 + .../e2e_redap_tests/test_datafusion_utils.py | 417 + .../test_dataloader_sample_index.py | 72 + .../e2e_redap_tests/test_dataset_delete.py | 45 + .../e2e_redap_tests/test_dataset_entry.py | 86 + .../e2e_redap_tests/test_dataset_query.py | 106 + .../test_dataset_query_filter.py | 183 + .../test_dataset_query_select_pushdown.py | 352 + .../e2e_redap_tests/test_dataset_views.py | 511 + .../tests/e2e_redap_tests/test_entries.py | 144 + .../e2e_redap_tests/test_index_ranges.py | 144 + .../test_query_metrics_behaviors.py | 198 + .../e2e_redap_tests/test_registration.py | 784 + .../e2e_redap_tests/test_scan_path_errors.py | 96 + .../tests/e2e_redap_tests/test_segment_id.py | 33 + .../e2e_redap_tests/test_segment_store.py | 81 + .../e2e_redap_tests/test_table_create.py | 78 + .../tests/e2e_redap_tests/test_table_read.py | 80 + .../tests/e2e_redap_tests/test_table_write.py | 191 + rerun_py/tests/integration/__init__.py | 0 .../__snapshots__/test_chunk_store.ambr | 39 + .../__snapshots__/test_lazy_chunk_store.ambr | 11 + .../__snapshots__/test_mcap_reader.ambr | 25 + rerun_py/tests/integration/conftest.py | 73 + rerun_py/tests/integration/test_chunk.py | 948 + .../test_chunk_from_record_batch.py | 328 + .../tests/integration/test_chunk_store.py | 405 + .../integration/test_chunk_store_reader.py | 243 + .../integration/test_dataloader_video.py | 180 + .../test_dataloader_video_codecs.py | 544 + .../tests/integration/test_headless_viewer.py | 99 + .../integration/test_lazy_chunk_store.py | 188 + .../integration/test_lazy_chunk_stream.py | 649 + .../tests/integration/test_mcap_reader.py | 200 + rerun_py/tests/integration/test_mp4_reader.py | 252 + .../tests/integration/test_parquet_reader.py | 468 + .../test_rrd_reader_multi_store.py | 251 + .../tests/integration/test_send_chunks.py | 161 + rerun_py/tests/test_types/__init__.py | 0 .../test_types/archetypes/.gitattributes | 8 + .../tests/test_types/archetypes/__init__.py | 10 + .../test_types/archetypes/affix_fuzzer1.py | 602 + .../test_types/archetypes/affix_fuzzer2.py | 539 + .../test_types/archetypes/affix_fuzzer3.py | 518 + .../test_types/archetypes/affix_fuzzer4.py | 518 + .../tests/test_types/blueprint/.gitattributes | 4 + .../tests/test_types/blueprint/__init__.py | 3 + .../test_types/components/.gitattributes | 27 + .../tests/test_types/components/__init__.py | 96 + .../test_types/components/affix_fuzzer1.py | 30 + .../test_types/components/affix_fuzzer10.py | 66 + .../test_types/components/affix_fuzzer11.py | 70 + .../test_types/components/affix_fuzzer12.py | 58 + .../test_types/components/affix_fuzzer13.py | 58 + .../test_types/components/affix_fuzzer14.py | 30 + .../test_types/components/affix_fuzzer15.py | 30 + .../test_types/components/affix_fuzzer16.py | 121 + .../test_types/components/affix_fuzzer17.py | 121 + .../test_types/components/affix_fuzzer18.py | 205 + .../test_types/components/affix_fuzzer19.py | 30 + .../test_types/components/affix_fuzzer2.py | 30 + .../test_types/components/affix_fuzzer20.py | 30 + .../test_types/components/affix_fuzzer21.py | 30 + .../test_types/components/affix_fuzzer22.py | 30 + .../test_types/components/affix_fuzzer23.py | 30 + .../test_types/components/affix_fuzzer3.py | 30 + .../test_types/components/affix_fuzzer4.py | 30 + .../test_types/components/affix_fuzzer5.py | 30 + .../test_types/components/affix_fuzzer6.py | 30 + .../test_types/components/affix_fuzzer7.py | 98 + .../test_types/components/affix_fuzzer8.py | 75 + .../test_types/components/affix_fuzzer9.py | 69 + .../tests/test_types/datatypes/.gitattributes | 18 + .../tests/test_types/datatypes/__init__.py | 82 + .../test_types/datatypes/affix_fuzzer1.py | 128 + .../test_types/datatypes/affix_fuzzer2.py | 66 + .../test_types/datatypes/affix_fuzzer20.py | 80 + .../test_types/datatypes/affix_fuzzer21.py | 61 + .../test_types/datatypes/affix_fuzzer22.py | 68 + .../test_types/datatypes/affix_fuzzer3.py | 122 + .../test_types/datatypes/affix_fuzzer4.py | 184 + .../test_types/datatypes/affix_fuzzer5.py | 216 + .../tests/test_types/datatypes/enum_test.py | 90 + .../test_types/datatypes/flattened_scalar.py | 69 + .../tests/test_types/datatypes/multi_enum.py | 82 + .../datatypes/primitive_component.py | 69 + .../test_types/datatypes/string_component.py | 60 + .../tests/test_types/datatypes/valued_enum.py | 80 + rerun_py/tests/unit/__init__.py | 0 .../unit/__snapshots__/test_recording.ambr | 77 + .../__snapshots__/test_send_dataframe.ambr | 19 + rerun_py/tests/unit/blueprint_utils.py | 21 + rerun_py/tests/unit/common_arrays.py | 552 + .../tests/unit/test_annotation_context.py | 178 + rerun_py/tests/unit/test_any_values.py | 303 + rerun_py/tests/unit/test_archetype_builder.py | 65 + rerun_py/tests/unit/test_archetype_str.py | 105 + rerun_py/tests/unit/test_arrows3d.py | 111 + rerun_py/tests/unit/test_asset3d.py | 29 + rerun_py/tests/unit/test_background.py | 24 + rerun_py/tests/unit/test_batcher_config.py | 132 + rerun_py/tests/unit/test_binary_stream.py | 77 + rerun_py/tests/unit/test_blob.py | 29 + rerun_py/tests/unit/test_box2d.py | 170 + rerun_py/tests/unit/test_box3d.py | 204 + rerun_py/tests/unit/test_clear.py | 34 + rerun_py/tests/unit/test_color_columns.py | 232 + rerun_py/tests/unit/test_color_conversion.py | 27 + .../tests/unit/test_container_blueprint.py | 145 + rerun_py/tests/unit/test_content_filter.py | 144 + .../tests/unit/test_dataframe_view_query.py | 205 + rerun_py/tests/unit/test_datafusion_utils.py | 48 + .../unit/test_dataloader_decoder_helpers.py | 384 + .../unit/test_dataloader_query_indices.py | 67 + rerun_py/tests/unit/test_deprecated.py | 73 + rerun_py/tests/unit/test_depth_image.py | 206 + .../tests/unit/test_disconnect_on_cleanup.py | 56 + rerun_py/tests/unit/test_ellipsoids3d.py | 121 + rerun_py/tests/unit/test_exceptions.py | 145 + rerun_py/tests/unit/test_expected_warnings.py | 55 + rerun_py/tests/unit/test_file_sink.py | 87 + .../tests/unit/test_filesink_threading.py | 53 + rerun_py/tests/unit/test_geo_line_strings.py | 156 + rerun_py/tests/unit/test_geopoints.py | 106 + rerun_py/tests/unit/test_image.py | 145 + rerun_py/tests/unit/test_instance_pose3d.py | 84 + rerun_py/tests/unit/test_line_strips2d.py | 183 + rerun_py/tests/unit/test_line_strips3d.py | 199 + rerun_py/tests/unit/test_log.py | 10 + .../tests/unit/test_map_view_blueprint.py | 27 + rerun_py/tests/unit/test_matnxn.py | 145 + rerun_py/tests/unit/test_mesh3d.py | 114 + rerun_py/tests/unit/test_multi_stream.py | 100 + .../tests/unit/test_multiprocessing_gc.py | 34 + .../tests/unit/test_optimization_profile.py | 33 + .../unit/test_optimization_profile_parity.py | 58 + rerun_py/tests/unit/test_pinhole.py | 51 + rerun_py/tests/unit/test_plot_legend.py | 50 + rerun_py/tests/unit/test_points2d.py | 143 + rerun_py/tests/unit/test_points3d.py | 136 + .../test_python_objects_to_record_batch.py | 91 + rerun_py/tests/unit/test_quaternion.py | 46 + rerun_py/tests/unit/test_query_metrics.py | 400 + rerun_py/tests/unit/test_readers.py | 25 + rerun_py/tests/unit/test_rgba32.py | 101 + rerun_py/tests/unit/test_sample_index.py | 160 + rerun_py/tests/unit/test_scalar_axis.py | 48 + rerun_py/tests/unit/test_scalars.py | 41 + .../tests/unit/test_segmentation_image.py | 67 + rerun_py/tests/unit/test_selector.py | 146 + rerun_py/tests/unit/test_send_dataframe.py | 328 + rerun_py/tests/unit/test_series_styles.py | 65 + rerun_py/tests/unit/test_server.py | 162 + rerun_py/tests/unit/test_tensor.py | 107 + .../tests/unit/test_tensor_slice_selection.py | 88 + rerun_py/tests/unit/test_time.py | 106 + rerun_py/tests/unit/test_time_column.py | 141 + .../tests/unit/test_time_range_boundary.py | 71 + rerun_py/tests/unit/test_tracing_session.py | 207 + rerun_py/tests/unit/test_transform3d.py | 227 + rerun_py/tests/unit/test_type_aliases.py | 41 + rerun_py/tests/unit/test_urdf_tree.py | 326 + rerun_py/tests/unit/test_utf8.py | 28 + rerun_py/tests/unit/test_utf8pair.py | 29 + .../tests/unit/test_utilities_datafusion.py | 35 + rerun_py/tests/unit/test_uuid.py | 27 + rerun_py/tests/unit/test_validators.py | 65 + rerun_py/tests/unit/test_vecnd.py | 175 + rerun_py/tests/unit/test_version.py | 34 + .../tests/unit/test_video_frame_reference.py | 33 + rerun_py/tests/unit/test_view_blueprint.py | 62 + rerun_py/tests/unit/test_view_contents.py | 45 + rerun_py/tests/unit/test_view_coordinates.py | 47 + rerun_py/tests/unit/test_viewer_client.py | 30 + .../tests/unit/test_viewport_blueprint.py | 87 + .../tests/unit/test_visible_time_ranges.py | 66 + run_wasm/Cargo.toml | 15 + run_wasm/README.md | 11 + run_wasm/src/main.rs | 101 + rust-toolchain | 10 + scripts/accept_snapshots.sh | 14 + scripts/append_web_viewer.py | 123 + scripts/check_env.py | 65 + scripts/check_example_manifest_coverage.py | 66 + scripts/check_forbidden_dependencies.py | 153 + scripts/check_utils_dependencies.py | 102 + scripts/ci/__init__.py | 1 + scripts/ci/approve_workflow_runs.py | 73 + scripts/ci/buf.yaml | 15 + scripts/ci/build_and_upload_rerun_notebook.py | 89 + scripts/ci/build_and_upload_wheels.py | 159 + scripts/ci/bundle_and_upload_rerun_cpp.py | 179 + scripts/ci/bundle_macos_app.py | 105 + scripts/ci/check_cli_docs.py | 78 + scripts/ci/check_d2_diagrams.py | 65 + scripts/ci/check_doc_order.py | 72 + scripts/ci/check_doc_redirects.py | 125 + scripts/ci/check_large_files.py | 117 + scripts/ci/check_migration_guide_redirect.py | 32 + scripts/ci/check_pr_checkboxes.py | 48 + scripts/ci/check_skills.py | 99 + scripts/ci/check_speculative_links.py | 44 + scripts/ci/compare.py | 205 + scripts/ci/compare_path_digest.py | 74 + scripts/ci/count_bytes.py | 133 + scripts/ci/count_dependencies.py | 59 + scripts/ci/crates.py | 850 + scripts/ci/dag.py | 274 + scripts/ci/fetch_artifact.py | 78 + scripts/ci/frontmatter.py | 23 + scripts/ci/generate_prerelease_pip_index.py | 106 + scripts/ci/isolated_examples.py | 136 + scripts/ci/macos/Info.plist | 38 + scripts/ci/mdlint.py | 477 + scripts/ci/parse_bot_pr_comment.py | 47 + scripts/ci/parse_pr_number.py | 39 + scripts/ci/pixi_install_wheel.py | 113 + scripts/ci/pr_link_checker.py | 300 + scripts/ci/publish_wheels.py | 105 + scripts/ci/python_check_signatures.py | 320 + scripts/ci/render_bench.py | 399 + scripts/ci/rust_checks.py | 393 + scripts/ci/setup_software_rasterizer.py | 325 + scripts/ci/sync_release_assets.py | 329 + scripts/ci/templates/benchmark.html | 195 + scripts/ci/templates/pip_index.html | 41 + scripts/ci/thumbnails.py | 218 + scripts/ci/update_rerun_notebook_version.py | 74 + scripts/ci/update_rerun_py_and_c_version.py | 114 + scripts/ci/upload_docs.py | 607 + scripts/ci/upload_vulkan_sdk.py | 181 + scripts/ci/uv_install_wheel.py | 112 + scripts/ci/wheel_utils.py | 16 + scripts/clippy_wasm/clippy.toml | 164 + scripts/fast_lint.py | 206 + scripts/fetch_crashes.py | 170 + scripts/fetch_patch_candidates.py | 510 + scripts/generate_changelog.py | 549 + scripts/generate_view_coordinate_defs.py | 391 + scripts/highlight_issues.py | 131 + scripts/lint.py | 1951 ++ scripts/nbstripout.py | 64 + scripts/pixi/activate.bat | 19 + scripts/pixi/activate.sh | 9 + scripts/pre-push.sh | 25 + scripts/render_d2.py | 347 + scripts/roundtrip_utils.py | 93 + scripts/run_all.py | 398 + scripts/run_python_e2e_test.py | 108 + .../assets/static/index.css | 51 + .../assets/templates/example.html | 34 + .../assets/templates/index.html | 25 + .../build_screenshot_compare.py | 300 + scripts/snapshots.py | 132 + scripts/update_docs_url_rewrite.py | 227 + scripts/update_snapshots_from_ci.sh | 33 + scripts/upload_image.py | 426 + scripts/upload_rrd.py | 154 + scripts/zombie_todos.py | 521 + skills/rerun-blueprint/SKILL.md | 145 + skills/rerun-catalog-queries/SKILL.md | 306 + skills/rerun-chunk-processing/SKILL.md | 273 + skills/rerun-data-model/SKILL.md | 89 + skills/rerun-lerobot/SKILL.md | 73 + skills/rerun-mcap/SKILL.md | 86 + skills/rerun-parquet/SKILL.md | 244 + skills/rerun-urdf/SKILL.md | 264 + taplo.toml | 14 + tests/README.md | 1 + tests/__init__.py | 0 tests/assets/.gitattributes | 4 + tests/assets/README.md | 8 + tests/assets/empty.mp4 | 3 + tests/assets/encoded_depth_image.rvl | 3 + tests/assets/image/.gitignore | 4 + tests/assets/image/generate_yuv_assets.py | 118 + tests/assets/image/grinda.jpg | 3 + tests/assets/image/logo_dark_mode_nv12.bin | 3 + tests/assets/image/logo_dark_mode_y8_full.bin | 3 + .../image/logo_dark_mode_y8_limited.bin | 3 + .../image/logo_dark_mode_y_u_v12_full.bin | 3 + .../image/logo_dark_mode_y_u_v12_limited.bin | 3 + .../image/logo_dark_mode_y_u_v16_full.bin | 3 + .../image/logo_dark_mode_y_u_v16_limited.bin | 3 + .../image/logo_dark_mode_y_u_v24_full.bin | 3 + .../image/logo_dark_mode_y_u_v24_limited.bin | 3 + tests/assets/image/logo_dark_mode_yuy2.bin | 3 + tests/assets/mcap/README.md | 22 + tests/assets/mcap/r2b_galileo.mcap | 3 + tests/assets/mcap/trossen_transfer_cube.mcap | 3 + tests/assets/mesh/box.dae | 3 + tests/assets/mesh/cube.glb | Bin 0 -> 1936 bytes tests/assets/mesh/multi_triangle_groups.dae | 3 + tests/assets/rerun.obj | 3 + tests/assets/rrd/.gitattributes | 1 + tests/assets/rrd/README.md | 14 + tests/assets/rrd/examples/arkit_scenes.rrd | 3 + tests/assets/rrd/examples/dicom_mri.rrd | 3 + tests/assets/rrd/examples/dna.rrd | 3 + tests/assets/rrd/examples/face_tracking.rrd | 3 + tests/assets/rrd/examples/graphs.rrd | 3 + .../rrd/examples/human_pose_tracking.rrd | 3 + tests/assets/rrd/examples/imu_signals.rrd | 3 + tests/assets/rrd/examples/plots.rrd | 3 + tests/assets/rrd/examples/rrt_star.rrd | 3 + .../rrd/examples/structure_from_motion.rrd | 3 + .../assets/rrd/generate-compatibility-rrds.sh | 22 + .../rrd/sample_5/Fri_Jul_28_11-25-26_2023.rrd | 3 + tests/assets/rrd/sample_5/README.md | 7 + .../rrd/sample_5/Sun_Dec_24_16-20-37_2023.rrd | 3 + .../rrd/sample_5/Thu_Jul_20_10-40-10_2023.rrd | 3 + .../rrd/sample_5/Thu_Jun_15_13-42-56_2023.rrd | 3 + .../rrd/sample_5/Wed_Jul_12_20-55-08_2023.rrd | 3 + .../annotation_context_connections.rrd | 3 + .../archetypes/annotation_context_rects.rrd | 3 + .../annotation_context_segmentation.rrd | 3 + .../snippets/archetypes/arrows2d_simple.rrd | 3 + .../archetypes/arrows3d_column_updates.rrd | 3 + .../archetypes/arrows3d_row_updates.rrd | 3 + .../snippets/archetypes/arrows3d_simple.rrd | 3 + .../snippets/archetypes/asset3d_simple.rrd | 3 + .../rrd/snippets/archetypes/bar_chart.rrd | 3 + .../snippets/archetypes/boxes2d_simple.rrd | 3 + .../rrd/snippets/archetypes/boxes3d_batch.rrd | 3 + .../snippets/archetypes/boxes3d_simple.rrd | 3 + .../snippets/archetypes/capsules3d_batch.rrd | 3 + .../snippets/archetypes/clear_recursive.rrd | 3 + .../rrd/snippets/archetypes/clear_simple.rrd | 3 + .../coordinate_frame_builtin_frames.rrd | 3 + .../snippets/archetypes/cylinders3d_batch.rrd | 3 + .../snippets/archetypes/depth_image_3d.rrd | 3 + .../archetypes/depth_image_simple.rrd | 3 + .../snippets/archetypes/ellipses2d_batch.rrd | 3 + .../snippets/archetypes/ellipses2d_simple.rrd | 3 + .../archetypes/ellipsoids3d_batch.rrd | 3 + .../archetypes/ellipsoids3d_simple.rrd | 3 + .../archetypes/encoded_depth_image.rrd | 3 + .../rrd/snippets/archetypes/encoded_image.rrd | 3 + .../snippets/archetypes/entity_behavior.rrd | 3 + .../rrd/snippets/archetypes/entity_path.rrd | 3 + .../archetypes/geo_line_strings_simple.rrd | 3 + .../snippets/archetypes/geo_points_simple.rrd | 3 + .../snippets/archetypes/graph_directed.rrd | 3 + .../snippets/archetypes/graph_undirected.rrd | 3 + .../rrd/snippets/archetypes/grid_map_pose.rrd | 3 + .../snippets/archetypes/grid_map_simple.rrd | 3 + .../snippets/archetypes/image_advanced.rrd | 3 + .../archetypes/image_column_updates.rrd | 3 + .../rrd/snippets/archetypes/image_formats.rrd | 3 + .../snippets/archetypes/image_row_updates.rrd | 3 + .../rrd/snippets/archetypes/image_simple.rrd | 3 + .../archetypes/instance_poses3d_combined.rrd | 3 + .../archetypes/line_strips2d_batch.rrd | 3 + .../line_strips2d_segments_simple.rrd | 3 + .../archetypes/line_strips2d_simple.rrd | 3 + .../archetypes/line_strips2d_ui_radius.rrd | 3 + .../archetypes/line_strips3d_batch.rrd | 3 + .../line_strips3d_segments_simple.rrd | 3 + .../archetypes/line_strips3d_simple.rrd | 3 + .../archetypes/line_strips3d_time_window.rrd | 3 + .../archetypes/line_strips3d_ui_radius.rrd | 3 + .../archetypes/mcap_channel_simple.rrd | 3 + .../archetypes/mcap_message_simple.rrd | 3 + .../archetypes/mcap_schema_simple.rrd | 3 + .../archetypes/mcap_statistics_simple.rrd | 3 + .../snippets/archetypes/mesh3d_indexed.rrd | 3 + .../snippets/archetypes/mesh3d_instancing.rrd | 3 + .../archetypes/mesh3d_partial_updates.rrd | 3 + .../rrd/snippets/archetypes/mesh3d_simple.rrd | 3 + .../archetypes/pinhole_perspective.rrd | 3 + .../archetypes/pinhole_projections.rrd | 3 + .../snippets/archetypes/pinhole_simple.rrd | 3 + .../snippets/archetypes/points2d_random.rrd | 3 + .../snippets/archetypes/points2d_simple.rrd | 3 + .../archetypes/points2d_ui_radius.rrd | 3 + .../archetypes/points3d_column_updates.rrd | 3 + .../archetypes/points3d_partial_updates.rrd | 3 + .../snippets/archetypes/points3d_random.rrd | 3 + .../archetypes/points3d_row_updates.rrd | 3 + .../snippets/archetypes/points3d_simple.rrd | 3 + .../archetypes/points3d_ui_radius.rrd | 3 + .../archetypes/scalars_column_updates.rrd | 3 + .../archetypes/scalars_multiple_plots.rrd | 3 + .../archetypes/scalars_row_updates.rrd | 3 + .../snippets/archetypes/scalars_simple.rrd | 3 + .../archetypes/segmentation_image_simple.rrd | 3 + .../archetypes/series_lines_style.rrd | 3 + .../archetypes/series_points_style.rrd | 3 + .../rrd/snippets/archetypes/state_change.rrd | 3 + .../archetypes/state_configuration.rrd | 3 + .../rrd/snippets/archetypes/tensor_simple.rrd | 3 + .../rrd/snippets/archetypes/text_document.rrd | 3 + .../rrd/snippets/archetypes/text_log.rrd | 3 + .../archetypes/text_log_integration.rrd | 3 + .../snippets/archetypes/transform3d_axes.rrd | 3 + .../archetypes/transform3d_column_updates.rrd | 3 + .../archetypes/transform3d_hierarchy.rrd | 3 + .../transform3d_hierarchy_frames.rrd | 3 + .../transform3d_partial_updates.rrd | 3 + .../archetypes/transform3d_row_updates.rrd | 3 + .../archetypes/transform3d_simple.rrd | 3 + .../snippets/archetypes/video_auto_frames.rrd | 3 + .../archetypes/video_manual_frames.rrd | 3 + .../archetypes/view_coordinates_simple.rrd | 3 + .../archetypes/voxel_grid_map_simple.rrd | 3 + .../concepts/different_data_per_timeline.rrd | 3 + .../assets/rrd/snippets/concepts/indices.rrd | 3 + tests/assets/rrd/snippets/concepts/lenses.rrd | 3 + .../concepts/recording_properties.rrd | 3 + .../transform3d_hierarchy_named_frames.rrd | 3 + .../concepts/transform3d_hierarchy_simple.rrd | 3 + .../rrd/snippets/concepts/viscomp-base.rrd | 3 + .../concepts/viscomp-component-default.rrd | 3 + .../concepts/viscomp-component-override.rrd | 3 + .../descriptors/descr_builtin_archetype.rrd | 3 + .../descriptors/descr_builtin_component.rrd | 3 + .../descriptors/descr_custom_archetype.rrd | 3 + .../descriptors/descr_custom_component.rrd | 3 + .../howto/any_batch_value_column_updates.rrd | 3 + .../howto/any_values_column_updates.rrd | 3 + .../snippets/howto/any_values_row_updates.rrd | 3 + .../rrd/snippets/howto/component_mapping.rrd | 3 + .../snippets/howto/dual_color_point_cloud.rrd | 3 + tests/assets/rrd/snippets/howto/load_mcap.rrd | 3 + tests/assets/rrd/snippets/howto/load_urdf.rrd | 3 + .../rrd/snippets/howto/micro_batching.rrd | 3 + .../rrd/snippets/howto/state_remapping.rrd | 3 + .../rrd/snippets/howto/state_timeline.rrd | 3 + .../quick_start/quick_start_connect.rrd | 3 + .../quick_start/quick_start_spawn.rrd | 3 + .../snippets/tutorials/annotation_context.rrd | 3 + .../rrd/snippets/tutorials/any_values.rrd | 3 + .../rrd/snippets/tutorials/custom_data.rrd | 3 + .../rrd/snippets/tutorials/data_out.rrd | 3 + .../snippets/tutorials/dynamic_archetype.rrd | 3 + .../rrd/snippets/tutorials/extra_values.rrd | 3 + .../tutorials/getting_started_log.rrd | 3 + .../tutorials/visualizer-overrides.rrd | 3 + tests/assets/rrd/snippets/views/bar_chart.rrd | 3 + tests/assets/rrd/snippets/views/dataframe.rrd | 3 + tests/assets/rrd/snippets/views/graph.rrd | 3 + tests/assets/rrd/snippets/views/map.rrd | 3 + tests/assets/rrd/snippets/views/spatial2d.rrd | 3 + tests/assets/rrd/snippets/views/spatial3d.rrd | 3 + .../rrd/snippets/views/state_timeline.rrd | 3 + tests/assets/rrd/snippets/views/tensor.rrd | 3 + .../rrd/snippets/views/text_document.rrd | 3 + tests/assets/rrd/snippets/views/text_log.rrd | 3 + .../assets/rrd/snippets/views/timeseries.rrd | 3 + .../rrd/video_sample/simple_frame_data.rrd | 3 + tests/assets/table/.gitattributes | 4 + ...0-828e81a3-bb94-44a2-bb8a-7cb9ea3e10b2.txn | 3 + .../simple_datatypes/_versions/1.manifest | 3 + ...00101111100713b14fa38c9a63c90f59698d.lance | 3 + .../video/Big_Buck_Bunny_1080_10s_av1.mp4 | 3 + .../video/Big_Buck_Bunny_1080_1s_av1.mp4 | 3 + .../video/Big_Buck_Bunny_1080_1s_h264.mp4 | 3 + .../Big_Buck_Bunny_1080_1s_h264_nobframes.mp4 | 3 + .../video/Big_Buck_Bunny_1080_1s_h265.mp4 | 3 + .../Big_Buck_Bunny_1080_1s_h265_nobframes.mp4 | 3 + .../video/Big_Buck_Bunny_1080_1s_vp8.mp4 | 3 + .../video/Big_Buck_Bunny_1080_1s_vp9.mp4 | 3 + tests/assets/video/Sintel_1080_10s_av1.mp4 | 3 + tests/assets/video/gif_as_h264_nobframes.h264 | 3 + tests/assets/video/mpeg4_part2.mp4 | 3 + tests/cpp/CMakeLists.txt | 4 + tests/cpp/log_benchmark/CMakeLists.txt | 7 + tests/cpp/log_benchmark/benchmarks.hpp | 20 + tests/cpp/log_benchmark/image.cpp | 52 + tests/cpp/log_benchmark/main.cpp | 68 + .../log_benchmark/points3d_large_batch.cpp | 29 + .../points3d_many_individual.cpp | 31 + tests/cpp/log_benchmark/points3d_shared.hpp | 81 + tests/cpp/log_benchmark/profile_scope.cpp | 3 + tests/cpp/log_benchmark/profile_scope.hpp | 47 + .../cpp/plot_dashboard_stress/CMakeLists.txt | 7 + tests/cpp/plot_dashboard_stress/main.cpp | 269 + tests/python/__init__.py | 0 .../annotation_context_ui_stress.py | 31 + tests/python/blueprint/main.py | 53 + tests/python/blueprint/save_blueprint.py | 12 + tests/python/blueprint/spawn_blueprint.py | 12 + tests/python/chunk_zoo/chunk_zoo.py | 203 + tests/python/chunked_video/chunked_video.py | 61 + .../many_large_many_rows_recordings.py | 28 + .../many_large_single_row_recordings.py | 34 + .../many_medium_sized_many_rows_recordings.py | 29 + ...many_medium_sized_single_row_recordings.py | 34 + tests/python/gil_stress/main.py | 53 + tests/python/log_benchmark/README.md | 79 + tests/python/log_benchmark/__init__.py | 54 + .../log_benchmark/test_log_benchmark.py | 253 + .../log_benchmark/test_micro_benchmark.py | 77 + tests/python/many_entity_transforms/main.py | 95 + tests/python/memory_drain/main.py | 62 + tests/python/plot_dashboard_stress/main.py | 247 + tests/python/release_checklist/.gitignore | 1 + tests/python/release_checklist/README.md | 30 + .../check_drag_and_drop_selection.py | 80 + .../check_hover_select_reset.py | 117 + .../check_lerobot_v2_importer.py | 49 + .../check_lerobot_v3_importer.py | 49 + .../check_modal_scrolling.py | 50 + .../check_multi_entity_drag_and_drop.py | 61 + .../release_checklist/check_notebook.py | 41 + .../check_parallelism_caching_reentrancy.py | 196 + .../release_checklist/check_plot_overrides.py | 74 + .../release_checklist/check_rbl_import.py | 108 + tests/python/release_checklist/main.py | 39 + tests/python/requirements.txt | 3 + tests/python/view_coordinates/main.py | 91 + .../python/visible_history_playground/main.py | 79 + tests/rust/log_benchmark/Cargo.toml | 21 + tests/rust/log_benchmark/README.md | 27 + tests/rust/log_benchmark/src/boxes3d_batch.rs | 52 + tests/rust/log_benchmark/src/image.rs | 80 + tests/rust/log_benchmark/src/main.rs | 165 + .../log_benchmark/src/points3d_large_batch.rs | 30 + .../src/points3d_many_individual.rs | 34 + .../rust/log_benchmark/src/points3d_shared.rs | 33 + tests/rust/log_benchmark/src/scalars.rs | 105 + tests/rust/log_benchmark/src/transform3d.rs | 128 + .../log_benchmark/src/very_large_chunk.rs | 29 + tests/rust/plot_dashboard_stress/Cargo.toml | 23 + tests/rust/plot_dashboard_stress/src/main.rs | 228 + tests/rust/re_integration_test/Cargo.toml | 56 + .../src/kittest_harness_ext.rs | 624 + tests/rust/re_integration_test/src/lib.rs | 139 + .../rust/re_integration_test/src/test_data.rs | 257 + .../re_integration_test/src/viewer_section.rs | 236 + .../tests/add_entity_to_view_test.rs | 283 + .../tests/add_visualizer_test.rs | 70 + .../re_integration_test/tests/basic_tests.rs | 38 + .../tests/blueprint_context_menu_test.rs | 84 + .../tests/check_focus_test.rs | 136 + .../tests/container_context_menu_test.rs | 161 + .../tests/context_menu_test.rs | 131 + .../tests/dataset_folders.rs | 263 + .../re_integration_test/tests/datasets.rs | 179 + .../tests/deselect_on_escape.rs | 78 + .../drop_component_to_state_timeline_view.rs | 88 + .../tests/drop_stream_to_view.rs | 155 + .../tests/grid_view_flagging.rs | 175 + .../tests/heuristics_mixed_2d_and_3d_test.rs | 88 + .../tests/heuristics_mixed_all_root_test.rs | 93 + .../tests/internal_catalog.rs | 206 + .../tests/multi_container_test.rs | 428 + .../tests/no_blueprint_test.rs | 44 + .../tests/origin_heuristics_test.rs | 263 + .../tests/preview_table.rs | 304 + .../tests/redap_catalog_select.rs | 185 + .../tests/rrd_bw_compat_test.rs | 383 + ..._container_from_blueprint_panel_menu_1.png | 3 + ..._container_from_blueprint_panel_menu_2.png | 3 + ..._container_from_blueprint_panel_menu_3.png | 3 + .../add_container_from_selection_panel_1.png | 3 + .../add_container_from_selection_panel_2.png | 3 + .../add_container_from_selection_panel_3.png | 3 + .../add_entity_to_view_bar_chart_1.png | 3 + .../add_entity_to_view_bar_chart_2.png | 3 + .../add_entity_to_view_bar_chart_3.png | 3 + .../add_entity_to_view_bar_chart_4.png | 3 + .../add_entity_to_view_bar_chart_5.png | 3 + .../add_entity_to_view_boxes2d_1.png | 3 + .../add_entity_to_view_boxes2d_2.png | 3 + .../add_entity_to_view_boxes2d_3.png | 3 + .../add_entity_to_view_boxes2d_4.png | 3 + .../add_entity_to_view_boxes2d_5.png | 3 + .../add_entity_to_view_boxes3d_1.png | 3 + .../add_entity_to_view_boxes3d_2.png | 3 + .../add_entity_to_view_boxes3d_3.png | 3 + .../add_entity_to_view_boxes3d_4.png | 3 + .../add_entity_to_view_boxes3d_5.png | 3 + .../snapshots/add_entity_to_view_tensor_1.png | 3 + .../snapshots/add_entity_to_view_tensor_2.png | 3 + .../snapshots/add_entity_to_view_tensor_3.png | 3 + .../snapshots/add_entity_to_view_tensor_4.png | 3 + .../snapshots/add_entity_to_view_tensor_5.png | 3 + .../add_entity_to_view_text_log_1.png | 3 + .../add_entity_to_view_text_log_2.png | 3 + .../add_entity_to_view_text_log_3.png | 3 + .../add_entity_to_view_text_log_4.png | 3 + .../add_entity_to_view_text_log_5.png | 3 + .../tests/snapshots/add_visualizer_axes_1.png | 3 + .../tests/snapshots/add_visualizer_axes_2.png | 3 + .../tests/snapshots/add_visualizer_axes_3.png | 3 + .../tests/snapshots/add_visualizer_axes_4.png | 3 + .../tests/snapshots/add_visualizer_axes_5.png | 3 + .../blueprint_tree_context_menu_01.png | 3 + .../blueprint_tree_context_menu_02.png | 3 + .../blueprint_tree_context_menu_03.png | 3 + .../blueprint_tree_context_menu_04.png | 3 + .../blueprint_tree_context_menu_05.png | 3 + .../blueprint_tree_context_menu_06.png | 3 + .../blueprint_tree_context_menu_07.png | 3 + .../blueprint_tree_context_menu_08.png | 3 + .../blueprint_tree_context_menu_09.png | 3 + .../blueprint_tree_context_menu_10.png | 3 + .../snapshots/blueprint_view_context.png | 3 + .../snapshots/change_container_type_1.png | 3 + .../snapshots/change_container_type_2.png | 3 + .../tests/snapshots/check_focus_1.png | 3 + .../tests/snapshots/check_focus_2.png | 3 + .../tests/snapshots/check_focus_3.png | 3 + .../tests/snapshots/check_focus_4.png | 3 + .../tests/snapshots/check_focus_5.png | 3 + .../tests/snapshots/check_focus_6.png | 3 + .../tests/snapshots/check_focus_7.png | 3 + .../tests/snapshots/check_focus_8.png | 3 + .../snapshots/collapse_stream_entity_1.png | 3 + .../snapshots/collapse_stream_entity_2.png | 3 + .../snapshots/collapse_stream_root_1.png | 3 + .../snapshots/collapse_stream_root_2.png | 3 + .../snapshots/collapse_stream_root_3.png | 3 + .../container_selection_context_menu_1.png | 3 + .../container_selection_context_menu_2.png | 3 + .../context_menu_invalid_sub_container_01.png | 3 + .../context_menu_invalid_sub_container_02.png | 3 + .../context_menu_invalid_sub_container_03.png | 3 + .../context_menu_invalid_sub_container_04.png | 3 + .../context_menu_invalid_sub_container_05.png | 3 + .../context_menu_multi_selection_01.png | 3 + .../context_menu_multi_selection_02.png | 3 + .../context_menu_multi_selection_03.png | 3 + .../context_menu_multi_selection_04.png | 3 + .../context_menu_multi_selection_05.png | 3 + .../context_menu_multi_selection_06.png | 3 + .../context_menu_multi_selection_07.png | 3 + .../context_menu_multi_selection_08.png | 3 + .../dataset_folders_01_perception.png | 3 + ...ataset_folders_02_perception_detection.png | 3 + ...set_folders_03_perception_after_parent.png | 3 + .../dataset_folders_04_summary_dataset.png | 3 + .../tests/snapshots/dataset_ui_empty_form.png | 3 + .../tests/snapshots/dataset_ui_table.png | 3 + .../tests/snapshots/deselect_on_escape_1.png | 3 + .../tests/snapshots/deselect_on_escape_2.png | 3 + .../tests/snapshots/deselect_on_escape_3.png | 3 + .../tests/snapshots/deselect_on_escape_4.png | 3 + .../tests/snapshots/deselect_on_escape_5.png | 3 + .../tests/snapshots/deselect_on_escape_6.png | 3 + .../tests/snapshots/deselect_on_escape_7.png | 3 + .../tests/snapshots/deselect_on_escape_8.png | 3 + .../drag_view_to_other_view_bottom_1.png | 3 + .../drag_view_to_other_view_bottom_2.png | 3 + .../drag_view_to_other_view_center_1.png | 3 + .../drag_view_to_other_view_center_2.png | 3 + .../drag_view_to_other_view_left_1.png | 3 + .../drag_view_to_other_view_left_2.png | 3 + .../drag_view_to_other_view_right_1.png | 3 + .../drag_view_to_other_view_right_2.png | 3 + .../drag_view_to_other_view_top_1.png | 3 + .../drag_view_to_other_view_top_2.png | 3 + ...onent_to_state_timeline_view_1_initial.png | 3 + ...mponent_to_state_timeline_view_2_hover.png | 3 + ...nt_to_state_timeline_view_3_after_drop.png | 3 + ..._to_state_timeline_view_4_after_redrop.png | 3 + .../drop_multiple_streams_to_view_1.png | 3 + .../drop_multiple_streams_to_view_2.png | 3 + .../drop_multiple_streams_to_view_3.png | 3 + .../drop_multiple_streams_to_view_4.png | 3 + .../drop_multiple_streams_to_view_5.png | 3 + .../drop_multiple_streams_to_view_6.png | 3 + .../tests/snapshots/drop_stream_to_view_1.png | 3 + .../tests/snapshots/drop_stream_to_view_2.png | 3 + .../tests/snapshots/drop_stream_to_view_3.png | 3 + .../tests/snapshots/drop_stream_to_view_4.png | 3 + .../tests/snapshots/drop_stream_to_view_5.png | 3 + .../tests/snapshots/drop_stream_to_view_6.png | 3 + .../snapshots/grid_view_flagging_after.png | 3 + .../snapshots/grid_view_flagging_before.png | 3 + .../snapshots/heuristics_mixed_2d_and_3d.png | 3 + .../snapshots/heuristics_mixed_all_root.png | 3 + .../internal_catalog_load_rrd_catalog.png | 3 + .../internal_catalog_load_rrd_recording.png | 3 + .../snapshots/multi_container_deep_nested.png | 3 + .../multi_container_drag_container_1.png | 3 + .../multi_container_drag_container_2.png | 3 + .../multi_container_drag_container_3.png | 3 + .../multi_container_drag_container_4.png | 3 + .../multi_container_drag_container_5.png | 3 + .../multi_container_drag_container_6.png | 3 + .../multi_container_drag_single_view_1.png | 3 + .../multi_container_drag_single_view_2.png | 3 + .../multi_container_drag_single_view_3.png | 3 + .../snapshots/multi_container_many_views.png | 3 + .../multiple_undo_redo_1_initial.png | 3 + .../multiple_undo_redo_2_after_drag_1.png | 3 + .../multiple_undo_redo_3_after_drag_2.png | 3 + .../multiple_undo_redo_4_undo_once.png | 3 + .../multiple_undo_redo_5_undo_twice.png | 3 + .../multiple_undo_redo_6_redo_once.png | 3 + .../multiple_undo_redo_7_redo_twice.png | 3 + .../tests/snapshots/no_blueprint_from_sdk.png | 3 + .../tests/snapshots/origin_camera_2d.png | 3 + .../tests/snapshots/origin_camera_3d.png | 3 + .../tests/snapshots/origin_image_2d.png | 3 + .../tests/snapshots/origin_image_3d.png | 3 + .../tests/snapshots/origin_keypoint_2d.png | 3 + .../tests/snapshots/origin_keypoint_3d.png | 3 + .../tests/snapshots/origin_root_2d.png | 3 + .../tests/snapshots/origin_root_3d.png | 3 + .../tests/snapshots/origin_world_2d.png | 3 + .../tests/snapshots/origin_world_3d.png | 3 + ...zer_instruction_errors_1_warnings_only.png | 3 + ...struction_errors_1b_warnings_only_menu.png | 3 + ...tion_errors_2_warnings_and_errors_menu.png | 3 + ...rors_2b_warnings_and_errors_dataresult.png | 3 + ...lizer_instruction_errors_3_errors_only.png | 3 + ..._instruction_errors_3_errors_only_menu.png | 3 + ...instruction_errors_3b_errors_only_menu.png | 3 + .../tests/snapshots/preview_table.png | 3 + .../tests/snapshots/preview_table_grid.png | 3 + .../preview_table_opened_recording.png | 3 + .../snapshots/resize_view_horizontal_1.png | 3 + .../snapshots/resize_view_horizontal_2.png | 3 + .../snapshots/resize_view_horizontal_3.png | 3 + .../snapshots/resize_view_vertical_1.png | 3 + .../snapshots/resize_view_vertical_2.png | 3 + .../snapshots/resize_view_vertical_3.png | 3 + .../snapshots/rrd_bw_compat_animated_urdf.png | 3 + .../snapshots/rrd_bw_compat_arkit_scenes.png | 3 + ...rrd_bw_compat_detect_and_track_objects.png | 3 + .../snapshots/rrd_bw_compat_dicom_mri.png | 3 + .../tests/snapshots/rrd_bw_compat_dna.png | 3 + .../tests/snapshots/rrd_bw_compat_graphs.png | 3 + .../snapshots/rrd_bw_compat_imu_signals.png | 3 + .../rrd_bw_compat_nuscenes_dataset.png | 3 + ...d_bw_compat_open_photogrammetry_format.png | 3 + .../tests/snapshots/rrd_bw_compat_plots.png | 3 + .../snapshots/rrd_bw_compat_raw_mesh.png | 3 + .../tests/snapshots/rrd_bw_compat_rgbd.png | 3 + .../snapshots/rrd_bw_compat_rrt_star.png | 3 + .../rrd_bw_compat_segment_anything_model.png | 3 + .../rrd_bw_compat_structure_from_motion.png | 3 + .../snapshots/series_count_exceeds_max.png | 3 + .../simplify_container_hierarchy_1.png | 3 + .../simplify_container_hierarchy_2.png | 3 + .../simplify_container_hierarchy_3.png | 3 + .../snapshots/simplify_root_hierarchy_1.png | 3 + .../snapshots/simplify_root_hierarchy_2.png | 3 + .../snapshots/simplify_root_hierarchy_3.png | 3 + .../snapshots/single_text_document_1.png | 3 + .../snapshots/single_text_document_2.png | 3 + .../tests/snapshots/source_component_1.png | 3 + .../tests/snapshots/source_component_2.png | 3 + .../tests/snapshots/source_component_3.png | 3 + .../tests/snapshots/source_component_4.png | 3 + .../tests/snapshots/source_component_5.png | 3 + .../tests/snapshots/source_component_6.png | 3 + .../tests/snapshots/source_component_7.png | 3 + .../tests/snapshots/source_component_8.png | 3 + .../snapshots/start_with_dataset_url.png | 3 + .../start_with_segment_fragment_url.png | 3 + .../state_timeline_hover_highlight_after.png | 3 + .../state_timeline_hover_highlight_before.png | 3 + .../snapshots/states_source_1_initial.png | 3 + .../states_source_2_tree_expanded.png | 3 + .../states_source_3_entity_selected.png | 3 + .../states_source_4_dropdown_open.png | 3 + .../states_source_5_source_changed.png | 3 + .../streams_context_single_select_1.png | 3 + .../streams_context_single_select_2.png | 3 + .../streams_context_single_select_3.png | 3 + .../streams_context_single_select_4.png | 3 + .../streams_context_single_select_5.png | 3 + .../undo_redo_3d_rotation_1_initial.png | 3 + ...do_redo_3d_rotation_2_after_first_drag.png | 3 + .../undo_redo_3d_rotation_3_after_undo.png | 3 + .../undo_redo_3d_rotation_4_after_redo.png | 3 + ...o_redo_3d_rotation_5_after_second_undo.png | 3 + ...undo_redo_3d_rotation_6_after_new_drag.png | 3 + ...do_3d_rotation_7_redo_after_new_action.png | 3 + .../tests/snapshots/view_defaults.png | 3 + .../snapshots/view_visualizers_1_initial.png | 3 + ...view_visualizers_2_plots_view_selected.png | 3 + ...view_visualizers_3_other_view_selected.png | 3 + .../view_visualizers_4_hover_sin_line.png | 3 + .../view_visualizers_5_after_hide.png | 3 + ...sualizers_6_hover_different_after_hide.png | 3 + .../view_visualizers_add_1_view_selected.png | 3 + .../view_visualizers_add_2_popup_open.png | 3 + ...visualizers_add_multi_1_starting_state.png | 3 + ...lizers_add_multi_2_selected_visualizer.png | 3 + ...alizers_add_multi_3_removed_visualizer.png | 3 + ...lizers_add_multi_4_view_selected_again.png | 3 + ...iew_visualizers_add_multi_5_popup_open.png | 3 + ...ew_visualizers_add_multi_6_first_added.png | 3 + ...w_visualizers_add_multi_7_second_added.png | 3 + .../view_visualizers_ctx_menu_1_open.png | 3 + ...view_visualizers_ctx_menu_2_after_hide.png | 3 + ...iew_visualizers_ctx_menu_3_show_option.png | 3 + ...view_visualizers_ctx_menu_4_after_show.png | 3 + ...ew_visualizers_ctx_menu_5_after_remove.png | 3 + ...visualizers_multi_scalar_view_selected.png | 3 + .../snapshots/watch_events_1_initial.png | 3 + .../watch_events_2_entries_added.png | 3 + .../watch_events_3_entries_removed.png | 3 + .../tests/snapshots/xtemp.png | 3 + .../tests/source_component_test.rs | 111 + .../tests/state_timeline_hover_highlight.rs | 125 + .../tests/undo_redo_test.rs | 169 + .../tests/view_defaults_test.rs | 87 + .../tests/view_visualizers_test.rs | 603 + .../tests/viewer_events_test.rs | 268 + .../tests/views_spawned_test.rs | 126 + .../visualizer_instruction_errors_test.rs | 176 + .../re_integration_test/tests/watch_events.rs | 210 + tests/rust/test_data_density_graph/Cargo.toml | 17 + .../rust/test_data_density_graph/src/main.rs | 136 + tests/rust/test_image_memory/Cargo.toml | 17 + tests/rust/test_image_memory/src/main.rs | 54 + tests/rust/test_label_compaction/Cargo.toml | 17 + tests/rust/test_label_compaction/src/main.rs | 45 + .../test_out_of_order_transforms/Cargo.toml | 18 + .../test_out_of_order_transforms/src/main.rs | 166 + tests/rust/test_ui_wakeup/Cargo.toml | 17 + tests/rust/test_ui_wakeup/src/main.rs | 70 + uv.lock | 6597 +++++++ 7904 files changed, 1000926 insertions(+) create mode 100644 .RERUN_ROOT create mode 100644 .cargo/config.toml create mode 100644 .cargo/cranelift.toml create mode 100644 .clang-format create mode 100644 .config/nextest.toml create mode 100644 .dockerignore create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .github/ISSUE_TEMPLATE/annoyance_report.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/other.md create mode 100644 .github/ISSUE_TEMPLATE/project.md create mode 100644 .github/ISSUE_TEMPLATE/question.md create mode 100644 .github/actions/setup-rust/action.yml create mode 100644 .github/actions/vercel/action.yml create mode 100644 .github/actions/vercel/commands/deploy-preview.mjs create mode 100644 .github/actions/vercel/commands/deploy-production.mjs create mode 100644 .github/actions/vercel/commands/update-env.mjs create mode 100644 .github/actions/vercel/index.mjs create mode 100755 .github/actions/vercel/manual.mjs create mode 100644 .github/actions/vercel/types.d.ts create mode 100644 .github/actions/vercel/util.mjs create mode 100644 .github/actions/vercel/vercel.mjs create mode 100644 .github/pull_request_template.md create mode 100644 .github/runs-on.yml create mode 100755 .github/scripts/setup_sccache.sh create mode 100644 .github/workflows/README.md create mode 100644 .github/workflows/adhoc_wheels.yml create mode 100644 .github/workflows/auto_approve.yml create mode 100644 .github/workflows/auto_docs.yml create mode 100644 .github/workflows/auto_docs_check.yml create mode 100644 .github/workflows/cargo_shear.yml create mode 100644 .github/workflows/checkboxes.yml create mode 100644 .github/workflows/clear_cache.yml create mode 100644 .github/workflows/contrib_checks.yml create mode 100644 .github/workflows/contrib_rerun_py.yml create mode 100644 .github/workflows/cpp_matrix_full.json create mode 100644 .github/workflows/enforce_branch_name.yml create mode 100644 .github/workflows/first_time_contrib.yml create mode 100644 .github/workflows/labels.yml create mode 100644 .github/workflows/lsan_suppressions.supp create mode 100644 .github/workflows/nightly.yml create mode 100644 .github/workflows/notify-reality-sync.yml create mode 100644 .github/workflows/on_gh_release.yml create mode 100644 .github/workflows/on_pr_comment.yml create mode 100644 .github/workflows/on_pull_request.yml create mode 100644 .github/workflows/on_pull_request_contrib.yml create mode 100644 .github/workflows/on_push_docs.yml create mode 100644 .github/workflows/on_push_main.yml create mode 100644 .github/workflows/pr-trigger-reality-sync.yml create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/reusable_bench.yml create mode 100644 .github/workflows/reusable_build_and_upload_rerun_c.yml create mode 100644 .github/workflows/reusable_build_and_upload_rerun_cli.yml create mode 100644 .github/workflows/reusable_build_and_upload_wheels.yml create mode 100644 .github/workflows/reusable_build_examples.yml create mode 100644 .github/workflows/reusable_build_js.yml create mode 100644 .github/workflows/reusable_build_web.yml create mode 100644 .github/workflows/reusable_bundle_and_upload_rerun_cpp.yml create mode 100644 .github/workflows/reusable_checks.yml create mode 100644 .github/workflows/reusable_checks_cpp.yml create mode 100644 .github/workflows/reusable_checks_doc_redirects.yml create mode 100644 .github/workflows/reusable_checks_protobuf.yml create mode 100644 .github/workflows/reusable_checks_python.yml create mode 100644 .github/workflows/reusable_checks_rust.yml create mode 100644 .github/workflows/reusable_deploy_docs.yml create mode 100644 .github/workflows/reusable_deploy_landing_preview.yml create mode 100644 .github/workflows/reusable_pip_index.yml create mode 100644 .github/workflows/reusable_publish_js.yml create mode 100644 .github/workflows/reusable_publish_rerun_c.yml create mode 100644 .github/workflows/reusable_publish_rerun_cli.yml create mode 100644 .github/workflows/reusable_publish_web.yml create mode 100644 .github/workflows/reusable_publish_wheels.yml create mode 100644 .github/workflows/reusable_release_crates.yml create mode 100644 .github/workflows/reusable_run_notebook.yml create mode 100644 .github/workflows/reusable_sync_release_assets.yml create mode 100644 .github/workflows/reusable_test_wheels.yml create mode 100644 .github/workflows/reusable_track_size.yml create mode 100644 .github/workflows/reusable_upload_examples.yml create mode 100644 .github/workflows/reusable_upload_js.yml create mode 100644 .github/workflows/reusable_upload_web.yml create mode 100644 .github/workflows/reusable_web_test.yml create mode 100644 .github/workflows/update_kittest_snapshots.yml create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/vcs.xml create mode 100644 .idea/watcherTasks.xml create mode 100644 .mcp.json create mode 100644 .prettierignore create mode 100644 .prettierrc.toml create mode 100644 .python-version create mode 100644 .run/viewer_fast.run.xml create mode 100644 .rustfmt.toml create mode 100644 .typos.toml create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 AGENTS.md create mode 100644 ARCHITECTURE.md create mode 100644 BUILD.md create mode 100644 CHANGELOG.md create mode 100644 CLAUDE.md create mode 100644 CMakeLists.txt create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CODE_STYLE.md create mode 100644 CONTRIBUTING.md create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 DESIGN.md create mode 100644 LICENSE-APACHE create mode 100644 LICENSE-MIT create mode 100644 README.md create mode 100644 README.wehub.md create mode 100644 RELEASES.md create mode 100644 SECURITY.md create mode 100644 TESTING.md create mode 100644 bacon.toml create mode 100644 ci_docker/Dockerfile create mode 100644 ci_docker/README.md create mode 100755 ci_docker/publish.sh create mode 100644 clippy.toml create mode 100644 crates/build/README.md create mode 100644 crates/build/re_build_info/Cargo.toml create mode 100644 crates/build/re_build_info/README.md create mode 100644 crates/build/re_build_info/src/build_info.rs create mode 100644 crates/build/re_build_info/src/crate_version.rs create mode 100644 crates/build/re_build_info/src/lib.rs create mode 100644 crates/build/re_build_tools/Cargo.toml create mode 100644 crates/build/re_build_tools/README.md create mode 100644 crates/build/re_build_tools/src/git.rs create mode 100644 crates/build/re_build_tools/src/hashing.rs create mode 100644 crates/build/re_build_tools/src/lib.rs create mode 100644 crates/build/re_build_tools/src/rebuild_detector.rs create mode 100644 crates/build/re_build_tools/src/rustfmt.rs create mode 100644 crates/build/re_dev_tools/Cargo.toml create mode 100644 crates/build/re_dev_tools/README.md create mode 100644 crates/build/re_dev_tools/src/build_examples/example.rs create mode 100644 crates/build/re_dev_tools/src/build_examples/install.rs create mode 100644 crates/build/re_dev_tools/src/build_examples/manifest.rs create mode 100644 crates/build/re_dev_tools/src/build_examples/mod.rs create mode 100644 crates/build/re_dev_tools/src/build_examples/notebook.rs create mode 100644 crates/build/re_dev_tools/src/build_examples/rrd.rs create mode 100644 crates/build/re_dev_tools/src/build_examples/snippets.rs create mode 100644 crates/build/re_dev_tools/src/build_examples/wait_for_output.rs create mode 100644 crates/build/re_dev_tools/src/build_search_index/README.md create mode 100644 crates/build/re_dev_tools/src/build_search_index/build.rs create mode 100644 crates/build/re_dev_tools/src/build_search_index/ingest.rs create mode 100644 crates/build/re_dev_tools/src/build_search_index/ingest/cpp.rs create mode 100644 crates/build/re_dev_tools/src/build_search_index/ingest/docs.rs create mode 100644 crates/build/re_dev_tools/src/build_search_index/ingest/examples.rs create mode 100644 crates/build/re_dev_tools/src/build_search_index/ingest/python.rs create mode 100644 crates/build/re_dev_tools/src/build_search_index/meili.rs create mode 100644 crates/build/re_dev_tools/src/build_search_index/mod.rs create mode 100644 crates/build/re_dev_tools/src/build_search_index/repl.rs create mode 100644 crates/build/re_dev_tools/src/build_search_index/util.rs create mode 100644 crates/build/re_dev_tools/src/build_web_viewer/README.md create mode 100644 crates/build/re_dev_tools/src/build_web_viewer/lib.rs create mode 100644 crates/build/re_dev_tools/src/build_web_viewer/mod.rs create mode 100644 crates/build/re_dev_tools/src/main.rs create mode 100644 crates/build/re_protos_builder/Cargo.toml create mode 100644 crates/build/re_protos_builder/README.md create mode 100644 crates/build/re_protos_builder/src/bin/build_re_remote_store_types.rs create mode 100644 crates/build/re_protos_builder/src/lib.rs create mode 100644 crates/build/re_types_builder/.gitignore create mode 100644 crates/build/re_types_builder/Cargo.toml create mode 100644 crates/build/re_types_builder/README.md create mode 100644 crates/build/re_types_builder/build.rs create mode 100644 crates/build/re_types_builder/definitions/reflection.fbs create mode 100644 crates/build/re_types_builder/src/bin/build_re_types.rs create mode 100644 crates/build/re_types_builder/src/codegen/common.rs create mode 100644 crates/build/re_types_builder/src/codegen/cpp/array_builder.rs create mode 100644 crates/build/re_types_builder/src/codegen/cpp/forward_decl.rs create mode 100644 crates/build/re_types_builder/src/codegen/cpp/includes.rs create mode 100644 crates/build/re_types_builder/src/codegen/cpp/method.rs create mode 100644 crates/build/re_types_builder/src/codegen/cpp/mod.rs create mode 100644 crates/build/re_types_builder/src/codegen/docs/datatype_docs.rs create mode 100644 crates/build/re_types_builder/src/codegen/docs/mod.rs create mode 100644 crates/build/re_types_builder/src/codegen/docs/snippets_ref.rs create mode 100644 crates/build/re_types_builder/src/codegen/docs/website.rs create mode 100644 crates/build/re_types_builder/src/codegen/fbs/mod.rs create mode 100644 crates/build/re_types_builder/src/codegen/mod.rs create mode 100644 crates/build/re_types_builder/src/codegen/python/mod.rs create mode 100644 crates/build/re_types_builder/src/codegen/python/views.rs create mode 100644 crates/build/re_types_builder/src/codegen/rust/api.rs create mode 100644 crates/build/re_types_builder/src/codegen/rust/arrow.rs create mode 100644 crates/build/re_types_builder/src/codegen/rust/blueprint_validation.rs create mode 100644 crates/build/re_types_builder/src/codegen/rust/deserializer.rs create mode 100644 crates/build/re_types_builder/src/codegen/rust/mod.rs create mode 100644 crates/build/re_types_builder/src/codegen/rust/reflection.rs create mode 100644 crates/build/re_types_builder/src/codegen/rust/serializer.rs create mode 100644 crates/build/re_types_builder/src/codegen/rust/util.rs create mode 100644 crates/build/re_types_builder/src/data_type.rs create mode 100644 crates/build/re_types_builder/src/docs.rs create mode 100644 crates/build/re_types_builder/src/format/cpp.rs create mode 100644 crates/build/re_types_builder/src/format/fbs.rs create mode 100644 crates/build/re_types_builder/src/format/mod.rs create mode 100644 crates/build/re_types_builder/src/format/python.rs create mode 100644 crates/build/re_types_builder/src/format/rust.rs create mode 100644 crates/build/re_types_builder/src/lib.rs create mode 100644 crates/build/re_types_builder/src/objects.rs create mode 100644 crates/build/re_types_builder/src/reflection.rs create mode 100644 crates/build/re_types_builder/src/report.rs create mode 100644 crates/build/re_types_builder/src/type_registry.rs create mode 100644 crates/store/README.md create mode 100644 crates/store/re_chunk/Cargo.toml create mode 100644 crates/store/re_chunk/README.md create mode 100644 crates/store/re_chunk/examples/chunk_latest_at.rs create mode 100644 crates/store/re_chunk/examples/chunk_range.rs create mode 100644 crates/store/re_chunk/src/batcher.rs create mode 100644 crates/store/re_chunk/src/builder.rs create mode 100644 crates/store/re_chunk/src/chunk.rs create mode 100644 crates/store/re_chunk/src/iter.rs create mode 100644 crates/store/re_chunk/src/latest_at.rs create mode 100644 crates/store/re_chunk/src/lib.rs create mode 100644 crates/store/re_chunk/src/merge.rs create mode 100644 crates/store/re_chunk/src/range.rs create mode 100644 crates/store/re_chunk/src/shuffle.rs create mode 100644 crates/store/re_chunk/src/slice.rs create mode 100644 crates/store/re_chunk/src/split.rs create mode 100644 crates/store/re_chunk/src/transport.rs create mode 100644 crates/store/re_chunk/src/unit_chunk.rs create mode 100644 crates/store/re_chunk/tests/formatting.rs create mode 100644 crates/store/re_chunk/tests/latest_at.rs create mode 100644 crates/store/re_chunk/tests/memory_test.rs create mode 100644 crates/store/re_chunk/tests/range.rs create mode 100644 crates/store/re_chunk/tests/snapshots/formatting__format_chunk.snap create mode 100644 crates/store/re_chunk/tests/snapshots/formatting__format_chunk_redacted.snap create mode 100644 crates/store/re_chunk/tests/sorbet.rs create mode 100644 crates/store/re_chunk/tests/timeline.rs create mode 100644 crates/store/re_chunk/tests/with_mapped_component.rs create mode 100644 crates/store/re_chunk_store/Cargo.toml create mode 100644 crates/store/re_chunk_store/README.md create mode 100644 crates/store/re_chunk_store/benches/gc.rs create mode 100644 crates/store/re_chunk_store/src/compact.rs create mode 100644 crates/store/re_chunk_store/src/dataframe.rs create mode 100644 crates/store/re_chunk_store/src/drop_time_range.rs create mode 100644 crates/store/re_chunk_store/src/entity_tree.rs create mode 100644 crates/store/re_chunk_store/src/events.rs create mode 100644 crates/store/re_chunk_store/src/gc.rs create mode 100644 crates/store/re_chunk_store/src/lazy_store.rs create mode 100644 crates/store/re_chunk_store/src/lib.rs create mode 100644 crates/store/re_chunk_store/src/lineage.rs create mode 100644 crates/store/re_chunk_store/src/missing_chunk_reporter.rs create mode 100644 crates/store/re_chunk_store/src/profile.rs create mode 100644 crates/store/re_chunk_store/src/properties.rs create mode 100644 crates/store/re_chunk_store/src/query.rs create mode 100644 crates/store/re_chunk_store/src/rebatch_videos.rs create mode 100644 crates/store/re_chunk_store/src/snapshots/re_chunk_store__lineage__tests__lineage_bootstrapped.snap create mode 100644 crates/store/re_chunk_store/src/snapshots/re_chunk_store__lineage__tests__lineage_leaky_compactions.snap create mode 100644 crates/store/re_chunk_store/src/snapshots/re_chunk_store__lineage__tests__lineage_volatile.snap create mode 100644 crates/store/re_chunk_store/src/split_thick_thin.rs create mode 100644 crates/store/re_chunk_store/src/stats.rs create mode 100644 crates/store/re_chunk_store/src/store.rs create mode 100644 crates/store/re_chunk_store/src/store_schema.rs create mode 100644 crates/store/re_chunk_store/src/subscribers.rs create mode 100644 crates/store/re_chunk_store/src/writes.rs create mode 100644 crates/store/re_chunk_store/tests/compact.rs create mode 100644 crates/store/re_chunk_store/tests/correctness.rs create mode 100644 crates/store/re_chunk_store/tests/dataframe.rs create mode 100644 crates/store/re_chunk_store/tests/drop_time_range.rs create mode 100644 crates/store/re_chunk_store/tests/formatting.rs create mode 100644 crates/store/re_chunk_store/tests/gc.rs create mode 100644 crates/store/re_chunk_store/tests/memory_test.rs create mode 100644 crates/store/re_chunk_store/tests/reads.rs create mode 100644 crates/store/re_chunk_store/tests/snapshots/dataframe__schema_static_columns-2.snap create mode 100644 crates/store/re_chunk_store/tests/snapshots/dataframe__schema_static_columns-3.snap create mode 100644 crates/store/re_chunk_store/tests/snapshots/dataframe__schema_static_columns.snap create mode 100644 crates/store/re_chunk_store/tests/snapshots/formatting__format_chunk_store.snap create mode 100644 crates/store/re_chunk_store/tests/snapshots/memory_test__scalars_on_one_timeline_new.snap create mode 100644 crates/store/re_chunk_store/tests/stats.rs create mode 100644 crates/store/re_data_source/Cargo.toml create mode 100644 crates/store/re_data_source/README.md create mode 100644 crates/store/re_data_source/src/data_source.rs create mode 100644 crates/store/re_data_source/src/fetch_file_from_http.rs create mode 100644 crates/store/re_data_source/src/lib.rs create mode 100644 crates/store/re_data_source/src/load_stdin.rs create mode 100644 crates/store/re_data_source/src/stream_rrd_from_http.rs create mode 100644 crates/store/re_dataframe/Cargo.toml create mode 100644 crates/store/re_dataframe/README.md create mode 100644 crates/store/re_dataframe/benches/next_row.rs create mode 100644 crates/store/re_dataframe/examples/query.rs create mode 100644 crates/store/re_dataframe/src/engine.rs create mode 100644 crates/store/re_dataframe/src/lib.rs create mode 100644 crates/store/re_dataframe/src/query.rs create mode 100644 crates/store/re_dataframe/src/snapshots/re_dataframe__query__tests__async_barebones_static.snap create mode 100644 crates/store/re_dataframe/src/snapshots/re_dataframe__query__tests__async_barebones_temporal.snap create mode 100644 crates/store/re_dataframe/src/snapshots/re_dataframe__query__tests__barebones-2.snap create mode 100644 crates/store/re_dataframe/src/snapshots/re_dataframe__query__tests__barebones.snap create mode 100644 crates/store/re_dataframe/src/snapshots/re_dataframe__query__tests__clears-2.snap create mode 100644 crates/store/re_dataframe/src/snapshots/re_dataframe__query__tests__clears.snap create mode 100644 crates/store/re_dataframe/src/snapshots/re_dataframe__query__tests__filtered_index_range.snap create mode 100644 crates/store/re_dataframe/src/snapshots/re_dataframe__query__tests__filtered_index_values.snap create mode 100644 crates/store/re_dataframe/src/snapshots/re_dataframe__query__tests__filtered_is_not_null-2.snap create mode 100644 crates/store/re_dataframe/src/snapshots/re_dataframe__query__tests__filtered_is_not_null-3.snap create mode 100644 crates/store/re_dataframe/src/snapshots/re_dataframe__query__tests__filtered_is_not_null-4.snap create mode 100644 crates/store/re_dataframe/src/snapshots/re_dataframe__query__tests__filtered_is_not_null.snap create mode 100644 crates/store/re_dataframe/src/snapshots/re_dataframe__query__tests__query_static_any_values.snap create mode 100644 crates/store/re_dataframe/src/snapshots/re_dataframe__query__tests__selection-2.snap create mode 100644 crates/store/re_dataframe/src/snapshots/re_dataframe__query__tests__selection-3.snap create mode 100644 crates/store/re_dataframe/src/snapshots/re_dataframe__query__tests__selection-4.snap create mode 100644 crates/store/re_dataframe/src/snapshots/re_dataframe__query__tests__selection.snap create mode 100644 crates/store/re_dataframe/src/snapshots/re_dataframe__query__tests__sparse_fill_strategy_latestatglobal.snap create mode 100644 crates/store/re_dataframe/src/snapshots/re_dataframe__query__tests__using_index_values-2.snap create mode 100644 crates/store/re_dataframe/src/snapshots/re_dataframe__query__tests__using_index_values.snap create mode 100644 crates/store/re_dataframe/src/snapshots/re_dataframe__query__tests__view_contents-2.snap create mode 100644 crates/store/re_dataframe/src/snapshots/re_dataframe__query__tests__view_contents.snap create mode 100644 crates/store/re_dataframe/src/snapshots/re_dataframe__query__tests__view_contents_and_selection.snap create mode 100644 crates/store/re_dataframe/src/utils.rs create mode 100644 crates/store/re_datafusion/ARCHITECTURE.md create mode 100644 crates/store/re_datafusion/Cargo.toml create mode 100644 crates/store/re_datafusion/PIPELINE_BUDGET.md create mode 100644 crates/store/re_datafusion/README.md create mode 100644 crates/store/re_datafusion/src/analytics.rs create mode 100644 crates/store/re_datafusion/src/batch_coalescer/coalesce_exec.rs create mode 100644 crates/store/re_datafusion/src/batch_coalescer/coalescer.rs create mode 100644 crates/store/re_datafusion/src/batch_coalescer/mod.rs create mode 100644 crates/store/re_datafusion/src/catalog_provider.rs create mode 100644 crates/store/re_datafusion/src/chunk_fetcher.rs create mode 100644 crates/store/re_datafusion/src/dataframe_query_common.rs create mode 100644 crates/store/re_datafusion/src/dataframe_query_provider.rs create mode 100644 crates/store/re_datafusion/src/dataframe_query_provider/cpu_worker.rs create mode 100644 crates/store/re_datafusion/src/dataframe_query_provider/io_loop.rs create mode 100644 crates/store/re_datafusion/src/dataframe_query_provider_wasm.rs create mode 100644 crates/store/re_datafusion/src/dataset_manifest.rs create mode 100644 crates/store/re_datafusion/src/errors.rs create mode 100644 crates/store/re_datafusion/src/grpc_streaming_provider.rs create mode 100644 crates/store/re_datafusion/src/lib.rs create mode 100644 crates/store/re_datafusion/src/local_chunk_store_provider.rs create mode 100644 crates/store/re_datafusion/src/metrics_capture.rs create mode 100644 crates/store/re_datafusion/src/pipeline_budget.rs create mode 100644 crates/store/re_datafusion/src/pipeline_budget/tests.rs create mode 100644 crates/store/re_datafusion/src/pushdown_expressions.rs create mode 100644 crates/store/re_datafusion/src/segment_chunk_manifest.rs create mode 100644 crates/store/re_datafusion/src/segment_table.rs create mode 100644 crates/store/re_datafusion/src/table_entry_provider.rs create mode 100644 crates/store/re_datafusion/src/wasm_compat.rs create mode 100644 crates/store/re_entity_db/Cargo.toml create mode 100644 crates/store/re_entity_db/README.md create mode 100644 crates/store/re_entity_db/examples/memory_usage.rs create mode 100644 crates/store/re_entity_db/src/chunk_requests.rs create mode 100644 crates/store/re_entity_db/src/data_meta_per_timeline.rs create mode 100644 crates/store/re_entity_db/src/entity_db.rs create mode 100644 crates/store/re_entity_db/src/ingestion_statistics.rs create mode 100644 crates/store/re_entity_db/src/instance_path.rs create mode 100644 crates/store/re_entity_db/src/lib.rs create mode 100644 crates/store/re_entity_db/src/rrd_manifest_index.rs create mode 100644 crates/store/re_entity_db/src/rrd_manifest_index/chunk_prioritizer.rs create mode 100644 crates/store/re_entity_db/src/rrd_manifest_index/collapsed_time_ranges.rs create mode 100644 crates/store/re_entity_db/src/rrd_manifest_index/sorted_temporal_chunks.rs create mode 100644 crates/store/re_entity_db/src/rrd_manifest_index/time_range_merger.rs create mode 100644 crates/store/re_entity_db/src/sorted_range_map.rs create mode 100644 crates/store/re_entity_db/src/store_bundle.rs create mode 100644 crates/store/re_entity_db/src/versioned_instance_path.rs create mode 100644 crates/store/re_entity_db/tests/clear.rs create mode 100644 crates/store/re_grpc_client/Cargo.toml create mode 100644 crates/store/re_grpc_client/README.md create mode 100644 crates/store/re_grpc_client/src/lib.rs create mode 100644 crates/store/re_grpc_client/src/read.rs create mode 100644 crates/store/re_grpc_client/src/write.rs create mode 100644 crates/store/re_grpc_client/src/write_table.rs create mode 100644 crates/store/re_grpc_server/Cargo.toml create mode 100644 crates/store/re_grpc_server/README.md create mode 100644 crates/store/re_grpc_server/src/lib.rs create mode 100644 crates/store/re_grpc_server/src/main.rs create mode 100644 crates/store/re_grpc_server/src/priority_stream.rs create mode 100644 crates/store/re_grpc_server/src/shutdown.rs create mode 100644 crates/store/re_grpc_server/src/viewer_control.rs create mode 100644 crates/store/re_importer/Cargo.toml create mode 100644 crates/store/re_importer/README.md create mode 100644 crates/store/re_importer/src/import_file.rs create mode 100644 crates/store/re_importer/src/importer_archetype.rs create mode 100644 crates/store/re_importer/src/importer_directory.rs create mode 100644 crates/store/re_importer/src/importer_external.rs create mode 100644 crates/store/re_importer/src/importer_lerobot.rs create mode 100644 crates/store/re_importer/src/importer_mcap/importer.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/foxglove/camera_calibration.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/foxglove/compressed_image.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/foxglove/compressed_video.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/foxglove/frame_transform.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/foxglove/frame_transforms.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/foxglove/location_fix.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/foxglove/location_fixes.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/foxglove/log.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/foxglove/mod.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/foxglove/packed_element_field.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/foxglove/point_cloud.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/foxglove/pose_in_frame.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/foxglove/poses_in_frame.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/foxglove/raw_image.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/foxglove/voxel_grid.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/helpers.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/image_helpers.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/mod.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/ros2msg/log.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/ros2msg/magnetic_field.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/ros2msg/mod.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/ros2msg/occupancy_grid.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/ros2msg/pose_stamped.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/ros2msg/ros_map_helpers.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/ros2msg/string.rs create mode 100644 crates/store/re_importer/src/importer_mcap/lenses/ros2msg/voxel_grid.rs create mode 100644 crates/store/re_importer/src/importer_mcap/mod.rs create mode 100644 crates/store/re_importer/src/importer_mcap/robot_description.rs create mode 100644 crates/store/re_importer/src/importer_mcap/tests/assets/foxglove_camera_calibration.mcap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/assets/foxglove_compressed_image.mcap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/assets/foxglove_compressed_video.mcap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/assets/foxglove_frame_transforms.mcap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/assets/foxglove_location_fixes.mcap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/assets/foxglove_log.mcap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/assets/foxglove_point_cloud.mcap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/assets/foxglove_poses_in_frame.mcap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/assets/foxglove_raw_image.mcap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/assets/foxglove_voxel_grid.mcap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/assets/ros_log.mcap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/assets/ros_magnetic_field.mcap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/assets/ros_nav2_voxel_grid.mcap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/assets/ros_occupancy_grid.mcap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/assets/ros_pose_stamped.mcap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/assets/ros_string.mcap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/mod.rs create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/snapshots/re_importer__importer_mcap__tests__foxglove__test_camera_calibration__foxglove_camera_calibration.snap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/snapshots/re_importer__importer_mcap__tests__foxglove__test_compressed_image__foxglove_compressed_image.snap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/snapshots/re_importer__importer_mcap__tests__foxglove__test_compressed_video__foxglove_compressed_video.snap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/snapshots/re_importer__importer_mcap__tests__foxglove__test_frame_transforms__foxglove_frame_transform.snap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/snapshots/re_importer__importer_mcap__tests__foxglove__test_frame_transforms__foxglove_frame_transforms.snap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/snapshots/re_importer__importer_mcap__tests__foxglove__test_location_fixes__foxglove_location_fix.snap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/snapshots/re_importer__importer_mcap__tests__foxglove__test_location_fixes__foxglove_location_fixes.snap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/snapshots/re_importer__importer_mcap__tests__foxglove__test_log__foxglove_log.snap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/snapshots/re_importer__importer_mcap__tests__foxglove__test_point_cloud__foxglove_point_cloud.snap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/snapshots/re_importer__importer_mcap__tests__foxglove__test_point_cloud__foxglove_point_cloud_with_pose.snap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/snapshots/re_importer__importer_mcap__tests__foxglove__test_poses_in_frame__foxglove_pose_in_frame.snap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/snapshots/re_importer__importer_mcap__tests__foxglove__test_poses_in_frame__foxglove_poses_in_frame.snap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/snapshots/re_importer__importer_mcap__tests__foxglove__test_raw_image__foxglove_raw_image.snap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/snapshots/re_importer__importer_mcap__tests__foxglove__test_voxel_grid__foxglove_voxel_grid.snap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/test_camera_calibration.rs create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/test_compressed_image.rs create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/test_compressed_video.rs create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/test_frame_transforms.rs create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/test_location_fixes.rs create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/test_log.rs create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/test_point_cloud.rs create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/test_poses_in_frame.rs create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/test_raw_image.rs create mode 100644 crates/store/re_importer/src/importer_mcap/tests/foxglove/test_voxel_grid.rs create mode 100644 crates/store/re_importer/src/importer_mcap/tests/mod.rs create mode 100644 crates/store/re_importer/src/importer_mcap/tests/ros2msg/mod.rs create mode 100644 crates/store/re_importer/src/importer_mcap/tests/ros2msg/snapshots/re_importer__importer_mcap__tests__ros2msg__test_log__log.snap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/ros2msg/snapshots/re_importer__importer_mcap__tests__ros2msg__test_magnetic_field__magnetic_field.snap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/ros2msg/snapshots/re_importer__importer_mcap__tests__ros2msg__test_nav2_voxel_grid__nav2_voxel_grid.snap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/ros2msg/snapshots/re_importer__importer_mcap__tests__ros2msg__test_occupancy_grid__occupancy_grid.snap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/ros2msg/snapshots/re_importer__importer_mcap__tests__ros2msg__test_pose_stamped__pose_stamped.snap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/ros2msg/snapshots/re_importer__importer_mcap__tests__ros2msg__test_string__string.snap create mode 100644 crates/store/re_importer/src/importer_mcap/tests/ros2msg/test_log.rs create mode 100644 crates/store/re_importer/src/importer_mcap/tests/ros2msg/test_magnetic_field.rs create mode 100644 crates/store/re_importer/src/importer_mcap/tests/ros2msg/test_nav2_voxel_grid.rs create mode 100644 crates/store/re_importer/src/importer_mcap/tests/ros2msg/test_occupancy_grid.rs create mode 100644 crates/store/re_importer/src/importer_mcap/tests/ros2msg/test_pose_stamped.rs create mode 100644 crates/store/re_importer/src/importer_mcap/tests/ros2msg/test_string.rs create mode 100644 crates/store/re_importer/src/importer_mcap/tests/util.rs create mode 100644 crates/store/re_importer/src/importer_parquet.rs create mode 100644 crates/store/re_importer/src/importer_rrd.rs create mode 100644 crates/store/re_importer/src/importer_urdf/joint_transform.rs create mode 100644 crates/store/re_importer/src/importer_urdf/mod.rs create mode 100644 crates/store/re_importer/src/importer_urdf/robot_description_parser.rs create mode 100644 crates/store/re_importer/src/importer_urdf/urdf_tree.rs create mode 100644 crates/store/re_importer/src/lerobot/common.rs create mode 100644 crates/store/re_importer/src/lerobot/datasetv2.rs create mode 100644 crates/store/re_importer/src/lerobot/datasetv3.rs create mode 100644 crates/store/re_importer/src/lerobot/mod.rs create mode 100644 crates/store/re_importer/src/lib.rs create mode 100644 crates/store/re_importer/tests/.gitattributes create mode 100644 crates/store/re_importer/tests/assets/supported_ros2_messages.mcap create mode 100644 crates/store/re_importer/tests/snapshots/test_mcap_importer__tests__ros2.snap create mode 100644 crates/store/re_importer/tests/snapshots/test_mp4_importer__tests__h264_nobframes.snap create mode 100644 crates/store/re_importer/tests/test_mcap_importer.rs create mode 100644 crates/store/re_importer/tests/test_mp4_importer.rs create mode 100644 crates/store/re_lenses/Cargo.toml create mode 100644 crates/store/re_lenses/README.md create mode 100644 crates/store/re_lenses/src/lib.rs create mode 100644 crates/store/re_lenses/src/op/mod.rs create mode 100644 crates/store/re_lenses/src/op/semantic.rs create mode 100644 crates/store/re_lenses/src/op/string.rs create mode 100644 crates/store/re_lenses/src/runtime.rs create mode 100644 crates/store/re_lenses/tests/test_builtins.rs create mode 100644 crates/store/re_lenses_core/Cargo.toml create mode 100644 crates/store/re_lenses_core/README.md create mode 100644 crates/store/re_lenses_core/src/ast.rs create mode 100644 crates/store/re_lenses_core/src/builder.rs create mode 100644 crates/store/re_lenses_core/src/cast.rs create mode 100644 crates/store/re_lenses_core/src/chunk.rs create mode 100644 crates/store/re_lenses_core/src/combinators/cast.rs create mode 100644 crates/store/re_lenses_core/src/combinators/error.rs create mode 100644 crates/store/re_lenses_core/src/combinators/index.rs create mode 100644 crates/store/re_lenses_core/src/combinators/map.rs create mode 100644 crates/store/re_lenses_core/src/combinators/mod.rs create mode 100644 crates/store/re_lenses_core/src/combinators/reshape.rs create mode 100644 crates/store/re_lenses_core/src/combinators/transform.rs create mode 100644 crates/store/re_lenses_core/src/error.rs create mode 100644 crates/store/re_lenses_core/src/execute.rs create mode 100644 crates/store/re_lenses_core/src/lib.rs create mode 100644 crates/store/re_lenses_core/src/plan.rs create mode 100644 crates/store/re_lenses_core/src/selector/dyn_expr.rs create mode 100644 crates/store/re_lenses_core/src/selector/eval.rs create mode 100644 crates/store/re_lenses_core/src/selector/function_registry.rs create mode 100644 crates/store/re_lenses_core/src/selector/lexer.rs create mode 100644 crates/store/re_lenses_core/src/selector/mod.rs create mode 100644 crates/store/re_lenses_core/src/selector/parser.rs create mode 100644 crates/store/re_lenses_core/src/selector/runtime.rs create mode 100644 crates/store/re_lenses_core/tests/test_apply_selector.rs create mode 100644 crates/store/re_lenses_core/tests/test_cast.rs create mode 100644 crates/store/re_lenses_core/tests/test_chunk_splitting.rs create mode 100644 crates/store/re_lenses_core/tests/test_combinators_explode.rs create mode 100644 crates/store/re_lenses_core/tests/test_combinators_string.rs create mode 100644 crates/store/re_lenses_core/tests/test_combinators_transform.rs create mode 100644 crates/store/re_lenses_core/tests/test_selector_array.rs create mode 100644 crates/store/re_lenses_core/tests/test_selector_extraction.rs create mode 100644 crates/store/re_lenses_core/tests/test_selector_functions.rs create mode 100644 crates/store/re_lenses_core/tests/test_selector_list_array.rs create mode 100644 crates/store/re_lenses_core/tests/test_selector_pack.rs create mode 100644 crates/store/re_lenses_core/tests/util.rs create mode 100644 crates/store/re_log_channel/Cargo.toml create mode 100644 crates/store/re_log_channel/README.md create mode 100644 crates/store/re_log_channel/src/data_source_message.rs create mode 100644 crates/store/re_log_channel/src/lib.rs create mode 100644 crates/store/re_log_channel/src/receiver.rs create mode 100644 crates/store/re_log_channel/src/receiver_set.rs create mode 100644 crates/store/re_log_channel/src/sender.rs create mode 100644 crates/store/re_log_encoding/Cargo.toml create mode 100644 crates/store/re_log_encoding/README.md create mode 100644 crates/store/re_log_encoding/benches/msg_encode_benchmark.rs create mode 100644 crates/store/re_log_encoding/rrd.hexpat create mode 100644 crates/store/re_log_encoding/src/app_id_injector.rs create mode 100644 crates/store/re_log_encoding/src/chunk_provider/mod.rs create mode 100644 crates/store/re_log_encoding/src/chunk_provider/rrd.rs create mode 100644 crates/store/re_log_encoding/src/lib.rs create mode 100644 crates/store/re_log_encoding/src/rrd/chunk_reader.rs create mode 100644 crates/store/re_log_encoding/src/rrd/decoder/iterator.rs create mode 100644 crates/store/re_log_encoding/src/rrd/decoder/mod.rs create mode 100644 crates/store/re_log_encoding/src/rrd/decoder/state_machine.rs create mode 100644 crates/store/re_log_encoding/src/rrd/decoder/stream.rs create mode 100644 crates/store/re_log_encoding/src/rrd/encoder.rs create mode 100644 crates/store/re_log_encoding/src/rrd/errors.rs create mode 100644 crates/store/re_log_encoding/src/rrd/file_sink.rs create mode 100644 crates/store/re_log_encoding/src/rrd/footer/builders.rs create mode 100644 crates/store/re_log_encoding/src/rrd/footer/mod.rs create mode 100644 crates/store/re_log_encoding/src/rrd/footer/raw_rrd_manifest.rs create mode 100644 crates/store/re_log_encoding/src/rrd/footer/rrd_footer.rs create mode 100644 crates/store/re_log_encoding/src/rrd/footer/rrd_manifest.rs create mode 100644 crates/store/re_log_encoding/src/rrd/footer_reader.rs create mode 100644 crates/store/re_log_encoding/src/rrd/frames.rs create mode 100644 crates/store/re_log_encoding/src/rrd/log_msg.rs create mode 100644 crates/store/re_log_encoding/src/rrd/mod.rs create mode 100644 crates/store/re_log_encoding/src/rrd/stream_from_http.rs create mode 100644 crates/store/re_log_encoding/src/rrd/test_util.rs create mode 100644 crates/store/re_log_encoding/src/transport_to_app.rs create mode 100644 crates/store/re_log_encoding/tests/arrow_encode_roundtrip.rs create mode 100644 crates/store/re_log_encoding/tests/footers_and_manifests.rs create mode 100644 crates/store/re_log_encoding/tests/snapshots/footers_and_manifests__rrd_manifest_blueprint.snap create mode 100644 crates/store/re_log_encoding/tests/snapshots/footers_and_manifests__rrd_manifest_blueprint_schema.snap create mode 100644 crates/store/re_log_encoding/tests/snapshots/footers_and_manifests__rrd_manifest_recording.snap create mode 100644 crates/store/re_log_encoding/tests/snapshots/footers_and_manifests__rrd_manifest_recording_schema.snap create mode 100644 crates/store/re_log_encoding/tests/snapshots/footers_and_manifests__simple_manifest_batch.snap create mode 100644 crates/store/re_log_encoding/tests/snapshots/footers_and_manifests__simple_manifest_batch_native_map_static.snap create mode 100644 crates/store/re_log_encoding/tests/snapshots/footers_and_manifests__simple_manifest_batch_native_map_temporal.snap create mode 100644 crates/store/re_log_encoding/tests/snapshots/footers_and_manifests__simple_manifest_batch_schema.snap create mode 100644 crates/store/re_log_types/Cargo.toml create mode 100644 crates/store/re_log_types/README.md create mode 100644 crates/store/re_log_types/benches/parse_entity_path.rs create mode 100644 crates/store/re_log_types/benches/vec_deque_ext.rs create mode 100644 crates/store/re_log_types/src/arrow_msg.rs create mode 100644 crates/store/re_log_types/src/entry_id.rs create mode 100644 crates/store/re_log_types/src/entry_name.rs create mode 100644 crates/store/re_log_types/src/example_components.rs create mode 100644 crates/store/re_log_types/src/hash.rs create mode 100644 crates/store/re_log_types/src/index/absolute_time_range.rs create mode 100644 crates/store/re_log_types/src/index/duration.rs create mode 100644 crates/store/re_log_types/src/index/mod.rs create mode 100644 crates/store/re_log_types/src/index/non_min_i64.rs create mode 100644 crates/store/re_log_types/src/index/time_cell.rs create mode 100644 crates/store/re_log_types/src/index/time_int.rs create mode 100644 crates/store/re_log_types/src/index/time_point.rs create mode 100644 crates/store/re_log_types/src/index/time_real.rs create mode 100644 crates/store/re_log_types/src/index/time_type.rs create mode 100644 crates/store/re_log_types/src/index/timeline.rs create mode 100644 crates/store/re_log_types/src/index/timeline_point.rs create mode 100644 crates/store/re_log_types/src/index/timestamp.rs create mode 100644 crates/store/re_log_types/src/index/timestamp_format.rs create mode 100644 crates/store/re_log_types/src/instance.rs create mode 100644 crates/store/re_log_types/src/lib.rs create mode 100644 crates/store/re_log_types/src/path/component_path.rs create mode 100644 crates/store/re_log_types/src/path/data_path.rs create mode 100644 crates/store/re_log_types/src/path/entity_path.rs create mode 100644 crates/store/re_log_types/src/path/entity_path_filter.rs create mode 100644 crates/store/re_log_types/src/path/entity_path_part.rs create mode 100644 crates/store/re_log_types/src/path/mod.rs create mode 100644 crates/store/re_log_types/src/path/natural_ordering.rs create mode 100644 crates/store/re_log_types/src/path/parse_path.rs create mode 100644 crates/store/re_log_types/src/vec_deque_ext.rs create mode 100644 crates/store/re_mcap/Cargo.toml create mode 100644 crates/store/re_mcap/README.md create mode 100644 crates/store/re_mcap/src/decoders/assets/attachments.mcap create mode 100644 crates/store/re_mcap/src/decoders/attachments.rs create mode 100644 crates/store/re_mcap/src/decoders/metadata.rs create mode 100644 crates/store/re_mcap/src/decoders/mod.rs create mode 100644 crates/store/re_mcap/src/decoders/protobuf.rs create mode 100644 crates/store/re_mcap/src/decoders/raw.rs create mode 100644 crates/store/re_mcap/src/decoders/recording_info.rs create mode 100644 crates/store/re_mcap/src/decoders/ros2.rs create mode 100644 crates/store/re_mcap/src/decoders/ros2_reflection.rs create mode 100644 crates/store/re_mcap/src/decoders/schema.rs create mode 100644 crates/store/re_mcap/src/decoders/snapshots/re_mcap__decoders__attachments__tests__attachments_mcap_fixture.snap create mode 100644 crates/store/re_mcap/src/decoders/snapshots/re_mcap__decoders__protobuf__integration_tests__decode_failure_resilience.snap create mode 100644 crates/store/re_mcap/src/decoders/snapshots/re_mcap__decoders__protobuf__integration_tests__field_combinations_with_presence_tracking.snap create mode 100644 crates/store/re_mcap/src/decoders/snapshots/re_mcap__decoders__protobuf__integration_tests__field_combinations_without_presence_tracking.snap create mode 100644 crates/store/re_mcap/src/decoders/snapshots/re_mcap__decoders__protobuf__integration_tests__oneof_fields.snap create mode 100644 crates/store/re_mcap/src/decoders/snapshots/re_mcap__decoders__protobuf__integration_tests__oneof_message_variants.snap create mode 100644 crates/store/re_mcap/src/decoders/snapshots/re_mcap__decoders__protobuf__integration_tests__oneof_nested.snap create mode 100644 crates/store/re_mcap/src/decoders/stats.rs create mode 100644 crates/store/re_mcap/src/error.rs create mode 100644 crates/store/re_mcap/src/lib.rs create mode 100644 crates/store/re_mcap/src/parsers/cdr.rs create mode 100644 crates/store/re_mcap/src/parsers/dds.rs create mode 100644 crates/store/re_mcap/src/parsers/decode.rs create mode 100644 crates/store/re_mcap/src/parsers/mod.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/definitions/builtin_interfaces.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/definitions/geometry_msgs.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/definitions/mod.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/definitions/sensor_msgs.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/definitions/std_msgs.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/definitions/tf2_msgs.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/mod.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/scalar_parser.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/sensor_msgs/camera_info.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/sensor_msgs/compressed_image.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/sensor_msgs/image.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/sensor_msgs/imu.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/sensor_msgs/joint_state.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/sensor_msgs/joy.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/sensor_msgs/mod.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/sensor_msgs/nav_sat_fix.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/sensor_msgs/point_cloud_2.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/sensor_msgs/scalar_msgs.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/std_msgs/float64_array.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/std_msgs/float64_multi_array.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/std_msgs/mod.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/tf2_msgs/mod.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/tf2_msgs/tf_message.rs create mode 100644 crates/store/re_mcap/src/parsers/ros2msg/util.rs create mode 100644 crates/store/re_mcap/src/util.rs create mode 100644 crates/store/re_mp4_reader/Cargo.toml create mode 100644 crates/store/re_mp4_reader/README.md create mode 100644 crates/store/re_mp4_reader/src/asset.rs create mode 100644 crates/store/re_mp4_reader/src/config.rs create mode 100644 crates/store/re_mp4_reader/src/error.rs create mode 100644 crates/store/re_mp4_reader/src/lib.rs create mode 100644 crates/store/re_mp4_reader/src/stream.rs create mode 100644 crates/store/re_mp4_reader/tests/stream.rs create mode 100644 crates/store/re_parquet/Cargo.toml create mode 100644 crates/store/re_parquet/src/config.rs create mode 100644 crates/store/re_parquet/src/grouping.rs create mode 100644 crates/store/re_parquet/src/lib.rs create mode 100644 crates/store/re_parquet/src/streaming.rs create mode 100644 crates/store/re_parquet/src/timeline.rs create mode 100644 crates/store/re_parquet/tests/integration.rs create mode 100644 crates/store/re_protos/.gitattributes create mode 100644 crates/store/re_protos/Cargo.toml create mode 100644 crates/store/re_protos/README.md create mode 100644 crates/store/re_protos/proto/.gitignore create mode 100644 crates/store/re_protos/proto/rerun/v1alpha1/cloud.proto create mode 100644 crates/store/re_protos/proto/rerun/v1alpha1/common.proto create mode 100644 crates/store/re_protos/proto/rerun/v1alpha1/log_msg.proto create mode 100644 crates/store/re_protos/proto/rerun/v1alpha1/sdk_comms.proto create mode 100644 crates/store/re_protos/proto/rerun/v1alpha1/viewer.proto create mode 100644 crates/store/re_protos/src/headers.rs create mode 100644 crates/store/re_protos/src/lib.rs create mode 100644 crates/store/re_protos/src/trace_id_layer.rs create mode 100644 crates/store/re_protos/src/v1alpha1/rerun.cloud.v1alpha1.ext.chunk_key.rs create mode 100644 crates/store/re_protos/src/v1alpha1/rerun.cloud.v1alpha1.ext.rs create mode 100644 crates/store/re_protos/src/v1alpha1/rerun.cloud.v1alpha1.ext.schemas.rs create mode 100644 crates/store/re_protos/src/v1alpha1/rerun.cloud.v1alpha1.rs create mode 100644 crates/store/re_protos/src/v1alpha1/rerun.common.v1alpha1.ext.rs create mode 100644 crates/store/re_protos/src/v1alpha1/rerun.common.v1alpha1.rs create mode 100644 crates/store/re_protos/src/v1alpha1/rerun.log_msg.v1alpha1.ext.rs create mode 100644 crates/store/re_protos/src/v1alpha1/rerun.log_msg.v1alpha1.rs create mode 100644 crates/store/re_protos/src/v1alpha1/rerun.sdk_comms.v1alpha1.rs create mode 100644 crates/store/re_protos/src/v1alpha1/snapshots/re_protos__v1alpha1__rerun_cloud_v1alpha1_ext__tests__query_dataset_dataframe_schema.snap create mode 100644 crates/store/re_protos/src/v1alpha1/snapshots/re_protos__v1alpha1__rerun_cloud_v1alpha1_ext__tests__query_tasks_dataframe_schema.snap create mode 100644 crates/store/re_protos/src/v1alpha1/snapshots/re_protos__v1alpha1__rerun_cloud_v1alpha1_ext__tests__register_with_dataset_dataframe_schema.snap create mode 100644 crates/store/re_protos/src/v1alpha1/snapshots/re_protos__v1alpha1__rerun_cloud_v1alpha1_ext__tests__scan_dataset_manifest_dataframe_schema.snap create mode 100644 crates/store/re_protos/src/v1alpha1/snapshots/re_protos__v1alpha1__rerun_cloud_v1alpha1_ext__tests__scan_segment_table_dataframe_schema.snap create mode 100644 crates/store/re_query/Cargo.toml create mode 100644 crates/store/re_query/README.md create mode 100644 crates/store/re_query/benches/latest_at.rs create mode 100644 crates/store/re_query/examples/query_latest_at.rs create mode 100644 crates/store/re_query/examples/query_range.rs create mode 100644 crates/store/re_query/src/bin/clamped_zip.rs create mode 100644 crates/store/re_query/src/bin/range_zip.rs create mode 100644 crates/store/re_query/src/cache.rs create mode 100644 crates/store/re_query/src/cache_stats.rs create mode 100644 crates/store/re_query/src/clamped_zip/.gitattributes create mode 100644 crates/store/re_query/src/clamped_zip/generated.rs create mode 100644 crates/store/re_query/src/clamped_zip/mod.rs create mode 100644 crates/store/re_query/src/latest_all.rs create mode 100644 crates/store/re_query/src/latest_at.rs create mode 100644 crates/store/re_query/src/lib.rs create mode 100644 crates/store/re_query/src/range.rs create mode 100644 crates/store/re_query/src/range_zip/.gitattributes create mode 100644 crates/store/re_query/src/range_zip/generated.rs create mode 100644 crates/store/re_query/src/range_zip/mod.rs create mode 100644 crates/store/re_query/src/storage_engine.rs create mode 100644 crates/store/re_query/tests/latest_all.rs create mode 100644 crates/store/re_query/tests/latest_at.rs create mode 100644 crates/store/re_query/tests/range.rs create mode 100644 crates/store/re_redap_client/Cargo.toml create mode 100644 crates/store/re_redap_client/README.md create mode 100644 crates/store/re_redap_client/src/analytics_exporter.rs create mode 100644 crates/store/re_redap_client/src/api_error.rs create mode 100644 crates/store/re_redap_client/src/api_response_stream.rs create mode 100644 crates/store/re_redap_client/src/connection_client.rs create mode 100644 crates/store/re_redap_client/src/connection_registry.rs create mode 100644 crates/store/re_redap_client/src/grpc.rs create mode 100644 crates/store/re_redap_client/src/lib.rs create mode 100644 crates/store/re_redap_client/src/segment_chunk_provider.rs create mode 100644 crates/store/re_redap_tests/Cargo.toml create mode 100644 crates/store/re_redap_tests/README.md create mode 100644 crates/store/re_redap_tests/src/lib.rs create mode 100644 crates/store/re_redap_tests/src/tests/column_projection.rs create mode 100644 crates/store/re_redap_tests/src/tests/common.rs create mode 100644 crates/store/re_redap_tests/src/tests/create_dataset.rs create mode 100644 crates/store/re_redap_tests/src/tests/create_table.rs create mode 100644 crates/store/re_redap_tests/src/tests/dataset_schema.rs create mode 100644 crates/store/re_redap_tests/src/tests/entries_table.rs create mode 100644 crates/store/re_redap_tests/src/tests/fetch_chunks.rs create mode 100644 crates/store/re_redap_tests/src/tests/mod.rs create mode 100644 crates/store/re_redap_tests/src/tests/query_dataset.rs create mode 100644 crates/store/re_redap_tests/src/tests/query_filter.rs create mode 100644 crates/store/re_redap_tests/src/tests/query_index_values.rs create mode 100644 crates/store/re_redap_tests/src/tests/register_asset.rs create mode 100644 crates/store/re_redap_tests/src/tests/register_segment.rs create mode 100644 crates/store/re_redap_tests/src/tests/rrd_manifest.rs create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__column_projection__dataset_manifest_all_columns.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__column_projection__segment_table_all_columns.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__create_table__create_table_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__dataset_schema__empty_dataset_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__dataset_schema__simple_dataset_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__entries_table__entries_table_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__entries_table__entries_table_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__entries_table__entries_table_with_empty_dataset.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__entries_table__entries_table_with_empty_dataset_deleted.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__fetch_chunks__simple_dataset_fetch_chunk.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_dataset__empty_dataset_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_dataset__empty_dataset_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_dataset__simple_dataset_default_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_dataset__simple_dataset_default_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_dataset__simple_dataset_exclude_static_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_dataset__simple_dataset_exclude_static_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_dataset__simple_dataset_exclude_temporal_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_dataset__simple_dataset_exclude_temporal_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_dataset__simple_dataset_single_entity_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_dataset__simple_dataset_single_entity_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_dataset__simple_dataset_single_segment_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_dataset__simple_dataset_single_segment_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_dataset__simple_with_layer_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_dataset__simple_with_layer_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_dataset__with_query_default_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_dataset__with_query_default_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_dataset__with_query_latest_at_end_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_dataset__with_query_latest_at_end_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_dataset__with_query_none_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_dataset__with_query_none_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_dataset__with_query_range_all_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_dataset__with_query_range_all_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_filter__frame_nr_range_fill_latest_at_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_filter__frame_nr_range_fill_latest_at_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_filter__frame_nr_range_no_fill_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_filter__frame_nr_range_no_fill_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_filter__simple_dataset_default_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_filter__simple_dataset_default_fill_latest_at_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_filter__simple_dataset_default_fill_latest_at_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_filter__simple_dataset_default_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_filter__simple_dataset_frame_nr_eq_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_filter__simple_dataset_frame_nr_eq_fill_latest_at_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_filter__simple_dataset_frame_nr_eq_fill_latest_at_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_filter__simple_dataset_frame_nr_eq_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_filter__simple_dataset_frame_nr_range_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_filter__simple_dataset_frame_nr_range_fill_latest_at_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_filter__simple_dataset_frame_nr_range_fill_latest_at_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_filter__simple_dataset_frame_nr_range_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_filter__simple_dataset_seg_id_eq_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_filter__simple_dataset_seg_id_eq_fill_latest_at_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_filter__simple_dataset_seg_id_eq_fill_latest_at_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_filter__simple_dataset_seg_id_eq_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_index_values__query_index_values_duration_all_valid_index_values_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_index_values__query_index_values_duration_all_valid_index_values_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_index_values__query_index_values_duration_single_segment_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_index_values__query_index_values_duration_unknown_segment_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_index_values__query_index_values_sequence_all_valid_index_values_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_index_values__query_index_values_sequence_all_valid_index_values_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_index_values__query_index_values_sequence_single_segment_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_index_values__query_index_values_sequence_unknown_segment_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_index_values__query_index_values_timestamp_all_valid_index_values_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_index_values__query_index_values_timestamp_all_valid_index_values_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_index_values__query_index_values_timestamp_single_segment_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__query_index_values__query_index_values_timestamp_unknown_segment_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__empty_manifest_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__empty_manifest_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__empty_segments_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__empty_segments_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__out_of_order_properties_manifest_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__out_of_order_properties_manifest_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__out_of_order_properties_segments_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__out_of_order_properties_segments_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__register_prefix_manifest_manifest_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__register_prefix_manifest_manifest_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__register_prefix_segments_segments_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__register_prefix_segments_segments_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__segment1_props_should_be_there_segments_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__segment1_props_should_be_there_segments_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__simple_blueprint_manifest_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__simple_blueprint_manifest_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__simple_blueprint_segments_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__simple_blueprint_segments_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__simple_manifest_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__simple_manifest_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__simple_segments_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__simple_segments_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__simple_with_layers_manifest_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__simple_with_layers_manifest_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__simple_with_layers_segments_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__simple_with_layers_segments_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__simple_with_multiple_timelines_manifest_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__simple_with_multiple_timelines_manifest_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__simple_with_multiple_timelines_segments_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__simple_with_multiple_timelines_segments_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__simple_with_properties_manifest_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__simple_with_properties_manifest_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__simple_with_properties_segments_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__register_segment__simple_with_properties_segments_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__rrd_manifest__fetch_chunks_from_rrd_manifest.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__rrd_manifest__layered_segment_rrd_manifest_1_all_there.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__rrd_manifest__layered_segment_rrd_manifest_1_all_there_sorbet_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__rrd_manifest__layered_segment_rrd_manifest_1_all_there_sorbet_schema_sha256.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__rrd_manifest__layered_segment_rrd_manifest_2_base_removed.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__rrd_manifest__layered_segment_rrd_manifest_2_base_removed_sorbet_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__rrd_manifest__layered_segment_rrd_manifest_2_base_removed_sorbet_schema_sha256.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__rrd_manifest__rrd_manifest.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__rrd_manifest__rrd_manifest_sorbet_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__rrd_manifest__rrd_manifest_sorbet_schema_sha256.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__missing_1_should_be_empty_response_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__missing_1_should_be_empty_response_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__products_1_register_all_manifest_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__products_1_register_all_manifest_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__products_1_register_all_segments_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__products_1_register_all_segments_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__products_2_remove_layers_BD_for_segments_13_manifest_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__products_2_remove_layers_BD_for_segments_13_manifest_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__products_2_remove_layers_BD_for_segments_13_response_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__products_2_remove_layers_BD_for_segments_13_segments_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__products_2_remove_layers_BD_for_segments_13_segments_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__products_3_remove_layers_BD_for_all_segments_manifest_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__products_3_remove_layers_BD_for_all_segments_manifest_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__products_3_remove_layers_BD_for_all_segments_response_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__products_3_remove_layers_BD_for_all_segments_segments_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__products_3_remove_layers_BD_for_all_segments_segments_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__products_4_remove_all_layers_for_segments_23_manifest_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__products_4_remove_all_layers_for_segments_23_manifest_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__products_4_remove_all_layers_for_segments_23_response_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__products_4_remove_all_layers_for_segments_23_segments_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__products_4_remove_all_layers_for_segments_23_segments_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__simple_1_register_all_manifest_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__simple_1_register_all_manifest_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__simple_1_register_all_segments_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__simple_1_register_all_segments_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__simple_2_remove_segment_id2_manifest_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__simple_2_remove_segment_id2_manifest_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__simple_2_remove_segment_id2_response_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__simple_2_remove_segment_id2_segments_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__simple_2_remove_segment_id2_segments_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__simple_3_remove_remaining_segments_manifest_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__simple_3_remove_remaining_segments_manifest_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__simple_3_remove_remaining_segments_response_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__simple_3_remove_remaining_segments_segments_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__simple_3_remove_remaining_segments_segments_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__simple_4_reregister_all_manifest_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__simple_4_reregister_all_manifest_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__simple_4_reregister_all_segments_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__simple_4_reregister_all_segments_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__unregister_then_query_1_added_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__unregister_then_query_1_added_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__unregister_then_query_2_removed_data.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__unregister_segment__unregister_then_query_2_removed_schema.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__write_table__append_table.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__write_table__overwrite_table.snap create mode 100644 crates/store/re_redap_tests/src/tests/snapshots/re_redap_tests__tests__write_table__replace_rows.snap create mode 100644 crates/store/re_redap_tests/src/tests/unregister_segment.rs create mode 100644 crates/store/re_redap_tests/src/tests/update_entry.rs create mode 100644 crates/store/re_redap_tests/src/tests/watch_events.rs create mode 100644 crates/store/re_redap_tests/src/tests/write_table.rs create mode 100644 crates/store/re_redap_tests/src/utils/client.rs create mode 100644 crates/store/re_redap_tests/src/utils/mod.rs create mode 100644 crates/store/re_redap_tests/src/utils/path.rs create mode 100644 crates/store/re_redap_tests/src/utils/rerun.rs create mode 100644 crates/store/re_redap_tests/src/utils/streaming.rs create mode 100644 crates/store/re_redap_tests/src/utils/tables.rs create mode 100644 crates/store/re_sdk_types/.gitattributes create mode 100644 crates/store/re_sdk_types/.gitignore create mode 100644 crates/store/re_sdk_types/Cargo.toml create mode 100644 crates/store/re_sdk_types/README.md create mode 100644 crates/store/re_sdk_types/definitions/.gitattributes create mode 100644 crates/store/re_sdk_types/definitions/attributes.fbs create mode 100644 crates/store/re_sdk_types/definitions/attributes/arrow.fbs create mode 100644 crates/store/re_sdk_types/definitions/attributes/cpp.fbs create mode 100644 crates/store/re_sdk_types/definitions/attributes/docs.fbs create mode 100644 crates/store/re_sdk_types/definitions/attributes/fbs.fbs create mode 100644 crates/store/re_sdk_types/definitions/attributes/python.fbs create mode 100644 crates/store/re_sdk_types/definitions/attributes/rust.fbs create mode 100644 crates/store/re_sdk_types/definitions/entry_point.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/.gitattributes create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/annotation_context.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/arrows2d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/arrows3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/asset3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/asset_video.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/bar_chart.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/boxes2d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/boxes3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/capsules3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/clear.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/coordinate_frame.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/cylinders3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/depth_image.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/ellipses2d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/ellipsoids3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/encoded_depth_image.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/encoded_image.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/geo_line_strings.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/geo_points.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/graph_edges.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/graph_nodes.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/grid_map.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/image.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/instance_poses3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/line_strips2d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/line_strips3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/mcap_channel.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/mcap_message.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/mcap_schema.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/mcap_statistics.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/mesh3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/pinhole.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/points2d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/points3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/recording_info.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/scalars.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/segmentation_image.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/series_lines.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/series_points.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/state_change.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/state_configuration.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/tensor.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/text_document.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/text_log.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/transform3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/transform_axes3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/video_frame_reference.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/video_stream.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/view_coordinates.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/archetypes/voxel_grid_map.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/attributes.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/.gitattributes create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/active_visualizers.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/background.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/container_blueprint.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/dataframe_query.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/entity_behavior.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/eye_controls3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/force_center.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/force_collision_radius.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/force_link.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/force_many_body.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/force_position.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/line_grid3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/map_background.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/map_zoom.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/near_clip_plane.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/panel_blueprint.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/plot_legend.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/scalar_axis.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/spatial_information.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/table_blueprint.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/tensor_scalar_mapping.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/tensor_slice_selection.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/tensor_view_fit.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/text_document_format.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/text_log_columns.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/text_log_format.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/text_log_rows.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/time_axis.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/view_blueprint.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/view_contents.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/viewport_blueprint.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/visible_time_ranges.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/visual_bounds2d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/archetypes/visualizer_instruction.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/absolute_time_range.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/active_tab.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/angular_speed.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/apply_latest_at.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/auto_layout.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/auto_scroll.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/auto_views.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/background_kind.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/column_name.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/column_order.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/column_share.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/component_column_selector.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/container_kind.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/corner2d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/enabled.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/eye3d_kind.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/filter_by_range.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/filter_is_not_null.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/force_distance.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/force_iterations.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/force_strength.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/fps.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/grid_columns.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/grid_spacing.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/included_content.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/link_axis.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/lock_range_during_zoom.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/loop_mode.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/map_provider.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/near_clip_plane.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/panel_state.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/play_state.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/playback_speed.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/query_expression.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/root_container.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/row_share.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/selected_columns.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/tensor_dimension_index_slider.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/text_log_column.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/time_int.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/time_range.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/timeline_column.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/timeline_name.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/view_class.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/view_fit.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/view_maximized.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/view_origin.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/viewer_recommendation_hash.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/visible_time_range.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/visual_bounds2d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/visualizer_component_mapping.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/visualizer_instruction_id.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/visualizer_type.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/components/zoom_level.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/datatypes.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/datatypes/component_column_selector.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/datatypes/filter_by_range.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/datatypes/filter_is_not_null.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/datatypes/selected_columns.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/datatypes/tensor_dimension_index_slider.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/datatypes/text_log_column.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/datatypes/timeline_column.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/datatypes/visualizer_component_mapping.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/views.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/views/bar_chart.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/views/dataframe.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/views/graph.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/views/map.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/views/spatial2d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/views/spatial3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/views/state_timeline.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/views/tensor.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/views/text_document.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/views/text_log.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/blueprint/views/time_series.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/aggregation_policy.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/albedo_factor.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/annotation_context.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/axis_length.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/blob.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/cell_size.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/channel_id.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/channel_message_counts.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/class_id.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/clear_is_recursive.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/color.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/colormap.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/count.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/depth_meter.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/draw_order.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/entity_path.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/fill_mode.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/fill_ratio.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/gamma_correction.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/geo_line_string.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/graph_edge.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/graph_node.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/graph_type.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/half_size2d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/half_size3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/image_buffer.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/image_format.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/image_plane_distance.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/interactive.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/interpolation_mode.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/is_keyframe.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/key_value_pairs.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/keypoint_id.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/latlon.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/length.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/line_strip2d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/line_strip3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/linear_speed.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/magnification_filter.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/marker_shape.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/marker_size.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/media_type.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/mesh_face_rendering.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/name.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/opacity.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/pinhole_projection.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/plane3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/point_shading.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/position2d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/position3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/radius.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/range1d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/resolution.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/rotation_axis_angle.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/rotation_quat.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/scalar.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/scale3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/schema_id.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/show_labels.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/stroke_width.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/tensor_data.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/tensor_dimension_selection.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/texcoord2d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/text.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/text_log_level.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/timestamp.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/transform_frame_id.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/transform_mat3x3.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/transform_relation.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/translation3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/triangle_indices.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/value_range.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/vector2d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/vector3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/video_codec.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/video_sample.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/video_timestamp.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/view_coordinates.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/visible.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/voxel_index.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/voxel_size.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/components/voxel_value.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/angle.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/annotation_info.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/blob.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/bool.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/channel_count_pair.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/channel_datatype.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/class_description.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/class_description_map_elem.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/class_id.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/color_model.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/dvec2d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/entity_path.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/float32.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/float64.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/image_format.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/ivec3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/keypoint_id.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/keypoint_pair.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/mat3x3.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/mat4x4.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/pixel_format.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/plane3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/quaternion.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/range1d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/range2d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/rgba32.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/rotation_axis_angle.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/tensor_buffer.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/tensor_data.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/tensor_dimension_selection.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/time_int.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/time_range.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/uint16.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/uint32.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/uint64.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/utf8.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/utf8_pair.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/uuid.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/uvec2d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/uvec3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/uvec4d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/vec2d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/vec3d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/vec4d.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/video_timestamp.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/view_coordinates.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/datatypes/visible_time_range.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/testing/archetypes/fuzzy.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/testing/components/enum_test.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/testing/components/fuzzy.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/testing/components/fuzzy_deps.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/testing/datatypes/fuzzy.fbs create mode 100644 crates/store/re_sdk_types/definitions/rerun/unit_type.fbs create mode 100644 crates/store/re_sdk_types/src/any_values.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/.gitattributes create mode 100644 crates/store/re_sdk_types/src/archetypes/annotation_context.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/arrows2d.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/arrows2d_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/arrows3d.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/arrows3d_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/asset3d.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/asset3d_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/asset_video.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/asset_video_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/bar_chart.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/boxes2d.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/boxes2d_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/boxes3d.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/boxes3d_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/capsules3d.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/capsules3d_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/coordinate_frame.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/cylinders3d.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/cylinders3d_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/depth_image.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/depth_image_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/ellipses2d.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/ellipses2d_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/ellipsoids3d.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/ellipsoids3d_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/encoded_depth_image.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/encoded_depth_image_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/encoded_image.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/encoded_image_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/geo_line_strings.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/geo_line_strings_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/geo_points.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/geo_points_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/graph_edges.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/graph_edges_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/graph_nodes.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/grid_map.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/image.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/image_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/instance_poses3d.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/line_strips2d.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/line_strips3d.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/mcap_channel.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/mcap_message.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/mcap_schema.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/mcap_statistics.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/mesh3d.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/mesh3d_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/mod.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/pinhole.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/pinhole_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/points2d.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/points3d.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/points3d_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/recording_info.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/scalars.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/scalars_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/segmentation_image.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/segmentation_image_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/series_lines.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/series_points.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/state_change.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/state_configuration.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/tensor.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/tensor_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/text_document.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/text_document_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/text_log.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/transform3d.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/transform3d_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/transform_axes3d.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/video_frame_reference.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/video_stream.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/view_coordinates.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/view_coordinates_ext.rs create mode 100644 crates/store/re_sdk_types/src/archetypes/voxel_grid_map.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/.gitattributes create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/active_visualizers.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/background.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/container_blueprint.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/dataframe_query.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/entity_behavior.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/eye_controls3d.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/force_center.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/force_collision_radius.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/force_link.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/force_many_body.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/force_position.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/graph_background.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/line_grid3d.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/map_background.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/map_zoom.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/mod.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/near_clip_plane.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/panel_blueprint.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/plot_background.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/plot_legend.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/scalar_axis.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/spatial_information.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/table_blueprint.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/tensor_scalar_mapping.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/tensor_slice_selection.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/tensor_view_fit.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/text_document_format.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/text_log_columns.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/text_log_format.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/text_log_rows.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/time_axis.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/time_panel_blueprint.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/view_blueprint.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/view_contents.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/view_contents_ext.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/viewport_blueprint.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/visible_time_ranges.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/visual_bounds2d.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/archetypes/visualizer_instruction.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/.gitattributes create mode 100644 crates/store/re_sdk_types/src/blueprint/components/absolute_time_range.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/active_tab.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/angular_speed.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/apply_latest_at.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/auto_layout.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/auto_layout_ext.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/auto_scroll.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/auto_views.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/background_kind.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/column_name.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/column_order.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/column_share.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/component_column_selector.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/component_column_selector_ext.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/container_kind.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/corner2d.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/corner2d_ext.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/enabled.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/enabled_ext.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/eye3d_kind.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/filter_by_range.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/filter_by_range_ext.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/filter_is_not_null.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/filter_is_not_null_ext.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/force_distance.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/force_iterations.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/force_strength.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/fps.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/grid_columns.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/grid_spacing.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/grid_spacing_ext.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/included_content.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/link_axis.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/lock_range_during_zoom.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/loop_mode.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/map_provider.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/mod.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/near_clip_plane.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/near_clip_plane_ext.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/panel_state.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/panel_state_ext.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/play_state.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/playback_speed.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/query_expression.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/root_container.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/row_share.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/selected_columns.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/tensor_dimension_index_slider.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/tensor_dimension_index_slider_ext.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/text_log_column.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/time_int.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/time_range.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/timeline_column.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/timeline_name.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/timeline_name_ext.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/view_class.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/view_class_ext.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/view_fit.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/view_maximized.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/view_origin.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/view_origin_ext.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/viewer_recommendation_hash.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/viewer_recommendation_hash_ext.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/visible_time_range.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/visual_bounds2d.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/visual_bounds2d_ext.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/visualizer_component_mapping.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/visualizer_instruction_id.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/visualizer_instruction_id_ext.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/visualizer_type.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/components/zoom_level.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/datatypes/.gitattributes create mode 100644 crates/store/re_sdk_types/src/blueprint/datatypes/component_column_selector.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/datatypes/component_column_selector_ext.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/datatypes/component_source_kind.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/datatypes/filter_by_range.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/datatypes/filter_is_not_null.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/datatypes/mod.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/datatypes/selected_columns.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/datatypes/tensor_dimension_index_slider.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/datatypes/text_log_column.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/datatypes/text_log_column_ext.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/datatypes/text_log_column_kind.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/datatypes/text_log_column_kind_ext.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/datatypes/timeline_column.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/datatypes/timeline_column_ext.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/datatypes/visualizer_component_mapping.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/datatypes/visualizer_component_mapping_ext.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/mod.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/views/.gitattributes create mode 100644 crates/store/re_sdk_types/src/blueprint/views/bar_chart_view.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/views/dataframe_view.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/views/graph_view.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/views/map_view.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/views/mod.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/views/spatial2d_view.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/views/spatial3d_view.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/views/state_timeline_view.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/views/tensor_view.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/views/text_document_view.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/views/text_log_view.rs create mode 100644 crates/store/re_sdk_types/src/blueprint/views/time_series_view.rs create mode 100644 crates/store/re_sdk_types/src/colormap_category.rs create mode 100644 crates/store/re_sdk_types/src/components/.gitattributes create mode 100644 crates/store/re_sdk_types/src/components/aggregation_policy.rs create mode 100644 crates/store/re_sdk_types/src/components/albedo_factor.rs create mode 100644 crates/store/re_sdk_types/src/components/albedo_factor_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/annotation_context.rs create mode 100644 crates/store/re_sdk_types/src/components/axis_length.rs create mode 100644 crates/store/re_sdk_types/src/components/axis_length_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/blob.rs create mode 100644 crates/store/re_sdk_types/src/components/cell_size.rs create mode 100644 crates/store/re_sdk_types/src/components/channel_id.rs create mode 100644 crates/store/re_sdk_types/src/components/channel_message_counts.rs create mode 100644 crates/store/re_sdk_types/src/components/class_id.rs create mode 100644 crates/store/re_sdk_types/src/components/class_id_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/color.rs create mode 100644 crates/store/re_sdk_types/src/components/color_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/colormap.rs create mode 100644 crates/store/re_sdk_types/src/components/colormap_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/count.rs create mode 100644 crates/store/re_sdk_types/src/components/depth_meter.rs create mode 100644 crates/store/re_sdk_types/src/components/depth_meter_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/draw_order.rs create mode 100644 crates/store/re_sdk_types/src/components/draw_order_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/entity_path.rs create mode 100644 crates/store/re_sdk_types/src/components/fill_mode.rs create mode 100644 crates/store/re_sdk_types/src/components/fill_mode_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/fill_ratio.rs create mode 100644 crates/store/re_sdk_types/src/components/fill_ratio_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/gamma_correction.rs create mode 100644 crates/store/re_sdk_types/src/components/gamma_correction_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/geo_line_string.rs create mode 100644 crates/store/re_sdk_types/src/components/geo_line_string_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/graph_edge.rs create mode 100644 crates/store/re_sdk_types/src/components/graph_node.rs create mode 100644 crates/store/re_sdk_types/src/components/graph_node_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/graph_type.rs create mode 100644 crates/store/re_sdk_types/src/components/half_size2d.rs create mode 100644 crates/store/re_sdk_types/src/components/half_size2d_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/half_size3d.rs create mode 100644 crates/store/re_sdk_types/src/components/half_size3d_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/image_buffer.rs create mode 100644 crates/store/re_sdk_types/src/components/image_buffer_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/image_format.rs create mode 100644 crates/store/re_sdk_types/src/components/image_format_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/image_plane_distance.rs create mode 100644 crates/store/re_sdk_types/src/components/image_plane_distance_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/interactive.rs create mode 100644 crates/store/re_sdk_types/src/components/interactive_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/interpolation_mode.rs create mode 100644 crates/store/re_sdk_types/src/components/is_keyframe.rs create mode 100644 crates/store/re_sdk_types/src/components/key_value_pairs.rs create mode 100644 crates/store/re_sdk_types/src/components/keypoint_id.rs create mode 100644 crates/store/re_sdk_types/src/components/keypoint_id_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/lat_lon.rs create mode 100644 crates/store/re_sdk_types/src/components/lat_lon_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/length.rs create mode 100644 crates/store/re_sdk_types/src/components/length_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/line_strip2d.rs create mode 100644 crates/store/re_sdk_types/src/components/line_strip2d_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/line_strip3d.rs create mode 100644 crates/store/re_sdk_types/src/components/line_strip3d_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/linear_speed.rs create mode 100644 crates/store/re_sdk_types/src/components/magnification_filter.rs create mode 100644 crates/store/re_sdk_types/src/components/magnification_filter_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/marker_shape.rs create mode 100644 crates/store/re_sdk_types/src/components/marker_shape_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/marker_size.rs create mode 100644 crates/store/re_sdk_types/src/components/marker_size_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/media_type.rs create mode 100644 crates/store/re_sdk_types/src/components/media_type_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/mesh_face_rendering.rs create mode 100644 crates/store/re_sdk_types/src/components/mod.rs create mode 100644 crates/store/re_sdk_types/src/components/name.rs create mode 100644 crates/store/re_sdk_types/src/components/name_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/opacity.rs create mode 100644 crates/store/re_sdk_types/src/components/opacity_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/pinhole_projection.rs create mode 100644 crates/store/re_sdk_types/src/components/pinhole_projection_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/plane3d.rs create mode 100644 crates/store/re_sdk_types/src/components/plane3d_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/point_shading.rs create mode 100644 crates/store/re_sdk_types/src/components/position2d.rs create mode 100644 crates/store/re_sdk_types/src/components/position2d_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/position3d.rs create mode 100644 crates/store/re_sdk_types/src/components/position3d_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/radius.rs create mode 100644 crates/store/re_sdk_types/src/components/radius_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/range1d.rs create mode 100644 crates/store/re_sdk_types/src/components/range1d_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/resolution.rs create mode 100644 crates/store/re_sdk_types/src/components/resolution_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/rotation_axis_angle.rs create mode 100644 crates/store/re_sdk_types/src/components/rotation_axis_angle_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/rotation_quat.rs create mode 100644 crates/store/re_sdk_types/src/components/rotation_quat_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/scalar.rs create mode 100644 crates/store/re_sdk_types/src/components/scalar_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/scale3d.rs create mode 100644 crates/store/re_sdk_types/src/components/scale3d_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/schema_id.rs create mode 100644 crates/store/re_sdk_types/src/components/show_labels.rs create mode 100644 crates/store/re_sdk_types/src/components/show_labels_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/stroke_width.rs create mode 100644 crates/store/re_sdk_types/src/components/stroke_width_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/tensor_data.rs create mode 100644 crates/store/re_sdk_types/src/components/tensor_dimension_index_selection.rs create mode 100644 crates/store/re_sdk_types/src/components/tensor_dimension_index_selection_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/tensor_height_dimension.rs create mode 100644 crates/store/re_sdk_types/src/components/tensor_width_dimension.rs create mode 100644 crates/store/re_sdk_types/src/components/texcoord2d.rs create mode 100644 crates/store/re_sdk_types/src/components/texcoord2d_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/text.rs create mode 100644 crates/store/re_sdk_types/src/components/text_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/text_log_level.rs create mode 100644 crates/store/re_sdk_types/src/components/text_log_level_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/timestamp.rs create mode 100644 crates/store/re_sdk_types/src/components/timestamp_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/transform_frame_id.rs create mode 100644 crates/store/re_sdk_types/src/components/transform_frame_id_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/transform_mat3x3.rs create mode 100644 crates/store/re_sdk_types/src/components/transform_mat3x3_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/transform_relation.rs create mode 100644 crates/store/re_sdk_types/src/components/translation3d.rs create mode 100644 crates/store/re_sdk_types/src/components/translation3d_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/triangle_indices.rs create mode 100644 crates/store/re_sdk_types/src/components/triangle_indices_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/value_range.rs create mode 100644 crates/store/re_sdk_types/src/components/value_range_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/vector2d.rs create mode 100644 crates/store/re_sdk_types/src/components/vector2d_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/vector3d.rs create mode 100644 crates/store/re_sdk_types/src/components/vector3d_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/video_codec.rs create mode 100644 crates/store/re_sdk_types/src/components/video_codec_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/video_sample.rs create mode 100644 crates/store/re_sdk_types/src/components/video_timestamp.rs create mode 100644 crates/store/re_sdk_types/src/components/video_timestamp_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/view_coordinates.rs create mode 100644 crates/store/re_sdk_types/src/components/view_coordinates_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/visible.rs create mode 100644 crates/store/re_sdk_types/src/components/visible_ext.rs create mode 100644 crates/store/re_sdk_types/src/components/voxel_index.rs create mode 100644 crates/store/re_sdk_types/src/components/voxel_size.rs create mode 100644 crates/store/re_sdk_types/src/components/voxel_value.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/.gitattributes create mode 100644 crates/store/re_sdk_types/src/datatypes/angle.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/angle_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/annotation_info.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/annotation_info_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/blob.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/blob_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/channel_count_pair.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/channel_datatype.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/channel_datatype_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/class_description.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/class_description_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/class_description_map_elem.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/class_description_map_elem_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/class_id.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/class_id_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/color_model.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/color_model_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/dvec2d.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/dvec2d_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/image_format.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/image_format_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/ivec3d.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/ivec3d_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/keypoint_id.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/keypoint_id_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/keypoint_pair.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/keypoint_pair_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/mat3x3.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/mat3x3_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/mat4x4.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/mat4x4_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/mod.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/pixel_format.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/pixel_format_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/plane3d.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/plane3d_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/quaternion.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/quaternion_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/range1d.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/range1d_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/range2d.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/range2d_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/rgba32.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/rgba32_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/rotation_axis_angle.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/rotation_axis_angle_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/tensor_buffer.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/tensor_buffer_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/tensor_data.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/tensor_data_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/tensor_dimension_index_selection.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/tensor_dimension_selection.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/tensor_dimension_selection_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/utf8pair.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/utf8pair_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/uuid.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/uuid_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/uvec2d.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/uvec2d_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/uvec3d.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/uvec3d_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/uvec4d.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/uvec4d_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/vec2d.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/vec2d_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/vec3d.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/vec3d_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/vec4d.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/vec4d_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/video_timestamp.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/video_timestamp_ext.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/view_coordinates.rs create mode 100644 crates/store/re_sdk_types/src/datatypes/view_coordinates_ext.rs create mode 100644 crates/store/re_sdk_types/src/image.rs create mode 100644 crates/store/re_sdk_types/src/lib.rs create mode 100644 crates/store/re_sdk_types/src/reflection/.gitattributes create mode 100644 crates/store/re_sdk_types/src/reflection/mod.rs create mode 100644 crates/store/re_sdk_types/src/rotation3d.rs create mode 100644 crates/store/re_sdk_types/src/tensor_data.rs create mode 100644 crates/store/re_sdk_types/src/testing/archetypes/.gitattributes create mode 100644 crates/store/re_sdk_types/src/testing/archetypes/affix_fuzzer1.rs create mode 100644 crates/store/re_sdk_types/src/testing/archetypes/affix_fuzzer2.rs create mode 100644 crates/store/re_sdk_types/src/testing/archetypes/affix_fuzzer3.rs create mode 100644 crates/store/re_sdk_types/src/testing/archetypes/affix_fuzzer4.rs create mode 100644 crates/store/re_sdk_types/src/testing/archetypes/mod.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/.gitattributes create mode 100644 crates/store/re_sdk_types/src/testing/components/affix_fuzzer1.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/affix_fuzzer10.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/affix_fuzzer11.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/affix_fuzzer12.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/affix_fuzzer13.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/affix_fuzzer14.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/affix_fuzzer15.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/affix_fuzzer16.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/affix_fuzzer17.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/affix_fuzzer18.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/affix_fuzzer19.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/affix_fuzzer2.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/affix_fuzzer20.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/affix_fuzzer21.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/affix_fuzzer22.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/affix_fuzzer23.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/affix_fuzzer3.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/affix_fuzzer4.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/affix_fuzzer5.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/affix_fuzzer6.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/affix_fuzzer7.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/affix_fuzzer8.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/affix_fuzzer9.rs create mode 100644 crates/store/re_sdk_types/src/testing/components/mod.rs create mode 100644 crates/store/re_sdk_types/src/testing/datatypes/.gitattributes create mode 100644 crates/store/re_sdk_types/src/testing/datatypes/affix_fuzzer1.rs create mode 100644 crates/store/re_sdk_types/src/testing/datatypes/affix_fuzzer2.rs create mode 100644 crates/store/re_sdk_types/src/testing/datatypes/affix_fuzzer20.rs create mode 100644 crates/store/re_sdk_types/src/testing/datatypes/affix_fuzzer21.rs create mode 100644 crates/store/re_sdk_types/src/testing/datatypes/affix_fuzzer22.rs create mode 100644 crates/store/re_sdk_types/src/testing/datatypes/affix_fuzzer3.rs create mode 100644 crates/store/re_sdk_types/src/testing/datatypes/affix_fuzzer3_ext.rs create mode 100644 crates/store/re_sdk_types/src/testing/datatypes/affix_fuzzer4.rs create mode 100644 crates/store/re_sdk_types/src/testing/datatypes/affix_fuzzer4_ext.rs create mode 100644 crates/store/re_sdk_types/src/testing/datatypes/affix_fuzzer5.rs create mode 100644 crates/store/re_sdk_types/src/testing/datatypes/enum_test.rs create mode 100644 crates/store/re_sdk_types/src/testing/datatypes/flattened_scalar.rs create mode 100644 crates/store/re_sdk_types/src/testing/datatypes/mod.rs create mode 100644 crates/store/re_sdk_types/src/testing/datatypes/multi_enum.rs create mode 100644 crates/store/re_sdk_types/src/testing/datatypes/primitive_component.rs create mode 100644 crates/store/re_sdk_types/src/testing/datatypes/string_component.rs create mode 100644 crates/store/re_sdk_types/src/testing/datatypes/valued_enum.rs create mode 100644 crates/store/re_sdk_types/src/testing/mod.rs create mode 100644 crates/store/re_sdk_types/src/transform_frame_id_hash.rs create mode 100644 crates/store/re_sdk_types/src/view_coordinates.rs create mode 100644 crates/store/re_sdk_types/src/visualizer.rs create mode 100644 crates/store/re_sdk_types/tests/types/annotation_context.rs create mode 100644 crates/store/re_sdk_types/tests/types/arrows3d.rs create mode 100644 crates/store/re_sdk_types/tests/types/asset3d.rs create mode 100644 crates/store/re_sdk_types/tests/types/box2d.rs create mode 100644 crates/store/re_sdk_types/tests/types/box3d.rs create mode 100644 crates/store/re_sdk_types/tests/types/clear.rs create mode 100644 crates/store/re_sdk_types/tests/types/depth_image.rs create mode 100644 crates/store/re_sdk_types/tests/types/dynamic_archetype.rs create mode 100644 crates/store/re_sdk_types/tests/types/fuzzy.rs create mode 100644 crates/store/re_sdk_types/tests/types/image.rs create mode 100644 crates/store/re_sdk_types/tests/types/line_strips2d.rs create mode 100644 crates/store/re_sdk_types/tests/types/line_strips3d.rs create mode 100644 crates/store/re_sdk_types/tests/types/main.rs create mode 100644 crates/store/re_sdk_types/tests/types/mesh3d.rs create mode 100644 crates/store/re_sdk_types/tests/types/mint_conversions.rs create mode 100644 crates/store/re_sdk_types/tests/types/points2d.rs create mode 100644 crates/store/re_sdk_types/tests/types/points3d.rs create mode 100644 crates/store/re_sdk_types/tests/types/segmentation_image.rs create mode 100644 crates/store/re_sdk_types/tests/types/tensor.rs create mode 100644 crates/store/re_sdk_types/tests/types/text_document.rs create mode 100644 crates/store/re_sdk_types/tests/types/transform3d.rs create mode 100644 crates/store/re_sdk_types/tests/types/validity.rs create mode 100644 crates/store/re_sdk_types/tests/types/view_coordinates.rs create mode 100644 crates/store/re_sdk_types/tests/types/voxel_grid_map.rs create mode 100644 crates/store/re_server/Cargo.toml create mode 100644 crates/store/re_server/README.md create mode 100644 crates/store/re_server/build.rs create mode 100644 crates/store/re_server/src/entrypoint.rs create mode 100644 crates/store/re_server/src/layers/bandwidth.rs create mode 100644 crates/store/re_server/src/layers/error.rs create mode 100644 crates/store/re_server/src/layers/latency.rs create mode 100644 crates/store/re_server/src/layers/mod.rs create mode 100644 crates/store/re_server/src/lib.rs create mode 100644 crates/store/re_server/src/named_path.rs create mode 100644 crates/store/re_server/src/opfs.rs create mode 100644 crates/store/re_server/src/rerun_cloud/mod.rs create mode 100644 crates/store/re_server/src/rerun_cloud/register_with_dataset.rs create mode 100644 crates/store/re_server/src/server.rs create mode 100644 crates/store/re_server/src/store/chunk_key.rs create mode 100644 crates/store/re_server/src/store/dataset.rs create mode 100644 crates/store/re_server/src/store/error.rs create mode 100644 crates/store/re_server/src/store/in_memory_store.rs create mode 100644 crates/store/re_server/src/store/layer_info.rs create mode 100644 crates/store/re_server/src/store/mod.rs create mode 100644 crates/store/re_server/src/store/resolved_store.rs create mode 100644 crates/store/re_server/src/store/segment.rs create mode 100644 crates/store/re_server/src/store/source.rs create mode 100644 crates/store/re_server/src/store/store_pool.rs create mode 100644 crates/store/re_server/src/store/table.rs create mode 100644 crates/store/re_server/src/store/task_registry.rs create mode 100644 crates/store/re_server/src/store/tracked.rs create mode 100644 crates/store/re_server/tests/memory_url.rs create mode 100644 crates/store/re_server/tests/opfs.rs create mode 100644 crates/store/re_server/tests/redap_tests.rs create mode 100644 crates/store/re_sorbet/Cargo.toml create mode 100644 crates/store/re_sorbet/README.md create mode 100644 crates/store/re_sorbet/src/chunk_batch.rs create mode 100644 crates/store/re_sorbet/src/chunk_columns.rs create mode 100644 crates/store/re_sorbet/src/chunk_schema.rs create mode 100644 crates/store/re_sorbet/src/column_descriptor.rs create mode 100644 crates/store/re_sorbet/src/column_descriptor_ref.rs create mode 100644 crates/store/re_sorbet/src/column_kind.rs create mode 100644 crates/store/re_sorbet/src/component_column_descriptor.rs create mode 100644 crates/store/re_sorbet/src/dataframe_to_chunks.rs create mode 100644 crates/store/re_sorbet/src/error.rs create mode 100644 crates/store/re_sorbet/src/index_column_descriptor.rs create mode 100644 crates/store/re_sorbet/src/ipc.rs create mode 100644 crates/store/re_sorbet/src/lib.rs create mode 100644 crates/store/re_sorbet/src/metadata.rs create mode 100644 crates/store/re_sorbet/src/migrations/make_list_arrays.rs create mode 100644 crates/store/re_sorbet/src/migrations/mod.rs create mode 100644 crates/store/re_sorbet/src/migrations/v0_0_1__to__v0_0_2.rs create mode 100644 crates/store/re_sorbet/src/migrations/v0_0_2__to__v0_1_0.rs create mode 100644 crates/store/re_sorbet/src/migrations/v0_1_0__to__v0_1_1.rs create mode 100644 crates/store/re_sorbet/src/migrations/v0_1_1__to__v0_1_2.rs create mode 100644 crates/store/re_sorbet/src/migrations/v0_1_2__to__v0_1_3.rs create mode 100644 crates/store/re_sorbet/src/row_id_column_descriptor.rs create mode 100644 crates/store/re_sorbet/src/schema_builder.rs create mode 100644 crates/store/re_sorbet/src/selectors.rs create mode 100644 crates/store/re_sorbet/src/sorbet_batch.rs create mode 100644 crates/store/re_sorbet/src/sorbet_columns.rs create mode 100644 crates/store/re_sorbet/src/sorbet_schema.rs create mode 100644 crates/store/re_sorbet/src/timestamp_metadata.rs create mode 100644 crates/store/re_tf/Cargo.toml create mode 100644 crates/store/re_tf/README.md create mode 100644 crates/store/re_tf/benches/transform_resolution_cache_bench.rs create mode 100644 crates/store/re_tf/src/convert.rs create mode 100644 crates/store/re_tf/src/frame_id_registry.rs create mode 100644 crates/store/re_tf/src/lib.rs create mode 100644 crates/store/re_tf/src/snapshots/re_tf__transform_forest__tests__simple_entity_hierarchy__transform_from_to__root.snap create mode 100644 crates/store/re_tf/src/snapshots/re_tf__transform_forest__tests__simple_entity_hierarchy__transform_from_to__top.snap create mode 100644 crates/store/re_tf/src/snapshots/re_tf__transform_forest__tests__simple_entity_hierarchy__transform_from_to__top_nonexistent.snap create mode 100644 crates/store/re_tf/src/snapshots/re_tf__transform_forest__tests__simple_entity_hierarchy__transform_from_to__top_pinhole.snap create mode 100644 crates/store/re_tf/src/snapshots/re_tf__transform_forest__tests__simple_entity_hierarchy__transform_from_to__top_pinhole_child2d.snap create mode 100644 crates/store/re_tf/src/snapshots/re_tf__transform_forest__tests__simple_entity_hierarchy__transform_from_to__top_pure_leaf_pinhole.snap create mode 100644 crates/store/re_tf/src/snapshots/re_tf__transform_forest__tests__simple_frame_hierarchy__all_on_single_entity.snap create mode 100644 crates/store/re_tf/src/snapshots/re_tf__transform_forest__tests__simple_frame_hierarchy__multiple_entities.snap create mode 100644 crates/store/re_tf/src/transform_aspect.rs create mode 100644 crates/store/re_tf/src/transform_forest.rs create mode 100644 crates/store/re_tf/src/transform_queries.rs create mode 100644 crates/store/re_tf/src/transform_resolution_cache/cache.rs create mode 100644 crates/store/re_tf/src/transform_resolution_cache/cached_transform_value.rs create mode 100644 crates/store/re_tf/src/transform_resolution_cache/cached_transforms_for_timeline.rs create mode 100644 crates/store/re_tf/src/transform_resolution_cache/mod.rs create mode 100644 crates/store/re_tf/src/transform_resolution_cache/parent_from_child_transform.rs create mode 100644 crates/store/re_tf/src/transform_resolution_cache/pose_transform_for_entity.rs create mode 100644 crates/store/re_tf/src/transform_resolution_cache/resolved_pinhole_projection.rs create mode 100644 crates/store/re_tf/src/transform_resolution_cache/tests.rs create mode 100644 crates/store/re_tf/src/transform_resolution_cache/transform_cache_snapshot.rs create mode 100644 crates/store/re_tf/src/transform_resolution_cache/transforms_for_child_frame_events.rs create mode 100644 crates/store/re_tf/src/transform_resolution_cache/tree_transforms_for_child_frame.rs create mode 100644 crates/store/re_types/Cargo.toml create mode 100644 crates/store/re_types/src/lib.rs create mode 100644 crates/store/re_types_core/.gitattributes create mode 100644 crates/store/re_types_core/Cargo.toml create mode 100644 crates/store/re_types_core/README.md create mode 100644 crates/store/re_types_core/benches/bench_tuid.rs create mode 100644 crates/store/re_types_core/src/archetype.rs create mode 100644 crates/store/re_types_core/src/archetypes/.gitattributes create mode 100644 crates/store/re_types_core/src/archetypes/clear.rs create mode 100644 crates/store/re_types_core/src/archetypes/clear_ext.rs create mode 100644 crates/store/re_types_core/src/archetypes/mod.rs create mode 100644 crates/store/re_types_core/src/arrow_helpers.rs create mode 100644 crates/store/re_types_core/src/arrow_string.rs create mode 100644 crates/store/re_types_core/src/arrow_zip_validity.rs create mode 100644 crates/store/re_types_core/src/as_components.rs create mode 100644 crates/store/re_types_core/src/chunk_id.rs create mode 100644 crates/store/re_types_core/src/component_batch.rs create mode 100644 crates/store/re_types_core/src/component_descriptor.rs create mode 100644 crates/store/re_types_core/src/components/.gitattributes create mode 100644 crates/store/re_types_core/src/components/clear_is_recursive.rs create mode 100644 crates/store/re_types_core/src/components/clear_is_recursive_ext.rs create mode 100644 crates/store/re_types_core/src/components/mod.rs create mode 100644 crates/store/re_types_core/src/datatypes/.gitattributes create mode 100644 crates/store/re_types_core/src/datatypes/absolute_time_range.rs create mode 100644 crates/store/re_types_core/src/datatypes/bool.rs create mode 100644 crates/store/re_types_core/src/datatypes/bool_ext.rs create mode 100644 crates/store/re_types_core/src/datatypes/entity_path.rs create mode 100644 crates/store/re_types_core/src/datatypes/entity_path_ext.rs create mode 100644 crates/store/re_types_core/src/datatypes/float32.rs create mode 100644 crates/store/re_types_core/src/datatypes/float32_ext.rs create mode 100644 crates/store/re_types_core/src/datatypes/float64.rs create mode 100644 crates/store/re_types_core/src/datatypes/float64_ext.rs create mode 100644 crates/store/re_types_core/src/datatypes/mod.rs create mode 100644 crates/store/re_types_core/src/datatypes/time_int.rs create mode 100644 crates/store/re_types_core/src/datatypes/time_int_ext.rs create mode 100644 crates/store/re_types_core/src/datatypes/time_range.rs create mode 100644 crates/store/re_types_core/src/datatypes/time_range_boundary.rs create mode 100644 crates/store/re_types_core/src/datatypes/time_range_boundary_ext.rs create mode 100644 crates/store/re_types_core/src/datatypes/time_range_ext.rs create mode 100644 crates/store/re_types_core/src/datatypes/uint16.rs create mode 100644 crates/store/re_types_core/src/datatypes/uint32.rs create mode 100644 crates/store/re_types_core/src/datatypes/uint32_ext.rs create mode 100644 crates/store/re_types_core/src/datatypes/uint64.rs create mode 100644 crates/store/re_types_core/src/datatypes/uint64_ext.rs create mode 100644 crates/store/re_types_core/src/datatypes/utf8.rs create mode 100644 crates/store/re_types_core/src/datatypes/utf8_ext.rs create mode 100644 crates/store/re_types_core/src/datatypes/visible_time_range.rs create mode 100644 crates/store/re_types_core/src/datatypes/visible_time_range_ext.rs create mode 100644 crates/store/re_types_core/src/dynamic_archetype.rs create mode 100644 crates/store/re_types_core/src/layer_name.rs create mode 100644 crates/store/re_types_core/src/lib.rs create mode 100644 crates/store/re_types_core/src/loggable.rs create mode 100644 crates/store/re_types_core/src/macros.rs create mode 100644 crates/store/re_types_core/src/reflection.rs create mode 100644 crates/store/re_types_core/src/result.rs create mode 100644 crates/store/re_types_core/src/row_id.rs create mode 100644 crates/store/re_types_core/src/segment_id.rs create mode 100644 crates/store/re_types_core/src/timeline_name.rs create mode 100644 crates/store/re_types_core/src/tuid.rs create mode 100644 crates/store/re_types_core/src/view.rs create mode 100644 crates/store/re_types_core/src/wrapper_component.rs create mode 100644 crates/store/re_uri/Cargo.toml create mode 100644 crates/store/re_uri/README.md create mode 100644 crates/store/re_uri/src/dataset_hierarchy.rs create mode 100644 crates/store/re_uri/src/endpoints/catalog.rs create mode 100644 crates/store/re_uri/src/endpoints/dataset.rs create mode 100644 crates/store/re_uri/src/endpoints/entry.rs create mode 100644 crates/store/re_uri/src/endpoints/folder.rs create mode 100644 crates/store/re_uri/src/endpoints/mod.rs create mode 100644 crates/store/re_uri/src/endpoints/proxy.rs create mode 100644 crates/store/re_uri/src/error.rs create mode 100644 crates/store/re_uri/src/fragment.rs create mode 100644 crates/store/re_uri/src/lib.rs create mode 100644 crates/store/re_uri/src/origin.rs create mode 100644 crates/store/re_uri/src/redap_uri.rs create mode 100644 crates/store/re_uri/src/scheme.rs create mode 100644 crates/store/re_uri/src/time_selection.rs create mode 100644 crates/top/README.md create mode 100644 crates/top/re_sdk/Cargo.toml create mode 100644 crates/top/re_sdk/README.md create mode 100644 crates/top/re_sdk/build.rs create mode 100644 crates/top/re_sdk/src/binary_stream_sink.rs create mode 100644 crates/top/re_sdk/src/blueprint/api.rs create mode 100644 crates/top/re_sdk/src/blueprint/container.rs create mode 100644 crates/top/re_sdk/src/blueprint/mod.rs create mode 100644 crates/top/re_sdk/src/blueprint/panel.rs create mode 100644 crates/top/re_sdk/src/blueprint/view.rs create mode 100644 crates/top/re_sdk/src/global.rs create mode 100644 crates/top/re_sdk/src/grpc_server.rs create mode 100644 crates/top/re_sdk/src/lenses/mod.rs create mode 100644 crates/top/re_sdk/src/lenses/sink.rs create mode 100644 crates/top/re_sdk/src/lib.rs create mode 100644 crates/top/re_sdk/src/log_sink.rs create mode 100644 crates/top/re_sdk/src/recording_stream.rs create mode 100644 crates/top/re_sdk/src/snapshots/re_sdk__recording_stream__tests__always_flush-2.snap create mode 100644 crates/top/re_sdk/src/snapshots/re_sdk__recording_stream__tests__always_flush-3.snap create mode 100644 crates/top/re_sdk/src/snapshots/re_sdk__recording_stream__tests__always_flush-4.snap create mode 100644 crates/top/re_sdk/src/snapshots/re_sdk__recording_stream__tests__always_flush.snap create mode 100644 crates/top/re_sdk/src/snapshots/re_sdk__recording_stream__tests__flush_hierarchy-2.snap create mode 100644 crates/top/re_sdk/src/snapshots/re_sdk__recording_stream__tests__flush_hierarchy.snap create mode 100644 crates/top/re_sdk/src/snapshots/re_sdk__recording_stream__tests__never_flush-2.snap create mode 100644 crates/top/re_sdk/src/snapshots/re_sdk__recording_stream__tests__never_flush.snap create mode 100644 crates/top/re_sdk/src/spawn.rs create mode 100644 crates/top/re_sdk/src/web_viewer.rs create mode 100644 crates/top/re_sdk/tests/flush.rs create mode 100644 crates/top/re_sdk/tests/lenses.rs create mode 100644 crates/top/re_sdk/tests/lenses/operations.rs create mode 100644 crates/top/re_sdk/tests/lenses/output_mode.rs create mode 100644 crates/top/re_sdk/tests/lenses/snapshots/lenses__lenses__operations__destructure_cast.snap create mode 100644 crates/top/re_sdk/tests/lenses/snapshots/lenses__lenses__operations__destructure_only.snap create mode 100644 crates/top/re_sdk/tests/lenses/snapshots/lenses__lenses__operations__scatter_columns.snap create mode 100644 crates/top/re_sdk/tests/lenses/snapshots/lenses__lenses__operations__scatter_columns_static.snap create mode 100644 crates/top/rerun-cli/Cargo.toml create mode 100644 crates/top/rerun-cli/README.md create mode 100644 crates/top/rerun-cli/build.rs create mode 100644 crates/top/rerun-cli/src/bin/rerun.rs create mode 100644 crates/top/rerun/Cargo.toml create mode 100644 crates/top/rerun/README.md create mode 100644 crates/top/rerun/build.rs create mode 100644 crates/top/rerun/src/clap.rs create mode 100644 crates/top/rerun/src/commands/analytics/mod.rs create mode 100644 crates/top/rerun/src/commands/auth.rs create mode 100644 crates/top/rerun/src/commands/download.rs create mode 100644 crates/top/rerun/src/commands/entrypoint.rs create mode 100644 crates/top/rerun/src/commands/mcap/info.rs create mode 100644 crates/top/rerun/src/commands/mcap/mod.rs create mode 100644 crates/top/rerun/src/commands/mod.rs create mode 100644 crates/top/rerun/src/commands/rrd/compare.rs create mode 100644 crates/top/rerun/src/commands/rrd/filter.rs create mode 100644 crates/top/rerun/src/commands/rrd/merge_optimize.rs create mode 100644 crates/top/rerun/src/commands/rrd/migrate.rs create mode 100644 crates/top/rerun/src/commands/rrd/mod.rs create mode 100644 crates/top/rerun/src/commands/rrd/print.rs create mode 100644 crates/top/rerun/src/commands/rrd/route.rs create mode 100644 crates/top/rerun/src/commands/rrd/split.rs create mode 100644 crates/top/rerun/src/commands/rrd/stats.rs create mode 100644 crates/top/rerun/src/commands/rrd/verify.rs create mode 100644 crates/top/rerun/src/commands/stdio.rs create mode 100644 crates/top/rerun/src/demo_util.rs create mode 100644 crates/top/rerun/src/lib.rs create mode 100644 crates/top/rerun/src/log_integration.rs create mode 100644 crates/top/rerun/src/native_viewer.rs create mode 100644 crates/top/rerun/src/sdk.rs create mode 100644 crates/top/rerun/tests/rerun_tests.rs create mode 100644 crates/top/rerun_c/CMakeLists.txt create mode 100644 crates/top/rerun_c/Cargo.toml create mode 100644 crates/top/rerun_c/README.md create mode 100644 crates/top/rerun_c/build.rs create mode 100644 crates/top/rerun_c/src/arrow_utils.rs create mode 100644 crates/top/rerun_c/src/component_type_registry.rs create mode 100644 crates/top/rerun_c/src/error.rs create mode 100644 crates/top/rerun_c/src/lib.rs create mode 100644 crates/top/rerun_c/src/ptr.rs create mode 100644 crates/top/rerun_c/src/recording_streams.rs create mode 100644 crates/top/rerun_c/src/video.rs create mode 100644 crates/utils/README.md create mode 100644 crates/utils/re_analytics/Cargo.toml create mode 100644 crates/utils/re_analytics/README.md create mode 100644 crates/utils/re_analytics/examples/end_to_end.rs create mode 100644 crates/utils/re_analytics/src/cli.rs create mode 100644 crates/utils/re_analytics/src/event.rs create mode 100644 crates/utils/re_analytics/src/lib.rs create mode 100644 crates/utils/re_analytics/src/native/config.rs create mode 100644 crates/utils/re_analytics/src/native/mod.rs create mode 100644 crates/utils/re_analytics/src/native/pipeline.rs create mode 100644 crates/utils/re_analytics/src/native/sink.rs create mode 100644 crates/utils/re_analytics/src/posthog.rs create mode 100644 crates/utils/re_analytics/src/web/config.rs create mode 100644 crates/utils/re_analytics/src/web/mod.rs create mode 100644 crates/utils/re_analytics/src/web/pipeline.rs create mode 100644 crates/utils/re_arrow_util/Cargo.toml create mode 100644 crates/utils/re_arrow_util/README.md create mode 100644 crates/utils/re_arrow_util/src/arrays.rs create mode 100644 crates/utils/re_arrow_util/src/batches.rs create mode 100644 crates/utils/re_arrow_util/src/compare.rs create mode 100644 crates/utils/re_arrow_util/src/format.rs create mode 100644 crates/utils/re_arrow_util/src/lib.rs create mode 100644 crates/utils/re_arrow_util/src/snapshots/re_arrow_util__arrays__tests__deep_slice_comparisons.snap create mode 100644 crates/utils/re_arrow_util/src/string_view.rs create mode 100644 crates/utils/re_arrow_util/src/test_extensions.rs create mode 100644 crates/utils/re_auth/Cargo.toml create mode 100644 crates/utils/re_auth/README.md create mode 100644 crates/utils/re_auth/src/callback_server.rs create mode 100644 crates/utils/re_auth/src/claims.rs create mode 100644 crates/utils/re_auth/src/cli.rs create mode 100644 crates/utils/re_auth/src/credentials.rs create mode 100644 crates/utils/re_auth/src/crypto_provider.rs create mode 100644 crates/utils/re_auth/src/error.rs create mode 100644 crates/utils/re_auth/src/lib.rs create mode 100644 crates/utils/re_auth/src/oauth.rs create mode 100644 crates/utils/re_auth/src/oauth/api.rs create mode 100644 crates/utils/re_auth/src/oauth/login_flow.rs create mode 100644 crates/utils/re_auth/src/oauth/storage.rs create mode 100644 crates/utils/re_auth/src/provider.rs create mode 100644 crates/utils/re_auth/src/service/client.rs create mode 100644 crates/utils/re_auth/src/service/mod.rs create mode 100644 crates/utils/re_auth/src/service/server.rs create mode 100644 crates/utils/re_auth/src/status_page.html create mode 100644 crates/utils/re_auth/src/token.rs create mode 100644 crates/utils/re_auth/src/wasm_compat.rs create mode 100644 crates/utils/re_auth/tests/tokens.rs create mode 100644 crates/utils/re_backoff/Cargo.toml create mode 100644 crates/utils/re_backoff/README.md create mode 100644 crates/utils/re_backoff/src/lib.rs create mode 100644 crates/utils/re_byte_size/Cargo.toml create mode 100644 crates/utils/re_byte_size/README.md create mode 100644 crates/utils/re_byte_size/src/arrow_sizes.rs create mode 100644 crates/utils/re_byte_size/src/bookkeeping_btreemap.rs create mode 100644 crates/utils/re_byte_size/src/egui_sizes.rs create mode 100644 crates/utils/re_byte_size/src/lib.rs create mode 100644 crates/utils/re_byte_size/src/mem_usage_tree.rs create mode 100644 crates/utils/re_byte_size/src/parking_lot_sizes.rs create mode 100644 crates/utils/re_byte_size/src/primitive_sizes.rs create mode 100644 crates/utils/re_byte_size/src/smallvec_sizes.rs create mode 100644 crates/utils/re_byte_size/src/std_sizes.rs create mode 100644 crates/utils/re_byte_size/src/testing.rs create mode 100644 crates/utils/re_byte_size/src/tuple_sizes.rs create mode 100644 crates/utils/re_byte_size/tests/derive.rs create mode 100644 crates/utils/re_byte_size/tests/snapshots/test_byte_sizes__sizes.snap create mode 100644 crates/utils/re_byte_size/tests/test_byte_sizes.rs create mode 100644 crates/utils/re_byte_size_derive/Cargo.toml create mode 100644 crates/utils/re_byte_size_derive/README.md create mode 100644 crates/utils/re_byte_size_derive/src/lib.rs create mode 100644 crates/utils/re_capabilities/Cargo.toml create mode 100644 crates/utils/re_capabilities/README.md create mode 100644 crates/utils/re_capabilities/src/lib.rs create mode 100644 crates/utils/re_capabilities/src/main_thread_token.rs create mode 100644 crates/utils/re_case/Cargo.toml create mode 100644 crates/utils/re_case/README.md create mode 100644 crates/utils/re_case/src/lib.rs create mode 100644 crates/utils/re_crash_handler/Cargo.toml create mode 100644 crates/utils/re_crash_handler/README.md create mode 100644 crates/utils/re_crash_handler/src/lib.rs create mode 100644 crates/utils/re_crash_handler/src/sigint.rs create mode 100644 crates/utils/re_error/Cargo.toml create mode 100644 crates/utils/re_error/README.md create mode 100644 crates/utils/re_error/src/lib.rs create mode 100644 crates/utils/re_format/Cargo.toml create mode 100644 crates/utils/re_format/README.md create mode 100644 crates/utils/re_format/src/duration.rs create mode 100644 crates/utils/re_format/src/lib.rs create mode 100644 crates/utils/re_format/src/plural.rs create mode 100644 crates/utils/re_format/src/time.rs create mode 100644 crates/utils/re_grpc_headers/Cargo.toml create mode 100644 crates/utils/re_grpc_headers/README.md create mode 100644 crates/utils/re_grpc_headers/src/lib.rs create mode 100644 crates/utils/re_log/Cargo.toml create mode 100644 crates/utils/re_log/README.md create mode 100644 crates/utils/re_log/src/channel_logger.rs create mode 100644 crates/utils/re_log/src/debug_assert.rs create mode 100644 crates/utils/re_log/src/event_visitor.rs create mode 100644 crates/utils/re_log/src/lib.rs create mode 100644 crates/utils/re_log/src/result_extensions.rs create mode 100644 crates/utils/re_log/src/setup.rs create mode 100644 crates/utils/re_memory/Cargo.toml create mode 100644 crates/utils/re_memory/README.md create mode 100644 crates/utils/re_memory/src/accounting_allocator.rs create mode 100644 crates/utils/re_memory/src/allocation_tracker.rs create mode 100644 crates/utils/re_memory/src/backtrace_native.rs create mode 100644 crates/utils/re_memory/src/backtrace_web.rs create mode 100644 crates/utils/re_memory/src/lib.rs create mode 100644 crates/utils/re_memory/src/memory_limit.rs create mode 100644 crates/utils/re_memory/src/memory_use.rs create mode 100644 crates/utils/re_memory/src/peak_memory_stats.rs create mode 100644 crates/utils/re_memory/src/ram_warner.rs create mode 100644 crates/utils/re_memory/src/util.rs create mode 100644 crates/utils/re_mutex/Cargo.toml create mode 100644 crates/utils/re_mutex/README.md create mode 100644 crates/utils/re_mutex/src/lib.rs create mode 100644 crates/utils/re_perf_telemetry/Cargo.toml create mode 100644 crates/utils/re_perf_telemetry/README.md create mode 100644 crates/utils/re_perf_telemetry/src/args.rs create mode 100644 crates/utils/re_perf_telemetry/src/grpc.rs create mode 100644 crates/utils/re_perf_telemetry/src/lib.rs create mode 100644 crates/utils/re_perf_telemetry/src/memory_telemetry.rs create mode 100644 crates/utils/re_perf_telemetry/src/metrics_server.rs create mode 100644 crates/utils/re_perf_telemetry/src/prometheus.rs create mode 100644 crates/utils/re_perf_telemetry/src/shared_reader.rs create mode 100644 crates/utils/re_perf_telemetry/src/telemetry.rs create mode 100644 crates/utils/re_perf_telemetry/src/trace_id_format.rs create mode 100644 crates/utils/re_perf_telemetry/src/tracestate.rs create mode 100644 crates/utils/re_perf_telemetry/src/tracing_session.rs create mode 100644 crates/utils/re_perf_telemetry/src/utils.rs create mode 100644 crates/utils/re_quota_channel/Cargo.toml create mode 100644 crates/utils/re_quota_channel/README.md create mode 100644 crates/utils/re_quota_channel/src/async_broadcast_channel.rs create mode 100644 crates/utils/re_quota_channel/src/async_mpsc_channel.rs create mode 100644 crates/utils/re_quota_channel/src/lib.rs create mode 100644 crates/utils/re_quota_channel/src/sync/mod.rs create mode 100644 crates/utils/re_quota_channel/src/sync/select.rs create mode 100644 crates/utils/re_quota_channel/src/try_send_error.rs create mode 100644 crates/utils/re_ros_msg/Cargo.toml create mode 100644 crates/utils/re_ros_msg/src/deserialize/mod.rs create mode 100644 crates/utils/re_ros_msg/src/deserialize/primitive_array.rs create mode 100644 crates/utils/re_ros_msg/src/lib.rs create mode 100644 crates/utils/re_ros_msg/src/message_spec.rs create mode 100644 crates/utils/re_rvl/Cargo.toml create mode 100644 crates/utils/re_rvl/README.md create mode 100644 crates/utils/re_rvl/src/lib.rs create mode 100644 crates/utils/re_span/Cargo.toml create mode 100644 crates/utils/re_span/README.md create mode 100644 crates/utils/re_span/src/lib.rs create mode 100644 crates/utils/re_string_interner/Cargo.toml create mode 100644 crates/utils/re_string_interner/README.md create mode 100644 crates/utils/re_string_interner/src/lib.rs create mode 100644 crates/utils/re_test_mocks/Cargo.toml create mode 100644 crates/utils/re_test_mocks/README.md create mode 100644 crates/utils/re_test_mocks/src/assert.rs create mode 100644 crates/utils/re_test_mocks/src/lib.rs create mode 100644 crates/utils/re_test_mocks/src/otlp.rs create mode 100644 crates/utils/re_test_mocks/src/posthog.rs create mode 100644 crates/utils/re_tracing/Cargo.toml create mode 100644 crates/utils/re_tracing/README.md create mode 100644 crates/utils/re_tracing/src/lib.rs create mode 100644 crates/utils/re_tracing/src/profile_capture.rs create mode 100644 crates/utils/re_tracing/src/server.rs create mode 100644 crates/utils/re_tuid/Cargo.toml create mode 100644 crates/utils/re_tuid/README.md create mode 100644 crates/utils/re_tuid/benches/bench_tuid.rs create mode 100644 crates/utils/re_tuid/src/lib.rs create mode 100644 crates/utils/re_video/Cargo.toml create mode 100644 crates/utils/re_video/README.md create mode 100644 crates/utils/re_video/benches/video_load_bench.rs create mode 100644 crates/utils/re_video/build.rs create mode 100644 crates/utils/re_video/examples/frames.rs create mode 100644 crates/utils/re_video/src/av1.rs create mode 100644 crates/utils/re_video/src/decode/av1.rs create mode 100644 crates/utils/re_video/src/decode/ffmpeg_cli/ffmpeg.rs create mode 100644 crates/utils/re_video/src/decode/ffmpeg_cli/ivf.rs create mode 100644 crates/utils/re_video/src/decode/ffmpeg_cli/mod.rs create mode 100644 crates/utils/re_video/src/decode/ffmpeg_cli/transcode.rs create mode 100644 crates/utils/re_video/src/decode/ffmpeg_cli/version.rs create mode 100644 crates/utils/re_video/src/decode/image_decoder.rs create mode 100644 crates/utils/re_video/src/decode/mod.rs create mode 100644 crates/utils/re_video/src/decode/rvl_decoder.rs create mode 100644 crates/utils/re_video/src/decode/sync_decoder.rs create mode 100644 crates/utils/re_video/src/decode/sync_decoder_wrapper_native.rs create mode 100644 crates/utils/re_video/src/decode/sync_decoder_wrapper_wasm.rs create mode 100644 crates/utils/re_video/src/decode/web_image_decoder.rs create mode 100644 crates/utils/re_video/src/decode/webcodecs.rs create mode 100644 crates/utils/re_video/src/demux/mod.rs create mode 100644 crates/utils/re_video/src/demux/mp4.rs create mode 100644 crates/utils/re_video/src/gop_detection.rs create mode 100644 crates/utils/re_video/src/h264.rs create mode 100644 crates/utils/re_video/src/h265.rs create mode 100644 crates/utils/re_video/src/lib.rs create mode 100644 crates/utils/re_video/src/nalu.rs create mode 100644 crates/utils/re_video/src/player/mod.rs create mode 100644 crates/utils/re_video/src/player/sample_decoder.rs create mode 100644 crates/utils/re_video/src/stable_index_deque.rs create mode 100644 crates/utils/re_video/src/time.rs create mode 100644 crates/utils/re_video/src/vp8.rs create mode 100644 crates/utils/re_video/src/vp9.rs create mode 100644 crates/viewer/README.md create mode 100644 crates/viewer/re_arrow_ui/Cargo.toml create mode 100644 crates/viewer/re_arrow_ui/README.md create mode 100644 crates/viewer/re_arrow_ui/src/arrow_node.rs create mode 100644 crates/viewer/re_arrow_ui/src/arrow_ui.rs create mode 100644 crates/viewer/re_arrow_ui/src/datatype_ui.rs create mode 100644 crates/viewer/re_arrow_ui/src/lib.rs create mode 100644 crates/viewer/re_arrow_ui/src/list_item_ranges.rs create mode 100644 crates/viewer/re_arrow_ui/src/show_index.rs create mode 100644 crates/viewer/re_arrow_ui/tests/arrow_test_data/mod.rs create mode 100644 crates/viewer/re_arrow_ui/tests/arrow_ui_test.rs create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/arrow_ui.png create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/arrow_ui_test__binary_array.snap create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/arrow_ui_test__complex_map.snap create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/arrow_ui_test__coordinates_struct.snap create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/arrow_ui_test__deeply_nested_struct.snap create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/arrow_ui_test__dictionary_array.snap create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/arrow_ui_test__fixed_size_list.snap create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/arrow_ui_test__large_binary_array.snap create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/arrow_ui_test__list_of_long_strings.snap create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/arrow_ui_test__long_string.snap create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/arrow_ui_test__metadata_struct.snap create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/arrow_ui_test__mixed_lists.snap create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/arrow_ui_test__optional_struct.snap create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/arrow_ui_test__simple_map.snap create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/arrow_ui_test__union_array.snap create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/binary_array.png create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/complex_map.png create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/coordinates_struct.png create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/deeply_nested_struct.png create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/dictionary_array.png create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/fixed_size_list.png create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/large_binary_array.png create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/list_of_long_strings.png create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/long_string.png create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/metadata_struct.png create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/mixed_lists.png create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/optional_struct.png create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/simple_map.png create mode 100644 crates/viewer/re_arrow_ui/tests/snapshots/union_array.png create mode 100644 crates/viewer/re_blueprint_tree/Cargo.toml create mode 100644 crates/viewer/re_blueprint_tree/README.md create mode 100644 crates/viewer/re_blueprint_tree/src/blueprint_tree.rs create mode 100644 crates/viewer/re_blueprint_tree/src/data.rs create mode 100644 crates/viewer/re_blueprint_tree/src/data_result_node_or_path.rs create mode 100644 crates/viewer/re_blueprint_tree/src/lib.rs create mode 100644 crates/viewer/re_blueprint_tree/tests/blueprint_tree_tests.rs create mode 100644 crates/viewer/re_blueprint_tree/tests/range_selection_test.rs create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/basic_blueprint_panel.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/blueprint_panel_filter_active_above_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/blueprint_panel_filter_active_inside_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/blueprint_panel_filter_active_outside_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/collapse_all_blueprint_panel.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/expand_all_blueprint_panel.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/range_selection_in_blueprint_tree.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/no-query/empty.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/no-query/empty.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/no-query/multiple_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/no-query/multiple_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/no-query/non_root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/no-query/non_root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/no-query/proj_with_placeholder.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/no-query/proj_with_placeholder.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/no-query/root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/no-query/root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/no-query/single_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/no-query/single_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/no-query/unknown_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/no-query/unknown_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-/empty.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-/empty.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-/multiple_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-/multiple_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-/non_root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-/non_root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-/proj_with_placeholder.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-/proj_with_placeholder.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-/root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-/root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-/single_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-/single_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-/unknown_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-/unknown_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to,_rig/empty.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to,_rig/empty.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to,_rig/multiple_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to,_rig/multiple_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to,_rig/non_root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to,_rig/non_root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to,_rig/proj_with_placeholder.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to,_rig/proj_with_placeholder.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to,_rig/root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to,_rig/root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to,_rig/single_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to,_rig/single_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to,_rig/unknown_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to,_rig/unknown_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to_th/empty.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to_th/empty.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to_th/multiple_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to_th/multiple_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to_th/non_root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to_th/non_root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to_th/proj_with_placeholder.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to_th/proj_with_placeholder.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to_th/root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to_th/root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to_th/single_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to_th/single_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to_th/unknown_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_path_to_th/unknown_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_to_the_/empty.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_to_the_/empty.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_to_the_/multiple_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_to_the_/multiple_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_to_the_/non_root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_to_the_/non_root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_to_the_/proj_with_placeholder.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_to_the_/proj_with_placeholder.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_to_the_/root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_to_the_/root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_to_the_/single_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_to_the_/single_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_to_the_/unknown_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-_to_the_/unknown_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,left/empty.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,left/empty.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,left/multiple_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,left/multiple_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,left/non_root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,left/non_root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,left/proj_with_placeholder.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,left/proj_with_placeholder.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,left/root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,left/root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,left/single_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,left/single_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,left/unknown_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,left/unknown_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,t/empty.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,t/empty.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,t/multiple_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,t/multiple_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,t/non_root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,t/non_root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,t/proj_with_placeholder.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,t/proj_with_placeholder.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,t/root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,t/root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,t/single_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,t/single_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,t/unknown_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-ath,t/unknown_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-path/empty.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-path/empty.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-path/multiple_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-path/multiple_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-path/non_root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-path/non_root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-path/proj_with_placeholder.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-path/proj_with_placeholder.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-path/root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-path/root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-path/single_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-path/single_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-path/unknown_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-path/unknown_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-t/empty.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-t/empty.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-t/multiple_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-t/multiple_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-t/non_root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-t/non_root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-t/proj_with_placeholder.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-t/proj_with_placeholder.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-t/root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-t/root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-t/single_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-t/single_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-t/unknown_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-t/unknown_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the,oid/empty.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the,oid/empty.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the,oid/multiple_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the,oid/multiple_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the,oid/non_root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the,oid/non_root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the,oid/proj_with_placeholder.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the,oid/proj_with_placeholder.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the,oid/root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the,oid/root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the,oid/single_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the,oid/single_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the,oid/unknown_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the,oid/unknown_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the/empty.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the/empty.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the/multiple_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the/multiple_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the/non_root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the/non_root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the/proj_with_placeholder.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the/proj_with_placeholder.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the/root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the/root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the/single_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the/single_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the/unknown_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-to_the/unknown_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-void/empty.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-void/empty.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-void/multiple_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-void/multiple_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-void/non_root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-void/non_root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-void/proj_with_placeholder.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-void/proj_with_placeholder.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-void/root_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-void/root_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-void/single_proj.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-void/single_proj.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-void/unknown_origin.png create mode 100644 crates/viewer/re_blueprint_tree/tests/snapshots/view_structure_test/query-void/unknown_origin.snap create mode 100644 crates/viewer/re_blueprint_tree/tests/view_structure_test.rs create mode 100644 crates/viewer/re_chunk_store_ui/Cargo.toml create mode 100644 crates/viewer/re_chunk_store_ui/README.md create mode 100644 crates/viewer/re_chunk_store_ui/src/chunk_list_mode.rs create mode 100644 crates/viewer/re_chunk_store_ui/src/chunk_store_ui.rs create mode 100644 crates/viewer/re_chunk_store_ui/src/chunk_ui.rs create mode 100644 crates/viewer/re_chunk_store_ui/src/lib.rs create mode 100644 crates/viewer/re_chunk_store_ui/src/sort.rs create mode 100644 crates/viewer/re_chunk_store_ui/src/toolbar_ui.rs create mode 100644 crates/viewer/re_component_fallbacks/Cargo.toml create mode 100644 crates/viewer/re_component_fallbacks/README.md create mode 100644 crates/viewer/re_component_fallbacks/src/blueprint_component_fallbacks.rs create mode 100644 crates/viewer/re_component_fallbacks/src/component_fallbacks.rs create mode 100644 crates/viewer/re_component_fallbacks/src/lib.rs create mode 100644 crates/viewer/re_component_ui/Cargo.toml create mode 100644 crates/viewer/re_component_ui/README.md create mode 100644 crates/viewer/re_component_ui/src/color.rs create mode 100644 crates/viewer/re_component_ui/src/color_swatch.rs create mode 100644 crates/viewer/re_component_ui/src/datatype_uis/bool_toggle.rs create mode 100644 crates/viewer/re_component_ui/src/datatype_uis/enum_ui.rs create mode 100644 crates/viewer/re_component_ui/src/datatype_uis/float_drag.rs create mode 100644 crates/viewer/re_component_ui/src/datatype_uis/int_drag.rs create mode 100644 crates/viewer/re_component_ui/src/datatype_uis/mod.rs create mode 100644 crates/viewer/re_component_ui/src/datatype_uis/range1d.rs create mode 100644 crates/viewer/re_component_ui/src/datatype_uis/singleline_string.rs create mode 100644 crates/viewer/re_component_ui/src/datatype_uis/vec.rs create mode 100644 crates/viewer/re_component_ui/src/datatype_uis/view_id.rs create mode 100644 crates/viewer/re_component_ui/src/datatype_uis/view_timestamp.rs create mode 100644 crates/viewer/re_component_ui/src/datatype_uis/view_uuid.rs create mode 100644 crates/viewer/re_component_ui/src/entity_path.rs create mode 100644 crates/viewer/re_component_ui/src/geo_line_string.rs create mode 100644 crates/viewer/re_component_ui/src/image_format.rs create mode 100644 crates/viewer/re_component_ui/src/lat_lon.rs create mode 100644 crates/viewer/re_component_ui/src/lib.rs create mode 100644 crates/viewer/re_component_ui/src/line_strip.rs create mode 100644 crates/viewer/re_component_ui/src/map_provider.rs create mode 100644 crates/viewer/re_component_ui/src/marker_shape.rs create mode 100644 crates/viewer/re_component_ui/src/pinhole.rs create mode 100644 crates/viewer/re_component_ui/src/plane3d.rs create mode 100644 crates/viewer/re_component_ui/src/radius.rs create mode 100644 crates/viewer/re_component_ui/src/resolution.rs create mode 100644 crates/viewer/re_component_ui/src/response_utils.rs create mode 100644 crates/viewer/re_component_ui/src/text_log_columns.rs create mode 100644 crates/viewer/re_component_ui/src/time_range.rs create mode 100644 crates/viewer/re_component_ui/src/timeline_columns.rs create mode 100644 crates/viewer/re_component_ui/src/transform_frame_id.rs create mode 100644 crates/viewer/re_component_ui/src/transforms.rs create mode 100644 crates/viewer/re_component_ui/src/variant_uis/mod.rs create mode 100644 crates/viewer/re_component_ui/src/variant_uis/redap_entry_kind.rs create mode 100644 crates/viewer/re_component_ui/src/variant_uis/redap_thumbnail.rs create mode 100644 crates/viewer/re_component_ui/src/variant_uis/redap_uri_button.rs create mode 100644 crates/viewer/re_component_ui/src/video_timestamp.rs create mode 100644 crates/viewer/re_component_ui/src/view_coordinates.rs create mode 100644 crates/viewer/re_component_ui/src/visible_dnd.rs create mode 100644 crates/viewer/re_component_ui/src/visual_bounds2d.rs create mode 100644 crates/viewer/re_component_ui/src/zoom_level.rs create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/AbsoluteTimeRange_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/AggregationPolicy_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/AlbedoFactor_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/AngularSpeed_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/ApplyLatestAt_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/AutoScroll_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/AxisLength_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/BackgroundKind_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/CellSize_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/ChannelId_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/ChannelMessageCounts_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/ClearIsRecursive_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Color_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Colormap_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/ColumnName_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/ColumnOrder_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/ComponentColumnSelector_simple.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/ContainerKind_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Corner2D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Count_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/DepthMeter_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/DrawOrder_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Enabled_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/EntityPath_simple.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Eye3DKind_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/FillMode_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/FillRatio_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/FilterByRange_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/FilterIsNotNull_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/ForceDistance_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/ForceIterations_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/ForceStrength_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Fps_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/GammaCorrection_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/GeoLineString_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/GraphEdge_simple.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/GraphNode_simple.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/GraphType_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/GridColumns_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/GridSpacing_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/HalfSize2D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/HalfSize3D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/ImageFormat_depth_f32.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/ImageFormat_nv12.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/ImageFormat_rgb8.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/ImageFormat_rgba8.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/ImageFormat_segmentation_u32.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/ImagePlaneDistance_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Interactive_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/InterpolationMode_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/IsKeyframe_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/KeyValuePairs_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/LatLon_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Length_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/LineStrip2D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/LineStrip3D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/LinearSpeed_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/LinkAxis_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/LockRangeDuringZoom_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/LoopMode_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/MagnificationFilter_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/MapProvider_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/MarkerShape_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/MarkerSize_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/MediaType_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/MeshFaceRendering_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Name_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/NearClipPlane_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Opacity_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/PinholeProjection_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Plane3D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/PlayState_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/PlaybackSpeed_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/PointShading_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Position2D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Position3D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/QueryExpression_simple.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Radius_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Range1D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Resolution_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/RotationAxisAngle_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/RotationQuat_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Scalar_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Scale3D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/SchemaId_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/SelectedColumns_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/ShowLabels_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/StrokeWidth_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/TensorDimensionIndexSelection_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/TensorDimensionIndexSlider_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/TensorHeightDimension_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/TensorWidthDimension_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Texcoord2D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/TextLogColumn_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/TextLogLevel_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Text_simple.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/TimeInt_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/TimeRange_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/TimelineColumn_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/TimelineName_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Timestamp_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/TransformFrameId_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/TransformMat3x3_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/TransformRelation_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Translation3D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/TriangleIndices_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/ValueRange_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Vector2D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Vector3D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/VideoCodec_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/VideoSample_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/VideoTimestamp_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/ViewClass_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/ViewCoordinates_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/ViewFit_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/VisibleTimeRange_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/Visible_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/VisualBounds2D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/VisualizerComponentMapping_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/VisualizerType_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/VoxelIndex_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/VoxelSize_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/VoxelValue_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/ZoomLevel_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/any_value_any_value_f64.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/custom_catalog_string_any_value_url_string.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/custom_empty_array_any_value_empty_array.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/custom_large_blob_any_value_large_blob.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/custom_small_array_any_value_small_array.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/custom_string_any_value_string.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/custom_struct_array_any_value_struct_array.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/custom_struct_array_single_element_any_value_struct_array_single_element.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_narrow_dark/custom_url_string_any_value_url_string.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/AbsoluteTimeRange_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/AggregationPolicy_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/AlbedoFactor_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/AngularSpeed_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/ApplyLatestAt_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/AutoScroll_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/AxisLength_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/BackgroundKind_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/CellSize_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/ChannelId_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/ChannelMessageCounts_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/ClearIsRecursive_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Color_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Colormap_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/ColumnName_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/ColumnOrder_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/ComponentColumnSelector_simple.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/ContainerKind_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Corner2D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Count_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/DepthMeter_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/DrawOrder_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Enabled_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/EntityPath_simple.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Eye3DKind_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/FillMode_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/FillRatio_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/FilterByRange_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/FilterIsNotNull_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/ForceDistance_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/ForceIterations_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/ForceStrength_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Fps_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/GammaCorrection_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/GeoLineString_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/GraphEdge_simple.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/GraphNode_simple.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/GraphType_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/GridColumns_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/GridSpacing_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/HalfSize2D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/HalfSize3D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/ImageFormat_depth_f32.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/ImageFormat_nv12.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/ImageFormat_rgb8.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/ImageFormat_rgba8.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/ImageFormat_segmentation_u32.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/ImagePlaneDistance_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Interactive_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/InterpolationMode_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/IsKeyframe_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/KeyValuePairs_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/LatLon_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Length_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/LineStrip2D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/LineStrip3D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/LinearSpeed_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/LinkAxis_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/LockRangeDuringZoom_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/LoopMode_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/MagnificationFilter_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/MapProvider_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/MarkerShape_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/MarkerSize_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/MediaType_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/MeshFaceRendering_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Name_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/NearClipPlane_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Opacity_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/PinholeProjection_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Plane3D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/PlayState_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/PlaybackSpeed_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/PointShading_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Position2D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Position3D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/QueryExpression_simple.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Radius_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Range1D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Resolution_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/RotationAxisAngle_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/RotationQuat_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Scalar_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Scale3D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/SchemaId_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/SelectedColumns_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/ShowLabels_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/StrokeWidth_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/TensorDimensionIndexSelection_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/TensorDimensionIndexSlider_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/TensorHeightDimension_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/TensorWidthDimension_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Texcoord2D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/TextLogColumn_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/TextLogLevel_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Text_simple.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/TimeInt_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/TimeRange_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/TimelineColumn_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/TimelineName_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Timestamp_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/TransformFrameId_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/TransformMat3x3_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/TransformRelation_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Translation3D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/TriangleIndices_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/ValueRange_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Vector2D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Vector3D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/VideoCodec_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/VideoSample_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/VideoTimestamp_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/ViewClass_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/ViewCoordinates_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/ViewFit_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/VisibleTimeRange_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/Visible_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/VisualBounds2D_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/VisualizerComponentMapping_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/VisualizerType_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/VoxelIndex_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/VoxelSize_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/VoxelValue_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/ZoomLevel_placeholder.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/any_value_any_value_f64.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/custom_catalog_string_any_value_url_string.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/custom_empty_array_any_value_empty_array.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/custom_large_blob_any_value_large_blob.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/custom_small_array_any_value_small_array.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/custom_string_any_value_string.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/custom_struct_array_any_value_struct_array.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/custom_struct_array_single_element_any_value_struct_array_single_element.png create mode 100644 crates/viewer/re_component_ui/tests/snapshots/all_components_list_item_wide_light/custom_url_string_any_value_url_string.png create mode 100644 crates/viewer/re_component_ui/tests/test_all_components_ui.rs create mode 100644 crates/viewer/re_context_menu/Cargo.toml create mode 100644 crates/viewer/re_context_menu/README.md create mode 100644 crates/viewer/re_context_menu/src/actions/add_container.rs create mode 100644 crates/viewer/re_context_menu/src/actions/add_entities_to_new_view.rs create mode 100644 crates/viewer/re_context_menu/src/actions/add_view.rs create mode 100644 crates/viewer/re_context_menu/src/actions/clone_view.rs create mode 100644 crates/viewer/re_context_menu/src/actions/collapse_expand_all.rs create mode 100644 crates/viewer/re_context_menu/src/actions/copy_entity_path.rs create mode 100644 crates/viewer/re_context_menu/src/actions/mod.rs create mode 100644 crates/viewer/re_context_menu/src/actions/move_contents_to_new_container.rs create mode 100644 crates/viewer/re_context_menu/src/actions/remove.rs create mode 100644 crates/viewer/re_context_menu/src/actions/screenshot_action.rs create mode 100644 crates/viewer/re_context_menu/src/actions/show_hide.rs create mode 100644 crates/viewer/re_context_menu/src/actions/show_hide_in_all_views.rs create mode 100644 crates/viewer/re_context_menu/src/actions/track_entity.rs create mode 100644 crates/viewer/re_context_menu/src/collapse_expand.rs create mode 100644 crates/viewer/re_context_menu/src/lib.rs create mode 100644 crates/viewer/re_context_menu/src/sub_menu.rs create mode 100644 crates/viewer/re_context_menu/src/visibility_actions.rs create mode 100644 crates/viewer/re_data_ui/Cargo.toml create mode 100644 crates/viewer/re_data_ui/README.md create mode 100644 crates/viewer/re_data_ui/src/annotation_context_ui.rs create mode 100644 crates/viewer/re_data_ui/src/app_id_ui.rs create mode 100644 crates/viewer/re_data_ui/src/blob_ui.rs create mode 100644 crates/viewer/re_data_ui/src/component_path_ui.rs create mode 100644 crates/viewer/re_data_ui/src/component_type_ui.rs create mode 100644 crates/viewer/re_data_ui/src/component_ui_registry.rs create mode 100644 crates/viewer/re_data_ui/src/data_source_ui.rs create mode 100644 crates/viewer/re_data_ui/src/entity_db_ui.rs create mode 100644 crates/viewer/re_data_ui/src/entity_path_ui.rs create mode 100644 crates/viewer/re_data_ui/src/extra_data_ui.rs create mode 100644 crates/viewer/re_data_ui/src/image_ui.rs create mode 100644 crates/viewer/re_data_ui/src/instance_path_ui.rs create mode 100644 crates/viewer/re_data_ui/src/item_ui.rs create mode 100644 crates/viewer/re_data_ui/src/latest_all_instance_ui.rs create mode 100644 crates/viewer/re_data_ui/src/latest_at_instance_ui.rs create mode 100644 crates/viewer/re_data_ui/src/lib.rs create mode 100644 crates/viewer/re_data_ui/src/store_id_ui.rs create mode 100644 crates/viewer/re_data_ui/src/tensor_ui.rs create mode 100644 crates/viewer/re_data_ui/src/transform_frames_ui.rs create mode 100644 crates/viewer/re_data_ui/src/video_ui.rs create mode 100644 crates/viewer/re_dataframe_ui/Cargo.toml create mode 100644 crates/viewer/re_dataframe_ui/README.md create mode 100644 crates/viewer/re_dataframe_ui/src/datafusion_adapter.rs create mode 100644 crates/viewer/re_dataframe_ui/src/datafusion_table_widget.rs create mode 100644 crates/viewer/re_dataframe_ui/src/display_record_batch.rs create mode 100644 crates/viewer/re_dataframe_ui/src/filters/boolean.rs create mode 100644 crates/viewer/re_dataframe_ui/src/filters/column_filter.rs create mode 100644 crates/viewer/re_dataframe_ui/src/filters/column_filter_ui.rs create mode 100644 crates/viewer/re_dataframe_ui/src/filters/filter.rs create mode 100644 crates/viewer/re_dataframe_ui/src/filters/filter_udf.rs create mode 100644 crates/viewer/re_dataframe_ui/src/filters/mod.rs create mode 100644 crates/viewer/re_dataframe_ui/src/filters/numerical.rs create mode 100644 crates/viewer/re_dataframe_ui/src/filters/parse_timestamp.rs create mode 100644 crates/viewer/re_dataframe_ui/src/filters/string.rs create mode 100644 crates/viewer/re_dataframe_ui/src/filters/timestamp.rs create mode 100644 crates/viewer/re_dataframe_ui/src/filters/timestamp_formatted.rs create mode 100644 crates/viewer/re_dataframe_ui/src/grid_view.rs create mode 100644 crates/viewer/re_dataframe_ui/src/header_tooltip.rs create mode 100644 crates/viewer/re_dataframe_ui/src/lib.rs create mode 100644 crates/viewer/re_dataframe_ui/src/preview_renderer.rs create mode 100644 crates/viewer/re_dataframe_ui/src/re_table.rs create mode 100644 crates/viewer/re_dataframe_ui/src/re_table_utils.rs create mode 100644 crates/viewer/re_dataframe_ui/src/requested_object.rs create mode 100644 crates/viewer/re_dataframe_ui/src/streaming_cache.rs create mode 100644 crates/viewer/re_dataframe_ui/src/table_blueprint.rs create mode 100644 crates/viewer/re_dataframe_ui/src/table_selection.rs create mode 100644 crates/viewer/re_dataframe_ui/tests/ascending_descending.rs create mode 100644 crates/viewer/re_dataframe_ui/tests/column_header_tooltips.rs create mode 100644 crates/viewer/re_dataframe_ui/tests/common.rs create mode 100644 crates/viewer/re_dataframe_ui/tests/filter_tests.rs create mode 100644 crates/viewer/re_dataframe_ui/tests/grid_view.rs create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__boolean_equals_list_non_nullable@both_null_true.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__boolean_equals_list_non_nullable@inner_null_true.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__boolean_equals_list_non_nullable@no_null_true.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__boolean_equals_list_non_nullable@outer_null_true.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__boolean_equals_list_nullable@both_null_is_not_true.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__boolean_equals_list_nullable@both_null_is_null.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__boolean_equals_list_nullable@both_null_is_true.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__boolean_equals_list_nullable@inner_null_is_not_true.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__boolean_equals_list_nullable@inner_null_is_null.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__boolean_equals_list_nullable@inner_null_is_true.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__boolean_equals_list_nullable@outer_null_is_not_true.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__boolean_equals_list_nullable@outer_null_is_null.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__boolean_equals_list_nullable@outer_null_is_true.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_all_types@Float32Type.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_all_types@Float64Type.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_compares@eq_3.0.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_compares@ge_3.0.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_compares@gt_3.0.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_compares@le_3.0.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_compares@lt_3.0.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_compares@ne_3.0.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_compares@nulls_eq_4.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_compares@nulls_ge_4.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_compares@nulls_gt_4.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_compares@nulls_le_4.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_compares@nulls_lt_4.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_compares@nulls_ne_4.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_lists@eq_2.0.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_lists@ge_2.0.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_lists@gt_2.0.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_lists@le_2.0.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_lists@lt_2.0.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_lists@ne_2.0.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_lists@nulls_eq_2.0.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_lists@nulls_ge_2.0.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_lists@nulls_gt_2.0.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_lists@nulls_le_2.0.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_lists@nulls_lt_2.0.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__float_lists@nulls_ne_2.0.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_all_types@Int16Type.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_all_types@Int32Type.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_all_types@Int64Type.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_all_types@Int8Type.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_all_types@UInt16Type.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_all_types@UInt32Type.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_all_types@UInt64Type.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_all_types@UInt8Type.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_compares@eq_3.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_compares@ge_3.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_compares@gt_3.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_compares@le_3.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_compares@lt_3.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_compares@ne_3.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_compares@nulls_eq_4.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_compares@nulls_eq_unspecified.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_compares@nulls_ge_4.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_compares@nulls_ge_unspecified.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_compares@nulls_gt_4.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_compares@nulls_gt_unspecified.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_compares@nulls_le_4.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_compares@nulls_le_unspecified.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_compares@nulls_lt_4.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_compares@nulls_lt_unspecified.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_compares@nulls_ne_4.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_compares@nulls_ne_unspecified.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_lists@eq_2.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_lists@ge_2.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_lists@gt_2.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_lists@le_2.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_lists@lt_2.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_lists@ne_2.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_lists@nulls_eq_2.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_lists@nulls_ge_2.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_lists@nulls_gt_2.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_lists@nulls_le_2.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_lists@nulls_lt_2.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__int_lists@nulls_ne_2.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__non_nullable_boolean_equals@false.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__non_nullable_boolean_equals@nulls_false.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__non_nullable_boolean_equals@nulls_true.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__non_nullable_boolean_equals@true.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__nullable_boolean_equals@nulls_false.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__nullable_boolean_equals@nulls_is_not_null.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__nullable_boolean_equals@nulls_is_not_true.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__nullable_boolean_equals@nulls_null.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__nullable_boolean_equals@nulls_true.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_contains@a.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_contains@a_uppercase.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_contains@ab.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_contains@does_not_contain_b.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_contains@empty.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_contains@ends_with_c.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_contains@nulls_a.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_contains@nulls_does_not_contain_b.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_contains@nulls_empty.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_contains@nulls_ends_with_c.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_contains@nulls_starts_with_b.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_contains@starts_with_b.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_list@both_null_Contains_ab.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_list@both_null_DoesNotContain_ab.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_list@both_null_EndsWith_ab.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_list@both_null_StartsWith_ab.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_list@inner_null_Contains_ab.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_list@inner_null_DoesNotContain_ab.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_list@inner_null_EndsWith_ab.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_list@inner_null_StartsWith_ab.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_list@no_null_Contains_ab.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_list@no_null_DoesNotContain_ab.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_list@no_null_EndsWith_ab.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_list@no_null_StartsWith_ab.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_list@outer_null_Contains_ab.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_list@outer_null_DoesNotContain_ab.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_list@outer_null_EndsWith_ab.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__string_list@outer_null_StartsWith_ab.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@after_Microsecond.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@after_Microsecond_nulls.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@after_Millisecond.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@after_Millisecond_nulls.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@after_Nanosecond.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@after_Nanosecond_nulls.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@after_Second.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@after_Second_nulls.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@after_strict_Microsecond.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@after_strict_Microsecond_nulls.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@after_strict_Millisecond.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@after_strict_Millisecond_nulls.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@after_strict_Nanosecond.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@after_strict_Nanosecond_nulls.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@after_strict_Second.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@after_strict_Second_nulls.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@between_Microsecond.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@between_Microsecond_nulls.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@between_Millisecond.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@between_Millisecond_nulls.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@between_Nanosecond.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@between_Nanosecond_nulls.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@between_Second.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@between_Second_nulls.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@not_after_Microsecond.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@not_after_Microsecond_nulls.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@not_after_Millisecond.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@not_after_Millisecond_nulls.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@not_after_Nanosecond.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@not_after_Nanosecond_nulls.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@not_after_Second.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps@not_after_Second_nulls.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps_list@after_both_null.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps_list@after_inner_null.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps_list@after_no_null.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps_list@after_outer_null.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps_list@after_strict_both_null.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps_list@after_strict_inner_null.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps_list@after_strict_no_null.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps_list@after_strict_outer_null.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps_list@between_both_null.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps_list@between_inner_null.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps_list@between_no_null.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps_list@between_outer_null.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps_list@not_after_both_null.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps_list@not_after_inner_null.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps_list@not_after_no_null.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_tests__timestamps_list@not_after_outer_null.snap create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_ui_boolean_equals_false.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_ui_boolean_equals_null.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_ui_boolean_equals_true.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_ui_float_compares.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_ui_float_compares_none.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_ui_int_compare.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_ui_int_compare_none.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_ui_nullable_boolean_equals_false.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_ui_nullable_boolean_equals_null.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_ui_nullable_boolean_equals_true.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_ui_nullable_boolean_not_equals_true.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_ui_string_contains.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_ui_string_contains_empty.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_ui_string_starts_with.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_ui_timestamp_after.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_ui_timestamp_between.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_ui_timestamp_not_after.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/filter_wrapping.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/grid_view_basic_dark.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/grid_view_basic_light.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/grid_view_flagging_dark.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/grid_view_flagging_light.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/grid_view_flagging_toggled_dark.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/grid_view_flagging_toggled_light.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/grid_view_non_uniform_cards.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/grid_view_resize_narrow.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/grid_view_resize_wide.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/header_tooltip_chunk_component_column.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/header_tooltip_chunk_component_column_with_extras.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/header_tooltip_dataframe_component_column.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/header_tooltip_dataframe_component_column_with_extras.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/header_tooltip_index_column.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/header_tooltip_index_column_with_extras.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/header_tooltip_raw_field.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/header_tooltip_raw_field_user_and_sorbet_metadata.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/header_tooltip_raw_field_user_and_sorbet_metadata_with_extras.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/header_tooltip_raw_field_user_metadata.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/header_tooltip_raw_field_user_metadata_with_extras.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/header_tooltip_raw_field_with_extras.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/header_tooltip_row_field_nullable.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/header_tooltip_row_field_nullable_with_extras.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/header_tooltip_row_id_column.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/header_tooltip_row_id_column_with_extras.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/popup_ui_boolean_equals_false.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/popup_ui_boolean_equals_true.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/popup_ui_float_compares.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/popup_ui_float_compares_none.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/popup_ui_int_compare.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/popup_ui_int_compare_none.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/popup_ui_nullable_boolean_equals_false.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/popup_ui_nullable_boolean_equals_null.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/popup_ui_nullable_boolean_equals_true.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/popup_ui_nullable_boolean_not_equals_true.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/popup_ui_string_contains.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/popup_ui_string_contains_empty.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/popup_ui_string_starts_with.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/popup_ui_timestamp_after.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/popup_ui_timestamp_between.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/popup_ui_timestamp_not_after.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/test_ascending.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/test_column_menu_button.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/test_descending.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/test_no_sort.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/test_text_truncation.png create mode 100644 crates/viewer/re_dataframe_ui/tests/snapshots/timestamp_filter_on_commit.png create mode 100644 crates/viewer/re_dataframe_ui/tests/text_truncation.rs create mode 100644 crates/viewer/re_gamepad/Cargo.toml create mode 100644 crates/viewer/re_gamepad/README.md create mode 100644 crates/viewer/re_gamepad/src/lib.rs create mode 100644 crates/viewer/re_gamepad/src/native.rs create mode 100644 crates/viewer/re_gamepad/src/web.rs create mode 100644 crates/viewer/re_memory_view/Cargo.toml create mode 100644 crates/viewer/re_memory_view/README.md create mode 100644 crates/viewer/re_memory_view/examples/demo.rs create mode 100644 crates/viewer/re_memory_view/src/flamegraph.rs create mode 100644 crates/viewer/re_memory_view/src/lib.rs create mode 100644 crates/viewer/re_plot/Cargo.toml create mode 100644 crates/viewer/re_plot/README.md create mode 100644 crates/viewer/re_plot/src/legend.rs create mode 100644 crates/viewer/re_plot/src/lib.rs create mode 100644 crates/viewer/re_plot/src/tooltip.rs create mode 100644 crates/viewer/re_recording_panel/Cargo.toml create mode 100644 crates/viewer/re_recording_panel/README.md create mode 100644 crates/viewer/re_recording_panel/src/data.rs create mode 100644 crates/viewer/re_recording_panel/src/lib.rs create mode 100644 crates/viewer/re_recording_panel/src/recording_panel_ui.rs create mode 100644 crates/viewer/re_recording_panel/tests/snapshot_tests.rs create mode 100644 crates/viewer/re_recording_panel/tests/snapshots/snapshot_tests__empty_context_test.snap create mode 100644 crates/viewer/re_recording_panel/tests/snapshots/snapshot_tests__fake_local_and_example_recordings_test.snap create mode 100644 crates/viewer/re_redap_browser/Cargo.toml create mode 100644 crates/viewer/re_redap_browser/README.md create mode 100644 crates/viewer/re_redap_browser/src/context.rs create mode 100644 crates/viewer/re_redap_browser/src/entries.rs create mode 100644 crates/viewer/re_redap_browser/src/folder_card_ui.rs create mode 100644 crates/viewer/re_redap_browser/src/lib.rs create mode 100644 crates/viewer/re_redap_browser/src/server_modal.rs create mode 100644 crates/viewer/re_redap_browser/src/server_modal/login_flow.rs create mode 100644 crates/viewer/re_redap_browser/src/server_modal/login_flow/native.rs create mode 100644 crates/viewer/re_redap_browser/src/server_modal/login_flow/web.rs create mode 100644 crates/viewer/re_redap_browser/src/servers.rs create mode 100644 crates/viewer/re_renderer/Cargo.toml create mode 100644 crates/viewer/re_renderer/README.md create mode 100644 crates/viewer/re_renderer/benches/bench_bounding_box.rs create mode 100644 crates/viewer/re_renderer/benches/bench_voxel_grid_draw_data.rs create mode 100644 crates/viewer/re_renderer/build.rs create mode 100644 crates/viewer/re_renderer/shader/colormap.wgsl create mode 100644 crates/viewer/re_renderer/shader/composite.wgsl create mode 100644 crates/viewer/re_renderer/shader/conversions/yuv_converter.wgsl create mode 100644 crates/viewer/re_renderer/shader/copy_texture.wgsl create mode 100644 crates/viewer/re_renderer/shader/debug_overlay.wgsl create mode 100644 crates/viewer/re_renderer/shader/depth_cloud.wgsl create mode 100644 crates/viewer/re_renderer/shader/generic_skybox.wgsl create mode 100644 crates/viewer/re_renderer/shader/global_bindings.wgsl create mode 100644 crates/viewer/re_renderer/shader/instanced_mesh.wgsl create mode 100644 crates/viewer/re_renderer/shader/lines.wgsl create mode 100644 crates/viewer/re_renderer/shader/mesh_vertex.wgsl create mode 100644 crates/viewer/re_renderer/shader/outlines/jumpflooding_init.wgsl create mode 100644 crates/viewer/re_renderer/shader/outlines/jumpflooding_init_msaa.wgsl create mode 100644 crates/viewer/re_renderer/shader/outlines/jumpflooding_init_shared.wgsl create mode 100644 crates/viewer/re_renderer/shader/outlines/jumpflooding_step.wgsl create mode 100644 crates/viewer/re_renderer/shader/point_cloud.wgsl create mode 100644 crates/viewer/re_renderer/shader/rectangle.wgsl create mode 100644 crates/viewer/re_renderer/shader/rectangle_fs.wgsl create mode 100644 crates/viewer/re_renderer/shader/rectangle_vs.wgsl create mode 100644 crates/viewer/re_renderer/shader/screen_triangle.wgsl create mode 100644 crates/viewer/re_renderer/shader/screen_triangle_vertex.wgsl create mode 100644 crates/viewer/re_renderer/shader/test_triangle.wgsl create mode 100644 crates/viewer/re_renderer/shader/types.wgsl create mode 100644 crates/viewer/re_renderer/shader/utils/camera.wgsl create mode 100644 crates/viewer/re_renderer/shader/utils/depth_offset.wgsl create mode 100644 crates/viewer/re_renderer/shader/utils/encoding.wgsl create mode 100644 crates/viewer/re_renderer/shader/utils/flags.wgsl create mode 100644 crates/viewer/re_renderer/shader/utils/interpolation.wgsl create mode 100644 crates/viewer/re_renderer/shader/utils/lighting.wgsl create mode 100644 crates/viewer/re_renderer/shader/utils/plane.wgsl create mode 100644 crates/viewer/re_renderer/shader/utils/quaternion.wgsl create mode 100644 crates/viewer/re_renderer/shader/utils/size.wgsl create mode 100644 crates/viewer/re_renderer/shader/utils/sphere_quad.wgsl create mode 100644 crates/viewer/re_renderer/shader/utils/srgb.wgsl create mode 100644 crates/viewer/re_renderer/shader/voxel_grid.wgsl create mode 100644 crates/viewer/re_renderer/shader/world_grid.wgsl create mode 100644 crates/viewer/re_renderer/src/allocator/cpu_write_gpu_read_belt.rs create mode 100644 crates/viewer/re_renderer/src/allocator/data_texture_source.rs create mode 100644 crates/viewer/re_renderer/src/allocator/gpu_readback_belt.rs create mode 100644 crates/viewer/re_renderer/src/allocator/mod.rs create mode 100644 crates/viewer/re_renderer/src/allocator/uniform_buffer_fill.rs create mode 100644 crates/viewer/re_renderer/src/color.rs create mode 100644 crates/viewer/re_renderer/src/colormap.rs create mode 100644 crates/viewer/re_renderer/src/context.rs create mode 100644 crates/viewer/re_renderer/src/context_test.rs create mode 100644 crates/viewer/re_renderer/src/depth_offset.rs create mode 100644 crates/viewer/re_renderer/src/device_caps.rs create mode 100644 crates/viewer/re_renderer/src/draw_phases/draw_phase_manager.rs create mode 100644 crates/viewer/re_renderer/src/draw_phases/mod.rs create mode 100644 crates/viewer/re_renderer/src/draw_phases/outlines.rs create mode 100644 crates/viewer/re_renderer/src/draw_phases/picking_layer.rs create mode 100644 crates/viewer/re_renderer/src/draw_phases/screenshot.rs create mode 100644 crates/viewer/re_renderer/src/error_handling/error_tracker.rs create mode 100644 crates/viewer/re_renderer/src/error_handling/mod.rs create mode 100644 crates/viewer/re_renderer/src/error_handling/wgpu_core_error.rs create mode 100644 crates/viewer/re_renderer/src/file_resolver.rs create mode 100644 crates/viewer/re_renderer/src/file_server.rs create mode 100644 crates/viewer/re_renderer/src/file_system.rs create mode 100644 crates/viewer/re_renderer/src/global_bindings.rs create mode 100644 crates/viewer/re_renderer/src/importer/cpu_model.rs create mode 100644 crates/viewer/re_renderer/src/importer/dae.rs create mode 100644 crates/viewer/re_renderer/src/importer/gltf.rs create mode 100644 crates/viewer/re_renderer/src/importer/mod.rs create mode 100644 crates/viewer/re_renderer/src/importer/obj.rs create mode 100644 crates/viewer/re_renderer/src/importer/stl.rs create mode 100644 crates/viewer/re_renderer/src/label.rs create mode 100644 crates/viewer/re_renderer/src/lib.rs create mode 100644 crates/viewer/re_renderer/src/line_drawable_builder.rs create mode 100644 crates/viewer/re_renderer/src/mesh.rs create mode 100644 crates/viewer/re_renderer/src/point_cloud_builder.rs create mode 100644 crates/viewer/re_renderer/src/queueable_draw_data.rs create mode 100644 crates/viewer/re_renderer/src/rect.rs create mode 100644 crates/viewer/re_renderer/src/renderer/compositor.rs create mode 100644 crates/viewer/re_renderer/src/renderer/debug_overlay.rs create mode 100644 crates/viewer/re_renderer/src/renderer/depth_cloud.rs create mode 100644 crates/viewer/re_renderer/src/renderer/generic_skybox.rs create mode 100644 crates/viewer/re_renderer/src/renderer/lines.rs create mode 100644 crates/viewer/re_renderer/src/renderer/mesh_renderer.rs create mode 100644 crates/viewer/re_renderer/src/renderer/mod.rs create mode 100644 crates/viewer/re_renderer/src/renderer/plane_clustering.rs create mode 100644 crates/viewer/re_renderer/src/renderer/point_cloud.rs create mode 100644 crates/viewer/re_renderer/src/renderer/rectangles.rs create mode 100644 crates/viewer/re_renderer/src/renderer/test_triangle.rs create mode 100644 crates/viewer/re_renderer/src/renderer/voxel_grid.rs create mode 100644 crates/viewer/re_renderer/src/renderer/world_grid.rs create mode 100644 crates/viewer/re_renderer/src/resource_managers/image_data_to_texture.rs create mode 100644 crates/viewer/re_renderer/src/resource_managers/mod.rs create mode 100644 crates/viewer/re_renderer/src/resource_managers/texture_manager.rs create mode 100644 crates/viewer/re_renderer/src/resource_managers/yuv_converter.rs create mode 100644 crates/viewer/re_renderer/src/shape_builder.rs create mode 100644 crates/viewer/re_renderer/src/size.rs create mode 100644 crates/viewer/re_renderer/src/texture_info.rs create mode 100644 crates/viewer/re_renderer/src/texture_readback.rs create mode 100644 crates/viewer/re_renderer/src/transform.rs create mode 100644 crates/viewer/re_renderer/src/util.rs create mode 100644 crates/viewer/re_renderer/src/video/chunk_decoder.rs create mode 100644 crates/viewer/re_renderer/src/video/mod.rs create mode 100644 crates/viewer/re_renderer/src/view_builder.rs create mode 100644 crates/viewer/re_renderer/src/wgpu_buffer_types.rs create mode 100644 crates/viewer/re_renderer/src/wgpu_resources/bind_group_layout_pool.rs create mode 100644 crates/viewer/re_renderer/src/wgpu_resources/bind_group_pool.rs create mode 100644 crates/viewer/re_renderer/src/wgpu_resources/buffer_pool.rs create mode 100644 crates/viewer/re_renderer/src/wgpu_resources/dynamic_resource_pool.rs create mode 100644 crates/viewer/re_renderer/src/wgpu_resources/mod.rs create mode 100644 crates/viewer/re_renderer/src/wgpu_resources/pipeline_layout_pool.rs create mode 100644 crates/viewer/re_renderer/src/wgpu_resources/render_pipeline_pool.rs create mode 100644 crates/viewer/re_renderer/src/wgpu_resources/resource.rs create mode 100644 crates/viewer/re_renderer/src/wgpu_resources/sampler_pool.rs create mode 100644 crates/viewer/re_renderer/src/wgpu_resources/shader_module_pool.rs create mode 100644 crates/viewer/re_renderer/src/wgpu_resources/static_resource_pool.rs create mode 100644 crates/viewer/re_renderer/src/wgpu_resources/texture_pool.rs create mode 100644 crates/viewer/re_renderer/src/workspace_shaders.rs create mode 100644 crates/viewer/re_renderer/tests/shader_validation.rs create mode 100644 crates/viewer/re_renderer_examples/2d.rs create mode 100644 crates/viewer/re_renderer_examples/Cargo.toml create mode 100644 crates/viewer/re_renderer_examples/README.md create mode 100644 crates/viewer/re_renderer_examples/assets/rerun.obj.zip create mode 100644 crates/viewer/re_renderer_examples/depth_cloud.rs create mode 100644 crates/viewer/re_renderer_examples/depth_offset.rs create mode 100644 crates/viewer/re_renderer_examples/framework.rs create mode 100644 crates/viewer/re_renderer_examples/multiview.rs create mode 100644 crates/viewer/re_renderer_examples/outlines.rs create mode 100644 crates/viewer/re_renderer_examples/picking.rs create mode 100644 crates/viewer/re_renderer_examples/point_cloud_bench.rs create mode 100644 crates/viewer/re_renderer_examples/world_grid.rs create mode 100644 crates/viewer/re_selection_panel/Cargo.toml create mode 100644 crates/viewer/re_selection_panel/README.md create mode 100644 crates/viewer/re_selection_panel/src/defaults_ui.rs create mode 100644 crates/viewer/re_selection_panel/src/item_heading_no_breadcrumbs.rs create mode 100644 crates/viewer/re_selection_panel/src/item_heading_with_breadcrumbs.rs create mode 100644 crates/viewer/re_selection_panel/src/item_title.rs create mode 100644 crates/viewer/re_selection_panel/src/lib.rs create mode 100644 crates/viewer/re_selection_panel/src/selection_panel.rs create mode 100644 crates/viewer/re_selection_panel/src/view_entity_picker.rs create mode 100644 crates/viewer/re_selection_panel/src/view_space_origin_ui.rs create mode 100644 crates/viewer/re_selection_panel/src/visible_time_range_ui.rs create mode 100644 crates/viewer/re_selection_panel/src/visualizer_ui.rs create mode 100644 crates/viewer/re_selection_panel/tests/snapshots/selection_panel_component_hybrid_overwrite.png create mode 100644 crates/viewer/re_selection_panel/tests/snapshots/selection_panel_component_static.png create mode 100644 crates/viewer/re_selection_panel/tests/snapshots/selection_panel_component_static_overwrite.png create mode 100644 crates/viewer/re_selection_panel/tests/snapshots/selection_panel_component_temporal_latest_all.png create mode 100644 crates/viewer/re_selection_panel/tests/snapshots/selection_panel_component_temporal_latest_all_multi_instance.png create mode 100644 crates/viewer/re_selection_panel/tests/snapshots/selection_panel_entity_static_latest_all.png create mode 100644 crates/viewer/re_selection_panel/tests/snapshots/selection_panel_entity_temporal_latest_all.png create mode 100644 crates/viewer/re_selection_panel/tests/snapshots/selection_panel_recording.png create mode 100644 crates/viewer/re_selection_panel/tests/snapshots/selection_panel_recording_hover_app_id.png create mode 100644 crates/viewer/re_selection_panel/tests/snapshots/selection_panel_view.png create mode 100644 crates/viewer/re_selection_panel/tests/snapshots/selection_panel_view_entity_no_match.png create mode 100644 crates/viewer/re_selection_panel/tests/snapshots/selection_panel_view_entity_no_visualizable.png create mode 100644 crates/viewer/re_test_context/Cargo.toml create mode 100644 crates/viewer/re_test_context/README.md create mode 100644 crates/viewer/re_test_context/src/lib.rs create mode 100644 crates/viewer/re_test_viewport/Cargo.toml create mode 100644 crates/viewer/re_test_viewport/README.md create mode 100644 crates/viewer/re_test_viewport/src/lib.rs create mode 100644 crates/viewer/re_test_viewport/src/test_view.rs create mode 100644 crates/viewer/re_test_viewport/tests/show_hide_in_all_views.rs create mode 100644 crates/viewer/re_test_viewport/tests/view_query_tests.rs create mode 100644 crates/viewer/re_time_panel/Cargo.toml create mode 100644 crates/viewer/re_time_panel/README.md create mode 100644 crates/viewer/re_time_panel/benches/bench_density_graph.rs create mode 100644 crates/viewer/re_time_panel/src/data_density_graph.rs create mode 100644 crates/viewer/re_time_panel/src/lib.rs create mode 100644 crates/viewer/re_time_panel/src/recursive_chunks_per_timeline_subscriber.rs create mode 100644 crates/viewer/re_time_panel/src/streams_tree_data.rs create mode 100644 crates/viewer/re_time_panel/src/time_axis.rs create mode 100644 crates/viewer/re_time_panel/src/time_control_ui.rs create mode 100644 crates/viewer/re_time_panel/src/time_panel.rs create mode 100644 crates/viewer/re_time_panel/src/time_selection_ui.rs create mode 100644 crates/viewer/re_time_panel/tests/snapshots/focused_item_is_focused.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/help_view_timeline_mac.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/help_view_timeline_windows.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/time_panel_dense_data.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/time_panel_filter_test_active_no_query.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/time_panel_filter_test_active_query.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/time_panel_filter_test_inactive.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/time_panel_loading_unloaded_chunks.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/time_panel_only_unloaded_chunks.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/time_panel_partially_unloaded_chunks.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/time_panel_two_sections.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/time_panel_two_sections_with_two_valid_ranges.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/time_panel_two_sections_with_two_valid_ranges_zoomed_out.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/time_panel_two_sections_with_valid_range.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/time_panel_two_sections_with_valid_range_zoomed_out.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_entity_kinds_timeline_a_0.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_entity_kinds_timeline_a_5.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_entity_kinds_timeline_a_9223372036854775807.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_entity_kinds_timeline_b_0.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_entity_kinds_timeline_b_5.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_entity_kinds_timeline_b_9223372036854775807.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-_path_to,_rig.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-_path_to,_rig.snap create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-_to_the.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-_to_the.snap create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-_to_the_.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-_to_the_.snap create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-ath,left.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-ath,left.snap create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-ath,t.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-ath,t.snap create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-none.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-none.snap create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-path.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-path.snap create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-t.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-t.snap create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-to_the,oid.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-to_the,oid.snap create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-to_the.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-to_the.snap create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-to_the_.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-to_the_.snap create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-void.png create mode 100644 crates/viewer/re_time_panel/tests/snapshots/various_filters-void.snap create mode 100644 crates/viewer/re_time_panel/tests/time_panel_filter_tests.rs create mode 100644 crates/viewer/re_time_panel/tests/time_panel_tests.rs create mode 100644 crates/viewer/re_time_ruler/Cargo.toml create mode 100644 crates/viewer/re_time_ruler/README.md create mode 100644 crates/viewer/re_time_ruler/src/lib.rs create mode 100644 crates/viewer/re_time_ruler/src/paint_gaps.rs create mode 100644 crates/viewer/re_time_ruler/src/paint_ticks.rs create mode 100644 crates/viewer/re_time_ruler/src/time_ranges_ui.rs create mode 100644 crates/viewer/re_ui/Cargo.toml create mode 100644 crates/viewer/re_ui/README.md create mode 100644 crates/viewer/re_ui/build.rs create mode 100644 crates/viewer/re_ui/data/Inter-Medium.otf create mode 100644 crates/viewer/re_ui/data/Inter-README.txt create mode 100644 crates/viewer/re_ui/data/OFL.txt create mode 100644 crates/viewer/re_ui/data/color_table.ron create mode 100644 crates/viewer/re_ui/data/dark_theme.ron create mode 100644 crates/viewer/re_ui/data/icons/add.svg create mode 100644 crates/viewer/re_ui/data/icons/app.svg create mode 100644 crates/viewer/re_ui/data/icons/application.svg create mode 100644 crates/viewer/re_ui/data/icons/arrow_down.svg create mode 100644 crates/viewer/re_ui/data/icons/arrow_left.svg create mode 100644 crates/viewer/re_ui/data/icons/arrow_right.svg create mode 100644 crates/viewer/re_ui/data/icons/arrow_up.svg create mode 100644 crates/viewer/re_ui/data/icons/blueprint.svg create mode 100644 crates/viewer/re_ui/data/icons/bottom_panel_toggle.svg create mode 100644 crates/viewer/re_ui/data/icons/breadcrumbs_separator.svg create mode 100644 crates/viewer/re_ui/data/icons/checked.svg create mode 100644 crates/viewer/re_ui/data/icons/chevron.svg create mode 100644 crates/viewer/re_ui/data/icons/chrome_close.svg create mode 100644 crates/viewer/re_ui/data/icons/chrome_maximize.svg create mode 100644 crates/viewer/re_ui/data/icons/chrome_minimize.svg create mode 100644 crates/viewer/re_ui/data/icons/chrome_restore.svg create mode 100644 crates/viewer/re_ui/data/icons/close.svg create mode 100644 crates/viewer/re_ui/data/icons/close_small.svg create mode 100644 crates/viewer/re_ui/data/icons/column_visibility.svg create mode 100644 crates/viewer/re_ui/data/icons/columns.svg create mode 100644 crates/viewer/re_ui/data/icons/combo_arrow.svg create mode 100644 crates/viewer/re_ui/data/icons/command.svg create mode 100644 crates/viewer/re_ui/data/icons/component.svg create mode 100644 crates/viewer/re_ui/data/icons/component_static.svg create mode 100644 crates/viewer/re_ui/data/icons/container_grid.svg create mode 100644 crates/viewer/re_ui/data/icons/container_horizontal.svg create mode 100644 crates/viewer/re_ui/data/icons/container_tabs.svg create mode 100644 crates/viewer/re_ui/data/icons/container_vertical.svg create mode 100644 crates/viewer/re_ui/data/icons/control.svg create mode 100644 crates/viewer/re_ui/data/icons/copy.svg create mode 100644 crates/viewer/re_ui/data/icons/data_source.svg create mode 100644 crates/viewer/re_ui/data/icons/dataset.svg create mode 100644 crates/viewer/re_ui/data/icons/discord.svg create mode 100644 crates/viewer/re_ui/data/icons/dnd_add_new.svg create mode 100644 crates/viewer/re_ui/data/icons/dnd_add_to_existing.svg create mode 100644 crates/viewer/re_ui/data/icons/dnd_denied.svg create mode 100644 crates/viewer/re_ui/data/icons/dnd_handle.svg create mode 100644 crates/viewer/re_ui/data/icons/dnd_move.svg create mode 100644 crates/viewer/re_ui/data/icons/download.svg create mode 100644 crates/viewer/re_ui/data/icons/dropdown_arrow.svg create mode 100644 crates/viewer/re_ui/data/icons/edit.svg create mode 100644 crates/viewer/re_ui/data/icons/entity.svg create mode 100644 crates/viewer/re_ui/data/icons/entity_empty.svg create mode 100644 crates/viewer/re_ui/data/icons/entity_reserved.svg create mode 100644 crates/viewer/re_ui/data/icons/entity_reserved_empty.svg create mode 100644 crates/viewer/re_ui/data/icons/error.svg create mode 100644 crates/viewer/re_ui/data/icons/expand.svg create mode 100644 crates/viewer/re_ui/data/icons/external_link.svg create mode 100644 crates/viewer/re_ui/data/icons/filter.svg create mode 100644 crates/viewer/re_ui/data/icons/flag_toggled.svg create mode 100644 crates/viewer/re_ui/data/icons/flag_untoggled.svg create mode 100644 crates/viewer/re_ui/data/icons/follow.svg create mode 100644 crates/viewer/re_ui/data/icons/github.svg create mode 100644 crates/viewer/re_ui/data/icons/group.svg create mode 100644 crates/viewer/re_ui/data/icons/help.svg create mode 100644 crates/viewer/re_ui/data/icons/home.svg create mode 100644 crates/viewer/re_ui/data/icons/info.svg create mode 100644 crates/viewer/re_ui/data/icons/internal_link.svg create mode 100644 crates/viewer/re_ui/data/icons/invisible.svg create mode 100644 crates/viewer/re_ui/data/icons/left_panel_toggle.svg create mode 100644 crates/viewer/re_ui/data/icons/link.svg create mode 100644 crates/viewer/re_ui/data/icons/lmc.svg create mode 100644 crates/viewer/re_ui/data/icons/loop.svg create mode 100644 crates/viewer/re_ui/data/icons/maximize.svg create mode 100644 crates/viewer/re_ui/data/icons/minimize.svg create mode 100644 crates/viewer/re_ui/data/icons/more.svg create mode 100644 crates/viewer/re_ui/data/icons/notification.svg create mode 100644 crates/viewer/re_ui/data/icons/open_recording.svg create mode 100644 crates/viewer/re_ui/data/icons/option.svg create mode 100644 crates/viewer/re_ui/data/icons/pause.svg create mode 100644 crates/viewer/re_ui/data/icons/play.svg create mode 100644 crates/viewer/re_ui/data/icons/recording.svg create mode 100644 crates/viewer/re_ui/data/icons/remove.svg create mode 100644 crates/viewer/re_ui/data/icons/rerun_logo.png create mode 100644 crates/viewer/re_ui/data/icons/rerun_wordmark.svg create mode 100644 crates/viewer/re_ui/data/icons/reset.svg create mode 100644 crates/viewer/re_ui/data/icons/right_panel_toggle.svg create mode 100644 crates/viewer/re_ui/data/icons/rmc.svg create mode 100644 crates/viewer/re_ui/data/icons/scroll.svg create mode 100644 crates/viewer/re_ui/data/icons/search.svg create mode 100644 crates/viewer/re_ui/data/icons/settings.svg create mode 100644 crates/viewer/re_ui/data/icons/shift.svg create mode 100644 crates/viewer/re_ui/data/icons/success.svg create mode 100644 crates/viewer/re_ui/data/icons/table.svg create mode 100644 crates/viewer/re_ui/data/icons/table_grid_view.svg create mode 100644 crates/viewer/re_ui/data/icons/table_row_view.svg create mode 100644 crates/viewer/re_ui/data/icons/trash.svg create mode 100644 crates/viewer/re_ui/data/icons/url.svg create mode 100644 crates/viewer/re_ui/data/icons/video_error.svg create mode 100644 crates/viewer/re_ui/data/icons/view_2d.svg create mode 100644 crates/viewer/re_ui/data/icons/view_3d.svg create mode 100644 crates/viewer/re_ui/data/icons/view_dataframe.svg create mode 100644 crates/viewer/re_ui/data/icons/view_generic.svg create mode 100644 crates/viewer/re_ui/data/icons/view_graph.svg create mode 100644 crates/viewer/re_ui/data/icons/view_histogram.svg create mode 100644 crates/viewer/re_ui/data/icons/view_log.svg create mode 100644 crates/viewer/re_ui/data/icons/view_map.svg create mode 100644 crates/viewer/re_ui/data/icons/view_state_timeline.svg create mode 100644 crates/viewer/re_ui/data/icons/view_tensor.svg create mode 100644 crates/viewer/re_ui/data/icons/view_text.svg create mode 100644 crates/viewer/re_ui/data/icons/view_timeseries.svg create mode 100644 crates/viewer/re_ui/data/icons/view_unknown.svg create mode 100644 crates/viewer/re_ui/data/icons/visible.svg create mode 100644 crates/viewer/re_ui/data/icons/warn.svg create mode 100644 crates/viewer/re_ui/data/light_theme.ron create mode 100644 crates/viewer/re_ui/data/logo_dark_mode.png create mode 100644 crates/viewer/re_ui/data/logo_light_mode.png create mode 100644 crates/viewer/re_ui/examples/cmd_palette_example.rs create mode 100644 crates/viewer/re_ui/examples/re_ui_example/drag_and_drop.rs create mode 100644 crates/viewer/re_ui/examples/re_ui_example/hierarchical_drag_and_drop.rs create mode 100644 crates/viewer/re_ui/examples/re_ui_example/main.rs create mode 100644 crates/viewer/re_ui/examples/re_ui_example/right_panel.rs create mode 100644 crates/viewer/re_ui/src/alert.rs create mode 100644 crates/viewer/re_ui/src/button.rs create mode 100644 crates/viewer/re_ui/src/color_table.rs create mode 100644 crates/viewer/re_ui/src/combo_item.rs create mode 100644 crates/viewer/re_ui/src/command/environment.rs create mode 100644 crates/viewer/re_ui/src/command/mod.rs create mode 100644 crates/viewer/re_ui/src/command/recording_command.rs create mode 100644 crates/viewer/re_ui/src/command/redap_server_command.rs create mode 100644 crates/viewer/re_ui/src/command/table_command.rs create mode 100644 crates/viewer/re_ui/src/command/ui_command.rs create mode 100644 crates/viewer/re_ui/src/command_palette.rs create mode 100644 crates/viewer/re_ui/src/context_ext.rs create mode 100644 crates/viewer/re_ui/src/design_tokens.rs create mode 100644 crates/viewer/re_ui/src/drag_and_drop.rs create mode 100644 crates/viewer/re_ui/src/egui_ext/boxed_widget.rs create mode 100644 crates/viewer/re_ui/src/egui_ext/card_layout.rs create mode 100644 crates/viewer/re_ui/src/egui_ext/group.rs create mode 100644 crates/viewer/re_ui/src/egui_ext/kb_shortcut_ext.rs create mode 100644 crates/viewer/re_ui/src/egui_ext/layout_job_ext.rs create mode 100644 crates/viewer/re_ui/src/egui_ext/mod.rs create mode 100644 crates/viewer/re_ui/src/egui_ext/response_ext.rs create mode 100644 crates/viewer/re_ui/src/egui_ext/widget_ext.rs create mode 100644 crates/viewer/re_ui/src/egui_ext/widget_text_ext.rs create mode 100644 crates/viewer/re_ui/src/filter_widget.rs create mode 100644 crates/viewer/re_ui/src/fuzzy.rs create mode 100644 crates/viewer/re_ui/src/help.rs create mode 100644 crates/viewer/re_ui/src/hot_reload_design_tokens.rs create mode 100644 crates/viewer/re_ui/src/icon_text.rs create mode 100644 crates/viewer/re_ui/src/icons.rs create mode 100644 crates/viewer/re_ui/src/lib.rs create mode 100644 crates/viewer/re_ui/src/list_item/button_content.rs create mode 100644 crates/viewer/re_ui/src/list_item/custom_content.rs create mode 100644 crates/viewer/re_ui/src/list_item/debug_content.rs create mode 100644 crates/viewer/re_ui/src/list_item/item_buttons.rs create mode 100644 crates/viewer/re_ui/src/list_item/label_content.rs create mode 100644 crates/viewer/re_ui/src/list_item/list_item.rs create mode 100644 crates/viewer/re_ui/src/list_item/mod.rs create mode 100644 crates/viewer/re_ui/src/list_item/navigation.rs create mode 100644 crates/viewer/re_ui/src/list_item/property_content.rs create mode 100644 crates/viewer/re_ui/src/list_item/scope.rs create mode 100644 crates/viewer/re_ui/src/loading_indicator.rs create mode 100644 crates/viewer/re_ui/src/markdown_utils.rs create mode 100644 crates/viewer/re_ui/src/menu.rs create mode 100644 crates/viewer/re_ui/src/modal.rs create mode 100644 crates/viewer/re_ui/src/notifications.rs create mode 100644 crates/viewer/re_ui/src/re_form/fields.rs create mode 100644 crates/viewer/re_ui/src/re_form/form_strip.rs create mode 100644 crates/viewer/re_ui/src/re_form/mod.rs create mode 100644 crates/viewer/re_ui/src/re_form/selectable.rs create mode 100644 crates/viewer/re_ui/src/relative_time_range.rs create mode 100644 crates/viewer/re_ui/src/section_collapsing_header.rs create mode 100644 crates/viewer/re_ui/src/syntax_highlighting.rs create mode 100644 crates/viewer/re_ui/src/testing.rs create mode 100644 crates/viewer/re_ui/src/text_edit.rs create mode 100644 crates/viewer/re_ui/src/time.rs create mode 100644 crates/viewer/re_ui/src/time_drag_value.rs create mode 100644 crates/viewer/re_ui/src/ui_ext.rs create mode 100644 crates/viewer/re_ui/src/ui_layout.rs create mode 100644 crates/viewer/re_ui/src/wayland.rs create mode 100644 crates/viewer/re_ui/tests/command_palette_test.rs create mode 100644 crates/viewer/re_ui/tests/filter_widget_test.rs create mode 100644 crates/viewer/re_ui/tests/help_ui_test.rs create mode 100644 crates/viewer/re_ui/tests/list_item_tests.rs create mode 100644 crates/viewer/re_ui/tests/modal_tests.rs create mode 100644 crates/viewer/re_ui/tests/notification_test.rs create mode 100644 crates/viewer/re_ui/tests/snapshots/alert_dark.png create mode 100644 crates/viewer/re_ui/tests/snapshots/alert_light.png create mode 100644 crates/viewer/re_ui/tests/snapshots/combo_item.png create mode 100644 crates/viewer/re_ui/tests/snapshots/command_palette_enabled_vs_disabled.png create mode 100644 crates/viewer/re_ui/tests/snapshots/command_palette_expanded_group.png create mode 100644 crates/viewer/re_ui/tests/snapshots/command_palette_truncated_group.png create mode 100644 crates/viewer/re_ui/tests/snapshots/command_palette_wraps_long_paths.png create mode 100644 crates/viewer/re_ui/tests/snapshots/filter_widget.png create mode 100644 crates/viewer/re_ui/tests/snapshots/help_Mac.png create mode 100644 crates/viewer/re_ui/tests/snapshots/help_Windows.png create mode 100644 crates/viewer/re_ui/tests/snapshots/list_items.png create mode 100644 crates/viewer/re_ui/tests/snapshots/modal_list_item.png create mode 100644 crates/viewer/re_ui/tests/snapshots/modal_normal.png create mode 100644 crates/viewer/re_ui/tests/snapshots/notification_with_fields.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_absolute_duration.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_absolute_sequence.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_absolute_timestamp.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_absolute_to_end_duration.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_absolute_to_end_sequence.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_absolute_to_end_timestamp.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_around_cursor_duration.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_around_cursor_sequence.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_around_cursor_timestamp.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_at_cursor_duration.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_at_cursor_sequence.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_at_cursor_timestamp.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_cursor_to_end_duration.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_cursor_to_end_sequence.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_cursor_to_end_timestamp.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_everything_duration.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_everything_sequence.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_everything_timestamp.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_start_to_absolute_duration.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_start_to_absolute_sequence.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_start_to_absolute_timestamp.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_start_to_cursor_duration.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_start_to_cursor_sequence.png create mode 100644 crates/viewer/re_ui/tests/snapshots/relative_time_range_start_to_cursor_timestamp.png create mode 100644 crates/viewer/re_view/Cargo.toml create mode 100644 crates/viewer/re_view/README.md create mode 100644 crates/viewer/re_view/src/annotation_context_utils.rs create mode 100644 crates/viewer/re_view/src/annotation_scene_context.rs create mode 100644 crates/viewer/re_view/src/blueprint_resolved_results.rs create mode 100644 crates/viewer/re_view/src/chunks_with_component.rs create mode 100644 crates/viewer/re_view/src/clears.rs create mode 100644 crates/viewer/re_view/src/component_drop.rs create mode 100644 crates/viewer/re_view/src/controls.rs create mode 100644 crates/viewer/re_view/src/instance_hash_conversions.rs create mode 100644 crates/viewer/re_view/src/lib.rs create mode 100644 crates/viewer/re_view/src/outlines.rs create mode 100644 crates/viewer/re_view/src/query.rs create mode 100644 crates/viewer/re_view/src/view_property_ui.rs create mode 100644 crates/viewer/re_view/src/visualizer_query.rs create mode 100644 crates/viewer/re_view_bar_chart/Cargo.toml create mode 100644 crates/viewer/re_view_bar_chart/README.md create mode 100644 crates/viewer/re_view_bar_chart/src/lib.rs create mode 100644 crates/viewer/re_view_bar_chart/src/view_class.rs create mode 100644 crates/viewer/re_view_bar_chart/src/visualizer_system.rs create mode 100644 crates/viewer/re_view_bar_chart/tests/bar_chart_test.rs create mode 100644 crates/viewer/re_view_bar_chart/tests/snapshots/bar_chart_1d.png create mode 100644 crates/viewer/re_view_bar_chart/tests/snapshots/help_view_bar_chart_view_mac.png create mode 100644 crates/viewer/re_view_bar_chart/tests/snapshots/help_view_bar_chart_view_windows.png create mode 100644 crates/viewer/re_view_dataframe/Cargo.toml create mode 100644 crates/viewer/re_view_dataframe/README.md create mode 100644 crates/viewer/re_view_dataframe/src/dataframe_ui.rs create mode 100644 crates/viewer/re_view_dataframe/src/expanded_rows.rs create mode 100644 crates/viewer/re_view_dataframe/src/lib.rs create mode 100644 crates/viewer/re_view_dataframe/src/view_class.rs create mode 100644 crates/viewer/re_view_dataframe/src/view_query/blueprint.rs create mode 100644 crates/viewer/re_view_dataframe/src/view_query/mod.rs create mode 100644 crates/viewer/re_view_dataframe/src/view_query/ui.rs create mode 100644 crates/viewer/re_view_dataframe/src/visualizer_system.rs create mode 100644 crates/viewer/re_view_dataframe/tests/basic.rs create mode 100644 crates/viewer/re_view_dataframe/tests/snapshots/help_view_dataframe_view_mac.png create mode 100644 crates/viewer/re_view_dataframe/tests/snapshots/help_view_dataframe_view_windows.png create mode 100644 crates/viewer/re_view_dataframe/tests/snapshots/null_timeline.png create mode 100644 crates/viewer/re_view_dataframe/tests/snapshots/unknown_timeline_selection_panel_ui.png create mode 100644 crates/viewer/re_view_dataframe/tests/snapshots/unknown_timeline_view_ui.png create mode 100644 crates/viewer/re_view_graph/Cargo.toml create mode 100644 crates/viewer/re_view_graph/README.md create mode 100644 crates/viewer/re_view_graph/src/graph/hash.rs create mode 100644 crates/viewer/re_view_graph/src/graph/ids.rs create mode 100644 crates/viewer/re_view_graph/src/graph/mod.rs create mode 100644 crates/viewer/re_view_graph/src/layout/geometry.rs create mode 100644 crates/viewer/re_view_graph/src/layout/mod.rs create mode 100644 crates/viewer/re_view_graph/src/layout/params.rs create mode 100644 crates/viewer/re_view_graph/src/layout/provider.rs create mode 100644 crates/viewer/re_view_graph/src/layout/request.rs create mode 100644 crates/viewer/re_view_graph/src/layout/result.rs create mode 100644 crates/viewer/re_view_graph/src/layout/slots.rs create mode 100644 crates/viewer/re_view_graph/src/lib.rs create mode 100644 crates/viewer/re_view_graph/src/ui/draw.rs create mode 100644 crates/viewer/re_view_graph/src/ui/mod.rs create mode 100644 crates/viewer/re_view_graph/src/ui/selection.rs create mode 100644 crates/viewer/re_view_graph/src/ui/state.rs create mode 100644 crates/viewer/re_view_graph/src/view.rs create mode 100644 crates/viewer/re_view_graph/src/visualizers/edges.rs create mode 100644 crates/viewer/re_view_graph/src/visualizers/mod.rs create mode 100644 crates/viewer/re_view_graph/src/visualizers/nodes.rs create mode 100644 crates/viewer/re_view_graph/tests/basic.rs create mode 100644 crates/viewer/re_view_graph/tests/snapshots/coincident_nodes.png create mode 100644 crates/viewer/re_view_graph/tests/snapshots/help_view_graph_view_mac.png create mode 100644 crates/viewer/re_view_graph/tests/snapshots/help_view_graph_view_windows.png create mode 100644 crates/viewer/re_view_graph/tests/snapshots/multi_graphs.png create mode 100644 crates/viewer/re_view_graph/tests/snapshots/self_and_multi_edges.png create mode 100644 crates/viewer/re_view_map/Cargo.toml create mode 100644 crates/viewer/re_view_map/README.md create mode 100644 crates/viewer/re_view_map/src/lib.rs create mode 100644 crates/viewer/re_view_map/src/map_overlays.rs create mode 100644 crates/viewer/re_view_map/src/map_view.rs create mode 100644 crates/viewer/re_view_map/src/visualizers/geo_line_strings.rs create mode 100644 crates/viewer/re_view_map/src/visualizers/geo_points.rs create mode 100644 crates/viewer/re_view_map/src/visualizers/mod.rs create mode 100644 crates/viewer/re_view_map/tests/snapshots/help_view_map_view_mac.png create mode 100644 crates/viewer/re_view_map/tests/snapshots/help_view_map_view_windows.png create mode 100644 crates/viewer/re_view_spatial/Cargo.toml create mode 100644 crates/viewer/re_view_spatial/README.md create mode 100644 crates/viewer/re_view_spatial/src/caches/mesh_cache.rs create mode 100644 crates/viewer/re_view_spatial/src/caches/mod.rs create mode 100644 crates/viewer/re_view_spatial/src/contexts/depth_offsets.rs create mode 100644 crates/viewer/re_view_spatial/src/contexts/mod.rs create mode 100644 crates/viewer/re_view_spatial/src/contexts/transform_tree_context.rs create mode 100644 crates/viewer/re_view_spatial/src/eye.rs create mode 100644 crates/viewer/re_view_spatial/src/heuristics.rs create mode 100644 crates/viewer/re_view_spatial/src/lib.rs create mode 100644 crates/viewer/re_view_spatial/src/max_image_dimension_subscriber.rs create mode 100644 crates/viewer/re_view_spatial/src/mesh_loader.rs create mode 100644 crates/viewer/re_view_spatial/src/pickable_textured_rect.rs create mode 100644 crates/viewer/re_view_spatial/src/picking.rs create mode 100644 crates/viewer/re_view_spatial/src/picking_ui.rs create mode 100644 crates/viewer/re_view_spatial/src/picking_ui_pixel.rs create mode 100644 crates/viewer/re_view_spatial/src/pinhole.rs create mode 100644 crates/viewer/re_view_spatial/src/pinhole_wrapper.rs create mode 100644 crates/viewer/re_view_spatial/src/proc_mesh.rs create mode 100644 crates/viewer/re_view_spatial/src/scene_bounding_boxes.rs create mode 100644 crates/viewer/re_view_spatial/src/shared_fallbacks.rs create mode 100644 crates/viewer/re_view_spatial/src/spatial_topology.rs create mode 100644 crates/viewer/re_view_spatial/src/ui.rs create mode 100644 crates/viewer/re_view_spatial/src/ui_2d.rs create mode 100644 crates/viewer/re_view_spatial/src/ui_3d.rs create mode 100644 crates/viewer/re_view_spatial/src/view_2d.rs create mode 100644 crates/viewer/re_view_spatial/src/view_3d.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/arrows2d.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/arrows3d.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/assets3d.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/boxes2d.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/boxes3d.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/cameras.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/capsules3d.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/cylinders3d.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/depth_images.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/ellipses2d.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/ellipsoids.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/grid_map.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/images.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/lines2d.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/lines3d.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/meshes.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/mod.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/points2d.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/points3d.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/segmentation_images.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/transform_axes_3d.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/utilities/entity_iterator.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/utilities/labels.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/utilities/mod.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/utilities/proc_mesh_vis.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/utilities/spatial_view_visualizer.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/utilities/textured_rect.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/utilities/transform_retrieval.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/video/encoded_depth_image.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/video/encoded_image.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/video/mod.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/video/video_frame_reference.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/video/video_stream.rs create mode 100644 crates/viewer/re_view_spatial/src/visualizers/voxel_grid_map.rs create mode 100644 crates/viewer/re_view_spatial/tests/annotation_context_update.rs create mode 100644 crates/viewer/re_view_spatial/tests/annotations.rs create mode 100644 crates/viewer/re_view_spatial/tests/bgr_images.rs create mode 100644 crates/viewer/re_view_spatial/tests/blueprint_2d.rs create mode 100644 crates/viewer/re_view_spatial/tests/chroma_subsampling.rs create mode 100644 crates/viewer/re_view_spatial/tests/dae_mesh.rs create mode 100644 crates/viewer/re_view_spatial/tests/draw_order.rs create mode 100644 crates/viewer/re_view_spatial/tests/grid_map.rs create mode 100644 crates/viewer/re_view_spatial/tests/latest_at_partial_updates.rs create mode 100644 crates/viewer/re_view_spatial/tests/magnification_filter.rs create mode 100644 crates/viewer/re_view_spatial/tests/mesh.rs create mode 100644 crates/viewer/re_view_spatial/tests/mesh_face_rendering.rs create mode 100644 crates/viewer/re_view_spatial/tests/opacity_2d.rs create mode 100644 crates/viewer/re_view_spatial/tests/partial_view_visibility.rs create mode 100644 crates/viewer/re_view_spatial/tests/pinhole_camera.rs create mode 100644 crates/viewer/re_view_spatial/tests/pinhole_draw_order.rs create mode 100644 crates/viewer/re_view_spatial/tests/point_shading.rs create mode 100644 crates/viewer/re_view_spatial/tests/points2d_ui_radius.rs create mode 100644 crates/viewer/re_view_spatial/tests/project_2d_and_3d.rs create mode 100644 crates/viewer/re_view_spatial/tests/segmentation_image_transparency.rs create mode 100644 crates/viewer/re_view_spatial/tests/select_box_instances.rs create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/2d_in_3d_at_origin.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/2d_in_3d_at_root.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/2d_in_3d_with_explicit_frames_at_origin.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/2d_in_3d_with_explicit_frames_at_root.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/3d_in_2d.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/3d_in_2d_with_explicit_frames.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/annotation_context_update_frame1.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/annotation_context_update_frame2.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/annotations_hover_background.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/annotations_hover_rect_green.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/annotations_hover_rect_red.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/annotations_hover_region_green.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/annotations_hover_region_red.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/annotations_overview.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/bgr_images_bgr_f16.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/bgr_images_bgr_f32.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/bgr_images_bgr_f64.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/bgr_images_bgr_i16.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/bgr_images_bgr_i32.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/bgr_images_bgr_i64.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/bgr_images_bgr_u16.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/bgr_images_bgr_u32.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/bgr_images_bgr_u64.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/bgr_images_bgr_u8.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/bgr_images_bgra_f16.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/bgr_images_bgra_f32.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/bgr_images_bgra_f64.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/bgr_images_bgra_i16.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/bgr_images_bgra_i32.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/bgr_images_bgra_i64.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/bgr_images_bgra_u16.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/bgr_images_bgra_u32.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/bgr_images_bgra_u64.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/bgr_images_bgra_u8.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/blueprint_defaults_with_spatial_2d.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/blueprint_no_overrides_or_defaults_with_spatial_2d.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/blueprint_overrides_with_spatial_2d.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/chroma_nv12.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/chroma_y8_full.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/chroma_y8_limited.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/chroma_y_u_v12_full.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/chroma_y_u_v12_limited.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/chroma_y_u_v16_full.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/chroma_y_u_v16_limited.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/chroma_y_u_v24_full.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/chroma_y_u_v24_limited.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/chroma_yuy2.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/dae_mesh_import.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/dae_multi_triangle_groups.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/draw_order.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/grid_map_rviz_costmap.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/grid_map_rviz_map.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/grid_map_texel_accuracy.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/help_view_2d_view_mac.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/help_view_2d_view_windows.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/help_view_3d_view_mac.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/help_view_3d_view_windows.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/image_from_tensor_1d.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/intra_timestamp/42_42.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/intra_timestamp/42_44.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/intra_timestamp/43_44.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/intra_timestamp/43_45.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/intra_timestamp/46_46.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/intra_timestamp/infinity_infinity.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/latest_at_partial_updates/frame_42.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/latest_at_partial_updates/frame_43.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/latest_at_partial_updates/frame_44.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/latest_at_partial_updates/frame_45.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/latest_at_partial_updates/frame_46.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/magnification_filter_bicubic.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/magnification_filter_depth_image_bicubic.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/magnification_filter_depth_image_linear.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/magnification_filter_depth_image_nearest.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/magnification_filter_linear.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/magnification_filter_nearest.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/mesh3d_grayscale_texture.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/mesh_face_rendering_back_opaque.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/mesh_face_rendering_back_transparent.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/mesh_face_rendering_double_sided_opaque.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/mesh_face_rendering_double_sided_transparent.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/mesh_face_rendering_front_opaque.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/mesh_face_rendering_front_transparent.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/opacity_2d.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/partial_view_visibility_2d.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/partial_view_visibility_3d.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/pinhole_camera.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/pinhole_draw_order_black_above_white.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/pinhole_draw_order_black_above_white_transparent.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/pinhole_draw_order_sandwiched_opaque_red.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/pinhole_draw_order_selection_outline_single_entity.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/pinhole_draw_order_white_above_black.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/pinhole_draw_order_white_above_black_transparent.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/point_shading.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/points2d_ui_radius_constant_across_positions.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/segmentation_image_transparency.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/select_box_instances_0.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/select_box_instances_1.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/select_box_instances_all.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/spawn_heuristics__2d_and_3d_view_nothing_excluded.snap create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/spawn_heuristics__detect_and_track_objects_like_scene_2d_view_heuristic.snap create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/spawn_heuristics__four_color_views_and_one_segmentation.snap create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/spawn_heuristics__four_space_views_with_one_overlapping.snap create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/spawn_heuristics__one_3d_view_one_2d_view.snap create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/spawn_heuristics__should_be_a_single_view.snap create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/spawn_heuristics__should_be_three_2d_and_one_3d.snap create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/spawn_heuristics__should_be_two_separate_views_because_differing_sizes.snap create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/spawn_heuristics__should_be_two_separate_views_because_we_cant_stack_color_images.snap create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/spawn_heuristics__three_2d_views_and_one_3d_excluding_images.snap create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/static_overwrite_color_override.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/static_overwrite_original.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/static_overwrite_radius_default.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/topology_errors__2d_view_at_pinhole.snap create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/topology_errors__2d_view_at_root.snap create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/topology_errors__3d_view_at_pinhole.snap create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/topology_errors__3d_view_at_root.snap create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/topology_errors__topology_error_empty_coordinate_frame_name.snap create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_axes_for_explicit_transforms.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_clamping_with_base_transform_EntityHierarchy_boxes.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_clamping_with_base_transform_EntityHierarchy_points.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_clamping_with_base_transform_EntityHierarchy_spheres.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_clamping_with_base_transform_EntityHierarchy_transform_axes.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_clamping_with_base_transform_FrameHierarchy_boxes.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_clamping_with_base_transform_FrameHierarchy_points.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_clamping_with_base_transform_FrameHierarchy_spheres.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_clamping_with_base_transform_FrameHierarchy_transform_axes.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_clamping_with_base_transform_None_boxes.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_clamping_with_base_transform_None_points.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_clamping_with_base_transform_None_spheres.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_clamping_with_base_transform_None_transform_axes.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_cleared_coordinate_frame_overrides_fall_through_to_store.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_hierarchy_step_0.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_hierarchy_step_1.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_hierarchy_step_2.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_hierarchy_step_3.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_hierarchy_step_4.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_hierarchy_step_5.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_hierarchy_step_6.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_hierarchy_step_7.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_many_child_parent_relations_on_single_time_and_entity.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_many_child_parent_relations_on_single_time_and_entity_with_coordinate_frame_overrides.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_tree_origins__sun.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_tree_origins__sun_planet.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_tree_origins__sun_planet_moon.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transform_tree_visualization.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transparent_boxes3d_0.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transparent_boxes3d_1.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transparent_capsules3d_0.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transparent_capsules3d_1.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transparent_cylinders3d_0.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transparent_cylinders3d_1.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transparent_ellipsoids3d_0.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transparent_ellipsoids3d_1.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transparent_mesh_0.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/transparent_mesh_1.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_asset_AV1_before_start.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_asset_AV1_beyond_end.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_asset_AV1_not_on_frame_boundary.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_asset_AV1_start.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_asset_H264_before_start.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_asset_H264_beyond_end.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_asset_H264_not_on_frame_boundary.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_asset_H264_start.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_asset_H265_before_start.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_asset_H265_beyond_end.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_asset_H265_not_on_frame_boundary.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_asset_H265_start.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_asset_VP8_before_start.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_asset_VP8_beyond_end.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_asset_VP8_not_on_frame_boundary.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_asset_VP8_start.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_asset_VP9_before_start.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_asset_VP9_beyond_end.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_asset_VP9_not_on_frame_boundary.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_asset_VP9_start.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_stream_AV1_before_start.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_stream_AV1_beyond_end.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_stream_AV1_not_on_frame_boundary.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_stream_AV1_start.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_stream_H264_before_start.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_stream_H264_beyond_end.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_stream_H264_not_on_frame_boundary.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_stream_H264_start.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_stream_H265_before_start.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_stream_H265_beyond_end.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_stream_H265_not_on_frame_boundary.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_stream_H265_start.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_stream_VP8_before_start.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_stream_VP8_beyond_end.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_stream_VP8_not_on_frame_boundary.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_stream_VP8_start.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_stream_VP9_before_start.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_stream_VP9_beyond_end.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_stream_VP9_not_on_frame_boundary.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/video_stream_VP9_start.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/visible_time_range_2d/absolute.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/visible_time_range_2d/cursor_relative.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/visible_time_range_2d/infinite.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/visible_time_range_2d/latest_at.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/visible_time_range_2d/override.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/visible_time_range_3d/absolute.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/visible_time_range_3d/cursor_relative.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/visible_time_range_3d/infinite.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/visible_time_range_3d/latest_at.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/visible_time_range_3d/override.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/visible_time_range_3d/sliding_window_cursor_1.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/visible_time_range_3d/sliding_window_cursor_2.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/visible_time_range_3d/sliding_window_cursor_3.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/voxel_grid_map.png create mode 100644 crates/viewer/re_view_spatial/tests/snapshots/voxel_grid_map_transparent_opacity.png create mode 100644 crates/viewer/re_view_spatial/tests/spawn_heuristics.rs create mode 100644 crates/viewer/re_view_spatial/tests/static_overwrite.rs create mode 100644 crates/viewer/re_view_spatial/tests/topology_errors.rs create mode 100644 crates/viewer/re_view_spatial/tests/transform_child_parent_single_time.rs create mode 100644 crates/viewer/re_view_spatial/tests/transform_clamping.rs create mode 100644 crates/viewer/re_view_spatial/tests/transform_hierarchy.rs create mode 100644 crates/viewer/re_view_spatial/tests/transform_tree_origins.rs create mode 100644 crates/viewer/re_view_spatial/tests/transform_tree_visualization.rs create mode 100644 crates/viewer/re_view_spatial/tests/transparent_geometry.rs create mode 100644 crates/viewer/re_view_spatial/tests/video.rs create mode 100644 crates/viewer/re_view_spatial/tests/visible_time_range.rs create mode 100644 crates/viewer/re_view_spatial/tests/voxel_grid_map.rs create mode 100644 crates/viewer/re_view_state_timeline/Cargo.toml create mode 100644 crates/viewer/re_view_state_timeline/README.md create mode 100644 crates/viewer/re_view_state_timeline/src/data.rs create mode 100644 crates/viewer/re_view_state_timeline/src/lib.rs create mode 100644 crates/viewer/re_view_state_timeline/src/view_class.rs create mode 100644 crates/viewer/re_view_state_timeline/src/visualizer.rs create mode 100644 crates/viewer/re_view_state_timeline/src/visualizer_ui.rs create mode 100644 crates/viewer/re_view_state_timeline/tests/basic.rs create mode 100644 crates/viewer/re_view_state_timeline/tests/snapshots/help_view_state_timeline_view_mac.png create mode 100644 crates/viewer/re_view_state_timeline/tests/snapshots/help_view_state_timeline_view_windows.png create mode 100644 crates/viewer/re_view_state_timeline/tests/snapshots/state_cast_bool.png create mode 100644 crates/viewer/re_view_state_timeline/tests/snapshots/state_cast_float64.png create mode 100644 crates/viewer/re_view_state_timeline/tests/snapshots/state_cast_int32.png create mode 100644 crates/viewer/re_view_state_timeline/tests/snapshots/state_cast_multi_different_types.png create mode 100644 crates/viewer/re_view_state_timeline/tests/snapshots/state_cast_multi_same_type.png create mode 100644 crates/viewer/re_view_state_timeline/tests/snapshots/state_cast_string.png create mode 100644 crates/viewer/re_view_state_timeline/tests/snapshots/state_cast_textlog.png create mode 100644 crates/viewer/re_view_state_timeline/tests/snapshots/state_configuration.png create mode 100644 crates/viewer/re_view_state_timeline/tests/snapshots/state_timeline_basic.png create mode 100644 crates/viewer/re_view_state_timeline/tests/snapshots/state_timeline_edge_cases.png create mode 100644 crates/viewer/re_view_state_timeline/tests/snapshots/state_timeline_empty_and_clear.png create mode 100644 crates/viewer/re_view_state_timeline/tests/snapshots/state_timeline_merge_small_phases.png create mode 100644 crates/viewer/re_view_state_timeline/tests/snapshots/state_timeline_null_is_reset.png create mode 100644 crates/viewer/re_view_state_timeline/tests/snapshots/state_timeline_pan_before_data.png create mode 100644 crates/viewer/re_view_state_timeline/tests/snapshots/state_timeline_pan_past_data.png create mode 100644 crates/viewer/re_view_state_timeline/tests/snapshots/state_timeline_recursive_clear.png create mode 100644 crates/viewer/re_view_state_timeline/tests/snapshots/state_timeline_time_cursor.png create mode 100644 crates/viewer/re_view_state_timeline/tests/snapshots/state_timeline_timeline_switch_sequence.png create mode 100644 crates/viewer/re_view_state_timeline/tests/snapshots/state_timeline_timeline_switch_timestamp.png create mode 100644 crates/viewer/re_view_state_timeline/tests/snapshots/state_timeline_zoom_after.png create mode 100644 crates/viewer/re_view_state_timeline/tests/snapshots/state_timeline_zoom_before.png create mode 100644 crates/viewer/re_view_state_timeline/tests/state_casting.rs create mode 100644 crates/viewer/re_view_tensor/Cargo.toml create mode 100644 crates/viewer/re_view_tensor/README.md create mode 100644 crates/viewer/re_view_tensor/src/dimension_mapping.rs create mode 100644 crates/viewer/re_view_tensor/src/lib.rs create mode 100644 crates/viewer/re_view_tensor/src/tensor_dimension_mapper.rs create mode 100644 crates/viewer/re_view_tensor/src/tensor_slice_to_gpu.rs create mode 100644 crates/viewer/re_view_tensor/src/tensor_tests.rs create mode 100644 crates/viewer/re_view_tensor/src/view_class.rs create mode 100644 crates/viewer/re_view_tensor/src/visualizer_system.rs create mode 100644 crates/viewer/re_view_tensor/tests/snapshots/help_view_tensor_view_mac.png create mode 100644 crates/viewer/re_view_tensor/tests/snapshots/help_view_tensor_view_windows.png create mode 100644 crates/viewer/re_view_tensor/tests/snapshots/tensor_1d.png create mode 100644 crates/viewer/re_view_tensor/tests/snapshots/tensor_2d_both.png create mode 100644 crates/viewer/re_view_tensor/tests/snapshots/tensor_2d_root.png create mode 100644 crates/viewer/re_view_tensor/tests/snapshots/tensor_2d_t1.png create mode 100644 crates/viewer/re_view_tensor/tests/snapshots/tensor_2d_t2.png create mode 100644 crates/viewer/re_view_tensor/tests/tensor_1d.rs create mode 100644 crates/viewer/re_view_tensor/tests/tensor_2d.rs create mode 100644 crates/viewer/re_view_text_document/Cargo.toml create mode 100644 crates/viewer/re_view_text_document/README.md create mode 100644 crates/viewer/re_view_text_document/src/lib.rs create mode 100644 crates/viewer/re_view_text_document/src/view_class.rs create mode 100644 crates/viewer/re_view_text_document/src/visualizer_system.rs create mode 100644 crates/viewer/re_view_text_document/tests/snapshots/help_view_text_document_view_mac.png create mode 100644 crates/viewer/re_view_text_document/tests/snapshots/help_view_text_document_view_windows.png create mode 100644 crates/viewer/re_view_text_document/tests/snapshots/text_view_both.png create mode 100644 crates/viewer/re_view_text_document/tests/snapshots/text_view_one.png create mode 100644 crates/viewer/re_view_text_document/tests/snapshots/text_view_root.png create mode 100644 crates/viewer/re_view_text_document/tests/snapshots/text_view_two.png create mode 100644 crates/viewer/re_view_text_document/tests/text_document_test.rs create mode 100644 crates/viewer/re_view_text_log/Cargo.toml create mode 100644 crates/viewer/re_view_text_log/README.md create mode 100644 crates/viewer/re_view_text_log/src/lib.rs create mode 100644 crates/viewer/re_view_text_log/src/view_class.rs create mode 100644 crates/viewer/re_view_text_log/src/visualizer_system.rs create mode 100644 crates/viewer/re_view_text_log/tests/basic.rs create mode 100644 crates/viewer/re_view_text_log/tests/snapshots/help_view_text_log_view_mac.png create mode 100644 crates/viewer/re_view_text_log/tests/snapshots/help_view_text_log_view_windows.png create mode 100644 crates/viewer/re_view_text_log/tests/snapshots/text_log_temporal_anchor_between_steps_first_chunk.png create mode 100644 crates/viewer/re_view_text_log/tests/snapshots/text_log_temporal_anchor_between_steps_rest.png create mode 100644 crates/viewer/re_view_time_series/Cargo.toml create mode 100644 crates/viewer/re_view_time_series/README.md create mode 100644 crates/viewer/re_view_time_series/src/aggregation.rs create mode 100644 crates/viewer/re_view_time_series/src/fallbacks.rs create mode 100644 crates/viewer/re_view_time_series/src/lib.rs create mode 100644 crates/viewer/re_view_time_series/src/line_visualizer_system.rs create mode 100644 crates/viewer/re_view_time_series/src/markers.rs create mode 100644 crates/viewer/re_view_time_series/src/naming.rs create mode 100644 crates/viewer/re_view_time_series/src/point_visualizer_system.rs create mode 100644 crates/viewer/re_view_time_series/src/series_query.rs create mode 100644 crates/viewer/re_view_time_series/src/util.rs create mode 100644 crates/viewer/re_view_time_series/src/view_class.rs create mode 100644 crates/viewer/re_view_time_series/src/visualizer_ui.rs create mode 100644 crates/viewer/re_view_time_series/tests/automatic_mapping.rs create mode 100644 crates/viewer/re_view_time_series/tests/basic.rs create mode 100644 crates/viewer/re_view_time_series/tests/blueprint.rs create mode 100644 crates/viewer/re_view_time_series/tests/component_drop.rs create mode 100644 crates/viewer/re_view_time_series/tests/interpolation.rs create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/all_neg_inf.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/all_pos_inf.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/blueprint_overrides_and_defaults_with_time_series.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/blueprint_overrides_and_defaults_with_time_series_absolute.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/blueprint_overrides_and_defaults_with_time_series_absolute_until_end.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/blueprint_overrides_and_defaults_with_time_series_around_cursor.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/blueprint_overrides_and_defaults_with_time_series_at_cursor.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/blueprint_overrides_and_defaults_with_time_series_everything.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/blueprint_overrides_and_defaults_with_time_series_start_until_absolute.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/bootstrapped_secondaries_full.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/bootstrapped_secondaries_partial.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/clear_series_points_and_line.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/clear_series_points_and_line_two_series_per_entity.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/custom_scalar_component_identifier.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/explicit_component_mapping.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/explicit_component_mapping_nested.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/help_view_time_series_view_mac.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/help_view_time_series_view_windows.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/interpolation_mode_Linear.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/interpolation_mode_StepAfter.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/interpolation_mode_StepBefore.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/interpolation_mode_StepMid.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/line_properties_multiple_properties_two_series_per_entity.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/line_properties_two_series_per_entity.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/multi_channel_scalars_per_entity.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/non_finite_islands.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/per_series_visibility_show_second_only.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/per_series_visibility_splat_false.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/per_series_visibility_splat_true.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/point_properties.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/point_properties_multiple_properties_two_series_per_entity.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/point_properties_two_series_per_entity.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/special_characters_in_entity_path.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/time_series_temporal_anchor_between_steps_first_chunk.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/time_series_temporal_anchor_between_steps_rest.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/transform3d_time_series.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/visible_time_range_absolute_until_end_view_data.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/visible_time_range_absolute_until_end_view_timeline.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/visible_time_range_absolute_view_data.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/visible_time_range_absolute_view_timeline.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/visible_time_range_around_cursor_view_data.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/visible_time_range_around_cursor_view_timeline.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/visible_time_range_everything_view_data.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/visible_time_range_everything_view_timeline.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/visible_time_range_start_until_absolute_view_data.png create mode 100644 crates/viewer/re_view_time_series/tests/snapshots/visible_time_range_start_until_absolute_view_timeline.png create mode 100644 crates/viewer/re_viewer/Cargo.toml create mode 100644 crates/viewer/re_viewer/README.md create mode 100644 crates/viewer/re_viewer/build.rs create mode 100644 crates/viewer/re_viewer/data/app_icon.png create mode 100644 crates/viewer/re_viewer/data/app_icon_mac.png create mode 100644 crates/viewer/re_viewer/data/quick_start_guides/cpp_connect.md create mode 100644 crates/viewer/re_viewer/data/quick_start_guides/cpp_spawn.md create mode 100644 crates/viewer/re_viewer/data/quick_start_guides/how_does_it_work.md create mode 100644 crates/viewer/re_viewer/data/quick_start_guides/python_connect.md create mode 100644 crates/viewer/re_viewer/data/quick_start_guides/python_spawn.md create mode 100644 crates/viewer/re_viewer/data/quick_start_guides/quick_start_connect.cpp create mode 100644 crates/viewer/re_viewer/data/quick_start_guides/quick_start_connect.py create mode 100644 crates/viewer/re_viewer/data/quick_start_guides/quick_start_connect.rs create mode 100644 crates/viewer/re_viewer/data/quick_start_guides/quick_start_spawn.cpp create mode 100644 crates/viewer/re_viewer/data/quick_start_guides/quick_start_spawn.py create mode 100644 crates/viewer/re_viewer/data/quick_start_guides/quick_start_spawn.rs create mode 100644 crates/viewer/re_viewer/data/quick_start_guides/rust_connect.md create mode 100644 crates/viewer/re_viewer/data/quick_start_guides/rust_spawn.md create mode 100644 crates/viewer/re_viewer/data/user_image.jpg create mode 100644 crates/viewer/re_viewer/src/.gitattributes create mode 100644 crates/viewer/re_viewer/src/app/add_data_source.rs create mode 100644 crates/viewer/re_viewer/src/app/command_handling.rs create mode 100644 crates/viewer/re_viewer/src/app/logic.rs create mode 100644 crates/viewer/re_viewer/src/app/mod.rs create mode 100644 crates/viewer/re_viewer/src/app/ui.rs create mode 100644 crates/viewer/re_viewer/src/app_blueprint.rs create mode 100644 crates/viewer/re_viewer/src/app_state.rs create mode 100644 crates/viewer/re_viewer/src/background_tasks.rs create mode 100644 crates/viewer/re_viewer/src/bin/viewer/main.rs create mode 100644 crates/viewer/re_viewer/src/blueprint/mod.rs create mode 100644 crates/viewer/re_viewer/src/blueprint/validation.rs create mode 100644 crates/viewer/re_viewer/src/blueprint/validation_gen/.gitattributes create mode 100644 crates/viewer/re_viewer/src/blueprint/validation_gen/mod.rs create mode 100644 crates/viewer/re_viewer/src/command_palette.rs create mode 100644 crates/viewer/re_viewer/src/default_views.rs create mode 100644 crates/viewer/re_viewer/src/docker_detection.rs create mode 100644 crates/viewer/re_viewer/src/env_vars.rs create mode 100644 crates/viewer/re_viewer/src/event.rs create mode 100644 crates/viewer/re_viewer/src/external_memory.rs create mode 100644 crates/viewer/re_viewer/src/headless.rs create mode 100644 crates/viewer/re_viewer/src/history.rs create mode 100644 crates/viewer/re_viewer/src/internal_catalog.rs create mode 100644 crates/viewer/re_viewer/src/latency_tracker.rs create mode 100644 crates/viewer/re_viewer/src/lib.rs create mode 100644 crates/viewer/re_viewer/src/loading.rs create mode 100644 crates/viewer/re_viewer/src/native.rs create mode 100644 crates/viewer/re_viewer/src/navigation.rs create mode 100644 crates/viewer/re_viewer/src/open_url_description.rs create mode 100644 crates/viewer/re_viewer/src/prefetch_chunks.rs create mode 100644 crates/viewer/re_viewer/src/saving.rs create mode 100644 crates/viewer/re_viewer/src/screenshotter.rs create mode 100644 crates/viewer/re_viewer/src/startup_options.rs create mode 100644 crates/viewer/re_viewer/src/texture_readback.rs create mode 100644 crates/viewer/re_viewer/src/ui/dev_panel/chunk_event_stats.rs create mode 100644 crates/viewer/re_viewer/src/ui/dev_panel/memory_history.rs create mode 100644 crates/viewer/re_viewer/src/ui/dev_panel/mod.rs create mode 100644 crates/viewer/re_viewer/src/ui/dev_panel/plot_utils.rs create mode 100644 crates/viewer/re_viewer/src/ui/dev_panel/server_streaming_tab.rs create mode 100644 crates/viewer/re_viewer/src/ui/dev_panel/streaming_history.rs create mode 100644 crates/viewer/re_viewer/src/ui/dev_panel/transform_cache_ui/layout.rs create mode 100644 crates/viewer/re_viewer/src/ui/dev_panel/transform_cache_ui/mod.rs create mode 100644 crates/viewer/re_viewer/src/ui/dev_panel/transform_cache_ui/model.rs create mode 100644 crates/viewer/re_viewer/src/ui/dev_panel/transform_cache_ui/paint.rs create mode 100644 crates/viewer/re_viewer/src/ui/mobile_warning_ui.rs create mode 100644 crates/viewer/re_viewer/src/ui/mod.rs create mode 100644 crates/viewer/re_viewer/src/ui/open_url_modal.rs create mode 100644 crates/viewer/re_viewer/src/ui/rerun_menu.rs create mode 100644 crates/viewer/re_viewer/src/ui/settings_screen.rs create mode 100644 crates/viewer/re_viewer/src/ui/share_modal.rs create mode 100644 crates/viewer/re_viewer/src/ui/top_panel.rs create mode 100644 crates/viewer/re_viewer/src/ui/welcome_screen/example_section.rs create mode 100644 crates/viewer/re_viewer/src/ui/welcome_screen/intro_section.rs create mode 100644 crates/viewer/re_viewer/src/ui/welcome_screen/loading_data_ui.rs create mode 100644 crates/viewer/re_viewer/src/ui/welcome_screen/mod.rs create mode 100644 crates/viewer/re_viewer/src/ui/welcome_screen/no_data_ui.rs create mode 100644 crates/viewer/re_viewer/src/ui/welcome_screen/welcome_section.rs create mode 100644 crates/viewer/re_viewer/src/viewer_analytics/event.rs create mode 100644 crates/viewer/re_viewer/src/viewer_analytics/mod.rs create mode 100644 crates/viewer/re_viewer/src/viewer_analytics/wsl.rs create mode 100644 crates/viewer/re_viewer/src/viewer_test_utils/app_testing_ext.rs create mode 100644 crates/viewer/re_viewer/src/viewer_test_utils/mod.rs create mode 100644 crates/viewer/re_viewer/src/web.rs create mode 100644 crates/viewer/re_viewer/src/web_history.rs create mode 100644 crates/viewer/re_viewer/src/web_tools.rs create mode 100644 crates/viewer/re_viewer/tests/all_component_fallbacks.rs create mode 100644 crates/viewer/re_viewer/tests/app_kittest.rs create mode 100644 crates/viewer/re_viewer/tests/blueprint_test.rs create mode 100644 crates/viewer/re_viewer/tests/snapshots/about_rerun.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.AnnotationContext.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.Arrows2D.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.Arrows3D.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.Asset3D.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.AssetVideo.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.BarChart.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.Boxes2D.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.Boxes3D.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.Capsules3D.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.Clear.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.CoordinateFrame.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.Cylinders3D.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.DepthImage.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.Ellipses2D.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.Ellipsoids3D.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.EncodedDepthImage.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.EncodedImage.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.GeoLineStrings.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.GeoPoints.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.GraphEdges.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.GraphNodes.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.GridMap.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.Image.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.InstancePoses3D.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.LineStrips2D.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.LineStrips3D.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.McapChannel.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.McapMessage.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.McapSchema.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.McapStatistics.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.Mesh3D.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.Pinhole.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.Points2D.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.Points3D.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.RecordingInfo.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.Scalars.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.SegmentationImage.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.SeriesLines.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.SeriesPoints.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.StateChange.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.StateConfiguration.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.Tensor.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.TextDocument.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.TextLog.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.Transform3D.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.TransformAxes3D.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.VideoFrameReference.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.VideoStream.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.ViewCoordinates.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.archetypes.VoxelGridMap.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.ActiveVisualizers.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.Background.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.ContainerBlueprint.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.DataframeQuery.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.EntityBehavior.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.EyeControls3D.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.ForceCenter.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.ForceCollisionRadius.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.ForceLink.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.ForceManyBody.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.ForcePosition.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.GraphBackground.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.LineGrid3D.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.MapBackground.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.MapZoom.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.NearClipPlane.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.PanelBlueprint.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.PlotBackground.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.PlotLegend.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.ScalarAxis.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.SpatialInformation.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.TableBlueprint.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.TensorScalarMapping.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.TensorSliceSelection.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.TensorViewFit.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.TextDocumentFormat.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.TextLogColumns.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.TextLogFormat.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.TextLogRows.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.TimeAxis.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.TimePanelBlueprint.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.ViewBlueprint.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.ViewContents.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.ViewportBlueprint.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.VisibleTimeRanges.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.VisualBounds2D.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.VisualizerInstruction.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_component_fallbacks__arch_fallback_rerun.blueprint.archetypes.VisualizerOverrides.snap create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_view_selection_uis/Dark/2D.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_view_selection_uis/Dark/3D.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_view_selection_uis/Dark/BarChart.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_view_selection_uis/Dark/Dataframe.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_view_selection_uis/Dark/Graph.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_view_selection_uis/Dark/Map.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_view_selection_uis/Dark/StateTimeline.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_view_selection_uis/Dark/Tensor.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_view_selection_uis/Dark/TextDocument.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_view_selection_uis/Dark/TextLog.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_view_selection_uis/Dark/TimeSeries.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_view_selection_uis/Light/2D.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_view_selection_uis/Light/3D.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_view_selection_uis/Light/BarChart.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_view_selection_uis/Light/Dataframe.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_view_selection_uis/Light/Graph.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_view_selection_uis/Light/Map.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_view_selection_uis/Light/StateTimeline.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_view_selection_uis/Light/Tensor.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_view_selection_uis/Light/TextDocument.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_view_selection_uis/Light/TextLog.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/all_view_selection_uis/Light/TimeSeries.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/blueprint_change_and_restore.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/blueprint_load_into_new_context_1.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/blueprint_load_into_new_context_2.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/colormap_selector_closed.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/colormap_selector_open.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/menu_without_recording.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/open_url_modal__invalid_url.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/open_url_modal__no_url.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/open_url_modal__valid_url.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/settings_screen_linux.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/settings_screen_mac.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/settings_screen_windows.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/share_modal__dataset_segment_url.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/share_modal__dataset_segment_url_with_time_range.png create mode 100644 crates/viewer/re_viewer/tests/snapshots/share_modal__server_url.png create mode 100644 crates/viewer/re_viewer/tests/time_control_blueprint_test.rs create mode 100644 crates/viewer/re_viewer_context/Cargo.toml create mode 100644 crates/viewer/re_viewer_context/README.md create mode 100644 crates/viewer/re_viewer_context/src/active_store_context.rs create mode 100644 crates/viewer/re_viewer_context/src/annotations.rs create mode 100644 crates/viewer/re_viewer_context/src/app_context.rs create mode 100644 crates/viewer/re_viewer_context/src/app_options.rs create mode 100644 crates/viewer/re_viewer_context/src/async_runtime_handle.rs create mode 100644 crates/viewer/re_viewer_context/src/blueprint_helpers.rs create mode 100644 crates/viewer/re_viewer_context/src/blueprint_id.rs create mode 100644 crates/viewer/re_viewer_context/src/cache/cache_trait.rs create mode 100644 crates/viewer/re_viewer_context/src/cache/image_decode_cache.rs create mode 100644 crates/viewer/re_viewer_context/src/cache/image_histogram_cache.rs create mode 100644 crates/viewer/re_viewer_context/src/cache/image_stats_cache.rs create mode 100644 crates/viewer/re_viewer_context/src/cache/memoizers.rs create mode 100644 crates/viewer/re_viewer_context/src/cache/mod.rs create mode 100644 crates/viewer/re_viewer_context/src/cache/store_cache.rs create mode 100644 crates/viewer/re_viewer_context/src/cache/tensor_stats_cache.rs create mode 100644 crates/viewer/re_viewer_context/src/cache/transform_database_store.rs create mode 100644 crates/viewer/re_viewer_context/src/cache/video_asset_cache.rs create mode 100644 crates/viewer/re_viewer_context/src/cache/video_stream_cache.rs create mode 100644 crates/viewer/re_viewer_context/src/cache/video_stream_cache/test_player/encoded_depth_image.rs create mode 100644 crates/viewer/re_viewer_context/src/cache/video_stream_cache/test_player/encoded_image.rs create mode 100644 crates/viewer/re_viewer_context/src/cache/video_stream_cache/test_player/mod.rs create mode 100644 crates/viewer/re_viewer_context/src/cache/video_stream_cache/test_player/video_stream.rs create mode 100644 crates/viewer/re_viewer_context/src/collapsed_id.rs create mode 100644 crates/viewer/re_viewer_context/src/command_sender.rs create mode 100644 crates/viewer/re_viewer_context/src/component_fallbacks.rs create mode 100644 crates/viewer/re_viewer_context/src/component_ui_registry.rs create mode 100644 crates/viewer/re_viewer_context/src/contents.rs create mode 100644 crates/viewer/re_viewer_context/src/drag_and_drop.rs create mode 100644 crates/viewer/re_viewer_context/src/file_dialog.rs create mode 100644 crates/viewer/re_viewer_context/src/focus_target.rs create mode 100644 crates/viewer/re_viewer_context/src/gpu_bridge/colormap.rs create mode 100644 crates/viewer/re_viewer_context/src/gpu_bridge/image_to_gpu.rs create mode 100644 crates/viewer/re_viewer_context/src/gpu_bridge/mod.rs create mode 100644 crates/viewer/re_viewer_context/src/gpu_bridge/re_renderer_callback.rs create mode 100644 crates/viewer/re_viewer_context/src/heuristics.rs create mode 100644 crates/viewer/re_viewer_context/src/image_info.rs create mode 100644 crates/viewer/re_viewer_context/src/item.rs create mode 100644 crates/viewer/re_viewer_context/src/item_collection.rs create mode 100644 crates/viewer/re_viewer_context/src/lib.rs create mode 100644 crates/viewer/re_viewer_context/src/maybe_mut_ref.rs create mode 100644 crates/viewer/re_viewer_context/src/open_url.rs create mode 100644 crates/viewer/re_viewer_context/src/query_context.rs create mode 100644 crates/viewer/re_viewer_context/src/query_range.rs create mode 100644 crates/viewer/re_viewer_context/src/recording_or_table.rs create mode 100644 crates/viewer/re_viewer_context/src/route.rs create mode 100644 crates/viewer/re_viewer_context/src/selection_state.rs create mode 100644 crates/viewer/re_viewer_context/src/storage_context.rs create mode 100644 crates/viewer/re_viewer_context/src/store_hub.rs create mode 100644 crates/viewer/re_viewer_context/src/store_view_context.rs create mode 100644 crates/viewer/re_viewer_context/src/tables.rs create mode 100644 crates/viewer/re_viewer_context/src/tensor/image_stats.rs create mode 100644 crates/viewer/re_viewer_context/src/tensor/mod.rs create mode 100644 crates/viewer/re_viewer_context/src/tensor/tensor_stats.rs create mode 100644 crates/viewer/re_viewer_context/src/time_control/blueprint_ext.rs create mode 100644 crates/viewer/re_viewer_context/src/time_control/command.rs create mode 100644 crates/viewer/re_viewer_context/src/time_control/mod.rs create mode 100644 crates/viewer/re_viewer_context/src/typed_entity_collections.rs create mode 100644 crates/viewer/re_viewer_context/src/undo.rs create mode 100644 crates/viewer/re_viewer_context/src/utils/color.rs create mode 100644 crates/viewer/re_viewer_context/src/utils/mod.rs create mode 100644 crates/viewer/re_viewer_context/src/utils/text.rs create mode 100644 crates/viewer/re_viewer_context/src/utils/video.rs create mode 100644 crates/viewer/re_viewer_context/src/view/highlights.rs create mode 100644 crates/viewer/re_viewer_context/src/view/mod.rs create mode 100644 crates/viewer/re_viewer_context/src/view/named_system.rs create mode 100644 crates/viewer/re_viewer_context/src/view/spawn_heuristics.rs create mode 100644 crates/viewer/re_viewer_context/src/view/system_execution_output.rs create mode 100644 crates/viewer/re_viewer_context/src/view/view_class.rs create mode 100644 crates/viewer/re_viewer_context/src/view/view_class_placeholder.rs create mode 100644 crates/viewer/re_viewer_context/src/view/view_class_registry.rs create mode 100644 crates/viewer/re_viewer_context/src/view/view_context.rs create mode 100644 crates/viewer/re_viewer_context/src/view/view_context_system.rs create mode 100644 crates/viewer/re_viewer_context/src/view/view_query.rs create mode 100644 crates/viewer/re_viewer_context/src/view/view_states.rs create mode 100644 crates/viewer/re_viewer_context/src/view/visualizability_constraints.rs create mode 100644 crates/viewer/re_viewer_context/src/view/visualizer_entity_subscriber.rs create mode 100644 crates/viewer/re_viewer_context/src/view/visualizer_system.rs create mode 100644 crates/viewer/re_viewer_context/src/viewer_context.rs create mode 100644 crates/viewer/re_viewer_context/src/visitor_flow_control.rs create mode 100644 crates/viewer/re_viewer_mcp/Cargo.toml create mode 100644 crates/viewer/re_viewer_mcp/README.md create mode 100644 crates/viewer/re_viewer_mcp/src/lib.rs create mode 100644 crates/viewer/re_viewer_mcp/src/main.rs create mode 100644 crates/viewer/re_viewer_mcp/src/snapshots/re_viewer_mcp__tests__agent_surface.snap create mode 100644 crates/viewer/re_viewport/Cargo.toml create mode 100644 crates/viewer/re_viewport/README.md create mode 100644 crates/viewer/re_viewport/src/lib.rs create mode 100644 crates/viewer/re_viewport/src/system_execution.rs create mode 100644 crates/viewer/re_viewport/src/view_highlights.rs create mode 100644 crates/viewer/re_viewport/src/view_loading_indicator.rs create mode 100644 crates/viewer/re_viewport/src/viewport_ui.rs create mode 100644 crates/viewer/re_viewport_blueprint/Cargo.toml create mode 100644 crates/viewer/re_viewport_blueprint/README.md create mode 100644 crates/viewer/re_viewport_blueprint/benches/data_query.rs create mode 100644 crates/viewer/re_viewport_blueprint/src/auto_layout.rs create mode 100644 crates/viewer/re_viewport_blueprint/src/container.rs create mode 100644 crates/viewer/re_viewport_blueprint/src/entity_add_info.rs create mode 100644 crates/viewer/re_viewport_blueprint/src/lib.rs create mode 100644 crates/viewer/re_viewport_blueprint/src/test_view_class.rs create mode 100644 crates/viewer/re_viewport_blueprint/src/ui/add_view_or_container_modal.rs create mode 100644 crates/viewer/re_viewport_blueprint/src/ui/mod.rs create mode 100644 crates/viewer/re_viewport_blueprint/src/view.rs create mode 100644 crates/viewer/re_viewport_blueprint/src/view_contents.rs create mode 100644 crates/viewer/re_viewport_blueprint/src/view_properties.rs create mode 100644 crates/viewer/re_viewport_blueprint/src/viewport_blueprint.rs create mode 100644 crates/viewer/re_viewport_blueprint/src/viewport_command.rs create mode 100644 crates/viewer/re_web_viewer_server/Cargo.toml create mode 100644 crates/viewer/re_web_viewer_server/README.md create mode 100644 crates/viewer/re_web_viewer_server/build.rs create mode 100644 crates/viewer/re_web_viewer_server/src/lib.rs create mode 100644 crates/viewer/re_web_viewer_server/src/trailing_data.rs create mode 100644 crates/viewer/re_web_viewer_server/web_viewer/.gitignore create mode 100644 crates/viewer/re_web_viewer_server/web_viewer/README.md create mode 100644 crates/viewer/re_web_viewer_server/web_viewer/apple-touch-icon.png create mode 100644 crates/viewer/re_web_viewer_server/web_viewer/favicon.ico create mode 100644 crates/viewer/re_web_viewer_server/web_viewer/index.html create mode 100644 crates/viewer/re_web_viewer_server/web_viewer/manifest.json create mode 100644 crates/viewer/re_web_viewer_server/web_viewer/signed-in.html create mode 100644 crates/viewer/re_web_viewer_server/web_viewer/signed-out.html create mode 100644 crates/viewer/re_web_viewer_server/web_viewer/sw.js create mode 100644 deny.toml create mode 100644 docs/README.md create mode 100644 docs/content/_redirects.yaml create mode 100644 docs/content/concepts.md create mode 100644 docs/content/concepts/how-does-rerun-work.md create mode 100644 docs/content/concepts/logging-and-ingestion.md create mode 100644 docs/content/concepts/logging-and-ingestion/batches.md create mode 100644 docs/content/concepts/logging-and-ingestion/chunk-processing-api.md create mode 100644 docs/content/concepts/logging-and-ingestion/chunks.md create mode 100644 docs/content/concepts/logging-and-ingestion/entity-component.md create mode 100644 docs/content/concepts/logging-and-ingestion/entity-path.md create mode 100644 docs/content/concepts/logging-and-ingestion/importers.md create mode 100644 docs/content/concepts/logging-and-ingestion/importers/cpp.md create mode 100644 docs/content/concepts/logging-and-ingestion/importers/overview.md create mode 100644 docs/content/concepts/logging-and-ingestion/importers/python.md create mode 100644 docs/content/concepts/logging-and-ingestion/importers/rust.md create mode 100644 docs/content/concepts/logging-and-ingestion/latest-at.md create mode 100644 docs/content/concepts/logging-and-ingestion/mcap.md create mode 100644 docs/content/concepts/logging-and-ingestion/mcap/cli-reference.md create mode 100644 docs/content/concepts/logging-and-ingestion/mcap/decoders-explained.md create mode 100644 docs/content/concepts/logging-and-ingestion/mcap/message-formats.md create mode 100644 docs/content/concepts/logging-and-ingestion/recordings.md create mode 100644 docs/content/concepts/logging-and-ingestion/rrd-format.md create mode 100644 docs/content/concepts/logging-and-ingestion/sinks.md create mode 100644 docs/content/concepts/logging-and-ingestion/static.md create mode 100644 docs/content/concepts/logging-and-ingestion/timelines.md create mode 100644 docs/content/concepts/logging-and-ingestion/transforms.md create mode 100644 docs/content/concepts/logging-and-ingestion/video.md create mode 100644 docs/content/concepts/query-and-transform.md create mode 100644 docs/content/concepts/query-and-transform/catalog-object-model.md create mode 100644 docs/content/concepts/query-and-transform/dataframe-queries.md create mode 100644 docs/content/concepts/query-and-transform/lenses.md create mode 100644 docs/content/concepts/query-and-transform/properties-and-segments.md create mode 100644 docs/content/concepts/train.md create mode 100644 docs/content/concepts/visualization.md create mode 100644 docs/content/concepts/visualization/annotation-context.md create mode 100644 docs/content/concepts/visualization/blueprints.md create mode 100644 docs/content/concepts/visualization/customize-views.md create mode 100644 docs/content/concepts/visualization/entity-queries.md create mode 100644 docs/content/development.md create mode 100644 docs/content/development/architecture.md create mode 100644 docs/content/development/code_of_conduct.md create mode 100644 docs/content/development/contributing.md create mode 100644 docs/content/development/roadmap.md create mode 100644 docs/content/getting-started.md create mode 100644 docs/content/getting-started/configure-the-viewer.md create mode 100644 docs/content/getting-started/configure-the-viewer/navigating-the-viewer.md create mode 100644 docs/content/getting-started/data-in.md create mode 100644 docs/content/getting-started/data-in/open-any-file.md create mode 100644 docs/content/getting-started/data-out.md create mode 100644 docs/content/getting-started/data-out/analyze-and-send.md create mode 100644 docs/content/getting-started/data-out/explore-as-dataframe.md create mode 100644 docs/content/getting-started/data-out/export-dataframe.md create mode 100644 docs/content/getting-started/install-rerun.md create mode 100644 docs/content/getting-started/install-rerun/cpp.md create mode 100644 docs/content/getting-started/install-rerun/python.md create mode 100644 docs/content/getting-started/install-rerun/rust.md create mode 100644 docs/content/getting-started/install-rerun/troubleshooting.md create mode 100644 docs/content/getting-started/install-rerun/viewer.md create mode 100644 docs/content/getting-started/project-setup.md create mode 100644 docs/content/getting-started/project-setup/cpp.md create mode 100644 docs/content/getting-started/project-setup/python.md create mode 100644 docs/content/getting-started/project-setup/rust.md create mode 100644 docs/content/getting-started/train.md create mode 100644 docs/content/howto.md create mode 100644 docs/content/howto/extend.md create mode 100644 docs/content/howto/integrations.md create mode 100644 docs/content/howto/integrations/embed-notebooks.md create mode 100644 docs/content/howto/integrations/embed-web.md create mode 100644 docs/content/howto/integrations/integrate-host-loggers.md create mode 100644 docs/content/howto/integrations/ros2-nav-turtlebot.md create mode 100644 docs/content/howto/logging-and-ingestion.md create mode 100644 docs/content/howto/logging-and-ingestion/clears.md create mode 100644 docs/content/howto/logging-and-ingestion/convert-existing-data.md create mode 100644 docs/content/howto/logging-and-ingestion/custom-data.md create mode 100644 docs/content/howto/logging-and-ingestion/layers.md create mode 100644 docs/content/howto/logging-and-ingestion/mcap.md create mode 100644 docs/content/howto/logging-and-ingestion/optimize-chunks.md create mode 100644 docs/content/howto/logging-and-ingestion/send-columns.md create mode 100644 docs/content/howto/logging-and-ingestion/send-partial-updates.md create mode 100644 docs/content/howto/logging-and-ingestion/send-table.md create mode 100644 docs/content/howto/logging-and-ingestion/shared-recordings.md create mode 100644 docs/content/howto/logging-and-ingestion/urdf.md create mode 100644 docs/content/howto/query-and-transform.md create mode 100644 docs/content/howto/query-and-transform/dataframe_operations.md create mode 100644 docs/content/howto/query-and-transform/dataset_resampling.md create mode 100644 docs/content/howto/query-and-transform/get-data-out.md create mode 100644 docs/content/howto/query-and-transform/overview.md create mode 100644 docs/content/howto/query-and-transform/query_images.md create mode 100644 docs/content/howto/query-and-transform/query_performance_tuning.md create mode 100644 docs/content/howto/query-and-transform/query_videos.md create mode 100644 docs/content/howto/query-and-transform/segment_url.md create mode 100644 docs/content/howto/query-and-transform/sub_dataset.md create mode 100644 docs/content/howto/query-and-transform/time_alignment.md create mode 100644 docs/content/howto/query-and-transform/view_operations.md create mode 100644 docs/content/howto/train.md create mode 100644 docs/content/howto/train/dataloader.md create mode 100644 docs/content/howto/train/lerobot_export.md create mode 100644 docs/content/howto/visualization.md create mode 100644 docs/content/howto/visualization/build-a-blueprint-programmatically.md create mode 100644 docs/content/howto/visualization/callbacks.md create mode 100644 docs/content/howto/visualization/component-mappings.md create mode 100644 docs/content/howto/visualization/extend-ui.md create mode 100644 docs/content/howto/visualization/fixed-window-plot.md create mode 100644 docs/content/howto/visualization/geospatial-data.md create mode 100644 docs/content/howto/visualization/limit-ram.md create mode 100644 docs/content/howto/visualization/multiple-viewers.md create mode 100644 docs/content/howto/visualization/plot-any-scalar.md create mode 100644 docs/content/howto/visualization/state-timeline.md create mode 100644 docs/content/index.md create mode 100644 docs/content/overview.md create mode 100644 docs/content/overview/resources.md create mode 100644 docs/content/overview/what-is-rerun.md create mode 100644 docs/content/reference.md create mode 100644 docs/content/reference/about.md create mode 100644 docs/content/reference/cli.md create mode 100644 docs/content/reference/cpp.md create mode 100644 docs/content/reference/migration.md create mode 100644 docs/content/reference/migration/migration-0-13.md create mode 100644 docs/content/reference/migration/migration-0-15.md create mode 100644 docs/content/reference/migration/migration-0-16.md create mode 100644 docs/content/reference/migration/migration-0-17.md create mode 100644 docs/content/reference/migration/migration-0-18.md create mode 100644 docs/content/reference/migration/migration-0-19.md create mode 100644 docs/content/reference/migration/migration-0-20.md create mode 100644 docs/content/reference/migration/migration-0-21.md create mode 100644 docs/content/reference/migration/migration-0-22.md create mode 100644 docs/content/reference/migration/migration-0-23.md create mode 100644 docs/content/reference/migration/migration-0-24.md create mode 100644 docs/content/reference/migration/migration-0-25.md create mode 100644 docs/content/reference/migration/migration-0-26.md create mode 100644 docs/content/reference/migration/migration-0-27.md create mode 100644 docs/content/reference/migration/migration-0-28.md create mode 100644 docs/content/reference/migration/migration-0-29.md create mode 100644 docs/content/reference/migration/migration-0-30.md create mode 100644 docs/content/reference/migration/migration-0-31.md create mode 100644 docs/content/reference/migration/migration-0-32.md create mode 100644 docs/content/reference/migration/migration-0-33.md create mode 100644 docs/content/reference/migration/migration-0-34.md create mode 100644 docs/content/reference/migration/migration-0-9.md create mode 100644 docs/content/reference/npm.md create mode 100644 docs/content/reference/python.md create mode 100644 docs/content/reference/rust.md create mode 100644 docs/content/reference/sdk.md create mode 100644 docs/content/reference/sdk/logging-controls.md create mode 100644 docs/content/reference/sdk/micro-batching.md create mode 100644 docs/content/reference/sdk/operating-modes.md create mode 100644 docs/content/reference/snippets.md create mode 100644 docs/content/reference/store-compaction.md create mode 100644 docs/content/reference/types.md create mode 100644 docs/content/reference/types/.gitattributes create mode 100644 docs/content/reference/types/archetypes.md create mode 100644 docs/content/reference/types/archetypes/.gitattributes create mode 100644 docs/content/reference/types/archetypes/annotation_context.md create mode 100644 docs/content/reference/types/archetypes/arrows2d.md create mode 100644 docs/content/reference/types/archetypes/arrows3d.md create mode 100644 docs/content/reference/types/archetypes/asset3d.md create mode 100644 docs/content/reference/types/archetypes/asset_video.md create mode 100644 docs/content/reference/types/archetypes/bar_chart.md create mode 100644 docs/content/reference/types/archetypes/boxes2d.md create mode 100644 docs/content/reference/types/archetypes/boxes3d.md create mode 100644 docs/content/reference/types/archetypes/capsules3d.md create mode 100644 docs/content/reference/types/archetypes/clear.md create mode 100644 docs/content/reference/types/archetypes/coordinate_frame.md create mode 100644 docs/content/reference/types/archetypes/cylinders3d.md create mode 100644 docs/content/reference/types/archetypes/depth_image.md create mode 100644 docs/content/reference/types/archetypes/ellipses2d.md create mode 100644 docs/content/reference/types/archetypes/ellipsoids3d.md create mode 100644 docs/content/reference/types/archetypes/encoded_depth_image.md create mode 100644 docs/content/reference/types/archetypes/encoded_image.md create mode 100644 docs/content/reference/types/archetypes/geo_line_strings.md create mode 100644 docs/content/reference/types/archetypes/geo_points.md create mode 100644 docs/content/reference/types/archetypes/graph_edges.md create mode 100644 docs/content/reference/types/archetypes/graph_nodes.md create mode 100644 docs/content/reference/types/archetypes/grid_map.md create mode 100644 docs/content/reference/types/archetypes/image.md create mode 100644 docs/content/reference/types/archetypes/instance_poses3d.md create mode 100644 docs/content/reference/types/archetypes/line_strips2d.md create mode 100644 docs/content/reference/types/archetypes/line_strips3d.md create mode 100644 docs/content/reference/types/archetypes/mcap_channel.md create mode 100644 docs/content/reference/types/archetypes/mcap_message.md create mode 100644 docs/content/reference/types/archetypes/mcap_schema.md create mode 100644 docs/content/reference/types/archetypes/mcap_statistics.md create mode 100644 docs/content/reference/types/archetypes/mesh3d.md create mode 100644 docs/content/reference/types/archetypes/pinhole.md create mode 100644 docs/content/reference/types/archetypes/points2d.md create mode 100644 docs/content/reference/types/archetypes/points3d.md create mode 100644 docs/content/reference/types/archetypes/recording_info.md create mode 100644 docs/content/reference/types/archetypes/scalars.md create mode 100644 docs/content/reference/types/archetypes/segmentation_image.md create mode 100644 docs/content/reference/types/archetypes/series_lines.md create mode 100644 docs/content/reference/types/archetypes/series_points.md create mode 100644 docs/content/reference/types/archetypes/state_change.md create mode 100644 docs/content/reference/types/archetypes/state_configuration.md create mode 100644 docs/content/reference/types/archetypes/tensor.md create mode 100644 docs/content/reference/types/archetypes/text_document.md create mode 100644 docs/content/reference/types/archetypes/text_log.md create mode 100644 docs/content/reference/types/archetypes/transform3d.md create mode 100644 docs/content/reference/types/archetypes/transform_axes3d.md create mode 100644 docs/content/reference/types/archetypes/video_frame_reference.md create mode 100644 docs/content/reference/types/archetypes/video_stream.md create mode 100644 docs/content/reference/types/archetypes/view_coordinates.md create mode 100644 docs/content/reference/types/archetypes/voxel_grid_map.md create mode 100644 docs/content/reference/types/components.md create mode 100644 docs/content/reference/types/components/.gitattributes create mode 100644 docs/content/reference/types/components/aggregation_policy.md create mode 100644 docs/content/reference/types/components/albedo_factor.md create mode 100644 docs/content/reference/types/components/annotation_context.md create mode 100644 docs/content/reference/types/components/axis_length.md create mode 100644 docs/content/reference/types/components/blob.md create mode 100644 docs/content/reference/types/components/cell_size.md create mode 100644 docs/content/reference/types/components/channel_id.md create mode 100644 docs/content/reference/types/components/channel_message_counts.md create mode 100644 docs/content/reference/types/components/class_id.md create mode 100644 docs/content/reference/types/components/clear_is_recursive.md create mode 100644 docs/content/reference/types/components/color.md create mode 100644 docs/content/reference/types/components/colormap.md create mode 100644 docs/content/reference/types/components/count.md create mode 100644 docs/content/reference/types/components/depth_meter.md create mode 100644 docs/content/reference/types/components/draw_order.md create mode 100644 docs/content/reference/types/components/entity_path.md create mode 100644 docs/content/reference/types/components/fill_mode.md create mode 100644 docs/content/reference/types/components/fill_ratio.md create mode 100644 docs/content/reference/types/components/gamma_correction.md create mode 100644 docs/content/reference/types/components/geo_line_string.md create mode 100644 docs/content/reference/types/components/graph_edge.md create mode 100644 docs/content/reference/types/components/graph_node.md create mode 100644 docs/content/reference/types/components/graph_type.md create mode 100644 docs/content/reference/types/components/half_size2d.md create mode 100644 docs/content/reference/types/components/half_size3d.md create mode 100644 docs/content/reference/types/components/image_buffer.md create mode 100644 docs/content/reference/types/components/image_format.md create mode 100644 docs/content/reference/types/components/image_plane_distance.md create mode 100644 docs/content/reference/types/components/interactive.md create mode 100644 docs/content/reference/types/components/interpolation_mode.md create mode 100644 docs/content/reference/types/components/is_keyframe.md create mode 100644 docs/content/reference/types/components/key_value_pairs.md create mode 100644 docs/content/reference/types/components/keypoint_id.md create mode 100644 docs/content/reference/types/components/lat_lon.md create mode 100644 docs/content/reference/types/components/length.md create mode 100644 docs/content/reference/types/components/line_strip2d.md create mode 100644 docs/content/reference/types/components/line_strip3d.md create mode 100644 docs/content/reference/types/components/linear_speed.md create mode 100644 docs/content/reference/types/components/magnification_filter.md create mode 100644 docs/content/reference/types/components/marker_shape.md create mode 100644 docs/content/reference/types/components/marker_size.md create mode 100644 docs/content/reference/types/components/media_type.md create mode 100644 docs/content/reference/types/components/mesh_face_rendering.md create mode 100644 docs/content/reference/types/components/name.md create mode 100644 docs/content/reference/types/components/opacity.md create mode 100644 docs/content/reference/types/components/pinhole_projection.md create mode 100644 docs/content/reference/types/components/plane3d.md create mode 100644 docs/content/reference/types/components/point_shading.md create mode 100644 docs/content/reference/types/components/position2d.md create mode 100644 docs/content/reference/types/components/position3d.md create mode 100644 docs/content/reference/types/components/radius.md create mode 100644 docs/content/reference/types/components/range1d.md create mode 100644 docs/content/reference/types/components/resolution.md create mode 100644 docs/content/reference/types/components/rotation_axis_angle.md create mode 100644 docs/content/reference/types/components/rotation_quat.md create mode 100644 docs/content/reference/types/components/scalar.md create mode 100644 docs/content/reference/types/components/scale3d.md create mode 100644 docs/content/reference/types/components/schema_id.md create mode 100644 docs/content/reference/types/components/show_labels.md create mode 100644 docs/content/reference/types/components/stroke_width.md create mode 100644 docs/content/reference/types/components/tensor_data.md create mode 100644 docs/content/reference/types/components/tensor_dimension_index_selection.md create mode 100644 docs/content/reference/types/components/tensor_height_dimension.md create mode 100644 docs/content/reference/types/components/tensor_width_dimension.md create mode 100644 docs/content/reference/types/components/texcoord2d.md create mode 100644 docs/content/reference/types/components/text.md create mode 100644 docs/content/reference/types/components/text_log_level.md create mode 100644 docs/content/reference/types/components/timestamp.md create mode 100644 docs/content/reference/types/components/transform_frame_id.md create mode 100644 docs/content/reference/types/components/transform_mat3x3.md create mode 100644 docs/content/reference/types/components/transform_relation.md create mode 100644 docs/content/reference/types/components/translation3d.md create mode 100644 docs/content/reference/types/components/triangle_indices.md create mode 100644 docs/content/reference/types/components/value_range.md create mode 100644 docs/content/reference/types/components/vector2d.md create mode 100644 docs/content/reference/types/components/vector3d.md create mode 100644 docs/content/reference/types/components/video_codec.md create mode 100644 docs/content/reference/types/components/video_sample.md create mode 100644 docs/content/reference/types/components/video_timestamp.md create mode 100644 docs/content/reference/types/components/view_coordinates.md create mode 100644 docs/content/reference/types/components/visible.md create mode 100644 docs/content/reference/types/components/voxel_index.md create mode 100644 docs/content/reference/types/components/voxel_size.md create mode 100644 docs/content/reference/types/components/voxel_value.md create mode 100644 docs/content/reference/types/datatypes.md create mode 100644 docs/content/reference/types/datatypes/.gitattributes create mode 100644 docs/content/reference/types/datatypes/absolute_time_range.md create mode 100644 docs/content/reference/types/datatypes/angle.md create mode 100644 docs/content/reference/types/datatypes/annotation_info.md create mode 100644 docs/content/reference/types/datatypes/blob.md create mode 100644 docs/content/reference/types/datatypes/bool.md create mode 100644 docs/content/reference/types/datatypes/channel_count_pair.md create mode 100644 docs/content/reference/types/datatypes/channel_datatype.md create mode 100644 docs/content/reference/types/datatypes/class_description.md create mode 100644 docs/content/reference/types/datatypes/class_description_map_elem.md create mode 100644 docs/content/reference/types/datatypes/class_id.md create mode 100644 docs/content/reference/types/datatypes/color_model.md create mode 100644 docs/content/reference/types/datatypes/dvec2d.md create mode 100644 docs/content/reference/types/datatypes/entity_path.md create mode 100644 docs/content/reference/types/datatypes/float32.md create mode 100644 docs/content/reference/types/datatypes/float64.md create mode 100644 docs/content/reference/types/datatypes/image_format.md create mode 100644 docs/content/reference/types/datatypes/ivec3d.md create mode 100644 docs/content/reference/types/datatypes/keypoint_id.md create mode 100644 docs/content/reference/types/datatypes/keypoint_pair.md create mode 100644 docs/content/reference/types/datatypes/mat3x3.md create mode 100644 docs/content/reference/types/datatypes/mat4x4.md create mode 100644 docs/content/reference/types/datatypes/pixel_format.md create mode 100644 docs/content/reference/types/datatypes/plane3d.md create mode 100644 docs/content/reference/types/datatypes/quaternion.md create mode 100644 docs/content/reference/types/datatypes/range1d.md create mode 100644 docs/content/reference/types/datatypes/range2d.md create mode 100644 docs/content/reference/types/datatypes/rgba32.md create mode 100644 docs/content/reference/types/datatypes/rotation_axis_angle.md create mode 100644 docs/content/reference/types/datatypes/tensor_buffer.md create mode 100644 docs/content/reference/types/datatypes/tensor_data.md create mode 100644 docs/content/reference/types/datatypes/tensor_dimension_index_selection.md create mode 100644 docs/content/reference/types/datatypes/tensor_dimension_selection.md create mode 100644 docs/content/reference/types/datatypes/time_int.md create mode 100644 docs/content/reference/types/datatypes/time_range.md create mode 100644 docs/content/reference/types/datatypes/time_range_boundary.md create mode 100644 docs/content/reference/types/datatypes/uint16.md create mode 100644 docs/content/reference/types/datatypes/uint32.md create mode 100644 docs/content/reference/types/datatypes/uint64.md create mode 100644 docs/content/reference/types/datatypes/utf8.md create mode 100644 docs/content/reference/types/datatypes/utf8pair.md create mode 100644 docs/content/reference/types/datatypes/uuid.md create mode 100644 docs/content/reference/types/datatypes/uvec2d.md create mode 100644 docs/content/reference/types/datatypes/uvec3d.md create mode 100644 docs/content/reference/types/datatypes/uvec4d.md create mode 100644 docs/content/reference/types/datatypes/vec2d.md create mode 100644 docs/content/reference/types/datatypes/vec3d.md create mode 100644 docs/content/reference/types/datatypes/vec4d.md create mode 100644 docs/content/reference/types/datatypes/video_timestamp.md create mode 100644 docs/content/reference/types/datatypes/view_coordinates.md create mode 100644 docs/content/reference/types/datatypes/visible_time_range.md create mode 100644 docs/content/reference/types/views.md create mode 100644 docs/content/reference/types/views/.gitattributes create mode 100644 docs/content/reference/types/views/bar_chart_view.md create mode 100644 docs/content/reference/types/views/dataframe_view.md create mode 100644 docs/content/reference/types/views/graph_view.md create mode 100644 docs/content/reference/types/views/map_view.md create mode 100644 docs/content/reference/types/views/spatial2d_view.md create mode 100644 docs/content/reference/types/views/spatial3d_view.md create mode 100644 docs/content/reference/types/views/state_timeline_view.md create mode 100644 docs/content/reference/types/views/tensor_view.md create mode 100644 docs/content/reference/types/views/text_document_view.md create mode 100644 docs/content/reference/types/views/text_log_view.md create mode 100644 docs/content/reference/types/views/time_series_view.md create mode 100644 docs/content/reference/viewer.md create mode 100644 docs/content/reference/viewer/blueprints.md create mode 100644 docs/content/reference/viewer/mcp.md create mode 100644 docs/content/reference/viewer/overview.md create mode 100644 docs/content/reference/viewer/selection.md create mode 100644 docs/content/reference/viewer/timeline.md create mode 100644 docs/content/reference/viewer/viewport.md create mode 100644 docs/snippets/.gitattributes create mode 100644 docs/snippets/CMakeLists.txt create mode 100644 docs/snippets/Cargo.toml create mode 100644 docs/snippets/INDEX.md create mode 100644 docs/snippets/README.md create mode 100644 docs/snippets/all/.clang-format create mode 100644 docs/snippets/all/__init__.py create mode 100644 docs/snippets/all/archetypes/annotation_context_connections.cpp create mode 100644 docs/snippets/all/archetypes/annotation_context_connections.py create mode 100644 docs/snippets/all/archetypes/annotation_context_connections.rs create mode 100644 docs/snippets/all/archetypes/annotation_context_rects.cpp create mode 100644 docs/snippets/all/archetypes/annotation_context_rects.py create mode 100644 docs/snippets/all/archetypes/annotation_context_rects.rs create mode 100644 docs/snippets/all/archetypes/annotation_context_segmentation.cpp create mode 100644 docs/snippets/all/archetypes/annotation_context_segmentation.py create mode 100644 docs/snippets/all/archetypes/annotation_context_segmentation.rs create mode 100644 docs/snippets/all/archetypes/arrows2d_simple.cpp create mode 100644 docs/snippets/all/archetypes/arrows2d_simple.py create mode 100644 docs/snippets/all/archetypes/arrows2d_simple.rs create mode 100644 docs/snippets/all/archetypes/arrows3d_column_updates.cpp create mode 100644 docs/snippets/all/archetypes/arrows3d_column_updates.py create mode 100644 docs/snippets/all/archetypes/arrows3d_column_updates.rs create mode 100644 docs/snippets/all/archetypes/arrows3d_row_updates.cpp create mode 100644 docs/snippets/all/archetypes/arrows3d_row_updates.py create mode 100644 docs/snippets/all/archetypes/arrows3d_row_updates.rs create mode 100644 docs/snippets/all/archetypes/arrows3d_simple.cpp create mode 100644 docs/snippets/all/archetypes/arrows3d_simple.py create mode 100644 docs/snippets/all/archetypes/arrows3d_simple.rs create mode 100644 docs/snippets/all/archetypes/asset3d_simple.cpp create mode 100644 docs/snippets/all/archetypes/asset3d_simple.py create mode 100644 docs/snippets/all/archetypes/asset3d_simple.rs create mode 100644 docs/snippets/all/archetypes/bar_chart.cpp create mode 100644 docs/snippets/all/archetypes/bar_chart.py create mode 100644 docs/snippets/all/archetypes/bar_chart.rs create mode 100644 docs/snippets/all/archetypes/boxes2d_simple.cpp create mode 100644 docs/snippets/all/archetypes/boxes2d_simple.py create mode 100644 docs/snippets/all/archetypes/boxes2d_simple.rs create mode 100644 docs/snippets/all/archetypes/boxes3d_batch.cpp create mode 100644 docs/snippets/all/archetypes/boxes3d_batch.py create mode 100644 docs/snippets/all/archetypes/boxes3d_batch.rs create mode 100644 docs/snippets/all/archetypes/boxes3d_simple.cpp create mode 100644 docs/snippets/all/archetypes/boxes3d_simple.py create mode 100644 docs/snippets/all/archetypes/boxes3d_simple.rs create mode 100644 docs/snippets/all/archetypes/capsules3d_batch.cpp create mode 100644 docs/snippets/all/archetypes/capsules3d_batch.py create mode 100644 docs/snippets/all/archetypes/capsules3d_batch.rs create mode 100644 docs/snippets/all/archetypes/clear_recursive.cpp create mode 100644 docs/snippets/all/archetypes/clear_recursive.py create mode 100644 docs/snippets/all/archetypes/clear_recursive.rs create mode 100644 docs/snippets/all/archetypes/clear_simple.cpp create mode 100644 docs/snippets/all/archetypes/clear_simple.py create mode 100644 docs/snippets/all/archetypes/clear_simple.rs create mode 100644 docs/snippets/all/archetypes/coordinate_frame_builtin_frames.cpp create mode 100644 docs/snippets/all/archetypes/coordinate_frame_builtin_frames.py create mode 100644 docs/snippets/all/archetypes/coordinate_frame_builtin_frames.rs create mode 100644 docs/snippets/all/archetypes/cylinders3d_batch.cpp create mode 100644 docs/snippets/all/archetypes/cylinders3d_batch.py create mode 100644 docs/snippets/all/archetypes/cylinders3d_batch.rs create mode 100644 docs/snippets/all/archetypes/depth_image_3d.cpp create mode 100644 docs/snippets/all/archetypes/depth_image_3d.py create mode 100644 docs/snippets/all/archetypes/depth_image_3d.rs create mode 100644 docs/snippets/all/archetypes/depth_image_simple.cpp create mode 100644 docs/snippets/all/archetypes/depth_image_simple.py create mode 100644 docs/snippets/all/archetypes/depth_image_simple.rs create mode 100644 docs/snippets/all/archetypes/ellipses2d_batch.cpp create mode 100644 docs/snippets/all/archetypes/ellipses2d_batch.py create mode 100644 docs/snippets/all/archetypes/ellipses2d_batch.rs create mode 100644 docs/snippets/all/archetypes/ellipses2d_simple.cpp create mode 100644 docs/snippets/all/archetypes/ellipses2d_simple.py create mode 100644 docs/snippets/all/archetypes/ellipses2d_simple.rs create mode 100644 docs/snippets/all/archetypes/ellipsoids3d_batch.cpp create mode 100644 docs/snippets/all/archetypes/ellipsoids3d_batch.py create mode 100644 docs/snippets/all/archetypes/ellipsoids3d_batch.rs create mode 100644 docs/snippets/all/archetypes/ellipsoids3d_simple.cpp create mode 100644 docs/snippets/all/archetypes/ellipsoids3d_simple.py create mode 100644 docs/snippets/all/archetypes/ellipsoids3d_simple.rs create mode 100644 docs/snippets/all/archetypes/encoded_depth_image.cpp create mode 100644 docs/snippets/all/archetypes/encoded_depth_image.py create mode 100644 docs/snippets/all/archetypes/encoded_depth_image.rs create mode 100644 docs/snippets/all/archetypes/encoded_image.cpp create mode 100644 docs/snippets/all/archetypes/encoded_image.py create mode 100644 docs/snippets/all/archetypes/encoded_image.rs create mode 100644 docs/snippets/all/archetypes/entity_behavior.py create mode 100644 docs/snippets/all/archetypes/entity_path.cpp create mode 100644 docs/snippets/all/archetypes/entity_path.py create mode 100644 docs/snippets/all/archetypes/entity_path.rs create mode 100644 docs/snippets/all/archetypes/ferris.png create mode 100644 docs/snippets/all/archetypes/geo_line_strings_simple.cpp create mode 100644 docs/snippets/all/archetypes/geo_line_strings_simple.py create mode 100644 docs/snippets/all/archetypes/geo_line_strings_simple.rs create mode 100644 docs/snippets/all/archetypes/geo_points_simple.cpp create mode 100644 docs/snippets/all/archetypes/geo_points_simple.py create mode 100644 docs/snippets/all/archetypes/geo_points_simple.rs create mode 100644 docs/snippets/all/archetypes/graph_directed.cpp create mode 100644 docs/snippets/all/archetypes/graph_directed.py create mode 100644 docs/snippets/all/archetypes/graph_directed.rs create mode 100644 docs/snippets/all/archetypes/graph_undirected.cpp create mode 100644 docs/snippets/all/archetypes/graph_undirected.py create mode 100644 docs/snippets/all/archetypes/graph_undirected.rs create mode 100644 docs/snippets/all/archetypes/grid_map_pose.py create mode 100644 docs/snippets/all/archetypes/grid_map_simple.cpp create mode 100644 docs/snippets/all/archetypes/grid_map_simple.py create mode 100644 docs/snippets/all/archetypes/grid_map_simple.rs create mode 100644 docs/snippets/all/archetypes/image_advanced.py create mode 100644 docs/snippets/all/archetypes/image_column_updates.cpp create mode 100644 docs/snippets/all/archetypes/image_column_updates.py create mode 100644 docs/snippets/all/archetypes/image_column_updates.rs create mode 100644 docs/snippets/all/archetypes/image_formats.cpp create mode 100644 docs/snippets/all/archetypes/image_formats.py create mode 100644 docs/snippets/all/archetypes/image_formats.rs create mode 100644 docs/snippets/all/archetypes/image_row_updates.cpp create mode 100644 docs/snippets/all/archetypes/image_row_updates.py create mode 100644 docs/snippets/all/archetypes/image_row_updates.rs create mode 100644 docs/snippets/all/archetypes/image_simple.cpp create mode 100644 docs/snippets/all/archetypes/image_simple.py create mode 100644 docs/snippets/all/archetypes/image_simple.rs create mode 100644 docs/snippets/all/archetypes/instance_poses3d_combined.cpp create mode 100644 docs/snippets/all/archetypes/instance_poses3d_combined.py create mode 100644 docs/snippets/all/archetypes/instance_poses3d_combined.rs create mode 100644 docs/snippets/all/archetypes/line_strips2d_batch.cpp create mode 100644 docs/snippets/all/archetypes/line_strips2d_batch.py create mode 100644 docs/snippets/all/archetypes/line_strips2d_batch.rs create mode 100644 docs/snippets/all/archetypes/line_strips2d_segments_simple.cpp create mode 100644 docs/snippets/all/archetypes/line_strips2d_segments_simple.py create mode 100644 docs/snippets/all/archetypes/line_strips2d_segments_simple.rs create mode 100644 docs/snippets/all/archetypes/line_strips2d_simple.cpp create mode 100644 docs/snippets/all/archetypes/line_strips2d_simple.py create mode 100644 docs/snippets/all/archetypes/line_strips2d_simple.rs create mode 100644 docs/snippets/all/archetypes/line_strips2d_ui_radius.cpp create mode 100644 docs/snippets/all/archetypes/line_strips2d_ui_radius.py create mode 100644 docs/snippets/all/archetypes/line_strips2d_ui_radius.rs create mode 100644 docs/snippets/all/archetypes/line_strips3d_batch.cpp create mode 100644 docs/snippets/all/archetypes/line_strips3d_batch.py create mode 100644 docs/snippets/all/archetypes/line_strips3d_batch.rs create mode 100644 docs/snippets/all/archetypes/line_strips3d_segments_simple.cpp create mode 100755 docs/snippets/all/archetypes/line_strips3d_segments_simple.py create mode 100644 docs/snippets/all/archetypes/line_strips3d_segments_simple.rs create mode 100644 docs/snippets/all/archetypes/line_strips3d_simple.cpp create mode 100644 docs/snippets/all/archetypes/line_strips3d_simple.py create mode 100644 docs/snippets/all/archetypes/line_strips3d_simple.rs create mode 100644 docs/snippets/all/archetypes/line_strips3d_time_window.py create mode 100644 docs/snippets/all/archetypes/line_strips3d_ui_radius.cpp create mode 100644 docs/snippets/all/archetypes/line_strips3d_ui_radius.py create mode 100644 docs/snippets/all/archetypes/line_strips3d_ui_radius.rs create mode 100644 docs/snippets/all/archetypes/mcap_channel_simple.cpp create mode 100644 docs/snippets/all/archetypes/mcap_channel_simple.py create mode 100644 docs/snippets/all/archetypes/mcap_channel_simple.rs create mode 100644 docs/snippets/all/archetypes/mcap_message_simple.cpp create mode 100644 docs/snippets/all/archetypes/mcap_message_simple.py create mode 100644 docs/snippets/all/archetypes/mcap_message_simple.rs create mode 100644 docs/snippets/all/archetypes/mcap_schema_simple.cpp create mode 100644 docs/snippets/all/archetypes/mcap_schema_simple.py create mode 100644 docs/snippets/all/archetypes/mcap_schema_simple.rs create mode 100644 docs/snippets/all/archetypes/mcap_statistics_simple.cpp create mode 100644 docs/snippets/all/archetypes/mcap_statistics_simple.py create mode 100644 docs/snippets/all/archetypes/mcap_statistics_simple.rs create mode 100644 docs/snippets/all/archetypes/mesh3d_indexed.cpp create mode 100644 docs/snippets/all/archetypes/mesh3d_indexed.py create mode 100644 docs/snippets/all/archetypes/mesh3d_indexed.rs create mode 100644 docs/snippets/all/archetypes/mesh3d_instancing.cpp create mode 100644 docs/snippets/all/archetypes/mesh3d_instancing.py create mode 100644 docs/snippets/all/archetypes/mesh3d_instancing.rs create mode 100644 docs/snippets/all/archetypes/mesh3d_partial_updates.cpp create mode 100644 docs/snippets/all/archetypes/mesh3d_partial_updates.py create mode 100644 docs/snippets/all/archetypes/mesh3d_partial_updates.rs create mode 100644 docs/snippets/all/archetypes/mesh3d_simple.cpp create mode 100644 docs/snippets/all/archetypes/mesh3d_simple.py create mode 100644 docs/snippets/all/archetypes/mesh3d_simple.rs create mode 100644 docs/snippets/all/archetypes/pinhole_perspective.cpp create mode 100644 docs/snippets/all/archetypes/pinhole_perspective.py create mode 100644 docs/snippets/all/archetypes/pinhole_perspective.rs create mode 100644 docs/snippets/all/archetypes/pinhole_projections.py create mode 100644 docs/snippets/all/archetypes/pinhole_simple.cpp create mode 100644 docs/snippets/all/archetypes/pinhole_simple.py create mode 100644 docs/snippets/all/archetypes/pinhole_simple.rs create mode 100644 docs/snippets/all/archetypes/points2d_random.cpp create mode 100644 docs/snippets/all/archetypes/points2d_random.py create mode 100644 docs/snippets/all/archetypes/points2d_random.rs create mode 100644 docs/snippets/all/archetypes/points2d_simple.cpp create mode 100644 docs/snippets/all/archetypes/points2d_simple.py create mode 100644 docs/snippets/all/archetypes/points2d_simple.rs create mode 100644 docs/snippets/all/archetypes/points2d_ui_radius.cpp create mode 100644 docs/snippets/all/archetypes/points2d_ui_radius.py create mode 100644 docs/snippets/all/archetypes/points2d_ui_radius.rs create mode 100644 docs/snippets/all/archetypes/points3d_column_updates.cpp create mode 100644 docs/snippets/all/archetypes/points3d_column_updates.py create mode 100644 docs/snippets/all/archetypes/points3d_column_updates.rs create mode 100644 docs/snippets/all/archetypes/points3d_partial_updates.cpp create mode 100644 docs/snippets/all/archetypes/points3d_partial_updates.py create mode 100644 docs/snippets/all/archetypes/points3d_partial_updates.rs create mode 100644 docs/snippets/all/archetypes/points3d_random.cpp create mode 100644 docs/snippets/all/archetypes/points3d_random.py create mode 100644 docs/snippets/all/archetypes/points3d_random.rs create mode 100644 docs/snippets/all/archetypes/points3d_row_updates.cpp create mode 100644 docs/snippets/all/archetypes/points3d_row_updates.py create mode 100644 docs/snippets/all/archetypes/points3d_row_updates.rs create mode 100644 docs/snippets/all/archetypes/points3d_simple.cpp create mode 100644 docs/snippets/all/archetypes/points3d_simple.py create mode 100644 docs/snippets/all/archetypes/points3d_simple.rs create mode 100644 docs/snippets/all/archetypes/points3d_ui_radius.cpp create mode 100644 docs/snippets/all/archetypes/points3d_ui_radius.py create mode 100644 docs/snippets/all/archetypes/points3d_ui_radius.rs create mode 100644 docs/snippets/all/archetypes/scalars_column_updates.cpp create mode 100644 docs/snippets/all/archetypes/scalars_column_updates.py create mode 100644 docs/snippets/all/archetypes/scalars_column_updates.rs create mode 100644 docs/snippets/all/archetypes/scalars_multiple_plots.cpp create mode 100644 docs/snippets/all/archetypes/scalars_multiple_plots.py create mode 100644 docs/snippets/all/archetypes/scalars_multiple_plots.rs create mode 100644 docs/snippets/all/archetypes/scalars_row_updates.cpp create mode 100644 docs/snippets/all/archetypes/scalars_row_updates.py create mode 100644 docs/snippets/all/archetypes/scalars_row_updates.rs create mode 100644 docs/snippets/all/archetypes/scalars_simple.cpp create mode 100644 docs/snippets/all/archetypes/scalars_simple.py create mode 100644 docs/snippets/all/archetypes/scalars_simple.rs create mode 100644 docs/snippets/all/archetypes/segmentation_image_simple.cpp create mode 100644 docs/snippets/all/archetypes/segmentation_image_simple.py create mode 100644 docs/snippets/all/archetypes/segmentation_image_simple.rs create mode 100644 docs/snippets/all/archetypes/series_lines_style.cpp create mode 100644 docs/snippets/all/archetypes/series_lines_style.py create mode 100644 docs/snippets/all/archetypes/series_lines_style.rs create mode 100644 docs/snippets/all/archetypes/series_points_style.cpp create mode 100644 docs/snippets/all/archetypes/series_points_style.py create mode 100644 docs/snippets/all/archetypes/series_points_style.rs create mode 100644 docs/snippets/all/archetypes/state_change.cpp create mode 100644 docs/snippets/all/archetypes/state_change.py create mode 100644 docs/snippets/all/archetypes/state_change.rs create mode 100644 docs/snippets/all/archetypes/state_configuration.cpp create mode 100644 docs/snippets/all/archetypes/state_configuration.py create mode 100644 docs/snippets/all/archetypes/state_configuration.rs create mode 100644 docs/snippets/all/archetypes/tensor_simple.cpp create mode 100644 docs/snippets/all/archetypes/tensor_simple.py create mode 100644 docs/snippets/all/archetypes/tensor_simple.rs create mode 100644 docs/snippets/all/archetypes/text_document.cpp create mode 100755 docs/snippets/all/archetypes/text_document.py create mode 100644 docs/snippets/all/archetypes/text_document.rs create mode 100644 docs/snippets/all/archetypes/text_log.cpp create mode 100755 docs/snippets/all/archetypes/text_log.py create mode 100644 docs/snippets/all/archetypes/text_log.rs create mode 100644 docs/snippets/all/archetypes/text_log_integration.cpp create mode 100644 docs/snippets/all/archetypes/text_log_integration.py create mode 100644 docs/snippets/all/archetypes/text_log_integration.rs create mode 100644 docs/snippets/all/archetypes/transform3d_axes.cpp create mode 100644 docs/snippets/all/archetypes/transform3d_axes.py create mode 100644 docs/snippets/all/archetypes/transform3d_axes.rs create mode 100644 docs/snippets/all/archetypes/transform3d_column_updates.cpp create mode 100644 docs/snippets/all/archetypes/transform3d_column_updates.py create mode 100644 docs/snippets/all/archetypes/transform3d_column_updates.rs create mode 100644 docs/snippets/all/archetypes/transform3d_hierarchy.cpp create mode 100644 docs/snippets/all/archetypes/transform3d_hierarchy.py create mode 100644 docs/snippets/all/archetypes/transform3d_hierarchy.rs create mode 100644 docs/snippets/all/archetypes/transform3d_hierarchy_frames.cpp create mode 100644 docs/snippets/all/archetypes/transform3d_hierarchy_frames.py create mode 100644 docs/snippets/all/archetypes/transform3d_hierarchy_frames.rs create mode 100644 docs/snippets/all/archetypes/transform3d_partial_updates.cpp create mode 100644 docs/snippets/all/archetypes/transform3d_partial_updates.py create mode 100644 docs/snippets/all/archetypes/transform3d_partial_updates.rs create mode 100644 docs/snippets/all/archetypes/transform3d_row_updates.cpp create mode 100644 docs/snippets/all/archetypes/transform3d_row_updates.py create mode 100644 docs/snippets/all/archetypes/transform3d_row_updates.rs create mode 100644 docs/snippets/all/archetypes/transform3d_simple.cpp create mode 100644 docs/snippets/all/archetypes/transform3d_simple.py create mode 100644 docs/snippets/all/archetypes/transform3d_simple.rs create mode 100644 docs/snippets/all/archetypes/video_auto_frames.cpp create mode 100644 docs/snippets/all/archetypes/video_auto_frames.py create mode 100644 docs/snippets/all/archetypes/video_auto_frames.rs create mode 100644 docs/snippets/all/archetypes/video_manual_frames.cpp create mode 100644 docs/snippets/all/archetypes/video_manual_frames.py create mode 100644 docs/snippets/all/archetypes/video_manual_frames.rs create mode 100644 docs/snippets/all/archetypes/video_stream_query_and_mux.py create mode 100644 docs/snippets/all/archetypes/video_stream_synthetic.py create mode 100644 docs/snippets/all/archetypes/view_coordinates_simple.cpp create mode 100644 docs/snippets/all/archetypes/view_coordinates_simple.py create mode 100644 docs/snippets/all/archetypes/view_coordinates_simple.rs create mode 100644 docs/snippets/all/archetypes/voxel_grid_map_simple.cpp create mode 100644 docs/snippets/all/archetypes/voxel_grid_map_simple.py create mode 100644 docs/snippets/all/archetypes/voxel_grid_map_simple.rs create mode 100644 docs/snippets/all/concepts/build_chunk.py create mode 100644 docs/snippets/all/concepts/build_chunk_from_record_batch.py create mode 100644 docs/snippets/all/concepts/chunk_processing.py create mode 100644 docs/snippets/all/concepts/chunk_processing_intro.py create mode 100644 docs/snippets/all/concepts/chunk_processing_query.py create mode 100644 docs/snippets/all/concepts/different_data_per_timeline.cpp create mode 100644 docs/snippets/all/concepts/different_data_per_timeline.py create mode 100644 docs/snippets/all/concepts/different_data_per_timeline.rs create mode 100644 docs/snippets/all/concepts/explicit_recording.py create mode 100644 docs/snippets/all/concepts/file_sink.cpp create mode 100644 docs/snippets/all/concepts/file_sink.py create mode 100644 docs/snippets/all/concepts/file_sink.rs create mode 100644 docs/snippets/all/concepts/grpc_sink.cpp create mode 100644 docs/snippets/all/concepts/grpc_sink.py create mode 100644 docs/snippets/all/concepts/grpc_sink.rs create mode 100644 docs/snippets/all/concepts/how-does-rerun-work/log-to-grpc.cpp create mode 100644 docs/snippets/all/concepts/how-does-rerun-work/log-to-grpc.py create mode 100644 docs/snippets/all/concepts/how-does-rerun-work/log-to-grpc.rs create mode 100644 docs/snippets/all/concepts/how-does-rerun-work/log-to-rrd.cpp create mode 100644 docs/snippets/all/concepts/how-does-rerun-work/log-to-rrd.py create mode 100644 docs/snippets/all/concepts/how-does-rerun-work/log-to-rrd.rs create mode 100644 docs/snippets/all/concepts/how_helix_was_logged.py create mode 100644 docs/snippets/all/concepts/indices.cpp create mode 100644 docs/snippets/all/concepts/indices.py create mode 100644 docs/snippets/all/concepts/indices.rs create mode 100644 docs/snippets/all/concepts/lenses.py create mode 100644 docs/snippets/all/concepts/lenses.rs create mode 100644 docs/snippets/all/concepts/query-and-transform/dataframe_query_example.py create mode 100644 docs/snippets/all/concepts/query-and-transform/segment_properties.py create mode 100644 docs/snippets/all/concepts/recording_properties.cpp create mode 100644 docs/snippets/all/concepts/recording_properties.py create mode 100644 docs/snippets/all/concepts/recording_properties.rs create mode 100644 docs/snippets/all/concepts/rrd_format.py create mode 100644 docs/snippets/all/concepts/send_chunks.py create mode 100644 docs/snippets/all/concepts/send_chunks.rs create mode 100644 docs/snippets/all/concepts/send_dataframe.py create mode 100644 docs/snippets/all/concepts/static/log_static.cpp create mode 100644 docs/snippets/all/concepts/static/log_static.py create mode 100644 docs/snippets/all/concepts/static/log_static.rs create mode 100644 docs/snippets/all/concepts/static/log_static_10x.py create mode 100644 docs/snippets/all/concepts/static/log_temporal_10x.py create mode 100644 docs/snippets/all/concepts/static/send_static.cpp create mode 100644 docs/snippets/all/concepts/static/send_static.py create mode 100644 docs/snippets/all/concepts/static/send_static.rs create mode 100644 docs/snippets/all/concepts/transform3d_hierarchy_named_frames.cpp create mode 100644 docs/snippets/all/concepts/transform3d_hierarchy_named_frames.py create mode 100644 docs/snippets/all/concepts/transform3d_hierarchy_named_frames.rs create mode 100644 docs/snippets/all/concepts/transform3d_hierarchy_simple.cpp create mode 100644 docs/snippets/all/concepts/transform3d_hierarchy_simple.py create mode 100644 docs/snippets/all/concepts/transform3d_hierarchy_simple.rs create mode 100644 docs/snippets/all/concepts/viscomp-base.py create mode 100644 docs/snippets/all/concepts/viscomp-component-default.py create mode 100644 docs/snippets/all/concepts/viscomp-component-override.py create mode 100644 docs/snippets/all/descriptors/descr_builtin_archetype.cpp create mode 100755 docs/snippets/all/descriptors/descr_builtin_archetype.py create mode 100644 docs/snippets/all/descriptors/descr_builtin_archetype.rs create mode 100644 docs/snippets/all/descriptors/descr_builtin_component.cpp create mode 100755 docs/snippets/all/descriptors/descr_builtin_component.py create mode 100644 docs/snippets/all/descriptors/descr_builtin_component.rs create mode 100644 docs/snippets/all/descriptors/descr_custom_archetype.cpp create mode 100755 docs/snippets/all/descriptors/descr_custom_archetype.py create mode 100644 docs/snippets/all/descriptors/descr_custom_archetype.rs create mode 100644 docs/snippets/all/descriptors/descr_custom_component.cpp create mode 100755 docs/snippets/all/descriptors/descr_custom_component.py create mode 100644 docs/snippets/all/descriptors/descr_custom_component.rs create mode 100644 docs/snippets/all/howto/any_batch_value_column_updates.cpp create mode 100644 docs/snippets/all/howto/any_batch_value_column_updates.py create mode 100644 docs/snippets/all/howto/any_batch_value_column_updates.rs create mode 100644 docs/snippets/all/howto/any_values_column_updates.cpp create mode 100644 docs/snippets/all/howto/any_values_column_updates.py create mode 100644 docs/snippets/all/howto/any_values_column_updates.rs create mode 100644 docs/snippets/all/howto/any_values_row_updates.cpp create mode 100644 docs/snippets/all/howto/any_values_row_updates.py create mode 100644 docs/snippets/all/howto/any_values_row_updates.rs create mode 100644 docs/snippets/all/howto/check_connection_status.rs create mode 100644 docs/snippets/all/howto/component_mapping.py create mode 100644 docs/snippets/all/howto/component_mapping.rs create mode 100644 docs/snippets/all/howto/convert_mcap_protobuf.py create mode 100644 docs/snippets/all/howto/convert_mcap_protobuf_send_column.py create mode 100644 docs/snippets/all/howto/dataframe_operations.py create mode 100644 docs/snippets/all/howto/dataframe_performance.py create mode 100644 docs/snippets/all/howto/dataloader.py create mode 100644 docs/snippets/all/howto/dataset_resampling.py create mode 100644 docs/snippets/all/howto/dual_color_point_cloud.py create mode 100644 docs/snippets/all/howto/dual_color_point_cloud.rs create mode 100644 docs/snippets/all/howto/layers.py create mode 100644 docs/snippets/all/howto/lerobot_export.py create mode 100644 docs/snippets/all/howto/load_mcap.cpp create mode 100644 docs/snippets/all/howto/load_mcap.py create mode 100644 docs/snippets/all/howto/load_mcap.rs create mode 100644 docs/snippets/all/howto/load_urdf.py create mode 100644 docs/snippets/all/howto/micro_batching.py create mode 100644 docs/snippets/all/howto/micro_batching.rs create mode 100644 docs/snippets/all/howto/minimal.urdf create mode 100644 docs/snippets/all/howto/optimize_chunks.py create mode 100644 docs/snippets/all/howto/query-and-transform/segment_url.py create mode 100644 docs/snippets/all/howto/query_images.py create mode 100644 docs/snippets/all/howto/query_video_keyframes.py create mode 100644 docs/snippets/all/howto/query_videos.py create mode 100644 docs/snippets/all/howto/screenshot.py create mode 100644 docs/snippets/all/howto/send_table.py create mode 100644 docs/snippets/all/howto/serve_web_viewer.py create mode 100644 docs/snippets/all/howto/serve_web_viewer.rs create mode 100644 docs/snippets/all/howto/set_sinks.cpp create mode 100644 docs/snippets/all/howto/set_sinks.py create mode 100644 docs/snippets/all/howto/set_sinks.rs create mode 100644 docs/snippets/all/howto/state_remapping.py create mode 100644 docs/snippets/all/howto/state_timeline.cpp create mode 100644 docs/snippets/all/howto/state_timeline.py create mode 100644 docs/snippets/all/howto/state_timeline.rs create mode 100644 docs/snippets/all/howto/sub_dataset.py create mode 100644 docs/snippets/all/howto/time_alignment.py create mode 100644 docs/snippets/all/howto/view_operations.py create mode 100644 docs/snippets/all/howto/visualization/load_blueprint.cpp create mode 100644 docs/snippets/all/howto/visualization/load_blueprint.py create mode 100644 docs/snippets/all/howto/visualization/load_blueprint.rs create mode 100644 docs/snippets/all/howto/visualization/save_blueprint.py create mode 100644 docs/snippets/all/migration/log_line.py create mode 100644 docs/snippets/all/migration/log_line.rs create mode 100644 docs/snippets/all/migration/log_tick_enabled.cpp create mode 100644 docs/snippets/all/migration/log_tick_enabled.py create mode 100644 docs/snippets/all/migration/log_tick_enabled.rs create mode 100644 docs/snippets/all/migration/transactional_transforms.cpp create mode 100644 docs/snippets/all/migration/transactional_transforms.py create mode 100644 docs/snippets/all/migration/transactional_transforms.rs create mode 100644 docs/snippets/all/quick_start/quick_start_connect.cpp create mode 100644 docs/snippets/all/quick_start/quick_start_connect.py create mode 100644 docs/snippets/all/quick_start/quick_start_connect.rs create mode 100644 docs/snippets/all/quick_start/quick_start_spawn.cpp create mode 100644 docs/snippets/all/quick_start/quick_start_spawn.py create mode 100644 docs/snippets/all/quick_start/quick_start_spawn.rs create mode 100644 docs/snippets/all/reference/dataframe_view_query.py create mode 100644 docs/snippets/all/ruff.toml create mode 100644 docs/snippets/all/tutorials/annotation_context.cpp create mode 100644 docs/snippets/all/tutorials/annotation_context.py create mode 100644 docs/snippets/all/tutorials/annotation_context.rs create mode 100644 docs/snippets/all/tutorials/any_values.cpp create mode 100644 docs/snippets/all/tutorials/any_values.py create mode 100644 docs/snippets/all/tutorials/any_values.rs create mode 100644 docs/snippets/all/tutorials/custom-application-id.cpp create mode 100644 docs/snippets/all/tutorials/custom-application-id.py create mode 100644 docs/snippets/all/tutorials/custom-application-id.rs create mode 100644 docs/snippets/all/tutorials/custom-recording-id.cpp create mode 100644 docs/snippets/all/tutorials/custom-recording-id.py create mode 100644 docs/snippets/all/tutorials/custom-recording-id.rs create mode 100644 docs/snippets/all/tutorials/custom_data.cpp create mode 100644 docs/snippets/all/tutorials/custom_data.py create mode 100644 docs/snippets/all/tutorials/custom_data.rs create mode 100644 docs/snippets/all/tutorials/data_out.py create mode 100644 docs/snippets/all/tutorials/default-off-session.py create mode 100644 docs/snippets/all/tutorials/default-off-session.rs create mode 100644 docs/snippets/all/tutorials/dna.cpp create mode 100644 docs/snippets/all/tutorials/dna.py create mode 100644 docs/snippets/all/tutorials/dna.rs create mode 100644 docs/snippets/all/tutorials/dna_connect_grpc.cpp create mode 100644 docs/snippets/all/tutorials/dna_connect_grpc.py create mode 100644 docs/snippets/all/tutorials/dna_connect_grpc.rs create mode 100644 docs/snippets/all/tutorials/dynamic_archetype.cpp create mode 100644 docs/snippets/all/tutorials/dynamic_archetype.py create mode 100644 docs/snippets/all/tutorials/dynamic_archetype.rs create mode 100644 docs/snippets/all/tutorials/extra_values.cpp create mode 100644 docs/snippets/all/tutorials/extra_values.py create mode 100644 docs/snippets/all/tutorials/extra_values.rs create mode 100755 docs/snippets/all/tutorials/fixed_window_plot.py create mode 100644 docs/snippets/all/tutorials/getting_started.py create mode 100644 docs/snippets/all/tutorials/getting_started_convert.py create mode 100644 docs/snippets/all/tutorials/getting_started_log.cpp create mode 100644 docs/snippets/all/tutorials/getting_started_log.py create mode 100644 docs/snippets/all/tutorials/getting_started_log.rs create mode 100644 docs/snippets/all/tutorials/log-file.cpp create mode 100644 docs/snippets/all/tutorials/log-file.py create mode 100644 docs/snippets/all/tutorials/log-file.rs create mode 100644 docs/snippets/all/tutorials/timelines_example.cpp create mode 100644 docs/snippets/all/tutorials/timelines_example.py create mode 100644 docs/snippets/all/tutorials/timelines_example.rs create mode 100644 docs/snippets/all/tutorials/visualization/load_blueprint.py create mode 100644 docs/snippets/all/tutorials/visualization/save_blueprint.py create mode 100644 docs/snippets/all/tutorials/visualizer-overrides.py create mode 100644 docs/snippets/all/views/bar_chart.py create mode 100644 docs/snippets/all/views/dataframe.py create mode 100644 docs/snippets/all/views/graph.py create mode 100644 docs/snippets/all/views/map.py create mode 100644 docs/snippets/all/views/spatial2d.py create mode 100644 docs/snippets/all/views/spatial3d.py create mode 100644 docs/snippets/all/views/state_timeline.py create mode 100644 docs/snippets/all/views/tensor.py create mode 100644 docs/snippets/all/views/text_document.py create mode 100644 docs/snippets/all/views/text_log.py create mode 100644 docs/snippets/all/views/timeseries.py create mode 100644 docs/snippets/build.rs create mode 100755 docs/snippets/compare_snippet_output.py create mode 100644 docs/snippets/rustfmt.toml create mode 100644 docs/snippets/snippet_dispatcher.cpp.in create mode 100644 docs/snippets/snippets.toml create mode 100644 docs/snippets/src/lib.rs create mode 100644 docs/snippets/src/main.rs create mode 100644 docs/snippets/src/snippets/.gitignore create mode 100644 docs/snippets/src/snippets/encoded_depth.png create mode 100644 docs/snippets/src/snippets/ferris.png create mode 100644 examples/.gitignore create mode 100644 examples/.rerun_examples create mode 100644 examples/README.md create mode 100644 examples/assets/.gitignore create mode 100644 examples/assets/example.cpp create mode 100644 examples/assets/example.glb create mode 100644 examples/assets/example.gltf create mode 100644 examples/assets/example.jpg create mode 100644 examples/assets/example.md create mode 100644 examples/assets/example.mtl create mode 100644 examples/assets/example.obj create mode 100644 examples/assets/example.ply create mode 100644 examples/assets/example.png create mode 100644 examples/assets/example.py create mode 100644 examples/assets/example.rrd create mode 100644 examples/assets/example.rs create mode 100644 examples/assets/example.txt create mode 100644 examples/c/README.md create mode 100644 examples/c/minimal/.gitignore create mode 100644 examples/c/minimal/README.md create mode 100644 examples/c/minimal/main.c create mode 100644 examples/c/spawn_viewer/.gitignore create mode 100644 examples/c/spawn_viewer/README.md create mode 100644 examples/c/spawn_viewer/main.c create mode 100644 examples/cpp/CMakeLists.txt create mode 100644 examples/cpp/README.md create mode 100644 examples/cpp/clock/CMakeLists.txt create mode 100644 examples/cpp/clock/README.md create mode 100644 examples/cpp/clock/main.cpp create mode 100644 examples/cpp/custom_collection_adapter/CMakeLists.txt create mode 100644 examples/cpp/custom_collection_adapter/README.md create mode 100644 examples/cpp/custom_collection_adapter/main.cpp create mode 100644 examples/cpp/dna/CMakeLists.txt create mode 100644 examples/cpp/dna/README.md create mode 100644 examples/cpp/dna/main.cpp create mode 100644 examples/cpp/eigen_opencv/README.md create mode 100644 examples/cpp/external_importer/CMakeLists.txt create mode 100644 examples/cpp/external_importer/README.md create mode 100644 examples/cpp/external_importer/main.cpp create mode 100644 examples/cpp/incremental_logging/CMakeLists.txt create mode 100644 examples/cpp/incremental_logging/README.md create mode 100644 examples/cpp/incremental_logging/main.cpp create mode 100644 examples/cpp/kiss-icp/README.md create mode 100644 examples/cpp/log_file/CMakeLists.txt create mode 100644 examples/cpp/log_file/README.md create mode 100644 examples/cpp/log_file/main.cpp create mode 100644 examples/cpp/minimal/CMakeLists.txt create mode 100644 examples/cpp/minimal/README.md create mode 100644 examples/cpp/minimal/main.cpp create mode 100644 examples/cpp/ros2_bridge/README.md create mode 100644 examples/cpp/ros_bridge/README.md create mode 100644 examples/cpp/shared_recording/CMakeLists.txt create mode 100644 examples/cpp/shared_recording/README.md create mode 100644 examples/cpp/shared_recording/main.cpp create mode 100644 examples/cpp/spawn_viewer/CMakeLists.txt create mode 100644 examples/cpp/spawn_viewer/README.md create mode 100644 examples/cpp/spawn_viewer/main.cpp create mode 100644 examples/cpp/stdio/CMakeLists.txt create mode 100644 examples/cpp/stdio/README.md create mode 100644 examples/cpp/stdio/main.cpp create mode 100644 examples/cpp/stereo_vision_slam/README.md create mode 100644 examples/cpp/vrs/README.md create mode 100644 examples/manifest.toml create mode 100644 examples/notebook/notebook/.gitignore create mode 100644 examples/notebook/notebook/README.md create mode 100644 examples/notebook/notebook/cube.ipynb create mode 100644 examples/notebook/notebook/partial_updates.ipynb create mode 100644 examples/notebook/notebook/requirements.txt create mode 100644 examples/notebook/notebook/send_table.ipynb create mode 100644 examples/notebook/notebook/set_application_blueprint.ipynb create mode 100644 examples/notebook/notebook_callbacks/README.md create mode 100644 examples/notebook/notebook_callbacks/notebook_callbacks.ipynb create mode 100644 examples/notebook/notebook_callbacks/requirements.txt create mode 100644 examples/notebook/notebook_neural_field_2d/.gitignore create mode 100644 examples/notebook/notebook_neural_field_2d/README.md create mode 100644 examples/notebook/notebook_neural_field_2d/neural_field_2d.ipynb create mode 100644 examples/notebook/notebook_neural_field_2d/requirements.txt create mode 100644 examples/notebook/notebook_viewer/README.md create mode 100644 examples/notebook/notebook_viewer/notebook_viewer.ipynb create mode 100644 examples/notebook/notebook_viewer/requirements.txt create mode 100644 examples/python/README.md create mode 100644 examples/python/_isolated/mypy.ini create mode 100644 examples/python/air_traffic_data/.gitignore create mode 100644 examples/python/air_traffic_data/README.md create mode 100644 examples/python/air_traffic_data/air_traffic_data.py create mode 100644 examples/python/air_traffic_data/pyproject.toml create mode 100644 examples/python/animated_urdf/README.md create mode 100755 examples/python/animated_urdf/animated_urdf.py create mode 100644 examples/python/animated_urdf/pyproject.toml create mode 100644 examples/python/annotation_gradio/README.md create mode 100644 examples/python/any_scalar/README.md create mode 100644 examples/python/any_scalar/any_scalar/__init__.py create mode 100755 examples/python/any_scalar/any_scalar/__main__.py create mode 100755 examples/python/any_scalar/any_scalar/market_demo.py create mode 100755 examples/python/any_scalar/any_scalar/robotics_demo.py create mode 100644 examples/python/any_scalar/pyproject.toml create mode 100644 examples/python/arflow/README.md create mode 100644 examples/python/arkit_scenes/.gitignore create mode 100644 examples/python/arkit_scenes/README.md create mode 100644 examples/python/arkit_scenes/arkit_scenes/__init__.py create mode 100755 examples/python/arkit_scenes/arkit_scenes/__main__.py create mode 100644 examples/python/arkit_scenes/arkit_scenes/download_dataset.py create mode 100644 examples/python/arkit_scenes/pyproject.toml create mode 100755 examples/python/blueprint/blueprint.py create mode 100644 examples/python/blueprint/pyproject.toml create mode 100644 examples/python/blueprint_stocks/README.md create mode 100755 examples/python/blueprint_stocks/blueprint_stocks.py create mode 100644 examples/python/blueprint_stocks/pyproject.toml create mode 100644 examples/python/camera_video_stream/README.md create mode 100755 examples/python/camera_video_stream/camera_video_stream.py create mode 100644 examples/python/camera_video_stream/pyproject.toml create mode 100644 examples/python/clock/README.md create mode 100755 examples/python/clock/clock.py create mode 100644 examples/python/clock/pyproject.toml create mode 100644 examples/python/controlnet/README.md create mode 100755 examples/python/controlnet/controlnet.py create mode 100644 examples/python/controlnet/pyproject.toml create mode 100644 examples/python/dataframe_query/README.md create mode 100755 examples/python/dataframe_query/dataframe_query.py create mode 100644 examples/python/dataframe_query/pyproject.toml create mode 100644 examples/python/dataloader/.gitignore create mode 100644 examples/python/dataloader/README.md create mode 100644 examples/python/dataloader/prepare_dataset.py create mode 100644 examples/python/dataloader/pyproject.toml create mode 100644 examples/python/dataloader/train.py create mode 100644 examples/python/dataloader/uv.lock create mode 100644 examples/python/depth_compare/README.md create mode 100644 examples/python/detect_and_track_objects/.gitignore create mode 100644 examples/python/detect_and_track_objects/README.md create mode 100755 examples/python/detect_and_track_objects/detect_and_track_objects.py create mode 100644 examples/python/detect_and_track_objects/panoptic_coco_categories.json create mode 100644 examples/python/detect_and_track_objects/pyproject.toml create mode 100644 examples/python/dicom_mri/.gitignore create mode 100644 examples/python/dicom_mri/README.md create mode 100755 examples/python/dicom_mri/dicom_mri.py create mode 100644 examples/python/dicom_mri/pyproject.toml create mode 100644 examples/python/differentiable_blocks_world/README.md create mode 100644 examples/python/dna/README.md create mode 100755 examples/python/dna/dna.py create mode 100644 examples/python/dna/pyproject.toml create mode 100644 examples/python/droid_dataset/README.md create mode 100644 examples/python/droid_semantic_search/.gitignore create mode 100644 examples/python/droid_semantic_search/README.md create mode 100644 examples/python/droid_semantic_search/embeddings.py create mode 100644 examples/python/droid_semantic_search/ingest.py create mode 100644 examples/python/droid_semantic_search/prepare_dataset.py create mode 100644 examples/python/droid_semantic_search/pyproject.toml create mode 100644 examples/python/droid_semantic_search/search.py create mode 100644 examples/python/droid_semantic_search/uv.lock create mode 100644 examples/python/droid_semantic_search/vector_store.py create mode 100644 examples/python/drone_lidar/.gitignore create mode 100644 examples/python/drone_lidar/README.md create mode 100644 examples/python/drone_lidar/drone_lidar.py create mode 100644 examples/python/drone_lidar/pyproject.toml create mode 100644 examples/python/egoexo_forge/README.md create mode 100644 examples/python/external_importer/README.md create mode 100755 examples/python/external_importer/rerun-importer-python-file.py create mode 100644 examples/python/eye_control/README.md create mode 100644 examples/python/face_tracking/.gitignore create mode 100644 examples/python/face_tracking/README.md create mode 100755 examples/python/face_tracking/face_tracking.py create mode 100644 examples/python/face_tracking/pyproject.toml create mode 100644 examples/python/gesture_detection/.gitignore create mode 100644 examples/python/gesture_detection/README.md create mode 100755 examples/python/gesture_detection/gesture_detection.py create mode 100644 examples/python/gesture_detection/pyproject.toml create mode 100644 examples/python/glomap/README.md create mode 100644 examples/python/graph_lattice/README.md create mode 100755 examples/python/graph_lattice/graph_lattice.py create mode 100644 examples/python/graph_lattice/pyproject.toml create mode 100644 examples/python/graphs/README.md create mode 100755 examples/python/graphs/graphs.py create mode 100644 examples/python/graphs/pyproject.toml create mode 100644 examples/python/hloc_glomap/README.md create mode 100644 examples/python/human_pose_tracking/.gitignore create mode 100644 examples/python/human_pose_tracking/README.md create mode 100755 examples/python/human_pose_tracking/human_pose_tracking.py create mode 100644 examples/python/human_pose_tracking/pyproject.toml create mode 100644 examples/python/imu_signals/.gitignore create mode 100644 examples/python/imu_signals/README.md create mode 100644 examples/python/imu_signals/imu_signals.py create mode 100644 examples/python/imu_signals/pyproject.toml create mode 100644 examples/python/incremental_logging/README.md create mode 100755 examples/python/incremental_logging/incremental_logging.py create mode 100644 examples/python/incremental_logging/pyproject.toml create mode 100644 examples/python/instant_splat/README.md create mode 100644 examples/python/kiss-icp/README.md create mode 100644 examples/python/lerobot/README.md create mode 100644 examples/python/lerobot_loader/README.md create mode 100644 examples/python/lidar/.gitignore create mode 100644 examples/python/lidar/README.md create mode 100644 examples/python/lidar/lidar/__init__.py create mode 100755 examples/python/lidar/lidar/__main__.py create mode 100644 examples/python/lidar/lidar/download_dataset.py create mode 100644 examples/python/lidar/pyproject.toml create mode 100644 examples/python/limap/README.md create mode 100644 examples/python/live_camera_edge_detection/README.md create mode 100755 examples/python/live_camera_edge_detection/live_camera_edge_detection.py create mode 100644 examples/python/live_camera_edge_detection/pyproject.toml create mode 100644 examples/python/live_depth_sensor/README.md create mode 100755 examples/python/live_depth_sensor/live_depth_sensor.py create mode 100644 examples/python/live_depth_sensor/pyproject.toml create mode 100644 examples/python/live_scrolling_plot/README.md create mode 100755 examples/python/live_scrolling_plot/live_scrolling_plot.py create mode 100644 examples/python/live_scrolling_plot/pyproject.toml create mode 100644 examples/python/llm_embedding_ner/README.md create mode 100755 examples/python/llm_embedding_ner/llm_embedding_ner.py create mode 100644 examples/python/llm_embedding_ner/pyproject.toml create mode 100644 examples/python/log_file/README.md create mode 100755 examples/python/log_file/log_file.py create mode 100644 examples/python/log_file/pyproject.toml create mode 100644 examples/python/mast3r_slam/README.md create mode 100644 examples/python/mcap/README.md create mode 100644 examples/python/mcc/README.md create mode 100644 examples/python/mini_nvs_solver/README.md create mode 100644 examples/python/minimal/README.md create mode 100755 examples/python/minimal/minimal.py create mode 100644 examples/python/minimal/pyproject.toml create mode 100755 examples/python/minimal_options/minimal_options.py create mode 100644 examples/python/minimal_options/pyproject.toml create mode 100644 examples/python/ml_depth_pro/README.md create mode 100644 examples/python/multiprocess_logging/README.md create mode 100755 examples/python/multiprocess_logging/multiprocess_logging.py create mode 100644 examples/python/multiprocess_logging/pyproject.toml create mode 100644 examples/python/multithreading/README.md create mode 100755 examples/python/multithreading/multithreading.py create mode 100644 examples/python/multithreading/pyproject.toml create mode 100644 examples/python/nuscenes_dataset/.gitignore create mode 100644 examples/python/nuscenes_dataset/README.md create mode 100644 examples/python/nuscenes_dataset/nuscenes_dataset/__init__.py create mode 100755 examples/python/nuscenes_dataset/nuscenes_dataset/__main__.py create mode 100644 examples/python/nuscenes_dataset/nuscenes_dataset/download_dataset.py create mode 100644 examples/python/nuscenes_dataset/nuscenes_dataset/export_gps.py create mode 100644 examples/python/nuscenes_dataset/pyproject.toml create mode 100644 examples/python/nv12/README.md create mode 100755 examples/python/nv12/nv12.py create mode 100644 examples/python/nv12/pyproject.toml create mode 100644 examples/python/objectron/README.md create mode 100644 examples/python/objectron/objectron/__init__.py create mode 100755 examples/python/objectron/objectron/__main__.py create mode 100644 examples/python/objectron/objectron/download_dataset.py create mode 100644 examples/python/objectron/objectron/proto/LICENSE.txt create mode 100644 examples/python/objectron/objectron/proto/__init__.py create mode 100644 examples/python/objectron/objectron/proto/a_r_capture_metadata.proto create mode 100644 examples/python/objectron/objectron/proto/annotation_data.proto create mode 100644 examples/python/objectron/objectron/proto/object.proto create mode 100644 examples/python/objectron/objectron/proto/objectron/__init__.py create mode 100644 examples/python/objectron/objectron/proto/objectron/proto.py create mode 100644 examples/python/objectron/pyproject.toml create mode 100644 examples/python/ocr/README.md create mode 100755 examples/python/ocr/ocr.py create mode 100644 examples/python/ocr/pyproject.toml create mode 100644 examples/python/open_photogrammetry_format/README.md create mode 100755 examples/python/open_photogrammetry_format/open_photogrammetry_format.py create mode 100644 examples/python/open_photogrammetry_format/pyproject.toml create mode 100644 examples/python/openstreetmap_data/.gitignore create mode 100644 examples/python/openstreetmap_data/README.md create mode 100644 examples/python/openstreetmap_data/openstreetmap_data.py create mode 100644 examples/python/openstreetmap_data/pyproject.toml create mode 100644 examples/python/plots/README.md create mode 100755 examples/python/plots/plots.py create mode 100644 examples/python/plots/pyproject.toml create mode 100644 examples/python/prompt_depth_anything/README.md create mode 100644 examples/python/raw_mesh/README.md create mode 100644 examples/python/raw_mesh/pyproject.toml create mode 100644 examples/python/raw_mesh/raw_mesh/__init__.py create mode 100755 examples/python/raw_mesh/raw_mesh/__main__.py create mode 100755 examples/python/raw_mesh/raw_mesh/download_dataset.py create mode 100644 examples/python/rerun_export/README.md create mode 100644 examples/python/rgbd/.gitignore create mode 100644 examples/python/rgbd/README.md create mode 100644 examples/python/rgbd/pyproject.toml create mode 100755 examples/python/rgbd/rgbd.py create mode 100644 examples/python/robot_data_preprocessing/.gitattributes create mode 100644 examples/python/robot_data_preprocessing/.gitignore create mode 100644 examples/python/robot_data_preprocessing/README.md create mode 100644 examples/python/robot_data_preprocessing/input_data/episode.mcap create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/angled_extrusion.stl create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/base_link.stl create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/camera_mount_d405.stl create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/carriage_left.stl create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/carriage_right.stl create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/corner_bracket.stl create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/d405_solid.stl create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/extrusion_1000.stl create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/extrusion_1220.stl create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/extrusion_150.stl create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/extrusion_2040_1000.stl create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/extrusion_2040_880.stl create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/extrusion_600.stl create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/gripper_left.stl create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/gripper_right.stl create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/link_1.stl create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/link_2.stl create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/link_3.stl create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/link_4.stl create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/link_5.stl create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/link_6.stl create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/overhead_mount.stl create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/tablelegs.obj create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/tabletop.obj create mode 100644 examples/python/robot_data_preprocessing/input_data/meshes/wormseye_mount.stl create mode 100644 examples/python/robot_data_preprocessing/input_data/offsets.json create mode 100644 examples/python/robot_data_preprocessing/input_data/robot.urdf create mode 100644 examples/python/robot_data_preprocessing/input_data/scene.urdf create mode 100644 examples/python/robot_data_preprocessing/pyproject.toml create mode 100644 examples/python/robot_data_preprocessing/robot_data_preprocessing.py create mode 100644 examples/python/ros_node/README.md create mode 100755 examples/python/ros_node/main.py create mode 100644 examples/python/ros_node/requirements.txt create mode 100644 examples/python/ros_tf/README.md create mode 100644 examples/python/rrt_star/README.md create mode 100644 examples/python/rrt_star/pyproject.toml create mode 100755 examples/python/rrt_star/rrt_star.py create mode 100644 examples/python/sam2_depthanything/README.md create mode 100644 examples/python/sam3d_body/README.md create mode 100644 examples/python/segment_anything_model/.gitignore create mode 100644 examples/python/segment_anything_model/README.md create mode 100644 examples/python/segment_anything_model/pyproject.toml create mode 100755 examples/python/segment_anything_model/segment_anything_model.py create mode 100644 examples/python/server_tables/README.md create mode 100644 examples/python/server_tables/pyproject.toml create mode 100755 examples/python/server_tables/server_tables.py create mode 100644 examples/python/shape_pointe/README.md create mode 100644 examples/python/shared_recording/README.md create mode 100644 examples/python/shared_recording/pyproject.toml create mode 100755 examples/python/shared_recording/shared_recording.py create mode 100644 examples/python/simplerecon/README.md create mode 100644 examples/python/slahmr/README.md create mode 100644 examples/python/stdio/README.md create mode 100644 examples/python/stdio/pyproject.toml create mode 100644 examples/python/stdio/requirements.txt create mode 100755 examples/python/stdio/stdio.py create mode 100644 examples/python/structure_from_motion/.gitignore create mode 100644 examples/python/structure_from_motion/README.md create mode 100644 examples/python/structure_from_motion/pyproject.toml create mode 100644 examples/python/structure_from_motion/structure_from_motion/__init__.py create mode 100755 examples/python/structure_from_motion/structure_from_motion/__main__.py create mode 100644 examples/python/structure_from_motion/structure_from_motion/read_write_model.py create mode 100644 examples/python/table_blueprints/README.md create mode 100644 examples/python/table_blueprints/pyproject.toml create mode 100644 examples/python/table_blueprints/table_blueprints.py create mode 100644 examples/python/table_grid_with_flags/README.md create mode 100644 examples/python/table_grid_with_flags/pyproject.toml create mode 100644 examples/python/table_grid_with_flags/table_grid_with_flags.py create mode 100644 examples/python/table_zoo/README.md create mode 100644 examples/python/table_zoo/pyproject.toml create mode 100644 examples/python/table_zoo/table_zoo.py create mode 100644 examples/python/tapir/README.md create mode 100644 examples/python/template/README.md create mode 100644 examples/python/template/pyproject.toml create mode 100755 examples/python/template/template.py create mode 100644 examples/python/tfrecord_loader/README.md create mode 100644 examples/python/using_index_values/README.md create mode 100644 examples/python/using_index_values/pyproject.toml create mode 100755 examples/python/using_index_values/using_index_values.py create mode 100644 examples/python/vista/README.md create mode 100644 examples/python/vistadream/README.md create mode 100644 examples/python/webpage/README.md create mode 100644 examples/python/widebaseline/README.md create mode 100644 examples/rust/README.md create mode 100644 examples/rust/animated_urdf/Cargo.toml create mode 100644 examples/rust/animated_urdf/README.md create mode 100644 examples/rust/animated_urdf/data/LICENSE create mode 100644 examples/rust/animated_urdf/data/README.md create mode 100755 examples/rust/animated_urdf/data/assets/Base.stl create mode 100755 examples/rust/animated_urdf/data/assets/Base_Motor.stl create mode 100755 examples/rust/animated_urdf/data/assets/Fixed_Jaw.stl create mode 100755 examples/rust/animated_urdf/data/assets/Fixed_Jaw_Motor.stl create mode 100755 examples/rust/animated_urdf/data/assets/Lower_Arm.stl create mode 100755 examples/rust/animated_urdf/data/assets/Lower_Arm_Motor.stl create mode 100755 examples/rust/animated_urdf/data/assets/Moving_Jaw.stl create mode 100755 examples/rust/animated_urdf/data/assets/Rotation_Pitch.stl create mode 100755 examples/rust/animated_urdf/data/assets/Rotation_Pitch_Motor.stl create mode 100755 examples/rust/animated_urdf/data/assets/Upper_Arm.stl create mode 100755 examples/rust/animated_urdf/data/assets/Upper_Arm_Motor.stl create mode 100755 examples/rust/animated_urdf/data/assets/Wrist_Pitch_Roll.stl create mode 100755 examples/rust/animated_urdf/data/assets/Wrist_Pitch_Roll_Motor.stl create mode 100644 examples/rust/animated_urdf/data/so100.urdf create mode 100644 examples/rust/animated_urdf/src/main.rs create mode 100644 examples/rust/blueprint/Cargo.toml create mode 100644 examples/rust/blueprint/README.md create mode 100644 examples/rust/blueprint/src/main.rs create mode 100644 examples/rust/blueprint_stocks/Cargo.toml create mode 100644 examples/rust/blueprint_stocks/README.md create mode 100644 examples/rust/blueprint_stocks/src/data/info/aapl.json create mode 100644 examples/rust/blueprint_stocks/src/data/info/amzn.json create mode 100644 examples/rust/blueprint_stocks/src/data/info/googl.json create mode 100644 examples/rust/blueprint_stocks/src/data/info/meta.json create mode 100644 examples/rust/blueprint_stocks/src/data/info/msft.json create mode 100644 examples/rust/blueprint_stocks/src/data/quotes/aapl.json create mode 100644 examples/rust/blueprint_stocks/src/data/quotes/amzn.json create mode 100644 examples/rust/blueprint_stocks/src/data/quotes/googl.json create mode 100644 examples/rust/blueprint_stocks/src/data/quotes/meta.json create mode 100644 examples/rust/blueprint_stocks/src/data/quotes/msft.json create mode 100644 examples/rust/blueprint_stocks/src/main.rs create mode 100644 examples/rust/chess_robby_fischer/README.md create mode 100644 examples/rust/clock/Cargo.toml create mode 100644 examples/rust/clock/README.md create mode 100644 examples/rust/clock/src/main.rs create mode 100644 examples/rust/custom_callback/Cargo.toml create mode 100644 examples/rust/custom_callback/README.md create mode 100644 examples/rust/custom_callback/src/app.rs create mode 100644 examples/rust/custom_callback/src/comms/app.rs create mode 100644 examples/rust/custom_callback/src/comms/mod.rs create mode 100644 examples/rust/custom_callback/src/comms/protocol.rs create mode 100644 examples/rust/custom_callback/src/comms/viewer.rs create mode 100644 examples/rust/custom_callback/src/lib.rs create mode 100644 examples/rust/custom_callback/src/panel.rs create mode 100644 examples/rust/custom_callback/src/viewer.rs create mode 100644 examples/rust/custom_importer/Cargo.toml create mode 100644 examples/rust/custom_importer/README.md create mode 100644 examples/rust/custom_importer/build.rs create mode 100644 examples/rust/custom_importer/src/main.rs create mode 100644 examples/rust/custom_store_subscriber/Cargo.toml create mode 100644 examples/rust/custom_store_subscriber/README.md create mode 100644 examples/rust/custom_store_subscriber/build.rs create mode 100644 examples/rust/custom_store_subscriber/src/main.rs create mode 100644 examples/rust/custom_view/Cargo.toml create mode 100644 examples/rust/custom_view/README.md create mode 100644 examples/rust/custom_view/src/color_coordinate_config.rs create mode 100644 examples/rust/custom_view/src/main.rs create mode 100644 examples/rust/custom_view/src/points3d_color_view.rs create mode 100644 examples/rust/custom_view/src/points3d_color_visualizer.rs create mode 100644 examples/rust/custom_visualizer/Cargo.toml create mode 100644 examples/rust/custom_visualizer/README.md create mode 100644 examples/rust/custom_visualizer/shader/height_field.wgsl create mode 100644 examples/rust/custom_visualizer/src/height_field_archetype.rs create mode 100644 examples/rust/custom_visualizer/src/height_field_renderer.rs create mode 100644 examples/rust/custom_visualizer/src/height_field_visualizer.rs create mode 100644 examples/rust/custom_visualizer/src/main.rs create mode 100644 examples/rust/dataframe_query/Cargo.toml create mode 100644 examples/rust/dataframe_query/README.md create mode 100644 examples/rust/dataframe_query/src/main.rs create mode 100644 examples/rust/dna/Cargo.toml create mode 100644 examples/rust/dna/README.md create mode 100644 examples/rust/dna/src/main.rs create mode 100644 examples/rust/extend_viewer_ui/Cargo.toml create mode 100644 examples/rust/extend_viewer_ui/README.md create mode 100644 examples/rust/extend_viewer_ui/src/main.rs create mode 100644 examples/rust/external_importer/Cargo.toml create mode 100644 examples/rust/external_importer/README.md create mode 100644 examples/rust/external_importer/src/main.rs create mode 100644 examples/rust/graph_lattice/Cargo.toml create mode 100644 examples/rust/graph_lattice/README.md create mode 100644 examples/rust/graph_lattice/src/main.rs create mode 100644 examples/rust/incremental_logging/Cargo.toml create mode 100644 examples/rust/incremental_logging/README.md create mode 100644 examples/rust/incremental_logging/src/main.rs create mode 100644 examples/rust/lenses/Cargo.toml create mode 100644 examples/rust/lenses/README.md create mode 100644 examples/rust/lenses/src/main.rs create mode 100644 examples/rust/log_file/Cargo.toml create mode 100644 examples/rust/log_file/README.md create mode 100644 examples/rust/log_file/src/main.rs create mode 100644 examples/rust/minimal/Cargo.toml create mode 100644 examples/rust/minimal/README.md create mode 100644 examples/rust/minimal/src/main.rs create mode 100644 examples/rust/minimal_options/Cargo.toml create mode 100644 examples/rust/minimal_options/src/main.rs create mode 100644 examples/rust/minimal_serve/Cargo.toml create mode 100644 examples/rust/minimal_serve/README.md create mode 100644 examples/rust/minimal_serve/src/main.rs create mode 100644 examples/rust/objectron/.gitattributes create mode 100644 examples/rust/objectron/Cargo.toml create mode 100644 examples/rust/objectron/README.md create mode 100644 examples/rust/objectron/build.rs create mode 120000 examples/rust/objectron/proto create mode 100644 examples/rust/objectron/src/main.rs create mode 100644 examples/rust/objectron/src/objectron.rs create mode 100644 examples/rust/raw_mesh/Cargo.toml create mode 100644 examples/rust/raw_mesh/README.md create mode 100644 examples/rust/raw_mesh/src/main.rs create mode 100644 examples/rust/revy/README.md create mode 100644 examples/rust/shared_recording/Cargo.toml create mode 100644 examples/rust/shared_recording/README.md create mode 100644 examples/rust/shared_recording/src/main.rs create mode 100644 examples/rust/spawn_viewer/Cargo.toml create mode 100644 examples/rust/spawn_viewer/README.md create mode 100644 examples/rust/spawn_viewer/src/main.rs create mode 100644 examples/rust/state_timeline/Cargo.toml create mode 100644 examples/rust/state_timeline/src/main.rs create mode 100644 examples/rust/stdio/Cargo.toml create mode 100644 examples/rust/stdio/README.md create mode 100644 examples/rust/stdio/src/main.rs create mode 100644 examples/rust/template/Cargo.toml create mode 100644 examples/rust/template/README.md create mode 100644 examples/rust/template/src/main.rs create mode 100644 examples/rust/viewer_callbacks/Cargo.toml create mode 100644 examples/rust/viewer_callbacks/README.md create mode 100644 examples/rust/viewer_callbacks/src/main.rs create mode 100644 examples/schema.json create mode 100644 hooks/README.md create mode 100755 hooks/pre-push create mode 100644 lychee.toml create mode 100644 pixi.lock create mode 100644 pixi.toml create mode 100644 pyproject.toml create mode 100644 pyrightconfig.json create mode 100644 rerun_cpp/.gitattributes create mode 100644 rerun_cpp/.gitignore create mode 100644 rerun_cpp/CMakeLists.txt create mode 100644 rerun_cpp/Config.cmake.in create mode 100644 rerun_cpp/README.md create mode 100644 rerun_cpp/arrow_cpp_install.md create mode 100644 rerun_cpp/cmake_setup_in_detail.md create mode 100644 rerun_cpp/docs/Doxyfile create mode 100644 rerun_cpp/docs/doxygen-awesome/README.md create mode 100644 rerun_cpp/docs/doxygen-awesome/doxygen-awesome-darkmode-toggle.js create mode 100644 rerun_cpp/docs/doxygen-awesome/doxygen-awesome-fragment-copy-button.js create mode 100644 rerun_cpp/docs/doxygen-awesome/doxygen-awesome-interactive-toc.js create mode 100644 rerun_cpp/docs/doxygen-awesome/doxygen-awesome-paragraph-link.js create mode 100644 rerun_cpp/docs/doxygen-awesome/doxygen-awesome-sidebar-only-darkmode-toggle.css create mode 100644 rerun_cpp/docs/doxygen-awesome/doxygen-awesome-sidebar-only.css create mode 100644 rerun_cpp/docs/doxygen-awesome/doxygen-awesome-tabs.js create mode 100644 rerun_cpp/docs/doxygen-awesome/doxygen-awesome.css create mode 100644 rerun_cpp/docs/header.html create mode 100644 rerun_cpp/docs/readme_snippets.cpp create mode 100644 rerun_cpp/docs/writing_docs.md create mode 100644 rerun_cpp/download_and_build_arrow.cmake create mode 100644 rerun_cpp/patches/mimalloc_cmake4.patch create mode 100644 rerun_cpp/src/rerun.hpp create mode 100644 rerun_cpp/src/rerun/.gitattributes create mode 100644 rerun_cpp/src/rerun/archetypes.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/.gitattributes create mode 100644 rerun_cpp/src/rerun/archetypes/annotation_context.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/annotation_context.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/arrows2d.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/arrows2d.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/arrows2d_ext.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/arrows3d.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/arrows3d.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/arrows3d_ext.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/asset3d.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/asset3d.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/asset3d_ext.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/asset_video.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/asset_video.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/asset_video_ext.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/bar_chart.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/bar_chart.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/bar_chart_ext.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/boxes2d.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/boxes2d.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/boxes2d_ext.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/boxes3d.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/boxes3d.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/boxes3d_ext.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/capsules3d.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/capsules3d.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/capsules3d_ext.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/clear.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/clear.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/clear_ext.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/coordinate_frame.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/coordinate_frame.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/cylinders3d.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/cylinders3d.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/cylinders3d_ext.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/depth_image.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/depth_image.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/depth_image_ext.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/ellipses2d.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/ellipses2d.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/ellipses2d_ext.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/ellipsoids3d.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/ellipsoids3d.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/ellipsoids3d_ext.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/encoded_depth_image.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/encoded_depth_image.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/encoded_image.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/encoded_image.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/encoded_image_ext.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/geo_line_strings.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/geo_line_strings.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/geo_points.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/geo_points.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/geo_points_ext.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/graph_edges.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/graph_edges.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/graph_nodes.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/graph_nodes.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/grid_map.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/grid_map.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/image.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/image.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/image_ext.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/instance_poses3d.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/instance_poses3d.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/line_strips2d.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/line_strips2d.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/line_strips3d.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/line_strips3d.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/mcap_channel.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/mcap_channel.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/mcap_message.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/mcap_message.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/mcap_schema.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/mcap_schema.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/mcap_statistics.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/mcap_statistics.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/mesh3d.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/mesh3d.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/pinhole.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/pinhole.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/pinhole_ext.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/points2d.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/points2d.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/points3d.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/points3d.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/recording_info.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/recording_info.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/scalars.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/scalars.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/segmentation_image.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/segmentation_image.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/segmentation_image_ext.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/series_lines.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/series_lines.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/series_lines_ext.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/series_points.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/series_points.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/series_points_ext.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/state_change.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/state_change.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/state_configuration.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/state_configuration.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/tensor.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/tensor.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/tensor_ext.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/text_document.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/text_document.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/text_log.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/text_log.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/transform3d.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/transform3d.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/transform3d_ext.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/transform_axes3d.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/transform_axes3d.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/video_frame_reference.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/video_frame_reference.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/video_stream.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/video_stream.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/view_coordinates.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/view_coordinates.hpp create mode 100644 rerun_cpp/src/rerun/archetypes/view_coordinates_ext.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/voxel_grid_map.cpp create mode 100644 rerun_cpp/src/rerun/archetypes/voxel_grid_map.hpp create mode 100644 rerun_cpp/src/rerun/arrow_utils.hpp create mode 100644 rerun_cpp/src/rerun/as_components.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/.gitattributes create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/.gitattributes create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/active_visualizers.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/active_visualizers.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/background.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/background.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/container_blueprint.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/container_blueprint.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/dataframe_query.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/dataframe_query.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/entity_behavior.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/entity_behavior.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/eye_controls3d.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/eye_controls3d.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/force_center.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/force_center.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/force_collision_radius.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/force_collision_radius.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/force_link.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/force_link.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/force_many_body.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/force_many_body.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/force_position.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/force_position.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/graph_background.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/graph_background.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/line_grid3d.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/line_grid3d.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/map_background.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/map_background.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/map_zoom.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/map_zoom.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/near_clip_plane.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/near_clip_plane.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/panel_blueprint.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/panel_blueprint.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/plot_background.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/plot_background.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/plot_legend.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/plot_legend.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/scalar_axis.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/scalar_axis.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/spatial_information.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/spatial_information.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/table_blueprint.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/table_blueprint.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/tensor_scalar_mapping.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/tensor_scalar_mapping.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/tensor_slice_selection.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/tensor_slice_selection.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/tensor_view_fit.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/tensor_view_fit.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/text_document_format.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/text_document_format.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/text_log_columns.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/text_log_columns.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/text_log_format.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/text_log_format.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/text_log_rows.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/text_log_rows.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/time_axis.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/time_axis.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/time_panel_blueprint.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/time_panel_blueprint.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/view_blueprint.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/view_blueprint.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/view_contents.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/view_contents.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/viewport_blueprint.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/viewport_blueprint.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/visible_time_ranges.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/visible_time_ranges.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/visual_bounds2d.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/visual_bounds2d.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/visualizer_instruction.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/archetypes/visualizer_instruction.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/.gitattributes create mode 100644 rerun_cpp/src/rerun/blueprint/components/absolute_time_range.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/active_tab.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/angular_speed.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/apply_latest_at.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/auto_layout.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/auto_scroll.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/auto_views.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/background_kind.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/background_kind.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/column_name.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/column_order.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/column_order.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/column_share.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/component_column_selector.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/container_kind.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/container_kind.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/corner2d.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/corner2d.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/enabled.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/eye3d_kind.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/eye3d_kind.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/filter_by_range.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/filter_is_not_null.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/force_distance.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/force_iterations.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/force_strength.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/fps.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/grid_columns.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/grid_spacing.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/included_content.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/link_axis.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/link_axis.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/lock_range_during_zoom.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/loop_mode.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/loop_mode.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/map_provider.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/map_provider.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/near_clip_plane.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/panel_state.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/panel_state.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/play_state.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/play_state.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/playback_speed.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/query_expression.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/root_container.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/row_share.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/selected_columns.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/tensor_dimension_index_slider.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/text_log_column.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/time_int.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/time_range.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/timeline_column.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/timeline_name.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/view_class.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/view_fit.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/view_fit.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/view_maximized.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/view_origin.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/viewer_recommendation_hash.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/visible_time_range.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/visual_bounds2d.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/visualizer_component_mapping.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/visualizer_instruction_id.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/visualizer_type.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/components/zoom_level.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/datatypes.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/datatypes/.gitattributes create mode 100644 rerun_cpp/src/rerun/blueprint/datatypes/component_column_selector.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/datatypes/component_column_selector.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/datatypes/component_source_kind.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/datatypes/component_source_kind.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/datatypes/filter_by_range.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/datatypes/filter_by_range.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/datatypes/filter_is_not_null.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/datatypes/filter_is_not_null.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/datatypes/selected_columns.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/datatypes/selected_columns.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/datatypes/tensor_dimension_index_slider.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/datatypes/tensor_dimension_index_slider.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/datatypes/text_log_column.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/datatypes/text_log_column.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/datatypes/text_log_column_kind.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/datatypes/text_log_column_kind.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/datatypes/timeline_column.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/datatypes/timeline_column.hpp create mode 100644 rerun_cpp/src/rerun/blueprint/datatypes/visualizer_component_mapping.cpp create mode 100644 rerun_cpp/src/rerun/blueprint/datatypes/visualizer_component_mapping.hpp create mode 100644 rerun_cpp/src/rerun/c/.gitattributes create mode 100644 rerun_cpp/src/rerun/c/arrow_c_data_interface.h create mode 100644 rerun_cpp/src/rerun/c/compiler_utils.h create mode 100644 rerun_cpp/src/rerun/c/rerun.h create mode 100644 rerun_cpp/src/rerun/c/sdk_info.h create mode 100644 rerun_cpp/src/rerun/collection.hpp create mode 100644 rerun_cpp/src/rerun/collection_adapter.hpp create mode 100644 rerun_cpp/src/rerun/collection_adapter_builtins.hpp create mode 100644 rerun_cpp/src/rerun/compiler_utils.hpp create mode 100644 rerun_cpp/src/rerun/component_batch.cpp create mode 100644 rerun_cpp/src/rerun/component_batch.hpp create mode 100644 rerun_cpp/src/rerun/component_column.cpp create mode 100644 rerun_cpp/src/rerun/component_column.hpp create mode 100644 rerun_cpp/src/rerun/component_descriptor.hpp create mode 100644 rerun_cpp/src/rerun/component_type.cpp create mode 100644 rerun_cpp/src/rerun/component_type.hpp create mode 100644 rerun_cpp/src/rerun/component_type_registry.cpp create mode 100644 rerun_cpp/src/rerun/component_type_registry.hpp create mode 100644 rerun_cpp/src/rerun/components.hpp create mode 100644 rerun_cpp/src/rerun/components/.gitattributes create mode 100644 rerun_cpp/src/rerun/components/aggregation_policy.cpp create mode 100644 rerun_cpp/src/rerun/components/aggregation_policy.hpp create mode 100644 rerun_cpp/src/rerun/components/albedo_factor.hpp create mode 100644 rerun_cpp/src/rerun/components/annotation_context.cpp create mode 100644 rerun_cpp/src/rerun/components/annotation_context.hpp create mode 100644 rerun_cpp/src/rerun/components/annotation_context_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/axis_length.hpp create mode 100644 rerun_cpp/src/rerun/components/blob.hpp create mode 100644 rerun_cpp/src/rerun/components/cell_size.hpp create mode 100644 rerun_cpp/src/rerun/components/channel_id.hpp create mode 100644 rerun_cpp/src/rerun/components/channel_message_counts.cpp create mode 100644 rerun_cpp/src/rerun/components/channel_message_counts.hpp create mode 100644 rerun_cpp/src/rerun/components/class_id.hpp create mode 100644 rerun_cpp/src/rerun/components/clear_is_recursive.hpp create mode 100644 rerun_cpp/src/rerun/components/color.hpp create mode 100644 rerun_cpp/src/rerun/components/color_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/colormap.cpp create mode 100644 rerun_cpp/src/rerun/components/colormap.hpp create mode 100644 rerun_cpp/src/rerun/components/count.hpp create mode 100644 rerun_cpp/src/rerun/components/depth_meter.hpp create mode 100644 rerun_cpp/src/rerun/components/draw_order.hpp create mode 100644 rerun_cpp/src/rerun/components/entity_path.hpp create mode 100644 rerun_cpp/src/rerun/components/entity_path_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/fill_mode.cpp create mode 100644 rerun_cpp/src/rerun/components/fill_mode.hpp create mode 100644 rerun_cpp/src/rerun/components/fill_ratio.hpp create mode 100644 rerun_cpp/src/rerun/components/gamma_correction.hpp create mode 100644 rerun_cpp/src/rerun/components/geo_line_string.cpp create mode 100644 rerun_cpp/src/rerun/components/geo_line_string.hpp create mode 100644 rerun_cpp/src/rerun/components/geo_line_string_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/graph_edge.hpp create mode 100644 rerun_cpp/src/rerun/components/graph_edge_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/graph_node.hpp create mode 100644 rerun_cpp/src/rerun/components/graph_node_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/graph_type.cpp create mode 100644 rerun_cpp/src/rerun/components/graph_type.hpp create mode 100644 rerun_cpp/src/rerun/components/half_size2d.hpp create mode 100644 rerun_cpp/src/rerun/components/half_size2d_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/half_size3d.hpp create mode 100644 rerun_cpp/src/rerun/components/half_size3d_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/image_buffer.hpp create mode 100644 rerun_cpp/src/rerun/components/image_buffer_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/image_format.hpp create mode 100644 rerun_cpp/src/rerun/components/image_format_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/image_plane_distance.hpp create mode 100644 rerun_cpp/src/rerun/components/interactive.hpp create mode 100644 rerun_cpp/src/rerun/components/interpolation_mode.cpp create mode 100644 rerun_cpp/src/rerun/components/interpolation_mode.hpp create mode 100644 rerun_cpp/src/rerun/components/is_keyframe.hpp create mode 100644 rerun_cpp/src/rerun/components/key_value_pairs.cpp create mode 100644 rerun_cpp/src/rerun/components/key_value_pairs.hpp create mode 100644 rerun_cpp/src/rerun/components/keypoint_id.hpp create mode 100644 rerun_cpp/src/rerun/components/lat_lon.hpp create mode 100644 rerun_cpp/src/rerun/components/lat_lon_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/length.hpp create mode 100644 rerun_cpp/src/rerun/components/line_strip2d.cpp create mode 100644 rerun_cpp/src/rerun/components/line_strip2d.hpp create mode 100644 rerun_cpp/src/rerun/components/line_strip3d.cpp create mode 100644 rerun_cpp/src/rerun/components/line_strip3d.hpp create mode 100644 rerun_cpp/src/rerun/components/linear_speed.hpp create mode 100644 rerun_cpp/src/rerun/components/magnification_filter.cpp create mode 100644 rerun_cpp/src/rerun/components/magnification_filter.hpp create mode 100644 rerun_cpp/src/rerun/components/marker_shape.cpp create mode 100644 rerun_cpp/src/rerun/components/marker_shape.hpp create mode 100644 rerun_cpp/src/rerun/components/marker_size.hpp create mode 100644 rerun_cpp/src/rerun/components/media_type.hpp create mode 100644 rerun_cpp/src/rerun/components/media_type_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/mesh_face_rendering.cpp create mode 100644 rerun_cpp/src/rerun/components/mesh_face_rendering.hpp create mode 100644 rerun_cpp/src/rerun/components/name.hpp create mode 100644 rerun_cpp/src/rerun/components/name_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/opacity.hpp create mode 100644 rerun_cpp/src/rerun/components/pinhole_projection.hpp create mode 100644 rerun_cpp/src/rerun/components/pinhole_projection_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/plane3d.hpp create mode 100644 rerun_cpp/src/rerun/components/point_shading.cpp create mode 100644 rerun_cpp/src/rerun/components/point_shading.hpp create mode 100644 rerun_cpp/src/rerun/components/position2d.hpp create mode 100644 rerun_cpp/src/rerun/components/position2d_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/position3d.hpp create mode 100644 rerun_cpp/src/rerun/components/position3d_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/radius.hpp create mode 100644 rerun_cpp/src/rerun/components/radius_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/range1d.hpp create mode 100644 rerun_cpp/src/rerun/components/resolution.hpp create mode 100644 rerun_cpp/src/rerun/components/resolution_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/rotation_axis_angle.hpp create mode 100644 rerun_cpp/src/rerun/components/rotation_quat.hpp create mode 100644 rerun_cpp/src/rerun/components/scalar.hpp create mode 100644 rerun_cpp/src/rerun/components/scale3d.hpp create mode 100644 rerun_cpp/src/rerun/components/scale3d_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/schema_id.hpp create mode 100644 rerun_cpp/src/rerun/components/show_labels.hpp create mode 100644 rerun_cpp/src/rerun/components/stroke_width.hpp create mode 100644 rerun_cpp/src/rerun/components/tensor_data.hpp create mode 100644 rerun_cpp/src/rerun/components/tensor_data_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/tensor_dimension_index_selection.hpp create mode 100644 rerun_cpp/src/rerun/components/tensor_height_dimension.hpp create mode 100644 rerun_cpp/src/rerun/components/tensor_width_dimension.hpp create mode 100644 rerun_cpp/src/rerun/components/texcoord2d.hpp create mode 100644 rerun_cpp/src/rerun/components/texcoord2d_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/text.hpp create mode 100644 rerun_cpp/src/rerun/components/text_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/text_log_level.hpp create mode 100644 rerun_cpp/src/rerun/components/text_log_level_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/timestamp.hpp create mode 100644 rerun_cpp/src/rerun/components/transform_frame_id.hpp create mode 100644 rerun_cpp/src/rerun/components/transform_frame_id_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/transform_mat3x3.hpp create mode 100644 rerun_cpp/src/rerun/components/transform_mat3x3_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/transform_relation.cpp create mode 100644 rerun_cpp/src/rerun/components/transform_relation.hpp create mode 100644 rerun_cpp/src/rerun/components/translation3d.hpp create mode 100644 rerun_cpp/src/rerun/components/translation3d_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/triangle_indices.hpp create mode 100644 rerun_cpp/src/rerun/components/triangle_indices_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/value_range.hpp create mode 100644 rerun_cpp/src/rerun/components/vector2d.hpp create mode 100644 rerun_cpp/src/rerun/components/vector2d_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/vector3d.hpp create mode 100644 rerun_cpp/src/rerun/components/vector3d_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/video_codec.cpp create mode 100644 rerun_cpp/src/rerun/components/video_codec.hpp create mode 100644 rerun_cpp/src/rerun/components/video_sample.hpp create mode 100644 rerun_cpp/src/rerun/components/video_timestamp.hpp create mode 100644 rerun_cpp/src/rerun/components/video_timestamp_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/view_coordinates.hpp create mode 100644 rerun_cpp/src/rerun/components/view_coordinates_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/visible.hpp create mode 100644 rerun_cpp/src/rerun/components/voxel_index.hpp create mode 100644 rerun_cpp/src/rerun/components/voxel_index_ext.cpp create mode 100644 rerun_cpp/src/rerun/components/voxel_size.hpp create mode 100644 rerun_cpp/src/rerun/components/voxel_value.hpp create mode 100644 rerun_cpp/src/rerun/config.cpp create mode 100644 rerun_cpp/src/rerun/config.hpp create mode 100644 rerun_cpp/src/rerun/datatypes.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/.gitattributes create mode 100644 rerun_cpp/src/rerun/datatypes/absolute_time_range.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/absolute_time_range.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/angle.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/angle.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/angle_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/annotation_info.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/annotation_info.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/annotation_info_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/blob.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/blob.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/blob_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/bool.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/bool.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/channel_count_pair.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/channel_count_pair.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/channel_datatype.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/channel_datatype.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/class_description.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/class_description.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/class_description_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/class_description_map_elem.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/class_description_map_elem.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/class_description_map_elem_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/class_id.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/class_id.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/color_model.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/color_model.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/dvec2d.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/dvec2d.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/dvec2d_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/entity_path.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/entity_path.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/float32.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/float32.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/float64.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/float64.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/image_format.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/image_format.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/image_format_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/ivec3d.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/ivec3d.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/ivec3d_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/keypoint_id.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/keypoint_id.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/keypoint_pair.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/keypoint_pair.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/keypoint_pair_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/mat3x3.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/mat3x3.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/mat3x3_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/mat4x4.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/mat4x4.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/mat4x4_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/pixel_format.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/pixel_format.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/plane3d.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/plane3d.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/quaternion.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/quaternion.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/quaternion_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/range1d.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/range1d.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/range2d.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/range2d.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/rgba32.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/rgba32.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/rgba32_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/rotation_axis_angle.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/rotation_axis_angle.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/rotation_axis_angle_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/tensor_buffer.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/tensor_buffer.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/tensor_buffer_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/tensor_data.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/tensor_data.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/tensor_data_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/tensor_dimension_index_selection.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/tensor_dimension_index_selection.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/tensor_dimension_selection.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/tensor_dimension_selection.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/time_int.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/time_int.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/time_range.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/time_range.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/time_range_boundary.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/time_range_boundary.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/uint16.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/uint16.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/uint32.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/uint32.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/uint64.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/uint64.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/utf8.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/utf8.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/utf8_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/utf8pair.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/utf8pair.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/utf8pair_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/uuid.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/uuid.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/uvec2d.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/uvec2d.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/uvec2d_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/uvec3d.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/uvec3d.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/uvec3d_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/uvec4d.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/uvec4d.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/vec2d.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/vec2d.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/vec2d_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/vec3d.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/vec3d.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/vec3d_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/vec4d.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/vec4d.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/vec4d_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/video_timestamp.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/video_timestamp.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/view_coordinates.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/view_coordinates.hpp create mode 100644 rerun_cpp/src/rerun/datatypes/view_coordinates_ext.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/visible_time_range.cpp create mode 100644 rerun_cpp/src/rerun/datatypes/visible_time_range.hpp create mode 100644 rerun_cpp/src/rerun/demo_utils.cpp create mode 100644 rerun_cpp/src/rerun/demo_utils.hpp create mode 100644 rerun_cpp/src/rerun/entity_path.cpp create mode 100644 rerun_cpp/src/rerun/entity_path.hpp create mode 100644 rerun_cpp/src/rerun/error.cpp create mode 100644 rerun_cpp/src/rerun/error.hpp create mode 100644 rerun_cpp/src/rerun/half.hpp create mode 100644 rerun_cpp/src/rerun/image_utils.hpp create mode 100644 rerun_cpp/src/rerun/log_sink.cpp create mode 100644 rerun_cpp/src/rerun/log_sink.hpp create mode 100644 rerun_cpp/src/rerun/loggable.hpp create mode 100644 rerun_cpp/src/rerun/recording_stream.cpp create mode 100644 rerun_cpp/src/rerun/recording_stream.hpp create mode 100644 rerun_cpp/src/rerun/rerun_sdk_export.hpp create mode 100644 rerun_cpp/src/rerun/result.hpp create mode 100644 rerun_cpp/src/rerun/rotation3d.hpp create mode 100644 rerun_cpp/src/rerun/sdk_info.cpp create mode 100644 rerun_cpp/src/rerun/sdk_info.hpp create mode 100644 rerun_cpp/src/rerun/spawn.cpp create mode 100644 rerun_cpp/src/rerun/spawn.hpp create mode 100644 rerun_cpp/src/rerun/spawn_options.cpp create mode 100644 rerun_cpp/src/rerun/spawn_options.hpp create mode 100644 rerun_cpp/src/rerun/string_utils.cpp create mode 100644 rerun_cpp/src/rerun/string_utils.hpp create mode 100644 rerun_cpp/src/rerun/third_party/cxxopts.hpp create mode 100644 rerun_cpp/src/rerun/time_column.cpp create mode 100644 rerun_cpp/src/rerun/time_column.hpp create mode 100644 rerun_cpp/src/rerun/timeline.cpp create mode 100644 rerun_cpp/src/rerun/timeline.hpp create mode 100644 rerun_cpp/src/rerun/type_traits.hpp create mode 100644 rerun_cpp/tests/CMakeLists.txt create mode 100644 rerun_cpp/tests/archetypes/annotation_context.cpp create mode 100644 rerun_cpp/tests/archetypes/archetype_test.hpp create mode 100644 rerun_cpp/tests/archetypes/arrows3d.cpp create mode 100644 rerun_cpp/tests/archetypes/boxes2d.cpp create mode 100644 rerun_cpp/tests/archetypes/boxes3d.cpp create mode 100644 rerun_cpp/tests/archetypes/clear.cpp create mode 100644 rerun_cpp/tests/archetypes/image.cpp create mode 100644 rerun_cpp/tests/archetypes/lines_strips2d.cpp create mode 100644 rerun_cpp/tests/archetypes/lines_strips3d.cpp create mode 100644 rerun_cpp/tests/archetypes/mesh3d.cpp create mode 100644 rerun_cpp/tests/archetypes/pinhole.cpp create mode 100644 rerun_cpp/tests/archetypes/points2d.cpp create mode 100644 rerun_cpp/tests/archetypes/points3d.cpp create mode 100644 rerun_cpp/tests/archetypes/segmentation_and_depth_image.cpp create mode 100644 rerun_cpp/tests/archetypes/tensor.cpp create mode 100644 rerun_cpp/tests/archetypes/transform3d.cpp create mode 100644 rerun_cpp/tests/archetypes/view_coordinates.cpp create mode 100644 rerun_cpp/tests/collection.cpp create mode 100644 rerun_cpp/tests/color.cpp create mode 100644 rerun_cpp/tests/component_type.cpp create mode 100644 rerun_cpp/tests/config.cpp create mode 100644 rerun_cpp/tests/error_check.hpp create mode 100644 rerun_cpp/tests/generated/.gitattributes create mode 100644 rerun_cpp/tests/generated/archetypes.hpp create mode 100644 rerun_cpp/tests/generated/archetypes/.gitattributes create mode 100644 rerun_cpp/tests/generated/archetypes/affix_fuzzer1.cpp create mode 100644 rerun_cpp/tests/generated/archetypes/affix_fuzzer1.hpp create mode 100644 rerun_cpp/tests/generated/archetypes/affix_fuzzer2.cpp create mode 100644 rerun_cpp/tests/generated/archetypes/affix_fuzzer2.hpp create mode 100644 rerun_cpp/tests/generated/archetypes/affix_fuzzer3.cpp create mode 100644 rerun_cpp/tests/generated/archetypes/affix_fuzzer3.hpp create mode 100644 rerun_cpp/tests/generated/archetypes/affix_fuzzer4.cpp create mode 100644 rerun_cpp/tests/generated/archetypes/affix_fuzzer4.hpp create mode 100644 rerun_cpp/tests/generated/components.hpp create mode 100644 rerun_cpp/tests/generated/components/.gitattributes create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer1.hpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer10.cpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer10.hpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer11.cpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer11.hpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer12.cpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer12.hpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer13.cpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer13.hpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer14.hpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer15.cpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer15.hpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer16.cpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer16.hpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer17.cpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer17.hpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer18.cpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer18.hpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer19.hpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer2.hpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer20.hpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer21.hpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer22.cpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer22.hpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer23.cpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer23.hpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer3.hpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer4.cpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer4.hpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer5.cpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer5.hpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer6.cpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer6.hpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer7.cpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer7.hpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer8.cpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer8.hpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer9.cpp create mode 100644 rerun_cpp/tests/generated/components/affix_fuzzer9.hpp create mode 100644 rerun_cpp/tests/generated/datatypes.hpp create mode 100644 rerun_cpp/tests/generated/datatypes/.gitattributes create mode 100644 rerun_cpp/tests/generated/datatypes/affix_fuzzer1.cpp create mode 100644 rerun_cpp/tests/generated/datatypes/affix_fuzzer1.hpp create mode 100644 rerun_cpp/tests/generated/datatypes/affix_fuzzer2.cpp create mode 100644 rerun_cpp/tests/generated/datatypes/affix_fuzzer2.hpp create mode 100644 rerun_cpp/tests/generated/datatypes/affix_fuzzer20.cpp create mode 100644 rerun_cpp/tests/generated/datatypes/affix_fuzzer20.hpp create mode 100644 rerun_cpp/tests/generated/datatypes/affix_fuzzer21.cpp create mode 100644 rerun_cpp/tests/generated/datatypes/affix_fuzzer21.hpp create mode 100644 rerun_cpp/tests/generated/datatypes/affix_fuzzer22.cpp create mode 100644 rerun_cpp/tests/generated/datatypes/affix_fuzzer22.hpp create mode 100644 rerun_cpp/tests/generated/datatypes/affix_fuzzer3.cpp create mode 100644 rerun_cpp/tests/generated/datatypes/affix_fuzzer3.hpp create mode 100644 rerun_cpp/tests/generated/datatypes/affix_fuzzer4.cpp create mode 100644 rerun_cpp/tests/generated/datatypes/affix_fuzzer4.hpp create mode 100644 rerun_cpp/tests/generated/datatypes/affix_fuzzer5.cpp create mode 100644 rerun_cpp/tests/generated/datatypes/affix_fuzzer5.hpp create mode 100644 rerun_cpp/tests/generated/datatypes/enum_test.cpp create mode 100644 rerun_cpp/tests/generated/datatypes/enum_test.hpp create mode 100644 rerun_cpp/tests/generated/datatypes/flattened_scalar.cpp create mode 100644 rerun_cpp/tests/generated/datatypes/flattened_scalar.hpp create mode 100644 rerun_cpp/tests/generated/datatypes/multi_enum.cpp create mode 100644 rerun_cpp/tests/generated/datatypes/multi_enum.hpp create mode 100644 rerun_cpp/tests/generated/datatypes/primitive_component.cpp create mode 100644 rerun_cpp/tests/generated/datatypes/primitive_component.hpp create mode 100644 rerun_cpp/tests/generated/datatypes/string_component.cpp create mode 100644 rerun_cpp/tests/generated/datatypes/string_component.hpp create mode 100644 rerun_cpp/tests/generated/datatypes/valued_enum.cpp create mode 100644 rerun_cpp/tests/generated/datatypes/valued_enum.hpp create mode 100644 rerun_cpp/tests/header_checks.cpp create mode 100644 rerun_cpp/tests/log_empty.cpp create mode 100644 rerun_cpp/tests/main.cpp create mode 100644 rerun_cpp/tests/mat.cpp create mode 100644 rerun_cpp/tests/recording_stream.cpp create mode 100644 rerun_cpp/tests/sdk_info.cpp create mode 100644 rerun_cpp/tests/test_types.cpp create mode 100644 rerun_cpp/tests/vec_and_quaternion.cpp create mode 100644 rerun_cpp/tests/windows_min_max_robustness.cpp create mode 100644 rerun_js/.gitignore create mode 100644 rerun_js/package.json create mode 100644 rerun_js/scripts/common.mjs create mode 100644 rerun_js/scripts/docs.mjs create mode 100755 rerun_js/scripts/publish.mjs create mode 100644 rerun_js/scripts/serve-docs.mjs create mode 100755 rerun_js/scripts/version.mjs create mode 100644 rerun_js/web-viewer-react/.gitignore create mode 100644 rerun_js/web-viewer-react/README.md create mode 100644 rerun_js/web-viewer-react/index.js create mode 100644 rerun_js/web-viewer-react/package.json create mode 100644 rerun_js/web-viewer-react/tsconfig.json create mode 100644 rerun_js/web-viewer-react/typedoc.json create mode 100644 rerun_js/web-viewer-react/types.d.ts create mode 100644 rerun_js/web-viewer/.gitignore create mode 100644 rerun_js/web-viewer/README.md create mode 100644 rerun_js/web-viewer/build-wasm.mjs create mode 100644 rerun_js/web-viewer/index.ts create mode 100644 rerun_js/web-viewer/package.json create mode 100644 rerun_js/web-viewer/tsconfig.json create mode 100644 rerun_js/web-viewer/typedoc.json create mode 100644 rerun_js/yarn.lock create mode 100644 rerun_notebook/.gitignore create mode 100644 rerun_notebook/README.md create mode 100644 rerun_notebook/build.mjs create mode 100644 rerun_notebook/package-lock.json create mode 100644 rerun_notebook/package.json create mode 100644 rerun_notebook/pyproject.toml create mode 100644 rerun_notebook/src/js/widget.css create mode 100644 rerun_notebook/src/js/widget.ts create mode 100644 rerun_notebook/src/rerun_notebook/__init__.py create mode 100644 rerun_notebook/src/rerun_notebook/__main__.py create mode 100644 rerun_notebook/src/rerun_notebook/asset_server.py create mode 100644 rerun_notebook/src/rerun_notebook/error_widget.js create mode 100644 rerun_notebook/tests/__init__.py create mode 100644 rerun_notebook/tests/conftest.py create mode 100644 rerun_notebook/tests/test_send_table.py create mode 100644 rerun_notebook/tests/test_viewer.py create mode 100644 rerun_notebook/tsconfig.json create mode 100644 rerun_pixi_env/pyproject.toml create mode 100644 rerun_pixi_env/src/rerun_pixi_env/__init__.py create mode 100644 rerun_pixi_env/src/rerun_pixi_env/pyo3_config.py create mode 100644 rerun_py/.gitignore create mode 100644 rerun_py/.non_sdk_mypy.ini create mode 100644 rerun_py/ARCHITECTURE.md create mode 100644 rerun_py/Cargo.toml create mode 100644 rerun_py/README.md create mode 100644 rerun_py/build.rs create mode 100644 rerun_py/docs/css/mkdocstrings.css create mode 100755 rerun_py/docs/gen_common_index.py create mode 100644 rerun_py/docs/templates/python/material/class.html.jinja create mode 100644 rerun_py/docs/templates/python/material/function.html.jinja create mode 100644 rerun_py/docs/writing_docs.md create mode 100644 rerun_py/mkdocs.yml create mode 100644 rerun_py/pyproject.toml create mode 100644 rerun_py/rerun_bindings/__init__.py create mode 100644 rerun_py/rerun_bindings/py.typed create mode 100644 rerun_py/rerun_bindings/rerun_bindings.pyi create mode 100644 rerun_py/rerun_bindings/types.py create mode 100644 rerun_py/rerun_dev_fixup/pyproject.toml create mode 100644 rerun_py/rerun_dev_fixup/rerun_dev_fixup/__init__.py create mode 100644 rerun_py/rerun_dev_fixup/rerun_sdk_fixup.pth create mode 100644 rerun_py/rerun_sdk.pth create mode 100644 rerun_py/rerun_sdk/rerun/.gitattributes create mode 100644 rerun_py/rerun_sdk/rerun/__init__.py create mode 100644 rerun_py/rerun_sdk/rerun/__main__.py create mode 100644 rerun_py/rerun_sdk/rerun/_arrow.py create mode 100644 rerun_py/rerun_sdk/rerun/_baseclasses.py create mode 100644 rerun_py/rerun_sdk/rerun/_color_conversion.py create mode 100644 rerun_py/rerun_sdk/rerun/_converters.py create mode 100644 rerun_py/rerun_sdk/rerun/_event.py create mode 100644 rerun_py/rerun_sdk/rerun/_legacy_notebook.py create mode 100644 rerun_py/rerun_sdk/rerun/_loading_widget.css create mode 100644 rerun_py/rerun_sdk/rerun/_log.py create mode 100644 rerun_py/rerun_sdk/rerun/_logging_handler.py create mode 100644 rerun_py/rerun_sdk/rerun/_memory.py create mode 100644 rerun_py/rerun_sdk/rerun/_numpy_compatibility.py create mode 100644 rerun_py/rerun_sdk/rerun/_properties.py create mode 100644 rerun_py/rerun_sdk/rerun/_script_helpers.py create mode 100644 rerun_py/rerun_sdk/rerun/_send_columns.py create mode 100644 rerun_py/rerun_sdk/rerun/_send_dataframe.py create mode 100644 rerun_py/rerun_sdk/rerun/_spawn.py create mode 100644 rerun_py/rerun_sdk/rerun/_tracing.py create mode 100644 rerun_py/rerun_sdk/rerun/_tracing_session.py create mode 100644 rerun_py/rerun_sdk/rerun/_unions.py create mode 100644 rerun_py/rerun_sdk/rerun/_validators.py create mode 100644 rerun_py/rerun_sdk/rerun/any_batch_value.py create mode 100644 rerun_py/rerun_sdk/rerun/any_value.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/.gitattributes create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/__init__.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/annotation_context.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/arrows2d.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/arrows2d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/arrows3d.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/arrows3d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/asset3d.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/asset3d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/asset_video.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/asset_video_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/bar_chart.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/bar_chart_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/boxes2d.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/boxes2d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/boxes3d.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/boxes3d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/capsules3d.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/capsules3d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/clear.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/clear_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/coordinate_frame.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/cylinders3d.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/cylinders3d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/depth_image.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/depth_image_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/ellipses2d.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/ellipses2d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/ellipsoids3d.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/ellipsoids3d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/encoded_depth_image.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/encoded_image.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/encoded_image_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/geo_line_strings.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/geo_line_strings_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/geo_points.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/geo_points_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/graph_edges.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/graph_nodes.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/grid_map.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/image.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/image_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/instance_poses3d.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/line_strips2d.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/line_strips3d.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/mcap_channel.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/mcap_message.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/mcap_schema.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/mcap_statistics.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/mesh3d.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/mesh3d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/pinhole.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/pinhole_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/points2d.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/points2d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/points3d.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/points3d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/recording_info.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/scalars.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/segmentation_image.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/segmentation_image_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/series_lines.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/series_points.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/series_points_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/state_change.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/state_configuration.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/tensor.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/tensor_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/text_document.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/text_log.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/transform3d.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/transform3d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/transform_axes3d.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/video_frame_reference.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/video_frame_reference_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/video_stream.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/view_coordinates.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/view_coordinates_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/archetypes/voxel_grid_map.py create mode 100644 rerun_py/rerun_sdk/rerun/auth.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/.gitattributes create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/__init__.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/api.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/.gitattributes create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/__init__.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/active_visualizers.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/background.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/background_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/container_blueprint.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/dataframe_query.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/dataframe_query_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/entity_behavior.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/eye_controls3d.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/force_center.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/force_collision_radius.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/force_link.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/force_many_body.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/force_position.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/graph_background.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/line_grid3d.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/line_grid3d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/map_background.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/map_zoom.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/near_clip_plane.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/panel_blueprint.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/plot_background.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/plot_legend.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/plot_legend_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/scalar_axis.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/spatial_information.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/table_blueprint.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/tensor_scalar_mapping.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/tensor_slice_selection.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/tensor_view_fit.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/tensor_view_fit_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/text_document_format.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/text_log_columns.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/text_log_format.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/text_log_rows.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/time_axis.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/time_panel_blueprint.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/view_blueprint.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/view_contents.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/viewport_blueprint.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/visible_time_ranges.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/visible_time_ranges_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/visual_bounds2d.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/visual_bounds2d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/archetypes/visualizer_instruction.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/.gitattributes create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/__init__.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/absolute_time_range.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/active_tab.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/angular_speed.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/apply_latest_at.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/auto_layout.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/auto_scroll.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/auto_views.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/background_kind.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/column_name.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/column_order.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/column_order_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/column_share.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/component_column_selector.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/container_kind.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/corner2d.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/enabled.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/eye3d_kind.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/filter_by_range.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/filter_is_not_null.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/force_distance.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/force_iterations.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/force_strength.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/fps.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/grid_columns.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/grid_spacing.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/included_content.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/link_axis.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/lock_range_during_zoom.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/loop_mode.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/map_provider.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/near_clip_plane.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/panel_state.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/play_state.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/playback_speed.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/query_expression.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/root_container.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/row_share.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/selected_columns.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/tensor_dimension_index_slider.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/text_log_column.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/time_int.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/time_range.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/timeline_column.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/timeline_name.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/view_class.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/view_fit.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/view_maximized.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/view_origin.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/viewer_recommendation_hash.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/visible_time_range.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/visual_bounds2d.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/visual_bounds2d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/visualizer_component_mapping.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/visualizer_instruction_id.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/visualizer_type.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/components/zoom_level.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/containers.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/datatypes/.gitattributes create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/datatypes/__init__.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/datatypes/component_column_selector.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/datatypes/component_column_selector_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/datatypes/component_source_kind.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/datatypes/filter_by_range.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/datatypes/filter_by_range_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/datatypes/filter_is_not_null.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/datatypes/filter_is_not_null_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/datatypes/selected_columns.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/datatypes/selected_columns_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/datatypes/tensor_dimension_index_slider.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/datatypes/tensor_dimension_index_slider_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/datatypes/text_log_column.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/datatypes/text_log_column_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/datatypes/text_log_column_kind.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/datatypes/timeline_column.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/datatypes/timeline_column_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/datatypes/visualizer_component_mapping.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/datatypes/visualizer_component_mapping_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/experimental.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/views/.gitattributes create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/views/__init__.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/views/bar_chart_view.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/views/dataframe_view.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/views/graph_view.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/views/map_view.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/views/spatial2d_view.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/views/spatial3d_view.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/views/state_timeline_view.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/views/tensor_view.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/views/text_document_view.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/views/text_log_view.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/views/time_series_view.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/visualizers/__init__.py create mode 100644 rerun_py/rerun_sdk/rerun/blueprint/visualizers/_base.py create mode 100644 rerun_py/rerun_sdk/rerun/catalog/__init__.py create mode 100644 rerun_py/rerun_sdk/rerun/catalog/_catalog_client.py create mode 100644 rerun_py/rerun_sdk/rerun/catalog/_content_filter.py create mode 100644 rerun_py/rerun_sdk/rerun/catalog/_entry.py create mode 100644 rerun_py/rerun_sdk/rerun/catalog/_registration_handle.py create mode 100644 rerun_py/rerun_sdk/rerun/catalog/_schema.py create mode 100644 rerun_py/rerun_sdk/rerun/catalog/_unregistration_handle.py create mode 100644 rerun_py/rerun_sdk/rerun/components/.gitattributes create mode 100644 rerun_py/rerun_sdk/rerun/components/__init__.py create mode 100644 rerun_py/rerun_sdk/rerun/components/aggregation_policy.py create mode 100644 rerun_py/rerun_sdk/rerun/components/albedo_factor.py create mode 100644 rerun_py/rerun_sdk/rerun/components/annotation_context.py create mode 100644 rerun_py/rerun_sdk/rerun/components/annotation_context_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/components/axis_length.py create mode 100644 rerun_py/rerun_sdk/rerun/components/blob.py create mode 100644 rerun_py/rerun_sdk/rerun/components/cell_size.py create mode 100644 rerun_py/rerun_sdk/rerun/components/channel_id.py create mode 100644 rerun_py/rerun_sdk/rerun/components/channel_message_counts.py create mode 100644 rerun_py/rerun_sdk/rerun/components/class_id.py create mode 100644 rerun_py/rerun_sdk/rerun/components/clear_is_recursive.py create mode 100644 rerun_py/rerun_sdk/rerun/components/clear_is_recursive_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/components/color.py create mode 100644 rerun_py/rerun_sdk/rerun/components/color_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/components/colormap.py create mode 100644 rerun_py/rerun_sdk/rerun/components/count.py create mode 100644 rerun_py/rerun_sdk/rerun/components/depth_meter.py create mode 100644 rerun_py/rerun_sdk/rerun/components/draw_order.py create mode 100644 rerun_py/rerun_sdk/rerun/components/entity_path.py create mode 100644 rerun_py/rerun_sdk/rerun/components/fill_mode.py create mode 100644 rerun_py/rerun_sdk/rerun/components/fill_ratio.py create mode 100644 rerun_py/rerun_sdk/rerun/components/gamma_correction.py create mode 100644 rerun_py/rerun_sdk/rerun/components/geo_line_string.py create mode 100644 rerun_py/rerun_sdk/rerun/components/geo_line_string_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/components/graph_edge.py create mode 100644 rerun_py/rerun_sdk/rerun/components/graph_node.py create mode 100644 rerun_py/rerun_sdk/rerun/components/graph_type.py create mode 100644 rerun_py/rerun_sdk/rerun/components/half_size2d.py create mode 100644 rerun_py/rerun_sdk/rerun/components/half_size3d.py create mode 100644 rerun_py/rerun_sdk/rerun/components/image_buffer.py create mode 100644 rerun_py/rerun_sdk/rerun/components/image_format.py create mode 100644 rerun_py/rerun_sdk/rerun/components/image_plane_distance.py create mode 100644 rerun_py/rerun_sdk/rerun/components/interactive.py create mode 100644 rerun_py/rerun_sdk/rerun/components/interpolation_mode.py create mode 100644 rerun_py/rerun_sdk/rerun/components/is_keyframe.py create mode 100644 rerun_py/rerun_sdk/rerun/components/key_value_pairs.py create mode 100644 rerun_py/rerun_sdk/rerun/components/key_value_pairs_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/components/keypoint_id.py create mode 100644 rerun_py/rerun_sdk/rerun/components/lat_lon.py create mode 100644 rerun_py/rerun_sdk/rerun/components/length.py create mode 100644 rerun_py/rerun_sdk/rerun/components/line_strip2d.py create mode 100644 rerun_py/rerun_sdk/rerun/components/line_strip2d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/components/line_strip3d.py create mode 100644 rerun_py/rerun_sdk/rerun/components/line_strip3d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/components/linear_speed.py create mode 100644 rerun_py/rerun_sdk/rerun/components/magnification_filter.py create mode 100644 rerun_py/rerun_sdk/rerun/components/marker_shape.py create mode 100644 rerun_py/rerun_sdk/rerun/components/marker_size.py create mode 100644 rerun_py/rerun_sdk/rerun/components/media_type.py create mode 100644 rerun_py/rerun_sdk/rerun/components/media_type_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/components/mesh_face_rendering.py create mode 100644 rerun_py/rerun_sdk/rerun/components/name.py create mode 100644 rerun_py/rerun_sdk/rerun/components/opacity.py create mode 100644 rerun_py/rerun_sdk/rerun/components/pinhole_projection.py create mode 100644 rerun_py/rerun_sdk/rerun/components/plane3d.py create mode 100644 rerun_py/rerun_sdk/rerun/components/point_shading.py create mode 100644 rerun_py/rerun_sdk/rerun/components/position2d.py create mode 100644 rerun_py/rerun_sdk/rerun/components/position3d.py create mode 100644 rerun_py/rerun_sdk/rerun/components/radius.py create mode 100644 rerun_py/rerun_sdk/rerun/components/radius_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/components/range1d.py create mode 100644 rerun_py/rerun_sdk/rerun/components/resolution.py create mode 100644 rerun_py/rerun_sdk/rerun/components/rotation_axis_angle.py create mode 100644 rerun_py/rerun_sdk/rerun/components/rotation_quat.py create mode 100644 rerun_py/rerun_sdk/rerun/components/scalar.py create mode 100644 rerun_py/rerun_sdk/rerun/components/scale3d.py create mode 100644 rerun_py/rerun_sdk/rerun/components/scale3d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/components/schema_id.py create mode 100644 rerun_py/rerun_sdk/rerun/components/show_labels.py create mode 100644 rerun_py/rerun_sdk/rerun/components/stroke_width.py create mode 100644 rerun_py/rerun_sdk/rerun/components/tensor_data.py create mode 100644 rerun_py/rerun_sdk/rerun/components/tensor_dimension_index_selection.py create mode 100644 rerun_py/rerun_sdk/rerun/components/tensor_height_dimension.py create mode 100644 rerun_py/rerun_sdk/rerun/components/tensor_width_dimension.py create mode 100644 rerun_py/rerun_sdk/rerun/components/texcoord2d.py create mode 100644 rerun_py/rerun_sdk/rerun/components/text.py create mode 100644 rerun_py/rerun_sdk/rerun/components/text_log_level.py create mode 100644 rerun_py/rerun_sdk/rerun/components/text_log_level_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/components/timestamp.py create mode 100644 rerun_py/rerun_sdk/rerun/components/transform_frame_id.py create mode 100644 rerun_py/rerun_sdk/rerun/components/transform_mat3x3.py create mode 100644 rerun_py/rerun_sdk/rerun/components/transform_relation.py create mode 100644 rerun_py/rerun_sdk/rerun/components/translation3d.py create mode 100644 rerun_py/rerun_sdk/rerun/components/triangle_indices.py create mode 100644 rerun_py/rerun_sdk/rerun/components/value_range.py create mode 100644 rerun_py/rerun_sdk/rerun/components/vector2d.py create mode 100644 rerun_py/rerun_sdk/rerun/components/vector3d.py create mode 100644 rerun_py/rerun_sdk/rerun/components/video_codec.py create mode 100644 rerun_py/rerun_sdk/rerun/components/video_sample.py create mode 100644 rerun_py/rerun_sdk/rerun/components/video_timestamp.py create mode 100644 rerun_py/rerun_sdk/rerun/components/video_timestamp_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/components/view_coordinates.py create mode 100644 rerun_py/rerun_sdk/rerun/components/view_coordinates_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/components/visible.py create mode 100644 rerun_py/rerun_sdk/rerun/components/voxel_index.py create mode 100644 rerun_py/rerun_sdk/rerun/components/voxel_size.py create mode 100644 rerun_py/rerun_sdk/rerun/components/voxel_value.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/.gitattributes create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/__init__.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/absolute_time_range.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/absolute_time_range_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/angle.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/angle_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/annotation_info.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/annotation_info_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/blob.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/blob_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/bool.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/channel_count_pair.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/channel_count_pair_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/channel_datatype.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/channel_datatype_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/class_description.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/class_description_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/class_description_map_elem.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/class_description_map_elem_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/class_id.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/color_model.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/color_model_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/dvec2d.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/dvec2d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/entity_path.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/float32.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/float64.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/image_format.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/image_format_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/ivec3d.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/ivec3d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/keypoint_id.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/keypoint_pair.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/keypoint_pair_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/mat3x3.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/mat3x3_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/mat4x4.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/mat4x4_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/pixel_format.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/plane3d.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/plane3d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/quaternion.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/quaternion_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/range1d.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/range1d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/range2d.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/rgba32.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/rgba32_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/rotation_axis_angle.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/rotation_axis_angle_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/tensor_buffer.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/tensor_buffer_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/tensor_data.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/tensor_data_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/tensor_dimension_index_selection.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/tensor_dimension_selection.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/tensor_dimension_selection_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/time_int.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/time_int_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/time_range.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/time_range_boundary.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/time_range_boundary_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/uint16.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/uint32.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/uint64.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/utf8.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/utf8pair.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/utf8pair_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/uuid.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/uuid_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/uvec2d.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/uvec2d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/uvec3d.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/uvec3d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/uvec4d.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/vec2d.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/vec2d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/vec3d.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/vec3d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/vec4d.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/vec4d_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/video_timestamp.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/view_coordinates.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/view_coordinates_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/visible_time_range.py create mode 100644 rerun_py/rerun_sdk/rerun/datatypes/visible_time_range_ext.py create mode 100644 rerun_py/rerun_sdk/rerun/dynamic_archetype.py create mode 100644 rerun_py/rerun_sdk/rerun/error_utils.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/__init__.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/_chunk.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/_chunk_store.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/_indexed_reader.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/_lazy_chunk_stream.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/_lazy_store.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/_lens.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/_mcap_reader.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/_mp4_reader.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/_optimization_profile.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/_parquet_reader.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/_query_metrics.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/_rrd_reader.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/_selector.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/_send_chunks.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/_store_entry.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/_streaming_reader.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/_viewer_client.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/dataloader/__init__.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/dataloader/_config.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/dataloader/_decoders.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/dataloader/_iterable_dataset.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/dataloader/_map_dataset.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/dataloader/_sample_index.py create mode 100644 rerun_py/rerun_sdk/rerun/experimental/dataloader/_utils.py create mode 100644 rerun_py/rerun_sdk/rerun/notebook.py create mode 100644 rerun_py/rerun_sdk/rerun/py.typed create mode 100644 rerun_py/rerun_sdk/rerun/recording_stream.py create mode 100644 rerun_py/rerun_sdk/rerun/server.py create mode 100644 rerun_py/rerun_sdk/rerun/sinks.py create mode 100644 rerun_py/rerun_sdk/rerun/time.py create mode 100644 rerun_py/rerun_sdk/rerun/urdf.py create mode 100644 rerun_py/rerun_sdk/rerun/utilities/__init__.py create mode 100644 rerun_py/rerun_sdk/rerun/utilities/_data.py create mode 100644 rerun_py/rerun_sdk/rerun/utilities/_turbo.py create mode 100644 rerun_py/rerun_sdk/rerun/utilities/_util.py create mode 100644 rerun_py/rerun_sdk/rerun/utilities/datafusion/__init__.py create mode 100644 rerun_py/rerun_sdk/rerun/utilities/datafusion/collect.py create mode 100644 rerun_py/rerun_sdk/rerun/utilities/datafusion/functions/__init__.py create mode 100644 rerun_py/rerun_sdk/rerun/utilities/datafusion/functions/url_generation.py create mode 100644 rerun_py/rerun_sdk/rerun/web.py create mode 100644 rerun_py/rerun_sdk/rerun_cli/__init__.py create mode 100644 rerun_py/rerun_sdk/rerun_cli/__main__.py create mode 100644 rerun_py/src/arrow.rs create mode 100644 rerun_py/src/catalog/catalog_client.rs create mode 100644 rerun_py/src/catalog/component_columns.rs create mode 100644 rerun_py/src/catalog/connection_handle.rs create mode 100644 rerun_py/src/catalog/dataframe_rendering.rs create mode 100644 rerun_py/src/catalog/datafusion_catalog.rs create mode 100644 rerun_py/src/catalog/dataset_entry.rs create mode 100644 rerun_py/src/catalog/dataset_view.rs create mode 100644 rerun_py/src/catalog/entry.rs create mode 100644 rerun_py/src/catalog/errors.rs create mode 100644 rerun_py/src/catalog/index_columns.rs create mode 100644 rerun_py/src/catalog/mod.rs create mode 100644 rerun_py/src/catalog/registration_handle.rs create mode 100644 rerun_py/src/catalog/schema.rs create mode 100644 rerun_py/src/catalog/segment_url_udf.rs create mode 100644 rerun_py/src/catalog/table_entry.rs create mode 100644 rerun_py/src/catalog/table_provider_adapter.rs create mode 100644 rerun_py/src/catalog/type_aliases.rs create mode 100644 rerun_py/src/catalog/unregistration_handle.rs create mode 100644 rerun_py/src/chunk/mod.rs create mode 100644 rerun_py/src/chunk/types.rs create mode 100644 rerun_py/src/chunk_stream/chunk_store.rs create mode 100644 rerun_py/src/chunk_stream/engine.rs create mode 100644 rerun_py/src/chunk_stream/error.rs create mode 100644 rerun_py/src/chunk_stream/lazy_store.rs create mode 100644 rerun_py/src/chunk_stream/mcap_reader.rs create mode 100644 rerun_py/src/chunk_stream/mod.rs create mode 100644 rerun_py/src/chunk_stream/mp4_reader.rs create mode 100644 rerun_py/src/chunk_stream/parquet_reader.rs create mode 100644 rerun_py/src/chunk_stream/py_stream.rs create mode 100644 rerun_py/src/chunk_stream/rrd_reader.rs create mode 100644 rerun_py/src/chunk_stream/stream.rs create mode 100644 rerun_py/src/chunk_stream/summary.rs create mode 100644 rerun_py/src/chunk_stream/urdf_tree_stream.rs create mode 100644 rerun_py/src/lenses.rs create mode 100644 rerun_py/src/lib.rs create mode 100644 rerun_py/src/python_bridge.rs create mode 100644 rerun_py/src/query_metrics.rs create mode 100644 rerun_py/src/selector.rs create mode 100644 rerun_py/src/server.rs create mode 100644 rerun_py/src/trace_context.rs create mode 100644 rerun_py/src/tracing_session.rs create mode 100644 rerun_py/src/urdf.rs create mode 100644 rerun_py/src/utils.rs create mode 100644 rerun_py/src/video.rs create mode 100644 rerun_py/src/viewer.rs create mode 100644 rerun_py/tests/api_sandbox/README.md create mode 100644 rerun_py/tests/api_sandbox/__init__.py create mode 100644 rerun_py/tests/api_sandbox/conftest.py create mode 100644 rerun_py/tests/api_sandbox/rerun_draft/__init__.py create mode 100644 rerun_py/tests/api_sandbox/rerun_draft/catalog.py create mode 100644 rerun_py/tests/api_sandbox/rerun_draft/server.py create mode 100644 rerun_py/tests/api_sandbox/test_current/__init__.py create mode 100644 rerun_py/tests/api_sandbox/test_current/conftest.py create mode 100644 rerun_py/tests/api_sandbox/test_current/test_catalog_basics.py create mode 100644 rerun_py/tests/api_sandbox/test_current/test_dataframe_api.py create mode 100644 rerun_py/tests/api_sandbox/test_current/test_dataset_basics.py create mode 100644 rerun_py/tests/api_sandbox/test_current/test_polars_interop.py create mode 100644 rerun_py/tests/api_sandbox/test_current/test_table_api.py create mode 100644 rerun_py/tests/api_sandbox/test_current/test_table_basics.py create mode 100644 rerun_py/tests/api_sandbox/test_draft/__init__.py create mode 100644 rerun_py/tests/api_sandbox/test_draft/conftest.py create mode 100644 rerun_py/tests/api_sandbox/test_draft/test_catalog_basics.py create mode 100644 rerun_py/tests/api_sandbox/test_draft/test_dataframe_api.py create mode 100644 rerun_py/tests/api_sandbox/test_draft/test_dataset_basics.py create mode 100644 rerun_py/tests/api_sandbox/test_draft/test_dataset_blueprints.py create mode 100644 rerun_py/tests/api_sandbox/test_draft/test_dataset_views.py create mode 100644 rerun_py/tests/api_sandbox/test_draft/test_index_ranges.py create mode 100644 rerun_py/tests/api_sandbox/test_draft/test_polars_interop.py create mode 100644 rerun_py/tests/api_sandbox/test_draft/test_removed_apis.py create mode 100644 rerun_py/tests/api_sandbox/test_draft/test_table_api.py create mode 100644 rerun_py/tests/api_sandbox/test_draft/test_table_basics.py create mode 100644 rerun_py/tests/api_sandbox/test_draft/utils.py create mode 100644 rerun_py/tests/e2e_redap_tests/README.md create mode 100644 rerun_py/tests/e2e_redap_tests/__init__.py create mode 100644 rerun_py/tests/e2e_redap_tests/__snapshots__/test_dataset_query_select_pushdown.ambr create mode 100644 rerun_py/tests/e2e_redap_tests/__snapshots__/test_dataset_views.ambr create mode 100644 rerun_py/tests/e2e_redap_tests/__snapshots__/test_entries.ambr create mode 100644 rerun_py/tests/e2e_redap_tests/__snapshots__/test_segment_id.ambr create mode 100644 rerun_py/tests/e2e_redap_tests/__snapshots__/test_table_write.ambr create mode 100644 rerun_py/tests/e2e_redap_tests/_helpers.py create mode 100644 rerun_py/tests/e2e_redap_tests/conftest.py create mode 100644 rerun_py/tests/e2e_redap_tests/resources/.gitattributes create mode 100644 rerun_py/tests/e2e_redap_tests/resources/README.md create mode 100644 rerun_py/tests/e2e_redap_tests/resources/blueprints/generate_blueprints.py create mode 100644 rerun_py/tests/e2e_redap_tests/resources/blueprints/table_blueprint.rbl create mode 100644 rerun_py/tests/e2e_redap_tests/resources/blueprints/table_blueprint2.rbl create mode 100644 rerun_py/tests/e2e_redap_tests/resources/simple_datatypes/_transactions/0-828e81a3-bb94-44a2-bb8a-7cb9ea3e10b2.txn create mode 100644 rerun_py/tests/e2e_redap_tests/resources/simple_datatypes/_versions/1.manifest create mode 100644 rerun_py/tests/e2e_redap_tests/resources/simple_datatypes/data/0101000110110100101111100713b14fa38c9a63c90f59698d.lance create mode 100644 rerun_py/tests/e2e_redap_tests/test_asset_dataset.py create mode 100644 rerun_py/tests/e2e_redap_tests/test_blueprint_dataset.py create mode 100644 rerun_py/tests/e2e_redap_tests/test_catalog_navigation.py create mode 100644 rerun_py/tests/e2e_redap_tests/test_client.py create mode 100644 rerun_py/tests/e2e_redap_tests/test_dataframe_query_view.py create mode 100644 rerun_py/tests/e2e_redap_tests/test_datafusion_tables.py create mode 100644 rerun_py/tests/e2e_redap_tests/test_datafusion_utils.py create mode 100644 rerun_py/tests/e2e_redap_tests/test_dataloader_sample_index.py create mode 100644 rerun_py/tests/e2e_redap_tests/test_dataset_delete.py create mode 100644 rerun_py/tests/e2e_redap_tests/test_dataset_entry.py create mode 100644 rerun_py/tests/e2e_redap_tests/test_dataset_query.py create mode 100644 rerun_py/tests/e2e_redap_tests/test_dataset_query_filter.py create mode 100644 rerun_py/tests/e2e_redap_tests/test_dataset_query_select_pushdown.py create mode 100644 rerun_py/tests/e2e_redap_tests/test_dataset_views.py create mode 100644 rerun_py/tests/e2e_redap_tests/test_entries.py create mode 100644 rerun_py/tests/e2e_redap_tests/test_index_ranges.py create mode 100644 rerun_py/tests/e2e_redap_tests/test_query_metrics_behaviors.py create mode 100644 rerun_py/tests/e2e_redap_tests/test_registration.py create mode 100644 rerun_py/tests/e2e_redap_tests/test_scan_path_errors.py create mode 100644 rerun_py/tests/e2e_redap_tests/test_segment_id.py create mode 100644 rerun_py/tests/e2e_redap_tests/test_segment_store.py create mode 100644 rerun_py/tests/e2e_redap_tests/test_table_create.py create mode 100644 rerun_py/tests/e2e_redap_tests/test_table_read.py create mode 100644 rerun_py/tests/e2e_redap_tests/test_table_write.py create mode 100644 rerun_py/tests/integration/__init__.py create mode 100644 rerun_py/tests/integration/__snapshots__/test_chunk_store.ambr create mode 100644 rerun_py/tests/integration/__snapshots__/test_lazy_chunk_store.ambr create mode 100644 rerun_py/tests/integration/__snapshots__/test_mcap_reader.ambr create mode 100644 rerun_py/tests/integration/conftest.py create mode 100644 rerun_py/tests/integration/test_chunk.py create mode 100644 rerun_py/tests/integration/test_chunk_from_record_batch.py create mode 100644 rerun_py/tests/integration/test_chunk_store.py create mode 100644 rerun_py/tests/integration/test_chunk_store_reader.py create mode 100644 rerun_py/tests/integration/test_dataloader_video.py create mode 100644 rerun_py/tests/integration/test_dataloader_video_codecs.py create mode 100644 rerun_py/tests/integration/test_headless_viewer.py create mode 100644 rerun_py/tests/integration/test_lazy_chunk_store.py create mode 100644 rerun_py/tests/integration/test_lazy_chunk_stream.py create mode 100644 rerun_py/tests/integration/test_mcap_reader.py create mode 100644 rerun_py/tests/integration/test_mp4_reader.py create mode 100644 rerun_py/tests/integration/test_parquet_reader.py create mode 100644 rerun_py/tests/integration/test_rrd_reader_multi_store.py create mode 100644 rerun_py/tests/integration/test_send_chunks.py create mode 100644 rerun_py/tests/test_types/__init__.py create mode 100644 rerun_py/tests/test_types/archetypes/.gitattributes create mode 100644 rerun_py/tests/test_types/archetypes/__init__.py create mode 100644 rerun_py/tests/test_types/archetypes/affix_fuzzer1.py create mode 100644 rerun_py/tests/test_types/archetypes/affix_fuzzer2.py create mode 100644 rerun_py/tests/test_types/archetypes/affix_fuzzer3.py create mode 100644 rerun_py/tests/test_types/archetypes/affix_fuzzer4.py create mode 100644 rerun_py/tests/test_types/blueprint/.gitattributes create mode 100644 rerun_py/tests/test_types/blueprint/__init__.py create mode 100644 rerun_py/tests/test_types/components/.gitattributes create mode 100644 rerun_py/tests/test_types/components/__init__.py create mode 100644 rerun_py/tests/test_types/components/affix_fuzzer1.py create mode 100644 rerun_py/tests/test_types/components/affix_fuzzer10.py create mode 100644 rerun_py/tests/test_types/components/affix_fuzzer11.py create mode 100644 rerun_py/tests/test_types/components/affix_fuzzer12.py create mode 100644 rerun_py/tests/test_types/components/affix_fuzzer13.py create mode 100644 rerun_py/tests/test_types/components/affix_fuzzer14.py create mode 100644 rerun_py/tests/test_types/components/affix_fuzzer15.py create mode 100644 rerun_py/tests/test_types/components/affix_fuzzer16.py create mode 100644 rerun_py/tests/test_types/components/affix_fuzzer17.py create mode 100644 rerun_py/tests/test_types/components/affix_fuzzer18.py create mode 100644 rerun_py/tests/test_types/components/affix_fuzzer19.py create mode 100644 rerun_py/tests/test_types/components/affix_fuzzer2.py create mode 100644 rerun_py/tests/test_types/components/affix_fuzzer20.py create mode 100644 rerun_py/tests/test_types/components/affix_fuzzer21.py create mode 100644 rerun_py/tests/test_types/components/affix_fuzzer22.py create mode 100644 rerun_py/tests/test_types/components/affix_fuzzer23.py create mode 100644 rerun_py/tests/test_types/components/affix_fuzzer3.py create mode 100644 rerun_py/tests/test_types/components/affix_fuzzer4.py create mode 100644 rerun_py/tests/test_types/components/affix_fuzzer5.py create mode 100644 rerun_py/tests/test_types/components/affix_fuzzer6.py create mode 100644 rerun_py/tests/test_types/components/affix_fuzzer7.py create mode 100644 rerun_py/tests/test_types/components/affix_fuzzer8.py create mode 100644 rerun_py/tests/test_types/components/affix_fuzzer9.py create mode 100644 rerun_py/tests/test_types/datatypes/.gitattributes create mode 100644 rerun_py/tests/test_types/datatypes/__init__.py create mode 100644 rerun_py/tests/test_types/datatypes/affix_fuzzer1.py create mode 100644 rerun_py/tests/test_types/datatypes/affix_fuzzer2.py create mode 100644 rerun_py/tests/test_types/datatypes/affix_fuzzer20.py create mode 100644 rerun_py/tests/test_types/datatypes/affix_fuzzer21.py create mode 100644 rerun_py/tests/test_types/datatypes/affix_fuzzer22.py create mode 100644 rerun_py/tests/test_types/datatypes/affix_fuzzer3.py create mode 100644 rerun_py/tests/test_types/datatypes/affix_fuzzer4.py create mode 100644 rerun_py/tests/test_types/datatypes/affix_fuzzer5.py create mode 100644 rerun_py/tests/test_types/datatypes/enum_test.py create mode 100644 rerun_py/tests/test_types/datatypes/flattened_scalar.py create mode 100644 rerun_py/tests/test_types/datatypes/multi_enum.py create mode 100644 rerun_py/tests/test_types/datatypes/primitive_component.py create mode 100644 rerun_py/tests/test_types/datatypes/string_component.py create mode 100644 rerun_py/tests/test_types/datatypes/valued_enum.py create mode 100644 rerun_py/tests/unit/__init__.py create mode 100644 rerun_py/tests/unit/__snapshots__/test_recording.ambr create mode 100644 rerun_py/tests/unit/__snapshots__/test_send_dataframe.ambr create mode 100644 rerun_py/tests/unit/blueprint_utils.py create mode 100644 rerun_py/tests/unit/common_arrays.py create mode 100644 rerun_py/tests/unit/test_annotation_context.py create mode 100644 rerun_py/tests/unit/test_any_values.py create mode 100644 rerun_py/tests/unit/test_archetype_builder.py create mode 100644 rerun_py/tests/unit/test_archetype_str.py create mode 100644 rerun_py/tests/unit/test_arrows3d.py create mode 100644 rerun_py/tests/unit/test_asset3d.py create mode 100644 rerun_py/tests/unit/test_background.py create mode 100644 rerun_py/tests/unit/test_batcher_config.py create mode 100644 rerun_py/tests/unit/test_binary_stream.py create mode 100644 rerun_py/tests/unit/test_blob.py create mode 100644 rerun_py/tests/unit/test_box2d.py create mode 100644 rerun_py/tests/unit/test_box3d.py create mode 100644 rerun_py/tests/unit/test_clear.py create mode 100644 rerun_py/tests/unit/test_color_columns.py create mode 100644 rerun_py/tests/unit/test_color_conversion.py create mode 100644 rerun_py/tests/unit/test_container_blueprint.py create mode 100644 rerun_py/tests/unit/test_content_filter.py create mode 100644 rerun_py/tests/unit/test_dataframe_view_query.py create mode 100644 rerun_py/tests/unit/test_datafusion_utils.py create mode 100644 rerun_py/tests/unit/test_dataloader_decoder_helpers.py create mode 100644 rerun_py/tests/unit/test_dataloader_query_indices.py create mode 100644 rerun_py/tests/unit/test_deprecated.py create mode 100644 rerun_py/tests/unit/test_depth_image.py create mode 100644 rerun_py/tests/unit/test_disconnect_on_cleanup.py create mode 100644 rerun_py/tests/unit/test_ellipsoids3d.py create mode 100644 rerun_py/tests/unit/test_exceptions.py create mode 100644 rerun_py/tests/unit/test_expected_warnings.py create mode 100644 rerun_py/tests/unit/test_file_sink.py create mode 100644 rerun_py/tests/unit/test_filesink_threading.py create mode 100644 rerun_py/tests/unit/test_geo_line_strings.py create mode 100644 rerun_py/tests/unit/test_geopoints.py create mode 100644 rerun_py/tests/unit/test_image.py create mode 100644 rerun_py/tests/unit/test_instance_pose3d.py create mode 100644 rerun_py/tests/unit/test_line_strips2d.py create mode 100644 rerun_py/tests/unit/test_line_strips3d.py create mode 100644 rerun_py/tests/unit/test_log.py create mode 100644 rerun_py/tests/unit/test_map_view_blueprint.py create mode 100644 rerun_py/tests/unit/test_matnxn.py create mode 100644 rerun_py/tests/unit/test_mesh3d.py create mode 100644 rerun_py/tests/unit/test_multi_stream.py create mode 100644 rerun_py/tests/unit/test_multiprocessing_gc.py create mode 100644 rerun_py/tests/unit/test_optimization_profile.py create mode 100644 rerun_py/tests/unit/test_optimization_profile_parity.py create mode 100644 rerun_py/tests/unit/test_pinhole.py create mode 100644 rerun_py/tests/unit/test_plot_legend.py create mode 100644 rerun_py/tests/unit/test_points2d.py create mode 100644 rerun_py/tests/unit/test_points3d.py create mode 100644 rerun_py/tests/unit/test_python_objects_to_record_batch.py create mode 100644 rerun_py/tests/unit/test_quaternion.py create mode 100644 rerun_py/tests/unit/test_query_metrics.py create mode 100644 rerun_py/tests/unit/test_readers.py create mode 100644 rerun_py/tests/unit/test_rgba32.py create mode 100644 rerun_py/tests/unit/test_sample_index.py create mode 100644 rerun_py/tests/unit/test_scalar_axis.py create mode 100644 rerun_py/tests/unit/test_scalars.py create mode 100644 rerun_py/tests/unit/test_segmentation_image.py create mode 100644 rerun_py/tests/unit/test_selector.py create mode 100644 rerun_py/tests/unit/test_send_dataframe.py create mode 100644 rerun_py/tests/unit/test_series_styles.py create mode 100644 rerun_py/tests/unit/test_server.py create mode 100644 rerun_py/tests/unit/test_tensor.py create mode 100644 rerun_py/tests/unit/test_tensor_slice_selection.py create mode 100644 rerun_py/tests/unit/test_time.py create mode 100644 rerun_py/tests/unit/test_time_column.py create mode 100644 rerun_py/tests/unit/test_time_range_boundary.py create mode 100644 rerun_py/tests/unit/test_tracing_session.py create mode 100644 rerun_py/tests/unit/test_transform3d.py create mode 100644 rerun_py/tests/unit/test_type_aliases.py create mode 100644 rerun_py/tests/unit/test_urdf_tree.py create mode 100644 rerun_py/tests/unit/test_utf8.py create mode 100644 rerun_py/tests/unit/test_utf8pair.py create mode 100644 rerun_py/tests/unit/test_utilities_datafusion.py create mode 100644 rerun_py/tests/unit/test_uuid.py create mode 100644 rerun_py/tests/unit/test_validators.py create mode 100644 rerun_py/tests/unit/test_vecnd.py create mode 100644 rerun_py/tests/unit/test_version.py create mode 100644 rerun_py/tests/unit/test_video_frame_reference.py create mode 100644 rerun_py/tests/unit/test_view_blueprint.py create mode 100644 rerun_py/tests/unit/test_view_contents.py create mode 100644 rerun_py/tests/unit/test_view_coordinates.py create mode 100644 rerun_py/tests/unit/test_viewer_client.py create mode 100644 rerun_py/tests/unit/test_viewport_blueprint.py create mode 100644 rerun_py/tests/unit/test_visible_time_ranges.py create mode 100644 run_wasm/Cargo.toml create mode 100644 run_wasm/README.md create mode 100644 run_wasm/src/main.rs create mode 100644 rust-toolchain create mode 100755 scripts/accept_snapshots.sh create mode 100755 scripts/append_web_viewer.py create mode 100755 scripts/check_env.py create mode 100755 scripts/check_example_manifest_coverage.py create mode 100755 scripts/check_forbidden_dependencies.py create mode 100755 scripts/check_utils_dependencies.py create mode 100644 scripts/ci/__init__.py create mode 100755 scripts/ci/approve_workflow_runs.py create mode 100644 scripts/ci/buf.yaml create mode 100755 scripts/ci/build_and_upload_rerun_notebook.py create mode 100755 scripts/ci/build_and_upload_wheels.py create mode 100755 scripts/ci/bundle_and_upload_rerun_cpp.py create mode 100755 scripts/ci/bundle_macos_app.py create mode 100755 scripts/ci/check_cli_docs.py create mode 100755 scripts/ci/check_d2_diagrams.py create mode 100755 scripts/ci/check_doc_order.py create mode 100755 scripts/ci/check_doc_redirects.py create mode 100644 scripts/ci/check_large_files.py create mode 100644 scripts/ci/check_migration_guide_redirect.py create mode 100755 scripts/ci/check_pr_checkboxes.py create mode 100644 scripts/ci/check_skills.py create mode 100755 scripts/ci/check_speculative_links.py create mode 100755 scripts/ci/compare.py create mode 100755 scripts/ci/compare_path_digest.py create mode 100755 scripts/ci/count_bytes.py create mode 100755 scripts/ci/count_dependencies.py create mode 100755 scripts/ci/crates.py create mode 100644 scripts/ci/dag.py create mode 100644 scripts/ci/fetch_artifact.py create mode 100644 scripts/ci/frontmatter.py create mode 100755 scripts/ci/generate_prerelease_pip_index.py create mode 100644 scripts/ci/isolated_examples.py create mode 100644 scripts/ci/macos/Info.plist create mode 100755 scripts/ci/mdlint.py create mode 100755 scripts/ci/parse_bot_pr_comment.py create mode 100755 scripts/ci/parse_pr_number.py create mode 100755 scripts/ci/pixi_install_wheel.py create mode 100755 scripts/ci/pr_link_checker.py create mode 100755 scripts/ci/publish_wheels.py create mode 100644 scripts/ci/python_check_signatures.py create mode 100755 scripts/ci/render_bench.py create mode 100755 scripts/ci/rust_checks.py create mode 100644 scripts/ci/setup_software_rasterizer.py create mode 100644 scripts/ci/sync_release_assets.py create mode 100644 scripts/ci/templates/benchmark.html create mode 100644 scripts/ci/templates/pip_index.html create mode 100755 scripts/ci/thumbnails.py create mode 100755 scripts/ci/update_rerun_notebook_version.py create mode 100755 scripts/ci/update_rerun_py_and_c_version.py create mode 100755 scripts/ci/upload_docs.py create mode 100644 scripts/ci/upload_vulkan_sdk.py create mode 100755 scripts/ci/uv_install_wheel.py create mode 100644 scripts/ci/wheel_utils.py create mode 100644 scripts/clippy_wasm/clippy.toml create mode 100755 scripts/fast_lint.py create mode 100755 scripts/fetch_crashes.py create mode 100755 scripts/fetch_patch_candidates.py create mode 100755 scripts/generate_changelog.py create mode 100755 scripts/generate_view_coordinate_defs.py create mode 100755 scripts/highlight_issues.py create mode 100755 scripts/lint.py create mode 100644 scripts/nbstripout.py create mode 100644 scripts/pixi/activate.bat create mode 100755 scripts/pixi/activate.sh create mode 100755 scripts/pre-push.sh create mode 100755 scripts/render_d2.py create mode 100755 scripts/roundtrip_utils.py create mode 100755 scripts/run_all.py create mode 100755 scripts/run_python_e2e_test.py create mode 100644 scripts/screenshot_compare/assets/static/index.css create mode 100644 scripts/screenshot_compare/assets/templates/example.html create mode 100644 scripts/screenshot_compare/assets/templates/index.html create mode 100755 scripts/screenshot_compare/build_screenshot_compare.py create mode 100644 scripts/snapshots.py create mode 100755 scripts/update_docs_url_rewrite.py create mode 100755 scripts/update_snapshots_from_ci.sh create mode 100755 scripts/upload_image.py create mode 100755 scripts/upload_rrd.py create mode 100755 scripts/zombie_todos.py create mode 100644 skills/rerun-blueprint/SKILL.md create mode 100644 skills/rerun-catalog-queries/SKILL.md create mode 100644 skills/rerun-chunk-processing/SKILL.md create mode 100644 skills/rerun-data-model/SKILL.md create mode 100644 skills/rerun-lerobot/SKILL.md create mode 100644 skills/rerun-mcap/SKILL.md create mode 100644 skills/rerun-parquet/SKILL.md create mode 100644 skills/rerun-urdf/SKILL.md create mode 100644 taplo.toml create mode 100644 tests/README.md create mode 100644 tests/__init__.py create mode 100644 tests/assets/.gitattributes create mode 100644 tests/assets/README.md create mode 100644 tests/assets/empty.mp4 create mode 100644 tests/assets/encoded_depth_image.rvl create mode 100644 tests/assets/image/.gitignore create mode 100755 tests/assets/image/generate_yuv_assets.py create mode 100644 tests/assets/image/grinda.jpg create mode 100644 tests/assets/image/logo_dark_mode_nv12.bin create mode 100644 tests/assets/image/logo_dark_mode_y8_full.bin create mode 100644 tests/assets/image/logo_dark_mode_y8_limited.bin create mode 100644 tests/assets/image/logo_dark_mode_y_u_v12_full.bin create mode 100644 tests/assets/image/logo_dark_mode_y_u_v12_limited.bin create mode 100644 tests/assets/image/logo_dark_mode_y_u_v16_full.bin create mode 100644 tests/assets/image/logo_dark_mode_y_u_v16_limited.bin create mode 100644 tests/assets/image/logo_dark_mode_y_u_v24_full.bin create mode 100644 tests/assets/image/logo_dark_mode_y_u_v24_limited.bin create mode 100644 tests/assets/image/logo_dark_mode_yuy2.bin create mode 100644 tests/assets/mcap/README.md create mode 100644 tests/assets/mcap/r2b_galileo.mcap create mode 100644 tests/assets/mcap/trossen_transfer_cube.mcap create mode 100644 tests/assets/mesh/box.dae create mode 100644 tests/assets/mesh/cube.glb create mode 100644 tests/assets/mesh/multi_triangle_groups.dae create mode 100644 tests/assets/rerun.obj create mode 100644 tests/assets/rrd/.gitattributes create mode 100644 tests/assets/rrd/README.md create mode 100644 tests/assets/rrd/examples/arkit_scenes.rrd create mode 100644 tests/assets/rrd/examples/dicom_mri.rrd create mode 100644 tests/assets/rrd/examples/dna.rrd create mode 100644 tests/assets/rrd/examples/face_tracking.rrd create mode 100644 tests/assets/rrd/examples/graphs.rrd create mode 100644 tests/assets/rrd/examples/human_pose_tracking.rrd create mode 100644 tests/assets/rrd/examples/imu_signals.rrd create mode 100644 tests/assets/rrd/examples/plots.rrd create mode 100644 tests/assets/rrd/examples/rrt_star.rrd create mode 100644 tests/assets/rrd/examples/structure_from_motion.rrd create mode 100755 tests/assets/rrd/generate-compatibility-rrds.sh create mode 100644 tests/assets/rrd/sample_5/Fri_Jul_28_11-25-26_2023.rrd create mode 100644 tests/assets/rrd/sample_5/README.md create mode 100644 tests/assets/rrd/sample_5/Sun_Dec_24_16-20-37_2023.rrd create mode 100644 tests/assets/rrd/sample_5/Thu_Jul_20_10-40-10_2023.rrd create mode 100644 tests/assets/rrd/sample_5/Thu_Jun_15_13-42-56_2023.rrd create mode 100644 tests/assets/rrd/sample_5/Wed_Jul_12_20-55-08_2023.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/annotation_context_connections.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/annotation_context_rects.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/annotation_context_segmentation.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/arrows2d_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/arrows3d_column_updates.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/arrows3d_row_updates.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/arrows3d_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/asset3d_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/bar_chart.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/boxes2d_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/boxes3d_batch.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/boxes3d_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/capsules3d_batch.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/clear_recursive.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/clear_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/coordinate_frame_builtin_frames.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/cylinders3d_batch.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/depth_image_3d.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/depth_image_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/ellipses2d_batch.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/ellipses2d_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/ellipsoids3d_batch.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/ellipsoids3d_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/encoded_depth_image.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/encoded_image.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/entity_behavior.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/entity_path.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/geo_line_strings_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/geo_points_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/graph_directed.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/graph_undirected.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/grid_map_pose.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/grid_map_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/image_advanced.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/image_column_updates.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/image_formats.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/image_row_updates.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/image_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/instance_poses3d_combined.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/line_strips2d_batch.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/line_strips2d_segments_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/line_strips2d_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/line_strips2d_ui_radius.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/line_strips3d_batch.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/line_strips3d_segments_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/line_strips3d_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/line_strips3d_time_window.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/line_strips3d_ui_radius.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/mcap_channel_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/mcap_message_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/mcap_schema_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/mcap_statistics_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/mesh3d_indexed.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/mesh3d_instancing.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/mesh3d_partial_updates.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/mesh3d_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/pinhole_perspective.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/pinhole_projections.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/pinhole_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/points2d_random.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/points2d_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/points2d_ui_radius.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/points3d_column_updates.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/points3d_partial_updates.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/points3d_random.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/points3d_row_updates.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/points3d_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/points3d_ui_radius.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/scalars_column_updates.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/scalars_multiple_plots.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/scalars_row_updates.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/scalars_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/segmentation_image_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/series_lines_style.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/series_points_style.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/state_change.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/state_configuration.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/tensor_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/text_document.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/text_log.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/text_log_integration.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/transform3d_axes.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/transform3d_column_updates.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/transform3d_hierarchy.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/transform3d_hierarchy_frames.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/transform3d_partial_updates.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/transform3d_row_updates.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/transform3d_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/video_auto_frames.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/video_manual_frames.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/view_coordinates_simple.rrd create mode 100644 tests/assets/rrd/snippets/archetypes/voxel_grid_map_simple.rrd create mode 100644 tests/assets/rrd/snippets/concepts/different_data_per_timeline.rrd create mode 100644 tests/assets/rrd/snippets/concepts/indices.rrd create mode 100644 tests/assets/rrd/snippets/concepts/lenses.rrd create mode 100644 tests/assets/rrd/snippets/concepts/recording_properties.rrd create mode 100644 tests/assets/rrd/snippets/concepts/transform3d_hierarchy_named_frames.rrd create mode 100644 tests/assets/rrd/snippets/concepts/transform3d_hierarchy_simple.rrd create mode 100644 tests/assets/rrd/snippets/concepts/viscomp-base.rrd create mode 100644 tests/assets/rrd/snippets/concepts/viscomp-component-default.rrd create mode 100644 tests/assets/rrd/snippets/concepts/viscomp-component-override.rrd create mode 100644 tests/assets/rrd/snippets/descriptors/descr_builtin_archetype.rrd create mode 100644 tests/assets/rrd/snippets/descriptors/descr_builtin_component.rrd create mode 100644 tests/assets/rrd/snippets/descriptors/descr_custom_archetype.rrd create mode 100644 tests/assets/rrd/snippets/descriptors/descr_custom_component.rrd create mode 100644 tests/assets/rrd/snippets/howto/any_batch_value_column_updates.rrd create mode 100644 tests/assets/rrd/snippets/howto/any_values_column_updates.rrd create mode 100644 tests/assets/rrd/snippets/howto/any_values_row_updates.rrd create mode 100644 tests/assets/rrd/snippets/howto/component_mapping.rrd create mode 100644 tests/assets/rrd/snippets/howto/dual_color_point_cloud.rrd create mode 100644 tests/assets/rrd/snippets/howto/load_mcap.rrd create mode 100644 tests/assets/rrd/snippets/howto/load_urdf.rrd create mode 100644 tests/assets/rrd/snippets/howto/micro_batching.rrd create mode 100644 tests/assets/rrd/snippets/howto/state_remapping.rrd create mode 100644 tests/assets/rrd/snippets/howto/state_timeline.rrd create mode 100644 tests/assets/rrd/snippets/quick_start/quick_start_connect.rrd create mode 100644 tests/assets/rrd/snippets/quick_start/quick_start_spawn.rrd create mode 100644 tests/assets/rrd/snippets/tutorials/annotation_context.rrd create mode 100644 tests/assets/rrd/snippets/tutorials/any_values.rrd create mode 100644 tests/assets/rrd/snippets/tutorials/custom_data.rrd create mode 100644 tests/assets/rrd/snippets/tutorials/data_out.rrd create mode 100644 tests/assets/rrd/snippets/tutorials/dynamic_archetype.rrd create mode 100644 tests/assets/rrd/snippets/tutorials/extra_values.rrd create mode 100644 tests/assets/rrd/snippets/tutorials/getting_started_log.rrd create mode 100644 tests/assets/rrd/snippets/tutorials/visualizer-overrides.rrd create mode 100644 tests/assets/rrd/snippets/views/bar_chart.rrd create mode 100644 tests/assets/rrd/snippets/views/dataframe.rrd create mode 100644 tests/assets/rrd/snippets/views/graph.rrd create mode 100644 tests/assets/rrd/snippets/views/map.rrd create mode 100644 tests/assets/rrd/snippets/views/spatial2d.rrd create mode 100644 tests/assets/rrd/snippets/views/spatial3d.rrd create mode 100644 tests/assets/rrd/snippets/views/state_timeline.rrd create mode 100644 tests/assets/rrd/snippets/views/tensor.rrd create mode 100644 tests/assets/rrd/snippets/views/text_document.rrd create mode 100644 tests/assets/rrd/snippets/views/text_log.rrd create mode 100644 tests/assets/rrd/snippets/views/timeseries.rrd create mode 100644 tests/assets/rrd/video_sample/simple_frame_data.rrd create mode 100644 tests/assets/table/.gitattributes create mode 100644 tests/assets/table/lance/simple_datatypes/_transactions/0-828e81a3-bb94-44a2-bb8a-7cb9ea3e10b2.txn create mode 100644 tests/assets/table/lance/simple_datatypes/_versions/1.manifest create mode 100644 tests/assets/table/lance/simple_datatypes/data/0101000110110100101111100713b14fa38c9a63c90f59698d.lance create mode 100644 tests/assets/video/Big_Buck_Bunny_1080_10s_av1.mp4 create mode 100644 tests/assets/video/Big_Buck_Bunny_1080_1s_av1.mp4 create mode 100644 tests/assets/video/Big_Buck_Bunny_1080_1s_h264.mp4 create mode 100644 tests/assets/video/Big_Buck_Bunny_1080_1s_h264_nobframes.mp4 create mode 100644 tests/assets/video/Big_Buck_Bunny_1080_1s_h265.mp4 create mode 100644 tests/assets/video/Big_Buck_Bunny_1080_1s_h265_nobframes.mp4 create mode 100644 tests/assets/video/Big_Buck_Bunny_1080_1s_vp8.mp4 create mode 100644 tests/assets/video/Big_Buck_Bunny_1080_1s_vp9.mp4 create mode 100644 tests/assets/video/Sintel_1080_10s_av1.mp4 create mode 100644 tests/assets/video/gif_as_h264_nobframes.h264 create mode 100644 tests/assets/video/mpeg4_part2.mp4 create mode 100644 tests/cpp/CMakeLists.txt create mode 100644 tests/cpp/log_benchmark/CMakeLists.txt create mode 100644 tests/cpp/log_benchmark/benchmarks.hpp create mode 100644 tests/cpp/log_benchmark/image.cpp create mode 100644 tests/cpp/log_benchmark/main.cpp create mode 100644 tests/cpp/log_benchmark/points3d_large_batch.cpp create mode 100644 tests/cpp/log_benchmark/points3d_many_individual.cpp create mode 100644 tests/cpp/log_benchmark/points3d_shared.hpp create mode 100644 tests/cpp/log_benchmark/profile_scope.cpp create mode 100644 tests/cpp/log_benchmark/profile_scope.hpp create mode 100644 tests/cpp/plot_dashboard_stress/CMakeLists.txt create mode 100644 tests/cpp/plot_dashboard_stress/main.cpp create mode 100644 tests/python/__init__.py create mode 100644 tests/python/annotation_context_ui_stress/annotation_context_ui_stress.py create mode 100644 tests/python/blueprint/main.py create mode 100644 tests/python/blueprint/save_blueprint.py create mode 100644 tests/python/blueprint/spawn_blueprint.py create mode 100644 tests/python/chunk_zoo/chunk_zoo.py create mode 100644 tests/python/chunked_video/chunked_video.py create mode 100644 tests/python/gc_stress/many_large_many_rows_recordings.py create mode 100644 tests/python/gc_stress/many_large_single_row_recordings.py create mode 100644 tests/python/gc_stress/many_medium_sized_many_rows_recordings.py create mode 100644 tests/python/gc_stress/many_medium_sized_single_row_recordings.py create mode 100644 tests/python/gil_stress/main.py create mode 100644 tests/python/log_benchmark/README.md create mode 100644 tests/python/log_benchmark/__init__.py create mode 100644 tests/python/log_benchmark/test_log_benchmark.py create mode 100644 tests/python/log_benchmark/test_micro_benchmark.py create mode 100644 tests/python/many_entity_transforms/main.py create mode 100644 tests/python/memory_drain/main.py create mode 100755 tests/python/plot_dashboard_stress/main.py create mode 100644 tests/python/release_checklist/.gitignore create mode 100644 tests/python/release_checklist/README.md create mode 100644 tests/python/release_checklist/check_drag_and_drop_selection.py create mode 100644 tests/python/release_checklist/check_hover_select_reset.py create mode 100644 tests/python/release_checklist/check_lerobot_v2_importer.py create mode 100644 tests/python/release_checklist/check_lerobot_v3_importer.py create mode 100644 tests/python/release_checklist/check_modal_scrolling.py create mode 100644 tests/python/release_checklist/check_multi_entity_drag_and_drop.py create mode 100644 tests/python/release_checklist/check_notebook.py create mode 100644 tests/python/release_checklist/check_parallelism_caching_reentrancy.py create mode 100644 tests/python/release_checklist/check_plot_overrides.py create mode 100644 tests/python/release_checklist/check_rbl_import.py create mode 100755 tests/python/release_checklist/main.py create mode 100644 tests/python/requirements.txt create mode 100755 tests/python/view_coordinates/main.py create mode 100644 tests/python/visible_history_playground/main.py create mode 100644 tests/rust/log_benchmark/Cargo.toml create mode 100644 tests/rust/log_benchmark/README.md create mode 100644 tests/rust/log_benchmark/src/boxes3d_batch.rs create mode 100644 tests/rust/log_benchmark/src/image.rs create mode 100644 tests/rust/log_benchmark/src/main.rs create mode 100644 tests/rust/log_benchmark/src/points3d_large_batch.rs create mode 100644 tests/rust/log_benchmark/src/points3d_many_individual.rs create mode 100644 tests/rust/log_benchmark/src/points3d_shared.rs create mode 100644 tests/rust/log_benchmark/src/scalars.rs create mode 100644 tests/rust/log_benchmark/src/transform3d.rs create mode 100644 tests/rust/log_benchmark/src/very_large_chunk.rs create mode 100644 tests/rust/plot_dashboard_stress/Cargo.toml create mode 100644 tests/rust/plot_dashboard_stress/src/main.rs create mode 100644 tests/rust/re_integration_test/Cargo.toml create mode 100644 tests/rust/re_integration_test/src/kittest_harness_ext.rs create mode 100644 tests/rust/re_integration_test/src/lib.rs create mode 100644 tests/rust/re_integration_test/src/test_data.rs create mode 100644 tests/rust/re_integration_test/src/viewer_section.rs create mode 100644 tests/rust/re_integration_test/tests/add_entity_to_view_test.rs create mode 100644 tests/rust/re_integration_test/tests/add_visualizer_test.rs create mode 100644 tests/rust/re_integration_test/tests/basic_tests.rs create mode 100644 tests/rust/re_integration_test/tests/blueprint_context_menu_test.rs create mode 100644 tests/rust/re_integration_test/tests/check_focus_test.rs create mode 100644 tests/rust/re_integration_test/tests/container_context_menu_test.rs create mode 100644 tests/rust/re_integration_test/tests/context_menu_test.rs create mode 100644 tests/rust/re_integration_test/tests/dataset_folders.rs create mode 100644 tests/rust/re_integration_test/tests/datasets.rs create mode 100644 tests/rust/re_integration_test/tests/deselect_on_escape.rs create mode 100644 tests/rust/re_integration_test/tests/drop_component_to_state_timeline_view.rs create mode 100644 tests/rust/re_integration_test/tests/drop_stream_to_view.rs create mode 100644 tests/rust/re_integration_test/tests/grid_view_flagging.rs create mode 100644 tests/rust/re_integration_test/tests/heuristics_mixed_2d_and_3d_test.rs create mode 100644 tests/rust/re_integration_test/tests/heuristics_mixed_all_root_test.rs create mode 100644 tests/rust/re_integration_test/tests/internal_catalog.rs create mode 100644 tests/rust/re_integration_test/tests/multi_container_test.rs create mode 100644 tests/rust/re_integration_test/tests/no_blueprint_test.rs create mode 100644 tests/rust/re_integration_test/tests/origin_heuristics_test.rs create mode 100644 tests/rust/re_integration_test/tests/preview_table.rs create mode 100644 tests/rust/re_integration_test/tests/redap_catalog_select.rs create mode 100644 tests/rust/re_integration_test/tests/rrd_bw_compat_test.rs create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_container_from_blueprint_panel_menu_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_container_from_blueprint_panel_menu_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_container_from_blueprint_panel_menu_3.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_container_from_selection_panel_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_container_from_selection_panel_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_container_from_selection_panel_3.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_bar_chart_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_bar_chart_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_bar_chart_3.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_bar_chart_4.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_bar_chart_5.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_boxes2d_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_boxes2d_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_boxes2d_3.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_boxes2d_4.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_boxes2d_5.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_boxes3d_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_boxes3d_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_boxes3d_3.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_boxes3d_4.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_boxes3d_5.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_tensor_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_tensor_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_tensor_3.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_tensor_4.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_tensor_5.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_text_log_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_text_log_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_text_log_3.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_text_log_4.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_entity_to_view_text_log_5.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_visualizer_axes_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_visualizer_axes_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_visualizer_axes_3.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_visualizer_axes_4.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/add_visualizer_axes_5.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/blueprint_tree_context_menu_01.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/blueprint_tree_context_menu_02.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/blueprint_tree_context_menu_03.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/blueprint_tree_context_menu_04.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/blueprint_tree_context_menu_05.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/blueprint_tree_context_menu_06.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/blueprint_tree_context_menu_07.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/blueprint_tree_context_menu_08.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/blueprint_tree_context_menu_09.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/blueprint_tree_context_menu_10.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/blueprint_view_context.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/change_container_type_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/change_container_type_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/check_focus_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/check_focus_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/check_focus_3.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/check_focus_4.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/check_focus_5.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/check_focus_6.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/check_focus_7.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/check_focus_8.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/collapse_stream_entity_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/collapse_stream_entity_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/collapse_stream_root_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/collapse_stream_root_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/collapse_stream_root_3.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/container_selection_context_menu_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/container_selection_context_menu_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/context_menu_invalid_sub_container_01.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/context_menu_invalid_sub_container_02.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/context_menu_invalid_sub_container_03.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/context_menu_invalid_sub_container_04.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/context_menu_invalid_sub_container_05.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/context_menu_multi_selection_01.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/context_menu_multi_selection_02.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/context_menu_multi_selection_03.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/context_menu_multi_selection_04.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/context_menu_multi_selection_05.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/context_menu_multi_selection_06.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/context_menu_multi_selection_07.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/context_menu_multi_selection_08.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/dataset_folders_01_perception.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/dataset_folders_02_perception_detection.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/dataset_folders_03_perception_after_parent.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/dataset_folders_04_summary_dataset.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/dataset_ui_empty_form.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/dataset_ui_table.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/deselect_on_escape_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/deselect_on_escape_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/deselect_on_escape_3.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/deselect_on_escape_4.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/deselect_on_escape_5.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/deselect_on_escape_6.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/deselect_on_escape_7.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/deselect_on_escape_8.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drag_view_to_other_view_bottom_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drag_view_to_other_view_bottom_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drag_view_to_other_view_center_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drag_view_to_other_view_center_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drag_view_to_other_view_left_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drag_view_to_other_view_left_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drag_view_to_other_view_right_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drag_view_to_other_view_right_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drag_view_to_other_view_top_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drag_view_to_other_view_top_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drop_component_to_state_timeline_view_1_initial.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drop_component_to_state_timeline_view_2_hover.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drop_component_to_state_timeline_view_3_after_drop.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drop_component_to_state_timeline_view_4_after_redrop.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drop_multiple_streams_to_view_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drop_multiple_streams_to_view_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drop_multiple_streams_to_view_3.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drop_multiple_streams_to_view_4.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drop_multiple_streams_to_view_5.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drop_multiple_streams_to_view_6.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drop_stream_to_view_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drop_stream_to_view_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drop_stream_to_view_3.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drop_stream_to_view_4.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drop_stream_to_view_5.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/drop_stream_to_view_6.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/grid_view_flagging_after.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/grid_view_flagging_before.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/heuristics_mixed_2d_and_3d.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/heuristics_mixed_all_root.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/internal_catalog_load_rrd_catalog.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/internal_catalog_load_rrd_recording.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/multi_container_deep_nested.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/multi_container_drag_container_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/multi_container_drag_container_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/multi_container_drag_container_3.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/multi_container_drag_container_4.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/multi_container_drag_container_5.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/multi_container_drag_container_6.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/multi_container_drag_single_view_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/multi_container_drag_single_view_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/multi_container_drag_single_view_3.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/multi_container_many_views.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/multiple_undo_redo_1_initial.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/multiple_undo_redo_2_after_drag_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/multiple_undo_redo_3_after_drag_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/multiple_undo_redo_4_undo_once.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/multiple_undo_redo_5_undo_twice.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/multiple_undo_redo_6_redo_once.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/multiple_undo_redo_7_redo_twice.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/no_blueprint_from_sdk.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/origin_camera_2d.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/origin_camera_3d.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/origin_image_2d.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/origin_image_3d.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/origin_keypoint_2d.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/origin_keypoint_3d.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/origin_root_2d.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/origin_root_3d.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/origin_world_2d.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/origin_world_3d.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/per_visualizer_instruction_errors_1_warnings_only.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/per_visualizer_instruction_errors_1b_warnings_only_menu.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/per_visualizer_instruction_errors_2_warnings_and_errors_menu.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/per_visualizer_instruction_errors_2b_warnings_and_errors_dataresult.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/per_visualizer_instruction_errors_3_errors_only.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/per_visualizer_instruction_errors_3_errors_only_menu.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/per_visualizer_instruction_errors_3b_errors_only_menu.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/preview_table.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/preview_table_grid.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/preview_table_opened_recording.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/resize_view_horizontal_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/resize_view_horizontal_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/resize_view_horizontal_3.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/resize_view_vertical_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/resize_view_vertical_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/resize_view_vertical_3.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/rrd_bw_compat_animated_urdf.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/rrd_bw_compat_arkit_scenes.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/rrd_bw_compat_detect_and_track_objects.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/rrd_bw_compat_dicom_mri.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/rrd_bw_compat_dna.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/rrd_bw_compat_graphs.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/rrd_bw_compat_imu_signals.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/rrd_bw_compat_nuscenes_dataset.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/rrd_bw_compat_open_photogrammetry_format.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/rrd_bw_compat_plots.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/rrd_bw_compat_raw_mesh.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/rrd_bw_compat_rgbd.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/rrd_bw_compat_rrt_star.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/rrd_bw_compat_segment_anything_model.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/rrd_bw_compat_structure_from_motion.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/series_count_exceeds_max.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/simplify_container_hierarchy_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/simplify_container_hierarchy_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/simplify_container_hierarchy_3.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/simplify_root_hierarchy_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/simplify_root_hierarchy_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/simplify_root_hierarchy_3.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/single_text_document_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/single_text_document_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/source_component_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/source_component_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/source_component_3.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/source_component_4.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/source_component_5.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/source_component_6.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/source_component_7.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/source_component_8.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/start_with_dataset_url.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/start_with_segment_fragment_url.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/state_timeline_hover_highlight_after.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/state_timeline_hover_highlight_before.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/states_source_1_initial.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/states_source_2_tree_expanded.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/states_source_3_entity_selected.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/states_source_4_dropdown_open.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/states_source_5_source_changed.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/streams_context_single_select_1.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/streams_context_single_select_2.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/streams_context_single_select_3.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/streams_context_single_select_4.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/streams_context_single_select_5.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/undo_redo_3d_rotation_1_initial.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/undo_redo_3d_rotation_2_after_first_drag.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/undo_redo_3d_rotation_3_after_undo.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/undo_redo_3d_rotation_4_after_redo.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/undo_redo_3d_rotation_5_after_second_undo.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/undo_redo_3d_rotation_6_after_new_drag.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/undo_redo_3d_rotation_7_redo_after_new_action.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/view_defaults.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/view_visualizers_1_initial.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/view_visualizers_2_plots_view_selected.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/view_visualizers_3_other_view_selected.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/view_visualizers_4_hover_sin_line.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/view_visualizers_5_after_hide.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/view_visualizers_6_hover_different_after_hide.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/view_visualizers_add_1_view_selected.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/view_visualizers_add_2_popup_open.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/view_visualizers_add_multi_1_starting_state.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/view_visualizers_add_multi_2_selected_visualizer.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/view_visualizers_add_multi_3_removed_visualizer.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/view_visualizers_add_multi_4_view_selected_again.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/view_visualizers_add_multi_5_popup_open.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/view_visualizers_add_multi_6_first_added.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/view_visualizers_add_multi_7_second_added.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/view_visualizers_ctx_menu_1_open.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/view_visualizers_ctx_menu_2_after_hide.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/view_visualizers_ctx_menu_3_show_option.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/view_visualizers_ctx_menu_4_after_show.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/view_visualizers_ctx_menu_5_after_remove.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/view_visualizers_multi_scalar_view_selected.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/watch_events_1_initial.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/watch_events_2_entries_added.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/watch_events_3_entries_removed.png create mode 100644 tests/rust/re_integration_test/tests/snapshots/xtemp.png create mode 100644 tests/rust/re_integration_test/tests/source_component_test.rs create mode 100644 tests/rust/re_integration_test/tests/state_timeline_hover_highlight.rs create mode 100644 tests/rust/re_integration_test/tests/undo_redo_test.rs create mode 100644 tests/rust/re_integration_test/tests/view_defaults_test.rs create mode 100644 tests/rust/re_integration_test/tests/view_visualizers_test.rs create mode 100644 tests/rust/re_integration_test/tests/viewer_events_test.rs create mode 100644 tests/rust/re_integration_test/tests/views_spawned_test.rs create mode 100644 tests/rust/re_integration_test/tests/visualizer_instruction_errors_test.rs create mode 100644 tests/rust/re_integration_test/tests/watch_events.rs create mode 100644 tests/rust/test_data_density_graph/Cargo.toml create mode 100644 tests/rust/test_data_density_graph/src/main.rs create mode 100644 tests/rust/test_image_memory/Cargo.toml create mode 100644 tests/rust/test_image_memory/src/main.rs create mode 100644 tests/rust/test_label_compaction/Cargo.toml create mode 100644 tests/rust/test_label_compaction/src/main.rs create mode 100644 tests/rust/test_out_of_order_transforms/Cargo.toml create mode 100644 tests/rust/test_out_of_order_transforms/src/main.rs create mode 100644 tests/rust/test_ui_wakeup/Cargo.toml create mode 100644 tests/rust/test_ui_wakeup/src/main.rs create mode 100644 uv.lock diff --git a/.RERUN_ROOT b/.RERUN_ROOT new file mode 100644 index 0000000..e69de29 diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..3ed0722 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,72 @@ +[alias] +# Run the codegen. Optionally pass `--profile` to it. +# NOTE: there are several CI jobs with `command: codegen` with the cargo action +codegen = "run --package re_types_builder --" + +# To easily run examples on the web, see https://github.com/rukai/cargo-run-wasm. +# Temporary solution while we wait for our own xtasks! +run-wasm = "run --release --package run_wasm --" + +[unstable] +codegen-backend = true +config-include = true + +[build] +# Incremental compilation blows up the size of the target folder, and is also buggy. +incremental = false + + +[env] +# Some of our build.rs files only run if this is set, +# so that we don't run them on cargo publish or on users machines. +IS_IN_RERUN_WORKSPACE = "yes" + +# Use a stable pyo3 config file to prevent cargo cache invalidation when building +# via different tools (maturin develop vs uv sync). The config file pins the Python +# executable to .venv/bin/python, ensuring consistent builds regardless of whether +# uv uses an isolated build environment. +# The `relative = true` makes cargo expand this to an absolute path. +# +# NOTE: This file must be generated before any cargo build involving pyo3. +# Run `pixi run ensure-pyo3-build-cfg ` +# +# If you need to build outside of pixi, you may run `python scripts/generate_pyo3_config.py` +# manually. But, mixing this with any pixi invocations will result in spurious rebuilds. +PYO3_CONFIG_FILE = { value = "rerun_py/pyo3-build.cfg", relative = true } + +[target.osx-arm64.activation.env] +AR = "llvm-ar" # Various Wasm targets fail on mac without llvm-ar + +# `web_sys_unstable_apis` is required to enable the web_sys clipboard API which egui_web uses. +# https://wasm-bindgen.github.io/wasm-bindgen/api/web_sys/struct.Clipboard.html +# https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html +# +# `getrandom_backend="wasm_js"` is required to enable the `getrandom` crate to use the `wasm_js` backend. +# https://docs.rs/getrandom/latest/getrandom/#webassembly-support +# +# `-Ctarget-feature=+simd128,…` enables LLVM auto-vectorization and a handful +# of other Wasm proposals for wasm32. The SIMD baseline is +# Chrome 91+, Firefox 89+, Safari 16.4+ — the JS loader feature-detects SIMD +# and shows a friendly error on older browsers. Every other feature listed +# here shipped strictly earlier in all three browsers, so the SIMD check is +# sufficient to gate them all: +# +# simd128 Chrome 91 / FF 89 / Safari 16.4 (auto-vectorization) +# bulk-memory Chrome 75 / FF 79 / Safari 15 (single-instr memcpy/memset) +# nontrapping-fptoint Chrome 75 / FF 64 / Safari 15 (saturating float→int) +# multivalue Chrome 85 / FF 78 / Safari 15 (multi-value returns) +# +# Note `bulk-memory` is already on by default in rustc 1.82+; listing it is +# redundant but explicit. `mutable-globals`, `sign-ext`, and `reference-types` +# are also enabled by default and not listed. +[target.wasm32-unknown-unknown] +rustflags = [ + '--cfg=web_sys_unstable_apis', + '--cfg=getrandom_backend="wasm_js"', + '-Ctarget-feature=+simd128,+bulk-memory,+nontrapping-fptoint,+multivalue', +] + +# Use rust-lld on Windows due problems with large debug symbols. +# See https://github.com/rust-lang/rust/issues/141626 +[target.x86_64-pc-windows-msvc] +linker = "rust-lld" diff --git a/.cargo/cranelift.toml b/.cargo/cranelift.toml new file mode 100644 index 0000000..edc2239 --- /dev/null +++ b/.cargo/cranelift.toml @@ -0,0 +1,39 @@ +# Cranelift codegen backend for the dev-fast profile (nightly only). +# Crates with unsupported aarch64 intrinsics (CRC32, NEON) are overridden to compile with LLVM. +# This file is included via config-include from the pixi task and run configuration + +[profile.dev-fast] +codegen-backend = "cranelift" + +[profile.dev-fast.package.crc32fast] +codegen-backend = "llvm" + +[profile.dev-fast.package.zune-jpeg] +codegen-backend = "llvm" + +[profile.dev-fast.package.image] +codegen-backend = "llvm" + +[profile.dev-fast.package.re_sdk_types] +codegen-backend = "llvm" + +[profile.dev-fast.package.glam] +codegen-backend = "llvm" + +[profile.dev-fast.package.fearless_simd] +codegen-backend = "llvm" + +[profile.dev-fast.package.vello_common] +codegen-backend = "llvm" + +[profile.dev-fast.package.vello_cpu] +codegen-backend = "llvm" + +[profile.dev-fast.package.tiny-skia] +codegen-backend = "llvm" + +[profile.dev-fast.package.simd-adler32] +codegen-backend = "llvm" + +[profile.dev-fast.package.re_rav1d] +codegen-backend = "llvm" diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..e8c5b49 --- /dev/null +++ b/.clang-format @@ -0,0 +1,34 @@ +BasedOnStyle: Google + +# Make it slightly more similar to Rust. +# Based loosely on https://gist.github.com/YodaEmbedding/c2c77dc693d11f3734d78489f9a6eea4 +AccessModifierOffset: -2 +AlignAfterOpenBracket: BlockIndent +AllowAllArgumentsOnNextLine: false +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: Empty +AllowShortIfStatementsOnASingleLine: Never +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: true +BinPackArguments: false +BreakStringLiterals: false +ColumnLimit: 100 +ContinuationIndentWidth: 4 +DerivePointerAlignment: false +EmptyLineBeforeAccessModifier: LogicalBlock +IndentWidth: 4 +IndentWrappedFunctionNames: true +InsertBraces: true +InsertTrailingCommas: Wrapped +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: All +PointerAlignment: Left +ReflowComments: false # This can break example code in docstrings +SeparateDefinitionBlocks: Always +SpacesBeforeTrailingComments: 1 + +# Don't change include blocks, we want to control this manually. +# Sorting headers however is allowed as all our headers should be standalone. +IncludeBlocks: Preserve +SortIncludes: CaseInsensitive diff --git a/.config/nextest.toml b/.config/nextest.toml new file mode 100644 index 0000000..af79515 --- /dev/null +++ b/.config/nextest.toml @@ -0,0 +1,11 @@ +# See https://nexte.st/docs/configuration/ + +[profile.default] +# warn if a test takes longer than 30 seconds and terminate it after 2 minutes +slow-timeout = { period = "30s", terminate-after = 4 } + +# CI profile: retry flaky tests once. Set via `--profile ci` in CI scripts. +# Local runs stay on `default` (no retries) so flakes surface. +[profile.ci] +slow-timeout = { period = "30s", terminate-after = 4 } +retries = 1 diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..abc69d7 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +venv/ +**/*.so +examples/ +target +target* diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..c2e316c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +[*.ron] +indent_style = space +indent_size = 2 +tab_width = 2 + +# keep in sync with `taplo.toml` +[*.toml] +indent_style = space +indent_size = 2 +tab_width = 2 + +[*.{js,ts,jsx,tsx}] +indent_style = space +indent_size = 2 +tab_width = 2 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..6ec19dd --- /dev/null +++ b/.gitattributes @@ -0,0 +1,19 @@ +* text=auto eol=lf +*.zip -text diff +Cargo.lock linguist-generated=false +pixi.lock linguist-generated=true +# git-lfs: +**/*.urdf filter=lfs diff=lfs merge=lfs -text +**/*.stl filter=lfs diff=lfs merge=lfs -text +**/*.STL filter=lfs diff=lfs merge=lfs -text +**/*.dae filter=lfs diff=lfs merge=lfs -text +**/*.DAE filter=lfs diff=lfs merge=lfs -text +**/*.mcap filter=lfs diff=lfs merge=lfs -text +**/snapshots/**/*.png filter=lfs diff=lfs merge=lfs -text +**/droid-loader/**/*.png filter=lfs diff=lfs merge=lfs -text +**/droid/resources/*.png filter=lfs diff=lfs merge=lfs -text +**/viewer/apple-touch-icon.png filter=lfs diff=lfs merge=lfs -text +**/*.h264 filter=lfs diff=lfs merge=lfs -text +**/*.mp4 filter=lfs diff=lfs merge=lfs -text +examples/assets/example.rrd filter=lfs diff=lfs merge=lfs -text +tests/assets/image/*.bin filter=lfs diff=lfs merge=lfs -text diff --git a/.github/ISSUE_TEMPLATE/annoyance_report.md b/.github/ISSUE_TEMPLATE/annoyance_report.md new file mode 100644 index 0000000..24f130d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/annoyance_report.md @@ -0,0 +1,43 @@ +--- +name: Annoyance report +about: Create a report to help us make Rerun easier to use +title: '' +labels: 😤 annoying, 👀 needs triage +assignees: '' + +--- + + + + +**Describe the annoyance** + + +**To Reproduce** +Steps to reproduce the behavior: +1. +2. +3. +4. + +**Expected behavior** + + +**Your goals** + + +**Screenshots** + + +**Desktop (please complete the following information):** + - OS: + +**Additional context** + diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..af01017 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,40 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: 🪳 bug, 👀 needs triage +assignees: '' + +--- + + + +**Describe the bug** + + +**To Reproduce** +Steps to reproduce the behavior: +1. +2. +3. +4. + +**Expected behavior** + + +**Screenshots** + + +**Backtrace** + + +**Desktop (please complete the following information):** + - OS: + +**Rerun version** + + +**Additional context** + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..97e0419 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,25 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: enhancement, 👀 needs triage +assignees: '' + +--- + + + + +**Is your feature request related to a problem? Please describe.** + + +**Describe the solution you'd like** + + +**Describe alternatives you've considered** + + +**Additional context** + diff --git a/.github/ISSUE_TEMPLATE/other.md b/.github/ISSUE_TEMPLATE/other.md new file mode 100644 index 0000000..3b7d1f6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/other.md @@ -0,0 +1,10 @@ +--- +name: Other +about: For issues that are neither bugs or feature requests +title: '' +labels: other, 👀 needs triage +assignees: '' + +--- + +If you are asking a question, use [the Rerun Discord server](https://discord.gg/PXtCgFBSmH) instead. diff --git a/.github/ISSUE_TEMPLATE/project.md b/.github/ISSUE_TEMPLATE/project.md new file mode 100644 index 0000000..cae40af --- /dev/null +++ b/.github/ISSUE_TEMPLATE/project.md @@ -0,0 +1,54 @@ +--- +name: Project +about: A large but finite project involving many sub-tasks +title: 'Project: ' +labels: project +assignees: '' + +--- + + + +## Summary description + + +## Background and problem + + +## Grounding use-cases + + +## How to describe, demo and evaluate + + +## Designs and plans + + +## Tasks + + +- [ ] Simple inline tasks +- [ ] Links to sub-issues + +## Non-goals and won't do + diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 0000000..4a570fd --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,10 @@ +--- +name: Question +about: For questions please use the Rerun Discord +title: '' +labels: 👀 needs triage +assignees: '' + +--- + +If you are asking a question, use [the Rerun Discord server](https://discord.gg/PXtCgFBSmH) instead. diff --git a/.github/actions/setup-rust/action.yml b/.github/actions/setup-rust/action.yml new file mode 100644 index 0000000..8639892 --- /dev/null +++ b/.github/actions/setup-rust/action.yml @@ -0,0 +1,90 @@ +# This action sets up: +# - The correct version of Rust based on the `rust-toolchain` file +# - All components + targets specified in `rust-toolchain` +# - Caching of individual compilation requests via `sccache` and GCS +# - Downloads sccache from the mirror at build.rerun.io +# - `cargo nextest` +# +# Note that due to the use of GCS as an sccache storage backend, +# this action also sets up GCP credentials as a side effect. +# There is no harm to setting up the credentials twice accidentally, +# but care should be taken not to do that, as it's wasteful. + +name: "Setup Rust" + +inputs: + cache_key: + type: string + required: true + save_cache: + type: boolean + required: false + default: false + workload_identity_provider: + type: string + required: true + service_account: + type: string + required: true + toolchains: + type: string + required: false + description: "Space-separated list of extra toolchains to install" + targets: + type: string + required: false + description: "One or more space separated target triplets that will be ensured to be supported." + +runs: + using: "composite" + steps: + # Needed because the default is clang 15 and it fails to compile some dependencies for wasm, with "LLVM error: + # section too large". + - name: Use clang 18 (mac) + if: ${{ runner.os == 'macOS' }} + run: | + echo "$(brew --prefix llvm@18)/bin" >> $GITHUB_PATH + shell: bash --noprofile --norc -euo pipefail {0} + + - name: Check clang version + if: ${{ runner.os == 'macOS' }} + run: | + clang --version + which clang + shell: bash --noprofile --norc -euo pipefail {0} + + - name: Set up GCP credentials + uses: google-github-actions/auth@v2 + with: + workload_identity_provider: ${{ inputs.workload_identity_provider }} + service_account: ${{ inputs.service_account }} + + - name: Ensure correct version of Rust is installed + shell: bash --noprofile --norc -euo pipefail {0} + run: | + rustup --version + rustup install + + - name: Install additional targets + if: ${{ inputs.targets != '' }} + shell: bash --noprofile --norc -euo pipefail {0} + run: rustup target add ${{ inputs.targets }} + + - name: Install additional toolchains + if: ${{ inputs.toolchains }} + shell: bash --noprofile --norc -euo pipefail {0} + run: | + for toolchain in ${{ inputs.toolchains }}; do + rustup install $toolchain + done + + - name: Set up sccache + shell: bash --noprofile --norc -euo pipefail {0} + run: | + "$GITHUB_ACTION_PATH/../../scripts/setup_sccache.sh" --version v0.14.0 --backend gcs + + # Recommended way to install nextest on CI. + - name: Install latest nextest release + uses: taiki-e/install-action@v2.48.7 + with: + tool: nextest@0.9.89 diff --git a/.github/actions/vercel/action.yml b/.github/actions/vercel/action.yml new file mode 100644 index 0000000..57617d4 --- /dev/null +++ b/.github/actions/vercel/action.yml @@ -0,0 +1,51 @@ +# If `target` is set to `production`, this action handles updating the +# target commit env variable (`RELEASE_COMMIT`) which is used as the +# pointer for `rerun.io/docs` and `rerun.io/examples` and triggering +# a redeploy of `rerun.io`. + +# If `target` is set to `preview`, then this instead deploys a fresh preview +# with an override for `release_commit`, and sets the following outputs: +# - `vercel_preview_deployment_id` +# - `vercel_preview_url` +# - `vercel_preview_inspector_url` +# +# The `vercel_preview_deployment_id` may be used to wait for the deployment +# to complete with the `wait-for-deployment` command, which outputs: +# - `vercel_preview_result`, either "success" or "failure" +# - `vercel_preview_url` +# - `vercel_preview_inspector_url` + +name: "Deploy rerun.io" + +description: "Vercel utilities" + +# Changing these inputs also requires changing their usage in `index.mjs` +inputs: + vercel_token: + description: "Vercel access token" + required: true + vercel_team_name: + description: "Vercel team name under which `vercel_project_name` can be found" + required: true + vercel_project_name: + description: "Vercel project name to update and redeploy" + required: true + vercel_deployment_id: + description: "Vercel deployment ID used in `wait-for-deployment`" + required: false + command: + description: "one of: `deploy`, `wait-for-deployment`, `update-env`" + required: true + release_commit: + description: "Release commit to update the deployment to" + required: false + release_version: + description: "Which release version to update the deployment to" + required: false + target: + description: "Which Vercel environment to deploy to" + required: false + +runs: + using: "node20" + main: "index.mjs" diff --git a/.github/actions/vercel/commands/deploy-preview.mjs b/.github/actions/vercel/commands/deploy-preview.mjs new file mode 100644 index 0000000..7bfb342 --- /dev/null +++ b/.github/actions/vercel/commands/deploy-preview.mjs @@ -0,0 +1,39 @@ +// @ts-check + +import { setOutput } from "../util.mjs"; +import { Client } from "../vercel.mjs"; + +/** + * + * @param {Client} client + * @param {{ + * team: string; + * project: string; + * commit: string | null; + * version: string | null; + * }} options + */ +export async function deployToPreview(client, options) { + const project = await client.project(options.team, options.project); + const deployment = await project.latestProductionDeployment(); + + let line = `Deploying preview`; + if (options.commit) line += ` RELEASE_COMMIT=${options.commit}`; + if (options.version) line += ` RELEASE_VERSION=${options.version}`; + console.log(line); + + const env = { IS_PR_PREVIEW: "true" }; + if (options.commit) env["RELEASE_COMMIT"] = options.commit; + if (options.version) env["RELEASE_VERSION"] = options.version; + + const newDeployment = await project.deployPreviewFrom( + deployment.uid, + "landing-preview", + env, + ); + setOutput("vercel_preview_deployment_id", newDeployment.id); + setOutput("vercel_preview_url", newDeployment.url); + setOutput("vercel_preview_inspector_url", newDeployment.inspectorUrl); + + return newDeployment; +} diff --git a/.github/actions/vercel/commands/deploy-production.mjs b/.github/actions/vercel/commands/deploy-production.mjs new file mode 100644 index 0000000..e3a66b8 --- /dev/null +++ b/.github/actions/vercel/commands/deploy-production.mjs @@ -0,0 +1,32 @@ +// @ts-check + +import { Client } from "../vercel.mjs"; + +/** + * + * @param {Client} client + * @param {{ + * team: string; + * project: string; + * commit: string | null; + * version: string | null; + * }} options + */ +export async function deployToProduction(client, options) { + const project = await client.project(options.team, options.project); + const deployment = await project.latestProductionDeployment(); + + if (options.commit) await project.setEnv("RELEASE_COMMIT", options.commit); + if (options.version) await project.setEnv("RELEASE_VERSION", options.version); + + const newDeployment = await project.redeploy(deployment.uid, "landing"); + + const result = await project.waitForDeployment(newDeployment.id); + if (result.type === "failure") { + throw new Error( + `deployment failed, see ${JSON.stringify( + result.deployment.inspectorUrl, + )} for more information`, + ); + } +} diff --git a/.github/actions/vercel/commands/update-env.mjs b/.github/actions/vercel/commands/update-env.mjs new file mode 100644 index 0000000..418aa4f --- /dev/null +++ b/.github/actions/vercel/commands/update-env.mjs @@ -0,0 +1,20 @@ +// @ts-check + +import { Client } from "../vercel.mjs"; + +/** + * + * @param {Client} client + * @param {{ + * team: string; + * project: string; + * commit: string | null; + * version: string | null; + * }} options + */ +export async function updateProjectEnv(client, options) { + const project = await client.project(options.team, options.project); + + if (options.commit) await project.setEnv("RELEASE_COMMIT", options.commit); + if (options.version) await project.setEnv("RELEASE_VERSION", options.version); +} diff --git a/.github/actions/vercel/index.mjs b/.github/actions/vercel/index.mjs new file mode 100644 index 0000000..987674e --- /dev/null +++ b/.github/actions/vercel/index.mjs @@ -0,0 +1,109 @@ +// @ts-check + +import { Client } from "./vercel.mjs"; +import { getInput, getRequiredInput, setOutput } from "./util.mjs"; +import { deployToProduction } from "./commands/deploy-production.mjs"; +import { deployToPreview } from "./commands/deploy-preview.mjs"; +import { updateProjectEnv } from "./commands/update-env.mjs"; + +// All inputs retrieved via `getInput` are defined in `action.yml`, and should be kept in sync + +const token = getRequiredInput("vercel_token"); +const teamId = getRequiredInput("vercel_team_name"); +const projectId = getRequiredInput("vercel_project_name"); +const deploymentId = getInput("vercel_deployment_id"); +const command = getRequiredInput("command"); +const commit = getInput("release_commit"); +const version = getInput("release_version"); +const target = getInput("target"); + +const client = new Client(token); + +switch (command) { + case "deploy": + await deploy(client, teamId, projectId, commit, version); + break; + case "wait-for-deployment": + if (!deploymentId) { + throw new Error(`"vercel_deployment_id" must be specified`); + } + await waitForDeployment(client, teamId, projectId, deploymentId); + break; + case "update-env": + await updateEnv(client, teamId, projectId); + break; + default: + throw new Error(`"command" must be one of: deploy, update-env`); +} + +/** + * @param {Client} client + * @param {string} teamId + * @param {string} projectId + * @param {string | null} commit + * @param {string | null} version + */ +async function deploy(client, teamId, projectId, commit, version) { + switch (target) { + case "production": { + await deployToProduction(client, { + team: teamId, + project: projectId, + commit, + version, + }); + break; + } + + case "preview": { + await deployToPreview(client, { + team: teamId, + project: projectId, + commit, + version, + }); + break; + } + + default: { + throw new Error(`"target" must be one of: production, preview`); + } + } +} + +/** + * @param {Client} client + * @param {string} teamId + * @param {string} projectId + * @param {string} deploymentId + */ +async function waitForDeployment(client, teamId, projectId, deploymentId) { + const project = await client.project(teamId, projectId); + + const result = await project.waitForDeployment(deploymentId); + setOutput("vercel_preview_result", result.type); + setOutput("vercel_preview_url", result.deployment.url); + setOutput("vercel_preview_inspector_url", result.deployment.inspectorUrl); + + return result.deployment; +} + +/** + * @param {Client} client + * @param {string} teamId + * @param {string} projectId + */ +async function updateEnv(client, teamId, projectId) { + if (!commit && !version) { + throw new Error( + `one of "release_commit", "release_version" must be specified`, + ); + } + + await updateProjectEnv(client, { + team: teamId, + project: projectId, + commit, + version, + }); +} diff --git a/.github/actions/vercel/manual.mjs b/.github/actions/vercel/manual.mjs new file mode 100755 index 0000000..aebe273 --- /dev/null +++ b/.github/actions/vercel/manual.mjs @@ -0,0 +1,73 @@ +#!/usr/bin/env node + +// Convenience script for running `index.mjs` locally, +// passing in inputs as CLI args instead of env vars. + +// @ts-check + +// Manually run the deployment: +// +// # Redeploy `landing`: +// node manual.mjs \ +// --command deploy \ +// --token VERCEL_TOKEN \ +// --team rerun \ +// --project landing \ +// --target production \ +// --commit RELEASE_COMMIT \ +// --version RELEASE_VERSION +// +// # Deploy a preview of `landing` with a `RELEASE_COMMIT` override: +// node manual.mjs \ +// --command deploy \ +// --token VERCEL_TOKEN \ +// --team rerun \ +// --project landing \ +// --target preview \ +// --commit RELEASE_COMMIT +// +// # Only update env: +// node manual.mjs \ +// --command update-env \ +// --token VERCEL_TOKEN \ +// --team rerun \ +// --project landing \ +// --commit RELEASE_COMMIT \ +// --version RELEASE_VERSION +// + +import { execSync } from "node:child_process"; +import { parseArgs } from "node:util"; +import { fileURLToPath } from "node:url"; +import path from "node:path"; + +try { + const { command, token, team, project, target, commit, version } = parseArgs({ + options: { + command: { type: "string" }, + token: { type: "string" }, + team: { type: "string" }, + project: { type: "string" }, + target: { type: "string" }, + commit: { type: "string" }, + version: { type: "string" }, + }, + strict: true, + allowPositionals: false, + }).values; + + const env = { ...process.env, MANUAL_RUN: "true" }; + if (command) env["INPUT_COMMAND"] = command; + if (token) env["INPUT_VERCEL_TOKEN"] = token; + if (team) env["INPUT_VERCEL_TEAM_NAME"] = team; + if (project) env["INPUT_VERCEL_PROJECT_NAME"] = project; + if (target) env["INPUT_TARGET"] = target; + if (commit) env["INPUT_RELEASE_COMMIT"] = commit; + if (version) env["INPUT_RELEASE_VERSION"] = version; + + const cwd = path.dirname(fileURLToPath(import.meta.url)); + execSync("node index.mjs", { cwd, env, stdio: "inherit" }); +} catch (err) { + console.error(err.message); + process.exit(1); +} diff --git a/.github/actions/vercel/types.d.ts b/.github/actions/vercel/types.d.ts new file mode 100644 index 0000000..0a4f427 --- /dev/null +++ b/.github/actions/vercel/types.d.ts @@ -0,0 +1,124 @@ +export interface Deployment { + id: string; + deploymentId?: string; + url: string; + inspectorUrl: string; + name: string; + meta: Dictionary; + version: 2; + regions: string[]; + routes: Route[]; + builds?: Builder[]; + functions?: BuilderFunctions; + plan: string; + public: boolean; + ownerId: string; + readyState: + | "INITIALIZING" + | "ANALYZING" + | "BUILDING" + | "DEPLOYING" + | "READY" + | "QUEUED" + | "CANCELED" + | "ERROR"; + state?: + | "INITIALIZING" + | "ANALYZING" + | "BUILDING" + | "DEPLOYING" + | "READY" + | "QUEUED" + | "CANCELED" + | "ERROR"; + ready?: number; + createdAt: number; + createdIn: string; + buildingAt?: number; + creator?: { + uid?: string; + email?: string; + name?: string; + username?: string; + }; + env: Dictionary; + build: { + env: Dictionary; + }; + target: string; + alias: string[]; + aliasAssigned: boolean; + aliasError: string | null; + expiration?: number; + proposedExpiration?: number; + undeletedAt?: number; +} + +export interface DeploymentBuild { + id: string; + use: string; + createdIn: string; + deployedTo: string; + readyState: + | "INITIALIZING" + | "ANALYZING" + | "BUILDING" + | "DEPLOYING" + | "READY" + | "ERROR"; + state?: + | "INITIALIZING" + | "ANALYZING" + | "BUILDING" + | "DEPLOYING" + | "READY" + | "ERROR"; + readyStateAt: string; + path: string; +} + +export type LegacyDeployment = { + aliasAssigned?: number | boolean | null; + aliasError?: { + code: string; + message: string; + } | null; + buildingAt: number; + checksConclusion?: "succeeded" | "failed" | "skipped" | "canceled"; + checksState?: "registered" | "running" | "completed"; + created: number; + createdAt?: number; + creator: { + uid: string; + email?: string; + username?: string; + githubLogin?: string; + gitlabLogin?: string; + }; + inspectorUrl: string | null; + isRollbackCandidate?: boolean | null; + meta?: { [key: string]: string | undefined }; + name: string; + ready?: number; + source?: "cli" | "git" | "import" | "import/repo" | "clone/repo"; + state: + | "BUILDING" + | "ERROR" + | "INITIALIZING" + | "QUEUED" + | "READY" + | "CANCELED"; + target?: "production" | "staging" | null; + type: "LAMBDAS"; + uid: string; + url: string; +}; + +export type VercelApiError = { + error: { + code: string; + message: string; + }; +}; + +export type VercelResponse = T | VercelApiError; diff --git a/.github/actions/vercel/util.mjs b/.github/actions/vercel/util.mjs new file mode 100644 index 0000000..8e8a81f --- /dev/null +++ b/.github/actions/vercel/util.mjs @@ -0,0 +1,64 @@ +// @ts-check + +import { appendFileSync } from "fs"; +import os from "os"; + +/** + * Return a GitHub Actions input, returning `null` if it was not set. + * + * @param {string} name + * @returns {string | null} + */ +export function getInput(name) { + return process.env[`INPUT_${name.replace(/ /g, "_").toUpperCase()}`] ?? null; +} + +/** + * Return a GitHub Actions input, throwing an error if it was not set. + * + * @param {string} name + * @returns {string} + */ +export function getRequiredInput(name) { + const input = getInput(name); + if (!input) { + throw new Error(`missing required input \`${name}\``); + } + return input; +} + +/** + * Set a GitHub Actions output for other workflows steps to read. + * @param {string} key + * @param {string} value + */ +export function setOutput(key, value) { + const s = `${key}=${value}${os.EOL}`; + if (process.env["MANUAL_RUN"]) { + console.log(s); + return; + } + const outputFile = /** @type {string} */ (process.env["GITHUB_OUTPUT"]); + appendFileSync(outputFile, s); +} + +/** + * Assert that `value` is truthy, throwing an error if it is not. + * + * @param {any} value + * @param {string | (() => string)} [message] + * @returns {asserts value} + */ +export function assert(value, message) { + if (!value) { + let error; + if (typeof message === "string") { + error = `assertion failed: ${message}`; + } else if (typeof message === "function") { + error = `assertion failed: ${message()}`; + } else { + error = `assertion failed`; + } + throw new Error(error); + } +} diff --git a/.github/actions/vercel/vercel.mjs b/.github/actions/vercel/vercel.mjs new file mode 100644 index 0000000..37008b2 --- /dev/null +++ b/.github/actions/vercel/vercel.mjs @@ -0,0 +1,403 @@ +// @ts-check +import { assert } from "./util.mjs"; +/** @import { Deployment, DeploymentBuild, LegacyDeployment, VercelResponse } from "./types" */ + +/** + * @typedef {Record} Params + * @typedef {Record} Headers + * @typedef {object} Body + * + * @typedef {{ id: string; name: string }} TeamInfo + * @typedef {{ id: string; name: string }} ProjectInfo + * @typedef {{ id: string, key: string, value: string }} Env + * + * @typedef {"production" | "preview" | "development"} EnvTarget + * @typedef {"encrypted" | "secret"} EnvType + */ + +function isDeploymentReady( + /** @type {Deployment | DeploymentBuild} */ deployment, +) { + return deployment.readyState === "READY" || deployment.state === "READY"; +} + +function isDeploymentFailed( + /** @type {Deployment | DeploymentBuild} */ deployment, +) { + if ( + deployment?.readyState?.endsWith("_ERROR") || + deployment?.readyState === "ERROR" + ) { + return true; + } + if ( + (deployment.state && deployment.state.endsWith("_ERROR")) || + deployment.state === "ERROR" + ) { + return true; + } + return false; +} + +export function getDeploymentId( + /** @type {LegacyDeployment | Deployment | DeploymentBuild} */ deployment, +) { + if ("uid" in deployment) return deployment.uid; + if ("deploymentId" in deployment && deployment.deploymentId) + return deployment.deploymentId; + return deployment.id; +} + +export class Project { + constructor( + /** @type {Client} */ client, + /** @type {TeamInfo} */ team, + /** @type {ProjectInfo} */ project, + ) { + this.client = client; + this.team = team; + this.project = project; + } + + /** + * Return deployments under the current team and project. + * + * The endpoint used is a paginated one, but this call does not support pagination, + * and only returns the first 20 results. + * + * The results are sorted by their created date, so the latest deployment + * for the given `target` is at index `0`. + * @param {"production" | "preview" | "development"} target + * @returns {Promise} + */ + async deployments(target = "production") { + const response = await this.client.get("v6/deployments", { + teamId: this.team.id, + projectId: this.project.id, + target, + sort: "created", + }); + assert( + "deployments" in response, + () => `failed to get deployments: ${JSON.stringify(response)}`, + ); + return response.deployments; + } + + async latestProductionDeployment() { + console.log("get latest production deployment"); + const productionDeployments = await this.deployments("production"); + const latestProductionDeployment = productionDeployments[0]; + assert( + latestProductionDeployment, + `failed to get latest production deployment`, + ); + return latestProductionDeployment; + } + + /** + * Return environment variables available to the current team and project. + * + * @returns {Promise} + */ + async envs() { + const response = await this.client.get( + `v9/projects/${this.project.id}/env`, + { + teamId: this.team.id, + }, + ); + assert( + "envs" in response, + () => `failed to get environment variables: ${JSON.stringify(response)}`, + ); + return response.envs; + } + + /** + * Set an environment variable (`envId`), making it available to the current team and project. + * + * @param {string} key + * @param {string} value + * @param {EnvTarget[]} [target] + * @param {EnvType} [type] + * @returns {Promise} + */ + async setEnv( + key, + value, + target = ["production", "preview", "development"], + type = "encrypted", + ) { + console.log(`set env ${key}=${value} (target: ${target}, type: ${type})`); + const env = await this.envs().then((envs) => + envs.find((env) => env.key === key), + ); + assert(env); + return this.client.patch( + `v9/projects/${this.project.id}/env/${env.id}`, + { gitBranch: null, key, target, type, value }, + { teamId: this.team.id }, + ); + } + + /** + * Trigger a redeploy of an existing deployment (`deploymentId`) + * of a project (`name`) under a specific team (`teamId`). + * + * The resulting deployment will be set as the current production deployment. + * + * @param {string} deploymentId + * @param {string} name + * @returns {Promise} + */ + async redeploy(deploymentId, name) { + console.log(`redeploy ${name} (id: ${deploymentId})`); + return this.client.post( + `v13/deployments`, + { + deploymentId, + meta: { action: "redeploy" }, + name, + target: "production", + }, + { teamId: this.team.id, forceNew: "1" }, + ); + } + + /** + * Trigger a preview deploy using the files of an existing deployment (`deploymentId`). + * + * @param {string} deploymentId + * @param {string} name + * @param {Record} [env] + * @returns {Promise} + */ + async deployPreviewFrom(deploymentId, name, env) { + console.log( + `deploy preview from ${name} (id: ${deploymentId}) with env:`, + env, + ); + // `target` not being set means "preview" + const body = { + deploymentId, + meta: { action: "redeploy" }, + name, + }; + if (env) { + body.env = env; + body.build = { env }; + } + return this.client.post(`v13/deployments`, body, { + teamId: this.team.id, + forceNew: "1", + }); + } + + /** + * @returns {Promise>} + */ + async getDeployment(/** @type {string} */ id) { + return this.client.get(`v13/deployments/${id}`); + } + + /** + * + * @returns {Promise<{ type: "success" | "failure", deployment: Deployment }>} + */ + async waitForDeployment(/** @type {string} */ id) { + let deployment = await this.getDeployment(id); + while (true) { + if ("error" in deployment) { + throw new Error( + `deployment failed: ${JSON.stringify(deployment.error)}`, + ); + } + + if (isDeploymentFailed(deployment)) { + return { type: "failure", deployment }; + } + + if (isDeploymentReady(deployment)) { + return { type: "success", deployment }; + } + + await sleep(1000); + deployment = await this.getDeployment(getDeploymentId(deployment)); + } + } +} + +async function sleep(/** @type {number} */ ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +/** + * @typedef {{ + * limit: number, + * remaining: number, + * reset: number, + * }} RateLimit + */ + +/** @returns {RateLimit} */ +function parseRateLimit(/** @type {Response} */ response) { + return { + limit: parseInt(response.headers.get("X-RateLimit-Limit") || "0"), + remaining: parseInt(response.headers.get("X-RateLimit-Remaining") || "0"), + reset: parseInt(response.headers.get("X-RateLimit-Reset") || "0"), + }; +} + +function waitFor(/** @type {RateLimit} */ rateLimit) { + const remainingTime = rateLimit.reset * 1000 + 999 - Date.now(); + console.log(`rate limited by Vercel, retrying after ${remainingTime}ms`); + return sleep(remainingTime); +} + +/** + * Vercel API Client + */ +export class Client { + constructor(/** @type {string} */ token) { + this.token = token; + } + + /** + * Helper function to generate the URL for a given `endpoint` + * with query `params`. + * + * @param {string} endpoint + * @param {Params} [params] + * @returns {URL} + */ + url(endpoint, params) { + const u = new URL(endpoint, "https://api.vercel.com/"); + if (params) for (const key in params) u.searchParams.set(key, params[key]); + return u; + } + + /** + * HTTP GET an `endpoint` with query `params` and `headers`. + * + * @template T + * @param {string} endpoint - not the full URL, just the path, e.g. `v9/projects` + * @param {Params} [params] + * @param {Headers} [headers] + * @returns {Promise} + */ + async get(endpoint, params, headers) { + while (true) { + const url = this.url(endpoint, params); + const response = await fetch(url, { + method: "GET", + headers: { + Authorization: `Bearer ${this.token}`, + ...headers, + }, + }); + + const rateLimit = parseRateLimit(response); + if (rateLimit.remaining < 10) { + await waitFor(rateLimit); + continue; + } + + return response.json(); + } + } + + /** + * HTTP POST a `body` to an `endpoint` with query `params` and `headers`. + * + * @template T + * @param {string} endpoint - not the full URL, just the path, e.g. `v9/projects` + * @param {Body} body - will be JSON encoded + * @param {Params} [params] + * @param {Headers} [headers] + * @returns {Promise} + */ + async post(endpoint, body, params, headers) { + const url = this.url(endpoint, params); + return fetch(url, { + method: "POST", + headers: { + Authorization: `Bearer ${this.token}`, + "Content-Type": "application/json; charset=utf-8", + ...headers, + }, + body: JSON.stringify(body), + }).then((r) => r.json()); + } + + /** + * HTTP PATCH a `body` to an `endpoint` with query `params` and `headers`. + * + * @template T + * @param {string} endpoint - not the full URL, just the path, e.g. `v9/projects` + * @param {Body} body - will be JSON encoded + * @param {Params} [params] + * @param {Headers} [headers] + * @returns {Promise} + */ + async patch(endpoint, body, params, headers) { + const url = this.url(endpoint, params); + return fetch(url, { + method: "PATCH", + headers: { + Authorization: `Bearer ${this.token}`, + "Content-Type": "application/json; charset=utf-8", + ...headers, + }, + body: JSON.stringify(body), + }).then((r) => r.json()); + } + + /** + * Return all available teams for the user authorized by this client's token. + * + * @returns {Promise} + */ + async teams() { + const response = await this.get("v2/teams"); + assert( + "teams" in response, + () => `failed to get teams: ${JSON.stringify(response)}`, + ); + return response.teams; + } + + /** + * Return all available projects under a given team (`teamId`) + * for the user authorized by this client's token. + * + * @param {string} teamId + * @returns {Promise} + */ + async projects(teamId) { + const response = await this.get("v9/projects", { teamId }); + assert( + "projects" in response, + () => `failed to get projects: ${JSON.stringify(response)}`, + ); + return response.projects; + } + + /** + * + * @param {string} teamName + * @param {string} projectName + */ + async project(teamName, projectName) { + console.log(`get project ${teamName}/${projectName}`); + + const teams = await this.teams(); + const team = teams.find((team) => team.name === teamName); + assert(team); + const projects = await this.projects(team.id); + const project = projects.find((project) => project.name === projectName); + assert(project); + + return new Project(this, team, project); + } +} diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..72f6069 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,32 @@ + + +### Related + + + +### What + + diff --git a/.github/runs-on.yml b/.github/runs-on.yml new file mode 100644 index 0000000..2024263 --- /dev/null +++ b/.github/runs-on.yml @@ -0,0 +1,45 @@ +runners: + # We don't specify `ram` as it's almost never a bottleneck: + # Usually the ratio of cores to memory is 2-4x. + + arm64-ubuntu-large: + cpu: [16, 32] + family: ["c7g", "m7g"] + volume: 250gb + spot: price-capacity-optimized + image: ubuntu24-full-arm64 + + arm64-ubuntu-small: + cpu: [2, 4] + family: ["c7g", "m7g"] + volume: 250gb + spot: price-capacity-optimized + image: ubuntu24-full-arm64 + + x64-ubuntu-large: + cpu: [16, 32] + family: ["c7", "m7"] + volume: 250gb + spot: price-capacity-optimized + image: ubuntu24-full-x64 + + x64-ubuntu-small: + cpu: [2, 4] + family: ["c7", "m7"] + volume: 250gb + spot: price-capacity-optimized + image: ubuntu24-full-x64 + + x64-windows-large: + cpu: [16, 32] + family: ["c7", "m7"] + volume: 250gb + spot: price-capacity-optimized + image: windows25-full-x64 + + x64-windows-small: + cpu: [2, 4] + family: ["c7", "m7"] + volume: 250gb + spot: price-capacity-optimized + image: windows25-full-x64 diff --git a/.github/scripts/setup_sccache.sh b/.github/scripts/setup_sccache.sh new file mode 100755 index 0000000..6b63a12 --- /dev/null +++ b/.github/scripts/setup_sccache.sh @@ -0,0 +1,277 @@ +#!/usr/bin/env bash +set -euo pipefail + +MIRROR_BASE_URL="https://build.rerun.io/mirror/mozilla/sccache" + +usage() { + cat <<'EOF' +Install and configure sccache for CI. + +Usage: setup_sccache.sh --version VERSION [--backend auto|s3|gcs] [--gcs-bucket BUCKET] [--gcs-read-only [true|false]] +EOF +} + +version="" +backend="auto" +gcs_bucket="rerun-sccache" +gcs_read_only="false" + +while [[ $# -gt 0 ]]; do + case "$1" in + --version) + version="${2:?--version requires a value}" + shift 2 + ;; + --backend) + backend="${2:?--backend requires a value}" + shift 2 + ;; + --gcs-bucket) + gcs_bucket="${2:?--gcs-bucket requires a value}" + shift 2 + ;; + --gcs-read-only) + if [[ "${2:-}" == "true" || "${2:-}" == "false" ]]; then + gcs_read_only="$2" + shift 2 + else + gcs_read_only="true" + shift + fi + ;; + -h|--help) + usage + exit 0 + ;; + *) + echo "Unknown argument: $1" >&2 + usage >&2 + exit 2 + ;; + esac +done + +if [[ -z "$version" ]]; then + echo "--version is required" >&2 + usage >&2 + exit 2 +fi + +append_line() { + local path="$1" + local line="$2" + printf '%s\n' "$line" >> "$path" +} + +export_env() { + local name="$1" + local value="$2" + export "$name=$value" + append_line "${GITHUB_ENV:?GITHUB_ENV is required}" "$name=$value" +} + +runner_arch() { + local raw="${RUNNER_ARCH:-$(uname -m)}" + case "$raw" in + X64|x64|x86_64|AMD64|amd64) echo "x86_64" ;; + ARM64|arm64|aarch64) echo "aarch64" ;; + ARM|arm|armv7|armv7l) echo "armv7" ;; + *) echo "Unsupported architecture: $raw" >&2; exit 1 ;; + esac +} + +runner_platform() { + local raw="${RUNNER_OS:-$(uname -s)}" + case "$raw" in + Linux|linux) echo "unknown-linux-musl tar.gz sccache" ;; + macOS|Darwin|darwin) echo "apple-darwin tar.gz sccache" ;; + Windows|windows|MINGW*|MSYS*|CYGWIN*) echo "pc-windows-msvc zip sccache.exe" ;; + *) echo "Unsupported OS: $raw" >&2; exit 1 ;; + esac +} + +download() { + local url="$1" + local destination="$2" + local curl_args=(--fail --location --retry 4 --connect-timeout 30 --max-time 120) + if curl --help all 2>/dev/null | grep -q -- '--retry-all-errors'; then + curl_args+=(--retry-all-errors) + fi + echo "Downloading $url" >&2 + curl "${curl_args[@]}" --user-agent "rerun-setup-sccache" --output "$destination" "$url" +} + +sha1_file() { + local path="$1" + if command -v sha1sum >/dev/null 2>&1; then + sha1sum "$path" | awk '{print $1}' + elif command -v shasum >/dev/null 2>&1; then + shasum -a 1 "$path" | awk '{print $1}' + elif command -v openssl >/dev/null 2>&1; then + openssl sha1 "$path" | awk '{print $NF}' + else + echo "No SHA1 tool found" >&2 + exit 1 + fi +} + +verify_sha1() { + local archive="$1" + local sha1_path="$2" + local expected actual + expected="$(awk '{print $1}' "$sha1_path")" + # shellcheck disable=SC2218 # False positive: sha1_file is defined before verify_sha1 is called. + actual="$(sha1_file "$archive")" + actual="$(printf '%s' "$actual" | tr '[:upper:]' '[:lower:]')" + expected="$(printf '%s' "$expected" | tr '[:upper:]' '[:lower:]')" + # GNU checksum tools prefix hashes with `\` when paths contain backslashes. + # See also: https://unix.stackexchange.com/a/424629 + actual="${actual#\\}" + expected="${expected#\\}" + if [[ "$actual" != "$expected" ]]; then + echo "SHA1 mismatch for $(basename "$archive"): expected $expected, got $actual" >&2 + exit 1 + fi +} + +extract_archive() { + local archive="$1" + local destination="$2" + local extension="$3" + if [[ "$extension" == "zip" ]]; then + if command -v unzip >/dev/null 2>&1; then + unzip -q "$archive" -d "$destination" + elif command -v powershell.exe >/dev/null 2>&1; then + powershell.exe -NoProfile -Command "Expand-Archive -LiteralPath '$archive' -DestinationPath '$destination' -Force" + else + echo "No zip extraction tool found" >&2 + exit 1 + fi + else + tar -xzf "$archive" -C "$destination" + fi +} + +resolve_backend() { + if [[ "$backend" != "auto" ]]; then + echo "$backend" + elif [[ "${RUNNER_OS:-}" == "Linux" && -n "${RUNS_ON_S3_BUCKET_CACHE:-}" ]]; then + echo "s3" + else + echo "gcs" + fi +} + +write_config() { + local path="$1" + local resolved_backend="$2" + local rw_mode="READ_WRITE" + + if [[ "$gcs_read_only" == "true" ]]; then + rw_mode="READ_ONLY" + fi + + { + echo "server_startup_timeout_ms = 60000" + if [[ "$resolved_backend" == "gcs" ]]; then + cat < "$path" +} + +configure_backend() { + local resolved_backend="$1" + case "$resolved_backend" in + s3) + if [[ -z "${RUNS_ON_S3_BUCKET_CACHE:-}" ]]; then + echo "RUNS_ON_S3_BUCKET_CACHE is required for s3 backend" >&2 + exit 1 + fi + if [[ -z "${RUNS_ON_AWS_REGION:-}" ]]; then + echo "RUNS_ON_AWS_REGION is required for s3 backend" >&2 + exit 1 + fi + export_env "SCCACHE_BUCKET" "$RUNS_ON_S3_BUCKET_CACHE" + export_env "SCCACHE_REGION" "$RUNS_ON_AWS_REGION" + export_env "SCCACHE_S3_KEY_PREFIX" "cache/sccache" + ;; + gcs) + ;; + *) + echo "Unsupported backend: $resolved_backend" >&2 + exit 1 + ;; + esac + + write_config "${SCCACHE_CONF:?SCCACHE_CONF is required}" "$resolved_backend" +} + +start_server() { + local sccache_bin="$1" + for attempt in 1 2 3; do + echo "Starting sccache server (attempt $attempt/3)…" + if "$sccache_bin" --start-server; then + "$sccache_bin" --show-stats + return + fi + if [[ "$attempt" != "3" ]]; then + sleep $((attempt * 5)) + fi + done + echo "sccache --start-server failed after 3 attempts" >&2 + exit 1 +} + +install_sccache() { + local arch target_platform extension exe filename install_root archive sha1_path extract_dir bin_dir sccache_bin base_url + # shellcheck disable=SC2218 # False positive: runner_arch is defined before install_sccache is called. + arch="$(runner_arch)" + read -r target_platform extension exe <<< "$(runner_platform)" + filename="sccache-${version}-${arch}-${target_platform}.${extension}" + install_root="${RUNNER_TEMP:?RUNNER_TEMP is required}/sccache-${version}-${arch}-${target_platform}" + archive="$install_root/$filename" + sha1_path="$archive.sha1" + extract_dir="$install_root/extract" + bin_dir="$extract_dir/sccache-${version}-${arch}-${target_platform}" + sccache_bin="$bin_dir/$exe" + + mkdir -p "$install_root" "$extract_dir" + base_url="$MIRROR_BASE_URL/$version" + download "$base_url/$filename" "$archive" + download "$base_url/$filename.sha1" "$sha1_path" + verify_sha1 "$archive" "$sha1_path" + extract_archive "$archive" "$extract_dir" "$extension" + + if [[ ! -f "$sccache_bin" ]]; then + echo "Missing extracted sccache binary at $sccache_bin" >&2 + echo "Extracted files:" >&2 + find "$extract_dir" -print >&2 + exit 1 + fi + + append_line "${GITHUB_PATH:?GITHUB_PATH is required}" "$bin_dir" + echo "$sccache_bin" +} + +case "$backend" in + auto|s3|gcs) ;; + *) echo "Unsupported backend: $backend" >&2; exit 2 ;; +esac + +# shellcheck disable=SC2218 # False positive: resolve_backend is defined above. +resolved_backend="$(resolve_backend)" +sccache_bin="$(install_sccache)" + +export_env "SCCACHE_PATH" "$sccache_bin" +export_env "SCCACHE_GHA_ENABLED" "false" +export_env "RUSTC_WRAPPER" "sccache" +export_env "CARGO_INCREMENTAL" "0" +export_env "SCCACHE_CONF" "${RUNNER_TEMP:?RUNNER_TEMP is required}/sccache-config.toml" +configure_backend "$resolved_backend" +start_server "$sccache_bin" diff --git a/.github/workflows/README.md b/.github/workflows/README.md new file mode 100644 index 0000000..deb5a77 --- /dev/null +++ b/.github/workflows/README.md @@ -0,0 +1,16 @@ +# Overview + +Our CI workflows make heavy usage of [Reusable Workflows](https://docs.github.com/en/actions/using-workflows/reusing-workflows). These reusable workflows can then be tested manually via the `manual_dispatch.yml` workflow. +Or integrated into CI jobs such has `on_pull_request.yml` or `on_main.yml`. + +By convention: + +- All reusable workflows start with the `reusable_` prefix. +- All workflows that are triggered via `workflow_dispatch` start with the `manual_` prefix. +- All workflows that are triggered via an event start with the `on_` prefix. + - `on_pull_request` is triggered on pull requests. + - `on_push_main` is triggered on pushes to the main branch. + +If you are going to be doing any editing of workflows, the +[VS Code extension](https://marketplace.visualstudio.com/items?itemName=cschleiden.vscode-github-actions) +for GitHub Actions is highly recommended. diff --git a/.github/workflows/adhoc_wheels.yml b/.github/workflows/adhoc_wheels.yml new file mode 100644 index 0000000..5fd7c28 --- /dev/null +++ b/.github/workflows/adhoc_wheels.yml @@ -0,0 +1,122 @@ +name: Adhoc Wheels + +on: + workflow_dispatch: + inputs: + MODE: + type: choice + required: false + options: + - pypi + - pr + - extra + description: "The build mode (`pypi` includes the web viewer, `pr` does not)" + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "write" + id-token: "write" + deployments: "write" + packages: "read" + +jobs: + # ----------------------------------------------------------------------------------- + # Build rerun-cli (rerun binaries): + + build-rerun-cli-and-upload-linux-arm64: + name: "Linux-arm64: Build & Upload rerun-cli" + uses: ./.github/workflows/reusable_build_and_upload_rerun_cli.yml + with: + CONCURRENCY: adhoc-wheels-linux-arm64 + PLATFORM: linux-arm64 + secrets: inherit + + build-rerun-cli-and-upload-linux-x64: + name: "Linux-x64: Build & Upload rerun-cli" + uses: ./.github/workflows/reusable_build_and_upload_rerun_cli.yml + with: + CONCURRENCY: adhoc-wheels-linux-x64 + PLATFORM: linux-x64 + secrets: inherit + + build-rerun-cli-and-upload-macos-arm64: + name: "Mac-arm64: Build & Upload rerun-cli" + uses: ./.github/workflows/reusable_build_and_upload_rerun_cli.yml + with: + CONCURRENCY: adhoc-wheels-macos-arm64 + PLATFORM: macos-arm64 + secrets: inherit + + build-rerun-cli-and-upload-windows-x64: + name: "Windows-x64: Build & Upload rerun-cli" + uses: ./.github/workflows/reusable_build_and_upload_rerun_cli.yml + with: + CONCURRENCY: adhoc-wheels-windows-x64 + PLATFORM: windows-x64 + secrets: inherit + + # --------------------------------------------------------------------------- + # Build wheels: + + build-wheel-linux-arm64: + needs: [build-rerun-cli-and-upload-linux-arm64] + name: "Linux-arm64: Build & Upload Wheels" + uses: ./.github/workflows/reusable_build_and_upload_wheels.yml + with: + CONCURRENCY: adhoc-wheels-linux-arm64 + PLATFORM: linux-arm64 + WHEEL_ARTIFACT_NAME: linux-arm64-wheel + MODE: ${{ inputs.MODE }} + secrets: inherit + + build-wheel-linux-x64: + needs: [build-rerun-cli-and-upload-linux-x64] + name: "Linux-x64: Build & Upload Wheels" + uses: ./.github/workflows/reusable_build_and_upload_wheels.yml + with: + CONCURRENCY: adhoc-wheels-linux-x64 + PLATFORM: linux-x64 + WHEEL_ARTIFACT_NAME: linux-x64-wheel + MODE: ${{ inputs.MODE }} + secrets: inherit + + build-wheel-macos-arm64: + needs: [build-rerun-cli-and-upload-macos-arm64] + name: "Macos-arm64: Build & Upload Wheels" + uses: ./.github/workflows/reusable_build_and_upload_wheels.yml + with: + CONCURRENCY: adhoc-wheels-macos-arm64 + PLATFORM: macos-arm64 + WHEEL_ARTIFACT_NAME: macos-arm64-wheel + MODE: ${{ inputs.MODE }} + secrets: inherit + + build-wheel-windows-x64: + needs: [build-rerun-cli-and-upload-windows-x64] + name: "Windows-x64: Build & Upload Wheels" + uses: ./.github/workflows/reusable_build_and_upload_wheels.yml + with: + CONCURRENCY: adhoc-wheels-windows-x64 + PLATFORM: windows-x64 + WHEEL_ARTIFACT_NAME: windows-x64-wheel + MODE: "pypi" + secrets: inherit + + # -------------------------------------------------------------------------- + + generate-pip-index: + name: "Generate Pip Index" + needs: + [ + build-wheel-linux-arm64, + build-wheel-linux-x64, + build-wheel-macos-arm64, + build-wheel-windows-x64, + ] + uses: ./.github/workflows/reusable_pip_index.yml + with: + CONCURRENCY: adhoc-wheels + secrets: inherit diff --git a/.github/workflows/auto_approve.yml b/.github/workflows/auto_approve.yml new file mode 100644 index 0000000..789000c --- /dev/null +++ b/.github/workflows/auto_approve.yml @@ -0,0 +1,41 @@ +name: "Approve Workflow Runs" + +on: + pull_request_target: + issue_comment: + types: [created, edited] + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + actions: "write" + +jobs: + approve-workflow-runs: + name: "Check for approval" + runs-on: ubuntu-latest + if: | + github.event.pull_request.head.repo.owner.login != 'rerun-io' && + (github.event_name == 'pull_request_target' || github.event.issue.pull_request) + steps: + - name: Checkout + uses: actions/checkout@v4 + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Wait a few seconds + run: | + # Give GitHub a bit of time to synchronize everything + sleep 5s + + - name: Approve workflow runs + run: | + pixi run python scripts/ci/approve_workflow_runs.py \ + --github-token "${{ secrets.GITHUB_TOKEN }}" \ + --github-repository "rerun-io/rerun" \ + --pr-number "${{ github.event.pull_request.number || github.event.issue.number }}" diff --git a/.github/workflows/auto_docs.yml b/.github/workflows/auto_docs.yml new file mode 100644 index 0000000..b29e92d --- /dev/null +++ b/.github/workflows/auto_docs.yml @@ -0,0 +1,69 @@ +name: Docs deploy + +on: + push: + branches: [main] + +permissions: + contents: "read" + id-token: "write" + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +# The lack of `concurrency` is intentional. +# We want this job to run on every commit, even if multiple are merged in a row. + +jobs: + has-label: + name: Check for PR label + runs-on: ubuntu-latest + outputs: + result: ${{ steps.find-pr.outputs.result }} + steps: + - uses: actions/checkout@v3 + with: + # ref - not set, because we want to end up on the merge commit + fetch-depth: 0 # don't perform a shallow clone + + # Find the PR by the number in the merge commit subject line + - name: Find PR + id: find-pr + env: + GH_TOKEN: ${{ secrets.RERUN_BOT_TOKEN }} + run: | + commit_message=$(git log --pretty=format:%s -n 1 ${{ github.sha }}) + pr_number=$(python3 scripts/ci/parse_pr_number.py "$commit_message" 2>/dev/null || true) + + # Exported commits don't have PR numbers - skip them + if [ -z "$pr_number" ]; then + echo "No PR number found in commit message, skipping" + echo "result=false" >> $GITHUB_OUTPUT + exit 0 + fi + + result=$(gh pr view $pr_number --json labels | jq -r 'any(.labels[].name; . == "deploy docs")') + echo "result=$result" >> $GITHUB_OUTPUT + + cherry-pick: + name: Cherry-pick to docs-latest + needs: [has-label] + if: needs.has-label.outputs.result == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + token: ${{ secrets.RERUN_BOT_TOKEN }} + + - name: Cherry-pick + run: | + # Setup git user + git config --global user.name "rerun-bot" + git config --global user.email "bot@rerun.io" + + # Cherry-pick the commit + git checkout docs-latest + git cherry-pick ${{ github.sha }} + git push origin docs-latest diff --git a/.github/workflows/auto_docs_check.yml b/.github/workflows/auto_docs_check.yml new file mode 100644 index 0000000..14efdac --- /dev/null +++ b/.github/workflows/auto_docs_check.yml @@ -0,0 +1,83 @@ +name: Docs deploy pre-check + +on: + pull_request: + types: + - opened + - synchronize + - reopened + - labeled + - unlabeled + +permissions: + contents: "read" + id-token: "write" + pull-requests: "write" + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +concurrency: + group: pr-${{ github.event.pull_request.number }}-auto-docs-check + cancel-in-progress: true + +jobs: + check-cherry-pick: + name: Check if merge commit can be cherry-picked + runs-on: ubuntu-latest + if: github.event.pull_request.head.repo.owner.login == 'rerun-io' && contains(github.event.pull_request.labels.*.name, 'deploy docs') + steps: + - uses: actions/checkout@v3 + with: + # ref - not set, because we want to end up on the merge commit + fetch-depth: 0 # don't perform a shallow clone + + - name: Try cherry-pick + env: + GH_TOKEN: ${{ secrets.RERUN_BOT_TOKEN }} + run: | + # Setup git user + git config --global user.name "rerun-bot" + git config --global user.email "bot@rerun.io" + + git fetch origin main + git checkout main + git merge --squash origin/${{ github.event.pull_request.head.ref }} + git commit -m "${{ github.event.pull_request.head.title }} (#${{ github.event.pull_request.number }})" + commit=$(git rev-parse HEAD) + git checkout docs-latest + + if git cherry-pick $commit; then + echo "Cherry-pick successful" + exit 0 + else + echo "Cherry-pick failed" + printf $(git diff) + exit 1 + fi + + - name: Add success comment + # https://github.com/mshick/add-pr-comment + uses: mshick/add-pr-comment@v3.9.1 + # GitHub API is very unreliable. We don't want to fail the entire workflow just because we couldn't post a comment on success. + continue-on-error: true + if: success() + with: + message-id: "cherry-pick-check" + repo-token: ${{ secrets.GITHUB_TOKEN }} + message: | + Your changes can be cherry-picked to `docs-latest` and will be deployed + immediately after merging. + + - name: Add failure comment + # https://github.com/mshick/add-pr-comment + uses: mshick/add-pr-comment@v3.9.1 + if: failure() + with: + message-id: "cherry-pick-check" + repo-token: ${{ secrets.GITHUB_TOKEN }} + message: | + Your changes cannot be automatically cherry-picked to `docs-latest`. + + You should remove the `deploy docs` label and perform the cherry-pick manually after merging. diff --git a/.github/workflows/cargo_shear.yml b/.github/workflows/cargo_shear.yml new file mode 100644 index 0000000..8b0f5d5 --- /dev/null +++ b/.github/workflows/cargo_shear.yml @@ -0,0 +1,35 @@ +name: Cargo Shear + +on: + push: + branches: + - "main" + pull_request: + types: [opened, synchronize] + +jobs: + cargo-shear: + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Rust + uses: dtolnay/rust-toolchain@stable + + # The snippets crate has a build.rs that generates src/snippets/*.rs from all/*/*.rs. + # Without this step, cargo-shear can't deduce requirements from the generated code. + - name: Regenerate snippets + run: | + cargo check -p snippets + + - name: Install Cargo Shear + uses: taiki-e/install-action@v2.48.7 + with: + tool: cargo-shear@1.11.2 + + # TODO(Boshen/cargo-shear#468): enable warnings as errors once we can ignore no (doc) test warnings. + - name: Run Cargo Shear + run: | + cargo shear diff --git a/.github/workflows/checkboxes.yml b/.github/workflows/checkboxes.yml new file mode 100644 index 0000000..42cb877 --- /dev/null +++ b/.github/workflows/checkboxes.yml @@ -0,0 +1,42 @@ +# Checks that all checkboxes in a PR are checked + +name: Pull Request Checkboxes + +on: + pull_request_target: + types: + - opened + - synchronize + - reopened + - edited + +concurrency: + group: ${{ github.event.pull_request.number }}-pr-checkboxes + cancel-in-progress: true + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + pull-requests: "read" + +jobs: + pr-checkboxes: + name: Check PR checkboxes + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Check PR checkboxes + run: | + pixi run ./scripts/ci/check_pr_checkboxes.py \ + --github-token ${{ secrets.GITHUB_TOKEN }} \ + --github-repository ${{ github.repository }} \ + --pr-number ${{ github.event.pull_request.number }} diff --git a/.github/workflows/clear_cache.yml b/.github/workflows/clear_cache.yml new file mode 100644 index 0000000..fa081e7 --- /dev/null +++ b/.github/workflows/clear_cache.yml @@ -0,0 +1,61 @@ +name: Clear cache + +on: + workflow_dispatch: + +permissions: + actions: write + +jobs: + clear-cache: + runs-on: ubuntu-latest + steps: + - name: Clear cache + uses: actions/github-script@v6 + with: + script: | + const opts = { + owner: context.repo.owner, + repo: context.repo.repo, + }; + + const cache_list = await github.rest.actions.getActionsCacheList({ + per_page: 1, + ...opts, + }); + const per_page = 100; + const pages = Math.ceil(cache_list.data.total_count / per_page); + + const total_count = cache_list.data.total_count; + let deleted = 0; + const _id = setInterval(() => { + console.log(`${deleted}/${total_count}`); + }, 500); + + let promises = []; + for (let page = 1; page <= pages; page++) { + const cache_page = await github.rest.actions.getActionsCacheList({ + per_page, + page, + ...opts, + }); + for (const cache of cache_page.data.actions_caches) { + promises.push( + github.rest.actions + .deleteActionsCacheById({ + cache_id: cache.id, + ...opts, + }) + .then(() => (deleted += 1)) + ); + } + await Promise.all(promises); + promises = []; + + // wait 60 seconds every 4 pages (secondary rate limit) + if (page % 4 === 0) { + await new Promise(f => setTimeout(f, 60_000)); + } + } + + clearInterval(_id); diff --git a/.github/workflows/contrib_checks.yml b/.github/workflows/contrib_checks.yml new file mode 100644 index 0000000..4e09708 --- /dev/null +++ b/.github/workflows/contrib_checks.yml @@ -0,0 +1,284 @@ +name: "Checks: Lints, Tests, Docs" + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + PR_NUMBER: + required: false + type: string + default: "" + +concurrency: + group: ${{ inputs.CONCURRENCY }}-checks + cancel-in-progress: true + +env: + PYTHON_VERSION: "3.10" + + RUSTFLAGS: --deny warnings + RUSTDOCFLAGS: --deny warnings + + # Do *not* use sscache since on contributor ci we don't have access to the gcloud stored cache. + #RUSTC_WRAPPER: "sccache" + + # Not only `sccache` cannot cache incremental builds, it's counter-productive to generate all + # these incremental artifacts when running on CI. + CARGO_INCREMENTAL: "0" + + # Sourced from https://vulkan.lunarg.com/sdk/home#linux + VULKAN_SDK_VERSION: "1.3.290.0" + + # ANSI color codes should be supported by default on GitHub Actions. + CARGO_TERM_COLOR: always + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + +jobs: + py-lints: + name: Python lints (ruff, mypy, …) + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Python format check + run: pixi run py-fmt-check + + - name: Lint Python + run: pixi run py-lint + + - name: Notebook strip check + run: pixi run nb-strip-check + + py-test-docs: + name: Test Python Docs + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Build via mkdocs + run: | + pixi run uv run --group docs mkdocs build --strict -f rerun_py/mkdocs.yml + + no-codegen-changes: + name: Check if running codegen would produce any changes + timeout-minutes: 60 + runs-on: ubuntu-latest-16-cores + steps: + # Note: We explicitly don't override `ref` here. We need to see if changes would be made + # in a context where we have merged with main. Otherwise we might miss changes such as one + # PR introduces a new type and another PR changes the codegen. + - uses: actions/checkout@v4 + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Codegen check + run: pixi run codegen --force --check --warnings-as-errors + + - name: Codegen out-of-sync (protos) + run: pixi run codegen-protos-check + + rs-lints: + name: Rust lints (fmt, check, clippy, tests, doc) + timeout-minutes: 60 + runs-on: ubuntu-latest-16-cores + steps: + - uses: actions/checkout@v4 + with: + lfs: true + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + # Install the Vulkan SDK, so we can use the software rasterizer. + # TODO(andreas): It would be nice if `setup_software_rasterizer.py` could do that for us as well (note though that this action here is very fast when cached!) + - name: Install Vulkan SDK + uses: rerun-io/install-vulkan-sdk-action@v1.1.0 + with: + vulkan_version: ${{ env.VULKAN_SDK_VERSION }} + install_runtime: true + cache: true + stripdown: true + + - name: Setup software rasterizer + run: pixi run python ./scripts/ci/setup_software_rasterizer.py + + # Recommended way to install nextest on CI. + - name: Install latest nextest release + uses: taiki-e/install-action@v2.48.7 + with: + tool: nextest@0.9.89 + + - name: Rust checks & tests + run: pixi run rs-check --skip individual_crates docs_slow + + - name: Upload test results + uses: actions/upload-artifact@v4 + if: always() + with: + name: test-results-linux + path: | + **/tests/snapshots + **/tests/failures + + rerun-lints: + name: Rerun lints + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Rerun lints + run: pixi run lint-rerun + + toml-format-check: + name: Toml format check + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Toml format check + run: pixi run toml-fmt-check + + check-too-large-files: + name: Check for too large files + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Check for too large files + run: pixi run check-large-files + + check-example-thumbnails: + name: Check example thumbnails + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Check example thumbnails + run: pixi run uvpy ./scripts/ci/thumbnails.py check + + check-doc-order: + name: Check docs order + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Check docs order + run: pixi run uvpy ./scripts/ci/check_doc_order.py + + check-no-d2-code-blocks: + name: Check for D2 code blocks + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Check for D2 code blocks + run: pixi run uvpy ./scripts/ci/check_d2_diagrams.py + + spell-check: + name: Spell Check + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - name: Checkout Actions Repository + uses: actions/checkout@v4 + + - name: Check spelling of entire workspace + uses: crate-ci/typos@v1.45.1 + + cpp-formatting: + name: C++ formatting check + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + environments: cpp + + - name: Run clang format on all relevant files + run: pixi run -e cpp cpp-fmt-check + + cpp-tests: + name: C++ tests + timeout-minutes: 60 + runs-on: ubuntu-latest-16-cores + steps: + - uses: actions/checkout@v4 + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + environments: cpp + + # TODO(emilk): make this work somehow. Right now this just results in + # > Compiler: GNU 12.3.0 (/__w/rerun/rerun/.pixi/env/bin/x86_64-conda-linux-gnu-c++) + # 😭 + # - name: Build and run C++ tests with clang++ + # run: | + # pixi run -e cpp cpp-clean + # RERUN_WERROR=ON RERUN_USE_ASAN=ON CXX=clang++ pixi run -e cpp cpp-build-all + # RERUN_WERROR=ON RERUN_USE_ASAN=ON CXX=clang++ pixi run -e cpp cpp-test + + - name: Build and run C++ tests with g++ + run: | + pixi run -e cpp cpp-clean + RERUN_WERROR=ON RERUN_USE_ASAN=ON LSAN_OPTIONS=suppressions=.github/workflows/lsan_suppressions.supp CXX=g++ pixi run -e cpp cpp-build-all + RERUN_WERROR=ON RERUN_USE_ASAN=ON LSAN_OPTIONS=suppressions=.github/workflows/lsan_suppressions.supp CXX=g++ pixi run -e cpp cpp-test diff --git a/.github/workflows/contrib_rerun_py.yml b/.github/workflows/contrib_rerun_py.yml new file mode 100644 index 0000000..1492981 --- /dev/null +++ b/.github/workflows/contrib_rerun_py.yml @@ -0,0 +1,86 @@ +name: Reusable Build and Test Wheels (contrib) + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + MATURIN_FEATURE_FLAGS: + required: false + type: string + default: "--no-default-features --features pypi" + +concurrency: + group: ${{ inputs.CONCURRENCY }}-build-wheels + cancel-in-progress: true + +env: + PYTHON_VERSION: "3.10" + + RUSTFLAGS: --deny warnings + RUSTDOCFLAGS: --deny warnings + + # Do *not* use sscache since on contributor ci we don't have access to the gcloud stored cache. + #RUSTC_WRAPPER: "sccache" + + # Not only `sccache` cannot cache incremental builds, it's counter-productive to generate all + # these incremental artifacts when running on CI. + CARGO_INCREMENTAL: "0" + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + packages: "read" + +jobs: + build-wheels: + name: Build Wheels + runs-on: ubuntu-latest-16-cores + timeout-minutes: 60 + container: + image: ghcr.io/rerun-io/ci_docker:0.18.0 + credentials: + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + steps: + - uses: actions/checkout@v4 + with: + lfs: true + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Build rerun-cli + run: | + pixi run rerun-build-native-and-web-release + + - name: Copy rerun-cli to wheel folder + run: | + cp target/release/rerun rerun_py/rerun_sdk/rerun_cli + + - name: Build the wheel + run: | + pixi run uvpy scripts/ci/build_and_upload_wheels.py \ + --mode pr \ + --target x86_64-unknown-linux-gnu \ + --dir unused \ + --compat manylinux_2_28 + + - name: Install built wheel + run: | + pixi run python scripts/ci/uv_install_wheel.py --package rerun-sdk --dir dist/x86_64-unknown-linux-gnu + + - name: Run e2e test + run: RUST_LOG=debug pixi run uvpy scripts/run_python_e2e_test.py --no-build # rerun-sdk is already built and installed + + - name: Run docs/snippets/compare_snippet_output.py + # --release so we can inherit from some of the artifacts that maturin has just built before + # --target x86_64-unknown-linux-gnu because otherwise cargo loses the target cache… even though this is the target anyhow… + # --no-py-build because rerun-sdk is already built and installed + run: | + RUST_LOG=debug pixi run uvpy docs/snippets/compare_snippet_output.py --release --target x86_64-unknown-linux-gnu --no-py-build diff --git a/.github/workflows/cpp_matrix_full.json b/.github/workflows/cpp_matrix_full.json new file mode 100644 index 0000000..b8bdb2e --- /dev/null +++ b/.github/workflows/cpp_matrix_full.json @@ -0,0 +1,40 @@ +{ + "include": [ + { + "name": "Linux x64, C++17", + "runs_on": "ubuntu-latest-16-cores", + "cache_key": "cpp-linux-cpp17", + "extra_env_vars": "RERUN_USE_ASAN=1 RERUN_SET_CXX_VERSION=17 LSAN_OPTIONS=suppressions=.github/workflows/lsan_suppressions.supp", + "additional_commands": "pixi run -e cpp cpp-docs", + "pr_ci": true + }, + { + "name": "Linux x64, C++20 (skipped on PRs)", + "runs_on": "ubuntu-latest-16-cores", + "cache_key": "cpp-linux-cpp20", + "extra_env_vars": "RERUN_USE_ASAN=1 RERUN_SET_CXX_VERSION=20 LSAN_OPTIONS=suppressions=.github/workflows/lsan_suppressions.supp", + "pr_ci": false + }, + { + "name": "Windows x64, C++17", + "runs_on": "windows-latest-8-cores", + "cache_key": "cpp-windows-cpp17", + "extra_env_vars": "RERUN_SET_CXX_VERSION=17", + "pr_ci": true + }, + { + "name": "Windows x64, C++20 (skipped on PRs)", + "runs_on": "windows-latest-8-cores", + "cache_key": "cpp-windows-cpp20", + "extra_env_vars": "RERUN_SET_CXX_VERSION=20", + "pr_ci": false + }, + { + "name": "Mac aarch64", + "runs_on": "macos-26-xlarge", + "cache_key": "cpp-macos-arm64", + "extra_env_vars": "", + "pr_ci": true + } + ] +} \ No newline at end of file diff --git a/.github/workflows/enforce_branch_name.yml b/.github/workflows/enforce_branch_name.yml new file mode 100644 index 0000000..44e2acf --- /dev/null +++ b/.github/workflows/enforce_branch_name.yml @@ -0,0 +1,42 @@ +name: PR Branch Name Check + +on: + pull_request_target: + types: [opened, reopened, synchronize] + +permissions: + issues: write + +jobs: + check-source-branch: + runs-on: ubuntu-latest + steps: + - name: Check PR source branch + env: + IS_FORK: ${{ github.event.pull_request.head.repo.fork }} + HEAD_REF: ${{ github.event.pull_request.head.ref }} + run: | + # Check if PR is from a fork + if [[ "$IS_FORK" == "true" ]]; then + # Check if PR is from the master/main branch of a fork + if [[ "$HEAD_REF" == "master" || "$HEAD_REF" == "main" ]]; then + echo "ERROR: Pull requests from the master/main branch of forks are not allowed, because it prevents maintainers from contributing to your PR" + echo "Please create a feature branch in your fork and submit the PR from that branch instead." + exit 1 + fi + fi + + - name: Leave comment if PR is from master/main branch of fork d + if: ${{ failure() }} + uses: actions/github-script@v7 + # GitHub API is very unreliable. We don't want to fail the entire workflow just because we couldn't post a comment. + continue-on-error: true + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: '⚠️ **ERROR:** Pull requests from the `master`/`main` branch of forks are not allowed, because it prevents maintainers from contributing to your PR. Please create a feature branch in your fork and submit the PR from that branch instead.' + }) diff --git a/.github/workflows/first_time_contrib.yml b/.github/workflows/first_time_contrib.yml new file mode 100644 index 0000000..5a46efd --- /dev/null +++ b/.github/workflows/first_time_contrib.yml @@ -0,0 +1,22 @@ +name: First time contributors + +on: + pull_request_target: + +permissions: + contents: "write" + id-token: "write" + pull-requests: "write" + +jobs: + comment: + name: Comment on PRs + runs-on: ubuntu-latest + steps: + - uses: actions/first-interaction@v1.3.0 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + pr-message: | + Hi! Thanks for opening this pull request. + + Because this is your first time contributing to this repository, make sure you've read our [Contributor Guide](https://github.com/rerun-io/rerun/blob/main/CONTRIBUTING.md) and [Code of Conduct](https://github.com/rerun-io/rerun/blob/main/CODE_OF_CONDUCT.md). diff --git a/.github/workflows/labels.yml b/.github/workflows/labels.yml new file mode 100644 index 0000000..ceb9893 --- /dev/null +++ b/.github/workflows/labels.yml @@ -0,0 +1,83 @@ +# https://github.com/marketplace/actions/require-labels +# Check for existence of labels +# See all our labels at https://github.com/rerun-io/rerun/issues/labels + +name: Pull Request Labels + +on: + pull_request_target: + types: + - opened + - synchronize + - reopened + - labeled + - unlabeled + +# No permissions needed here +# permissions: + +jobs: + label: + runs-on: ubuntu-latest + steps: + - name: Check for a "do-not-merge" label + uses: mheap/github-action-required-labels@v3 + with: + mode: exactly + count: 0 + labels: "do-not-merge" + + - name: Require label "include in changelog" or "exclude from changelog" + uses: mheap/github-action-required-labels@v3 + with: + mode: minimum + count: 1 + labels: "exclude from changelog, include in changelog" + + - name: Require at least one label + uses: mheap/github-action-required-labels@v3 + with: + mode: minimum + count: 1 + #NOLINT_START: skip lint rules on labels (dataplatform) + labels: "📊 analytics, 🟦 blueprint, 🪳 bug, CLI, codegen/idl, 🧑‍💻 dev experience, dependencies, 📖 documentation, 💬 discussion, examples, exclude from changelog, 🪵 Log & send APIs, 📉 performance, sdk-python, sdk-cpp, sdk-rust, ⛃ re_datastore, 🔍 re_query, 📺 re_viewer, 🔺 re_renderer, 🚜 refactor, ⛴ release, 🔨 testing, ui, 🕸️ web, 🧢 MCAP, OSS-server, dataplatform" + #NOLINT_END + + wasm-bindgen-check: + name: Check wasm-bindgen version + if: ${{ github.event_name == 'pull_request' }} + runs-on: ubuntu-latest + continue-on-error: true + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Get current wasm-bindgen version + id: current-version + run: | + version=$(pixi run taplo get -f crates/viewer/re_viewer/Cargo.toml "target.*.dependencies.wasm-bindgen") + echo "current_version=$version" >> $GITHUB_OUTPUT + + - name: Get previous wasm-bindgen version + id: previous-version + run: | + prev_ref=$(git rev-parse --abbrev-ref HEAD) + git checkout main + + version=$(pixi run taplo get -f crates/viewer/re_viewer/Cargo.toml "target.*.dependencies.wasm-bindgen") + echo "previous_version=$version" >> $GITHUB_OUTPUT + + git checkout $prev_ref + + - name: Require label if versions changed + if: ${{ steps.current-version.outputs.current_version != steps.previous-version.outputs.previous_version }} + uses: mheap/github-action-required-labels@v3 + with: + mode: exactly + count: 1 + labels: "wasm-bindgen version update" diff --git a/.github/workflows/lsan_suppressions.supp b/.github/workflows/lsan_suppressions.supp new file mode 100644 index 0000000..41134dd --- /dev/null +++ b/.github/workflows/lsan_suppressions.supp @@ -0,0 +1 @@ +leak:null_arrow_array diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml new file mode 100644 index 0000000..47a1e5d --- /dev/null +++ b/.github/workflows/nightly.yml @@ -0,0 +1,440 @@ +name: Nightly + +on: + workflow_dispatch: + schedule: + # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule + # 3am UTC, so 4am-5am CET and evening in east time, basically after everyone's day. + - cron: "15 3 * * *" + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "write" + id-token: "write" + deployments: "write" + # This is needed since the web viewer build has this permission in order to write comments in PRs + # (not needed for nightly, but the permission is still active). + pull-requests: "write" + packages: "read" + +jobs: + checks: + name: Checks + uses: ./.github/workflows/reusable_checks.yml + with: + CONCURRENCY: nightly + CHANNEL: nightly + secrets: inherit + + checks-cpp: + name: Checks + uses: ./.github/workflows/reusable_checks_cpp.yml + with: + CONCURRENCY: nightly + CHANNEL: nightly + secrets: inherit + + checks-rust: + name: Checks + uses: ./.github/workflows/reusable_checks_rust.yml + with: + CONCURRENCY: nightly + CHANNEL: nightly + secrets: inherit + + checks-python: + name: Checks + uses: ./.github/workflows/reusable_checks_python.yml + with: + CONCURRENCY: nightly + secrets: inherit + + # Check that a CLEAN container with just `cargo` on it can build rerun: + clean-build: + timeout-minutes: 60 + name: cargo build on clean container + strategy: + matrix: + runs_on: + [ubuntu-latest-16-cores, macos-26-xlarge, windows-latest-8-cores] + runs-on: ${{ matrix.runs_on }} + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + with: + toolchain: 1.92.0 + + - run: cargo build -p rerun # Intentionally NOT using pixi, because we wanna check that we can build outside of pixi + + build-web: + name: "Build web viewer" + uses: ./.github/workflows/reusable_build_web.yml + with: + CONCURRENCY: nightly + CHANNEL: nightly + secrets: inherit + + upload-web: + name: "Upload Web" + needs: [build-web] + uses: ./.github/workflows/reusable_upload_web.yml + with: + CONCURRENCY: nightly + NIGHTLY: true + secrets: inherit + + build-js: + name: "Build JS" + uses: ./.github/workflows/reusable_build_js.yml + with: + CONCURRENCY: nightly + secrets: inherit + + upload-js: + name: "Upload JS" + needs: [build-js] + uses: ./.github/workflows/reusable_upload_js.yml + with: + CONCURRENCY: nightly + NIGHTLY: true + secrets: inherit + + # ----------------------------------------------------------------------------------- + # Build rerun_c library binaries: + + build-rerun_c-and-upload-linux-arm64: + needs: [checks] + name: "Linux-Arm64: Build & Upload rerun_c" + uses: ./.github/workflows/reusable_build_and_upload_rerun_c.yml + with: + CONCURRENCY: nightly-linux-arm64 + PLATFORM: linux-arm64 + secrets: inherit + + build-rerun_c-and-upload-linux-x64: + needs: [checks] + name: "Linux-x64: Build & Upload rerun_c" + uses: ./.github/workflows/reusable_build_and_upload_rerun_c.yml + with: + CONCURRENCY: nightly-linux-x64 + PLATFORM: linux-x64 + secrets: inherit + + build-rerun_c-and-upload-macos-arm64: + needs: [checks] + name: "Mac-Arm64: Build & Upload rerun_c" + uses: ./.github/workflows/reusable_build_and_upload_rerun_c.yml + with: + CONCURRENCY: nightly-macos-arm64 + PLATFORM: macos-arm64 + secrets: inherit + + build-rerun_c-and-upload-windows-x64: + needs: [checks] + name: "Windows-x64: Build & Upload rerun_c" + uses: ./.github/workflows/reusable_build_and_upload_rerun_c.yml + with: + CONCURRENCY: nightly-windows-x64 + PLATFORM: windows-x64 + secrets: inherit + + # ----------------------------------------------------------------------------------- + # Build rerun-cli (rerun binaries): + + build-rerun-cli-and-upload-linux-arm64: + needs: [checks] + name: "Linux-arm64: Build & Upload rerun-cli" + uses: ./.github/workflows/reusable_build_and_upload_rerun_cli.yml + with: + CONCURRENCY: nightly-linux-arm64 + PLATFORM: linux-arm64 + secrets: inherit + + build-rerun-cli-and-upload-linux-x64: + needs: [checks] + name: "Linux-x64: Build & Upload rerun-cli" + uses: ./.github/workflows/reusable_build_and_upload_rerun_cli.yml + with: + CONCURRENCY: nightly-linux-x64 + PLATFORM: linux-x64 + secrets: inherit + + build-rerun-cli-and-upload-macos-arm64: + needs: [checks] + name: "Mac-arm64: Build & Upload rerun-cli" + uses: ./.github/workflows/reusable_build_and_upload_rerun_cli.yml + with: + CONCURRENCY: nightly-macos-arm64 + PLATFORM: macos-arm64 + secrets: inherit + + build-rerun-cli-and-upload-windows-x64: + needs: [checks] + name: "Windows-x64: Build & Upload rerun-cli" + uses: ./.github/workflows/reusable_build_and_upload_rerun_cli.yml + with: + CONCURRENCY: nightly-windows-x64 + PLATFORM: windows-x64 + secrets: inherit + + # --------------------------------------------------------------------------- + # Build wheels: + + build-wheel-linux-arm64: + needs: [checks, build-rerun-cli-and-upload-linux-arm64] + name: "Linux-arm64: Build & Upload Wheels" + uses: ./.github/workflows/reusable_build_and_upload_wheels.yml + with: + CONCURRENCY: nightly-linux-arm64 + PLATFORM: linux-arm64 + WHEEL_ARTIFACT_NAME: linux-arm64-wheel + MODE: "pypi" + secrets: inherit + + build-wheel-linux-x64: + needs: [checks, build-rerun-cli-and-upload-linux-x64] + name: "Linux-x64: Build & Upload Wheels" + uses: ./.github/workflows/reusable_build_and_upload_wheels.yml + with: + CONCURRENCY: nightly-linux-x64 + PLATFORM: linux-x64 + WHEEL_ARTIFACT_NAME: linux-x64-wheel + MODE: "pypi" + secrets: inherit + + build-wheel-macos-arm64: + needs: [checks, build-rerun-cli-and-upload-macos-arm64] + name: "Macos-arm64: Build & Upload Wheels" + uses: ./.github/workflows/reusable_build_and_upload_wheels.yml + with: + CONCURRENCY: nightly-macos-arm64 + PLATFORM: macos-arm64 + WHEEL_ARTIFACT_NAME: macos-arm64-wheel + MODE: "pypi" + secrets: inherit + + build-wheel-windows-x64: + needs: [checks, build-rerun-cli-and-upload-windows-x64] + name: "Windows-x64: Build & Upload Wheels" + uses: ./.github/workflows/reusable_build_and_upload_wheels.yml + with: + CONCURRENCY: nightly-windows-x64 + PLATFORM: windows-x64 + WHEEL_ARTIFACT_NAME: windows-x64-wheel + MODE: "pypi" + secrets: inherit + + # --------------------------------------------------------------------------- + # Test wheels: + + test-wheel-linux-arm64: + needs: [checks, build-wheel-linux-arm64] + name: "linux-arm64: Test Wheels" + uses: ./.github/workflows/reusable_test_wheels.yml + with: + CONCURRENCY: nightly-linux-arm64 + PLATFORM: linux-arm64 + WHEEL_ARTIFACT_NAME: linux-arm64-wheel + secrets: inherit + + test-wheel-linux-x64: + needs: [checks, build-wheel-linux-x64] + name: "Linux-x64: Test Wheels" + uses: ./.github/workflows/reusable_test_wheels.yml + with: + CONCURRENCY: nightly-linux-x64 + PLATFORM: linux-x64 + WHEEL_ARTIFACT_NAME: linux-x64-wheel + secrets: inherit + + test-wheel-macos-arm64: + needs: [checks, build-wheel-macos-arm64] + name: "macos-arm64: Test Wheels" + uses: ./.github/workflows/reusable_test_wheels.yml + with: + CONCURRENCY: nightly-macos-arm64 + PLATFORM: macos-arm64 + WHEEL_ARTIFACT_NAME: macos-arm64-wheel + secrets: inherit + + test-wheel-windows-x64: + needs: [checks, build-wheel-windows-x64] + name: "Windows-x64: Test Wheels" + uses: ./.github/workflows/reusable_test_wheels.yml + with: + CONCURRENCY: nightly-windows-x64 + PLATFORM: windows-x64 + WHEEL_ARTIFACT_NAME: windows-x64-wheel + secrets: inherit + + # --------------------------------------------------------------------------- + + # TODO(#9304): make the notebook export work + # run-notebook: + # name: "Run Notebook" + # needs: [build-wheel-linux-x64] + # uses: ./.github/workflows/reusable_run_notebook.yml + # with: + # CONCURRENCY: nightly + # WHEEL_ARTIFACT_NAME: linux-x64-wheel + # secrets: inherit + + build-examples: + name: "Build Examples" + needs: [build-wheel-linux-x64] + uses: ./.github/workflows/reusable_build_examples.yml + with: + CONCURRENCY: nightly + CHANNEL: nightly + WHEEL_ARTIFACT_NAME: linux-x64-wheel + secrets: inherit + + upload-examples: + name: "Upload Examples" + needs: [build-examples] + uses: ./.github/workflows/reusable_upload_examples.yml + with: + CONCURRENCY: nightly + NIGHTLY: true + secrets: inherit + + benches: + name: Benchmarks + uses: ./.github/workflows/reusable_bench.yml + with: + CONCURRENCY: nightly + SAVE_BENCHES: true + BENCH_NAME: main # We currently only run benches nightly, but we used to run them on main + COMPARE_TO: main # We currently only run benches nightly, but we used to run them on main + secrets: inherit + + # -------------------------------------------------------------------------- + # Release: + + generate-pip-index: + name: "Generate Pip Index" + needs: + [ + build-wheel-linux-arm64, + build-wheel-linux-x64, + build-wheel-macos-arm64, + build-wheel-windows-x64, + ] + uses: ./.github/workflows/reusable_pip_index.yml + with: + CONCURRENCY: nightly + secrets: inherit + + bundle-and-upload-rerun_cpp: + name: "Bundle and upload rerun_cpp_sdk.zip" + needs: + [ + build-rerun_c-and-upload-linux-arm64, + build-rerun_c-and-upload-linux-x64, + build-rerun_c-and-upload-macos-arm64, + build-rerun_c-and-upload-windows-x64, + ] + uses: ./.github/workflows/reusable_bundle_and_upload_rerun_cpp.yml + with: + CONCURRENCY: nightly + secrets: inherit + + pre-release: + timeout-minutes: 60 + name: Pre Release + concurrency: nightly + needs: + [ + build-rerun-cli-and-upload-linux-arm64, + build-rerun-cli-and-upload-linux-x64, + build-rerun-cli-and-upload-macos-arm64, + build-rerun-cli-and-upload-windows-x64, + build-rerun_c-and-upload-linux-arm64, + build-rerun_c-and-upload-linux-x64, + build-rerun_c-and-upload-macos-arm64, + build-rerun_c-and-upload-windows-x64, + bundle-and-upload-rerun_cpp, + generate-pip-index, + upload-web, + ] + runs-on: "ubuntu-latest" + steps: + - name: Add SHORT_SHA env property with commit short sha + run: echo "SHORT_SHA=`echo ${{github.sha}} | cut -c1-7`" >> $GITHUB_ENV + + # First delete the old prerelease. If we don't do this, we don't get things like + # proper source-archives and changelog info. + # https://github.com/dev-drprasad/delete-tag-and-release + - uses: dev-drprasad/delete-tag-and-release@v0.2.1 + with: + tag_name: prerelease + delete_release: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + # Create the actual prerelease + # https://github.com/ncipollo/release-action + - name: GitHub Release + uses: ncipollo/release-action@v1.12.0 + with: + body: | + This is a prerelease. It is not intended for production use. + Please report any issues you find. + + ## Example Hosted App + https://rerun.io/viewer/commit/${{ env.SHORT_SHA }} + + ## Wheels can be installed with: + ``` + pip install --pre --no-index -f https://build.rerun.io/commit/${{ env.SHORT_SHA }}/wheels --upgrade rerun-sdk + ``` + or + ``` + pip install --pre --no-index -f https://github.com/rerun-io/rerun/releases/download/prerelease --upgrade rerun-sdk + ``` + + ## CMake fetch-content for C++ SDK + ``` + include(FetchContent) + FetchContent_Declare(rerun_sdk URL https://build.rerun.io/commit/${{ env.SHORT_SHA }}/rerun_cpp_sdk.zip) + FetchContent_MakeAvailable(rerun_sdk) + ``` + or + ``` + include(FetchContent) + FetchContent_Declare(rerun_sdk URL https://github.com/rerun-io/rerun/releases/download/prerelease/rerun_cpp_sdk.zip) + FetchContent_MakeAvailable(rerun_sdk) + ``` + + ## Web Viewer NPM package + Can be installed with: + ``` + npm install https://build.rerun.io/commit/${{ env.SHORT_SHA }}/rerun_js + ``` + + prerelease: true + # Be explicit about the commit we're releasing/tagging. + # Otherwise it can happen that there's a discrepancy between the tag and the commit for which we uploaded & linked artifacts. + # It seems to otherwise use the latest commit for the tag. From the actions's docs: + # > If the tag of the release you are creating does not yet exist, you should set both the tag and commit action inputs. + # We just deleted the previous tag, so this is the case! + commit: ${{github.sha}} + name: "Development Build" + tag: "prerelease" + token: ${{ secrets.GITHUB_TOKEN }} + generateReleaseNotes: false + allowUpdates: true + removeArtifacts: true + replacesArtifacts: true + + sync-release-assets: + needs: [pre-release] + name: "Sync pre-release assets & build.rerun.io" + uses: ./.github/workflows/reusable_sync_release_assets.yml + with: + CONCURRENCY: nightly + RELEASE_VERSION: prerelease + secrets: inherit diff --git a/.github/workflows/notify-reality-sync.yml b/.github/workflows/notify-reality-sync.yml new file mode 100644 index 0000000..3d02d82 --- /dev/null +++ b/.github/workflows/notify-reality-sync.yml @@ -0,0 +1,54 @@ +name: Notify Reality of Sync Branch Update + +# When a PR that was synced from reality is updated on the rerun side, +# trigger a re-run of the verification workflow on the reality PR. +# This ensures the reality PR's "verify-rerun-sync" check reflects the +# current state of the rerun branch. + +on: + pull_request_target: + types: [synchronize] + +jobs: + notify-reality: + runs-on: ubuntu-latest + steps: + - name: Create GitHub App token + id: app-token + uses: actions/create-github-app-token@v2 + with: + app-id: ${{ vars.SYNC_APP_ID }} + private-key: ${{ secrets.SYNC_APP_PRIVATE_KEY }} + owner: rerun-io + repositories: | + reality + rerun + + - name: Re-run reality verification + env: + GH_TOKEN: ${{ steps.app-token.outputs.token }} + PR_NUMBER: ${{ github.event.pull_request.number }} + SYNC_APP_ID: ${{ vars.SYNC_APP_ID }} + run: | + # Find reality PR number from sync comment (only from our app for security) + REALITY_PR=$(gh api "repos/rerun-io/rerun/issues/$PR_NUMBER/comments" \ + | jq -r --arg app_id "$SYNC_APP_ID" '.[] | select(.performed_via_github_app.id | tostring == $app_id) | .body' \ + | grep -oP 'reality/pull/\K\d+' | head -1) + + if [[ -z "$REALITY_PR" ]]; then + echo "No reality PR reference found in bot comments - not a synced PR" + exit 0 + fi + + echo "Found reality PR #$REALITY_PR" + + # Find and re-run the verification workflow for that PR + RUN_ID=$(gh api "repos/rerun-io/reality/actions/workflows/sync-pr-to-rerun.yml/runs?event=pull_request&per_page=100" \ + --jq ".workflow_runs[] | select(.pull_requests[].number == $REALITY_PR) | .id" | head -1) + + if [[ -n "$RUN_ID" ]]; then + echo "Re-running workflow run $RUN_ID" + gh api "repos/rerun-io/reality/actions/runs/$RUN_ID/rerun" -X POST + else + echo "No workflow run found for reality PR #$REALITY_PR" + fi diff --git a/.github/workflows/on_gh_release.yml b/.github/workflows/on_gh_release.yml new file mode 100644 index 0000000..32a32d4 --- /dev/null +++ b/.github/workflows/on_gh_release.yml @@ -0,0 +1,56 @@ +name: "GitHub Release" + +on: + # Triggers when the `Publish release` button is pressed + release: + types: [published] + + # Manual trigger with `tag` input + workflow_dispatch: + inputs: + tag_name: + description: "Release tag" + type: string + required: true + +concurrency: + group: "release-${{ github.event.release.tag_name }}" + cancel-in-progress: true + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + # required for updating the release + contents: write + id-token: write + +jobs: + sync-release-assets: + name: "Sync Release Assets" + uses: ./.github/workflows/reusable_sync_release_assets.yml + with: + CONCURRENCY: "${{ github.event.release.tag_name || inputs.tag_name }}" + RELEASE_VERSION: "${{ github.event.release.tag_name || inputs.tag_name }}" + secrets: inherit + + dispatch-gradio-rerun-viewer: + name: "Trigger gradio-rerun-viewer release" + # Only on real GH release events (not workflow_dispatch), and only for finals. + if: github.event_name == 'release' && !github.event.release.prerelease + runs-on: ubuntu-latest + steps: + - name: Send repository_dispatch + env: + GH_TOKEN: ${{ secrets.RERUN_BOT_TOKEN }} + run: | + version="${{ github.event.release.tag_name }}" + if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Tag $version is not a final X.Y.Z release; skipping." + exit 0 + fi + gh api repos/rerun-io/gradio-rerun-viewer/dispatches \ + -f event_type=rerun-released \ + -F client_payload[version]="$version" \ + -F client_payload[source_release_url]="${{ github.event.release.html_url }}" diff --git a/.github/workflows/on_pr_comment.yml b/.github/workflows/on_pr_comment.yml new file mode 100644 index 0000000..2f0a57b --- /dev/null +++ b/.github/workflows/on_pr_comment.yml @@ -0,0 +1,130 @@ +# This workflow is triggered on any PR comment, and tries to find a `@rerun-bot` mention in it. +# If the mention is a command, such as `@rerun-bot full-check`, then it runs the command. +# +# Available commands: +# full-check Triggers a run of `on_push_main.yml` on the PR. + +name: "PR Comment" + +on: + issue_comment: + types: [created] + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + id-token: "write" + pull-requests: "write" + +jobs: + parse-command: + if: | + contains(github.event.comment.html_url, '/pull/') && + contains(github.event.comment.body, '@rerun-bot') && + contains( + fromJSON('["COLLABORATOR","MEMBER","OWNER"]'), + github.event.comment.author_association + ) + runs-on: ubuntu-latest + outputs: + command: ${{ steps.parse.outputs.command }} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Parse comment + id: parse + env: + GITHUB_COMMENT_BODY: "${{ github.event.comment.body }}" + run: python ./scripts/ci/parse_bot_pr_comment.py + + full-check: + needs: [parse-command] + if: needs.parse-command.outputs.command == 'full-check' + runs-on: ubuntu-latest + steps: + - name: Acknowledge command (eyes reaction) + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh api -X POST \ + /repos/${{ github.repository }}/issues/comments/${{ github.event.comment.id }}/reactions \ + -f content=eyes + + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Dispatch main workflow + id: dispatch + env: + # NOTE: This uses `RERUN_BOT_TOKEN` instead of `GITHUB_TOKEN`, + # otherwise the recursive workflow protection prevents us from + # starting the `on_push_main` run. + # https://docs.github.com/en/actions/using-workflows/triggering-a-workflow#triggering-a-workflow-from-a-workflow + GH_TOKEN: ${{ secrets.RERUN_BOT_TOKEN }} + run: | + get_latest_workflow_run () { + local workflow_name=$1 + local ref_name=$2 + local created_after=$3 + echo $( + # https://cli.github.com/manual/gh_run_list + # https://docs.github.com/en/search-github/getting-started-with-searching-on-github/understanding-the-search-syntax#query-for-dates + gh run list \ + --workflow $workflow_name \ + --event workflow_dispatch \ + --branch $ref_name \ + --created ">$created_after" \ + --json databaseId + ) + } + + dispatch_workflow () { + local workflow_name=$1 + local ref_name=$2 + local inputs=$3 + # https://cli.github.com/manual/gh_workflow_run + echo $inputs | gh workflow run $workflow_name --ref "refs/heads/$ref_name" --json + } + + workflow_name='on_push_main.yml' + ref_name=$(gh pr view ${{ github.event.issue.number }} --json headRefName | jq -r '.headRefName') + inputs='{"CONCURRENCY":"pr-${{ github.event.issue.number }}-full-check"}' + now=$(date --utc --iso-8601=seconds) + + echo "Dispatching workflow $workflow_name on branch $ref_name" + dispatch_workflow $workflow_name $ref_name $inputs + + # `gh workflow run` does NOT return the ID. + # In fact, it returns absolutely nothing: https://github.com/cli/cli/issues/4001 + # Instead, we have to wait for the workflow to start, and hope that nobody has + # started a workflow in parallel with us on the same branch. + + echo "Fetching workflow run id…" + run_info=$(get_latest_workflow_run $workflow_name $ref_name $now) + echo $run_info + run_id=$(echo $run_info | jq -r '.[0].databaseId') + while [ $run_id == 'null' ] + do + run_info=$(get_latest_workflow_run $workflow_name $ref_name $now) + echo $run_info + run_id=$(echo $run_info | jq -r '.[0].databaseId') + sleep 1 + done + echo "Workflow run: https://github.com/rerun-io/rerun/actions/runs/$run_id" + + echo "workflow_run_url=https://github.com/rerun-io/rerun/actions/runs/$run_id" >> "$GITHUB_OUTPUT" + + - name: Create PR comment + # https://github.com/mshick/add-pr-comment + uses: mshick/add-pr-comment@v3.9.1 + with: + # We use `GITHUB_TOKEN` here so there is no chance that we'll trigger another run of this workflow. + # https://docs.github.com/en/actions/using-workflows/triggering-a-workflow#triggering-a-workflow-from-a-workflow + repo-token: ${{ secrets.GITHUB_TOKEN }} + message-id: "pr-${{ github.event.issue.number }}-${{ github.run_id }}" + message: | + Started a full build: ${{ steps.dispatch.outputs.workflow_run_url }} diff --git a/.github/workflows/on_pull_request.yml b/.github/workflows/on_pull_request.yml new file mode 100644 index 0000000..cad0171 --- /dev/null +++ b/.github/workflows/on_pull_request.yml @@ -0,0 +1,252 @@ +# Jobs that only run for developers on the `rerun` team. +# We have to ensure that these jobs _only_ run for PRs inside the `rerun-io` organization +# this is done using the following check, added to every job: +# if: github.event.pull_request.head.repo.owner.login == 'rerun-io' +# (unfortunately this does not work on the trigger or the entire `jobs` category) + +name: Pull-Request + +on: + pull_request: + types: + - opened + - synchronize + +permissions: write-all + +# These jobs use fairly short names as they are a prefix in the display hierarchy +jobs: + checks: + name: Checks + if: github.event.pull_request.head.repo.owner.login == 'rerun-io' + uses: ./.github/workflows/reusable_checks.yml + with: + CONCURRENCY: pr-${{ github.event.pull_request.number }} + CHANNEL: pr + secrets: inherit + + paths-filter: + if: github.event.pull_request.head.repo.owner.login == 'rerun-io' + runs-on: ubuntu-latest + outputs: + cpp_changes: ${{ steps.filter.outputs.cpp_changes }} + docs_changes: ${{ steps.filter.outputs.docs_changes }} + python_changes: ${{ steps.filter.outputs.python_changes }} + rust_changes: ${{ steps.filter.outputs.rust_changes }} + protobuf_changes: ${{ steps.filter.outputs.protobuf_changes }} + web_changes: ${{ steps.filter.outputs.web_changes }} + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + - uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + cpp_changes: + # - .github/**/*.yml - this is tempting, but leads to constant rebuilds + - crates/top/rerun_c/**/* + - pixi.lock # maybe our build commands have changed + - pixi.toml # maybe our build commands have changed + - scripts/ci/**/* + - '**/*.cpp' + - '**/*.hpp' + - '**/*cmake' + - '**/CMakeLists.txt' + + docs_changes: + # - .github/**/*.yml - this is tempting, but leads to constant rebuilds + - .github/actions/vercel/**/* + - pixi.lock # maybe our build commands have changed + - pixi.toml # maybe our build commands have changed + - scripts/ci/* + - 'docs/content/**/*.md' + - 'examples/**/*.md' + - 'examples/manifest.toml' + + python_changes: + # - .github/**/*.yml - this is tempting, but leads to constant rebuilds + - pixi.lock # maybe our build commands have changed + - pixi.toml # maybe our build commands have changed + - scripts/ci/* + - '**/*.py' + - '**/*.pyi' + - '**/requirements.txt' + - '**/pyproject.toml' + + rust_changes: + # - .github/**/*.yml - this is tempting, but leads to constant rebuilds + - Cargo.lock + - crates/viewer/re_ui/data/**/* # parts of data are imported into the viewer and has ramifications on various tests + - pixi.lock # maybe our build commands have changed + - pixi.toml # maybe our build commands have changed + - "**/*.rs" + # wgsl is embedded into Rust binaries and should trigger tests. + - "rerun/**/*.wgsl" + - "**/*.toml" + - "crates/**/*.png" + - "tests/rust/**/*.png" + + protobuf_changes: + # - .github/**/*.yml - this is tempting, but leads to constant rebuilds + - "**/**.proto" + - pixi.lock # maybe our build commands have changed + - pixi.toml # maybe our build commands have changed + - scripts/ci/* + - "**/*.toml" + + web_changes: + # - .github/**/*.yml - this is tempting, but leads to constant rebuilds + - Cargo.lock + - pixi.lock # maybe our build commands have changed + - pixi.toml # maybe our build commands have changed + - scripts/ci/* + - "**/*.html" + - "**/*.js" + - "**/*.mjs" + - "**/*.json" + - "**/*.rs" + - "**/*.toml" + - "**/yarn.lock" + - "crates/viewer/re_ui/data/**" + + protobuf-checks: + name: "Protobuf Checks" + needs: [paths-filter] + if: github.event.pull_request.head.repo.owner.login == 'rerun-io' && needs.paths-filter.outputs.protobuf_changes == 'true' + uses: ./.github/workflows/reusable_checks_protobuf.yml + with: + CONCURRENCY: pr-${{ github.event.pull_request.number }} + secrets: inherit + + rust-checks: + name: "Rust Checks" + needs: [paths-filter] + if: github.event.pull_request.head.repo.owner.login == 'rerun-io' && needs.paths-filter.outputs.rust_changes == 'true' + uses: ./.github/workflows/reusable_checks_rust.yml + with: + CONCURRENCY: pr-${{ github.event.pull_request.number }} + CHANNEL: main # We run the full test suite here, because we've had so many breakages + secrets: inherit + + python-checks: + name: "Python Checks" + needs: [paths-filter] + if: github.event.pull_request.head.repo.owner.login == 'rerun-io' && needs.paths-filter.outputs.python_changes == 'true' + uses: ./.github/workflows/reusable_checks_python.yml + with: + CONCURRENCY: pr-${{ github.event.pull_request.number }} + secrets: inherit + + cpp-tests: + name: "C++ tests" + needs: [paths-filter] + if: needs.paths-filter.outputs.cpp_changes == 'true' + uses: ./.github/workflows/reusable_checks_cpp.yml + with: + CONCURRENCY: pr-${{ github.event.pull_request.number }} + CHANNEL: pr + secrets: inherit + + cli-build: + name: "Rerun CLI Build" + needs: [paths-filter] + if: needs.paths-filter.outputs.python_changes == 'true' || needs.paths-filter.outputs.rust_changes == 'true' + uses: ./.github/workflows/reusable_build_and_upload_rerun_cli.yml + with: + CONCURRENCY: pr-${{ github.event.pull_request.number }} + PLATFORM: linux-x64 + secrets: inherit + + # Build and test a single wheel to limit CI cost. We use linux-x64 because it's fast. linux-arm64 would also be a good + # choice, but reusable_test_wheels.yml is broken for that target (https://github.com/rerun-io/rerun/issues/5525) + min-wheel-build: + name: "Minimum Wheel Build" + needs: [cli-build, paths-filter] + if: github.event.pull_request.head.repo.owner.login == 'rerun-io' && (needs.paths-filter.outputs.python_changes == 'true' || needs.paths-filter.outputs.rust_changes == 'true') + uses: ./.github/workflows/reusable_build_and_upload_wheels.yml + with: + CONCURRENCY: pr-${{ github.event.pull_request.number }} + MODE: "pr" + PLATFORM: linux-x64 + WHEEL_ARTIFACT_NAME: "linux-x64-wheel-fast" + secrets: inherit + + min-wheel-test: + name: "Minimum Wheel Test" + needs: [min-wheel-build, paths-filter] + if: github.event.pull_request.head.repo.owner.login == 'rerun-io' && (needs.paths-filter.outputs.python_changes == 'true' || needs.paths-filter.outputs.rust_changes == 'true') + uses: ./.github/workflows/reusable_test_wheels.yml + with: + CONCURRENCY: pr-${{ github.event.pull_request.number }} + PLATFORM: linux-x64 + WHEEL_ARTIFACT_NAME: "linux-x64-wheel-fast" + FAST: true + secrets: inherit + + build-js: + name: "Build rerun_js" + needs: [paths-filter] + if: github.event.pull_request.head.repo.owner.login == 'rerun-io' && needs.paths-filter.outputs.web_changes == 'true' + uses: ./.github/workflows/reusable_build_js.yml + with: + CONCURRENCY: pr-${{ github.event.pull_request.number }} + secrets: inherit + + build-web: + name: "Build web viewer" + if: github.event.pull_request.head.repo.owner.login == 'rerun-io' && needs.paths-filter.outputs.web_changes == 'true' + needs: [paths-filter] + uses: ./.github/workflows/reusable_build_web.yml + with: + CONCURRENCY: pr-${{ github.event.pull_request.number }} + CHANNEL: main + secrets: inherit + + web-test: + name: "Web tests" + needs: [paths-filter] + if: github.event.pull_request.head.repo.owner.login == 'rerun-io' && needs.paths-filter.outputs.web_changes == 'true' + uses: ./.github/workflows/reusable_web_test.yml + with: + CONCURRENCY: pr-${{ github.event.pull_request.number }} + secrets: inherit + + upload-web: + name: "Upload Web" + needs: [build-web] + if: github.event.pull_request.head.repo.owner.login == 'rerun-io' + uses: ./.github/workflows/reusable_upload_web.yml + with: + CONCURRENCY: pr-${{ github.event.pull_request.number }} + PR_NUMBER: ${{ github.event.pull_request.number }} + secrets: inherit + + upload-js: + name: "Upload JS" + needs: [build-js] + if: github.event.pull_request.head.repo.owner.login == 'rerun-io' + uses: ./.github/workflows/reusable_upload_js.yml + with: + CONCURRENCY: pr-${{ github.event.pull_request.number }} + PR_NUMBER: ${{ github.event.pull_request.number }} + secrets: inherit + + deploy-landing-preview: + name: "Deploy Landing Preview" + needs: [paths-filter] + if: github.event.pull_request.head.repo.owner.login == 'rerun-io' && needs.paths-filter.outputs.docs_changes == 'true' + uses: ./.github/workflows/reusable_deploy_landing_preview.yml + with: + CONCURRENCY: pr-${{ github.event.pull_request.number }} + PR_NUMBER: ${{ github.event.pull_request.number }} + secrets: inherit + + check-doc-redirects: + name: "Check Doc Redirects" + needs: [paths-filter] + if: github.event.pull_request.head.repo.owner.login == 'rerun-io' && needs.paths-filter.outputs.docs_changes == 'true' + uses: ./.github/workflows/reusable_checks_doc_redirects.yml + with: + CONCURRENCY: pr-${{ github.event.pull_request.number }} + secrets: inherit diff --git a/.github/workflows/on_pull_request_contrib.yml b/.github/workflows/on_pull_request_contrib.yml new file mode 100644 index 0000000..7611936 --- /dev/null +++ b/.github/workflows/on_pull_request_contrib.yml @@ -0,0 +1,42 @@ +# Jobs that only run for external contributors. +# These have to be carefully sanitized, we don't want to leak secrets. +# - We can't use caching, outside of really rare scenarios, because our caching largely depends on GCS +# - We have to ensure that these jobs _only_ run for PRs outside of the `rerun-io` organization +# this is done using the following check, added to every job: +# if: github.event.pull_request.head.repo.owner.login != 'rerun-io' + +name: Pull-Request (Contrib) + +on: + pull_request: + types: + - opened + - synchronize + +permissions: + contents: "read" + packages: "read" + +jobs: + checks: + name: "Checks" + if: github.event.pull_request.head.repo.owner.login != 'rerun-io' + uses: ./.github/workflows/contrib_checks.yml + with: + CONCURRENCY: pr-${{ github.event.pull_request.number }} + PR_NUMBER: ${{ github.event.pull_request.number }} + + python: + name: "Python" + if: github.event.pull_request.head.repo.owner.login != 'rerun-io' + uses: ./.github/workflows/contrib_rerun_py.yml + with: + CONCURRENCY: pr-${{ github.event.pull_request.number }} + MATURIN_FEATURE_FLAGS: "--no-default-features --features extension-module" + + check-doc-redirects: + name: "Check Doc Redirects" + if: github.event.pull_request.head.repo.owner.login != 'rerun-io' + uses: ./.github/workflows/reusable_checks_doc_redirects.yml + with: + CONCURRENCY: pr-${{ github.event.pull_request.number }} diff --git a/.github/workflows/on_push_docs.yml b/.github/workflows/on_push_docs.yml new file mode 100644 index 0000000..8e2523a --- /dev/null +++ b/.github/workflows/on_push_docs.yml @@ -0,0 +1,98 @@ +name: "Push Docs" + +on: + push: + branches: [docs-latest] + +concurrency: + group: on-push-docs + cancel-in-progress: true + +permissions: + contents: "read" + id-token: "write" + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +jobs: + # Get latest release version from crates.io + # This excludes any prerelease builds, e.g. `0.15.0-alpha.1` or `rc` or similar. + # We get it from crates.io because it's the strongest indicator of the latest + # fully released version we have available, and there is no better way to retrieve + # that in the context of this branch, because we don't want to rely on the contents + # of a local `Cargo.toml` or the git branch name. + get-version: + runs-on: ubuntu-latest + outputs: + version: ${{ steps.versioning.outputs.crate_version }} + steps: + - uses: actions/checkout@v4 + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Get version + id: versioning + run: | + crate_version=$(pixi run python scripts/ci/crates.py get-version --from=cratesio --skip-prerelease) + echo "crate_version=$crate_version" >> "$GITHUB_OUTPUT" + + build-search-index: + runs-on: ubuntu-latest-16-cores + needs: [get-version] + steps: + - uses: actions/checkout@v4 + + - name: Set up Rust + uses: ./.github/actions/setup-rust + with: + cache_key: "build-linux" + save_cache: false + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Build search index + run: | + pixi run search-index build \ + landing \ + --url "https://ms-b22605aed932-7275.fra.meilisearch.io" \ + --master-key "${{ secrets.MEILISEARCH_TOKEN }}" \ + --release-version "${{ needs.get-version.outputs.version }}" + + # The website reads prose from GCS at SSR time, so a `docs-latest` + # push takes effect via a GCS re-upload + ISR revalidate. + upload-prose: + name: Upload prose to GCS + runs-on: ubuntu-latest + needs: [get-version] + steps: + - uses: actions/checkout@v4 + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - id: "auth" + uses: google-github-actions/auth@v2 + with: + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - name: "Upload markdown docs & examples to GCS" + env: + ISR_BYPASS_TOKEN: ${{ secrets.ISR_BYPASS_TOKEN }} + VERSION_LABEL: ${{ needs.get-version.outputs.version }} + RERUN_COMMIT: ${{ github.sha }} + run: | + pixi run uv run scripts/ci/upload_docs.py upload \ + --version "$VERSION_LABEL" \ + --rerun-commit "$RERUN_COMMIT" \ + --mark-latest \ + --purge-token "$ISR_BYPASS_TOKEN" diff --git a/.github/workflows/on_push_main.yml b/.github/workflows/on_push_main.yml new file mode 100644 index 0000000..944e123 --- /dev/null +++ b/.github/workflows/on_push_main.yml @@ -0,0 +1,265 @@ +name: Push To Main + +on: + push: + branches: + - "main" + + # Can be triggered manually from within the UI or using the GH CLI, + # e.g. `gh workflow run on_push_main.yml --ref main` + workflow_dispatch: + inputs: + CONCURRENCY: + required: true + type: string + +permissions: write-all + +jobs: + checks: + name: Checks + uses: ./.github/workflows/reusable_checks.yml + with: + CONCURRENCY: push-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + CHANNEL: main + secrets: inherit + + cpp_checks: + name: Checks + uses: ./.github/workflows/reusable_checks_cpp.yml + with: + CONCURRENCY: push-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + CHANNEL: main + secrets: inherit + + rust_checks: + name: Checks + uses: ./.github/workflows/reusable_checks_rust.yml + with: + CONCURRENCY: push-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + CHANNEL: main + secrets: inherit + + python_checks: + name: Checks + uses: ./.github/workflows/reusable_checks_python.yml + with: + CONCURRENCY: push-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + secrets: inherit + + deploy-docs: + needs: [checks] + name: Deploy Docs + uses: ./.github/workflows/reusable_deploy_docs.yml + with: + CONCURRENCY: push-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + PY_DOCS_VERSION_NAME: "main" + CPP_DOCS_VERSION_NAME: "main" + JS_DOCS_VERSION_NAME: "main" + MARKDOWN_DOCS_VERSION_NAME: "dev" + UPDATE_LATEST: false + secrets: inherit + + build-web: + name: "Build web viewer" + uses: ./.github/workflows/reusable_build_web.yml + with: + CONCURRENCY: push-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + CHANNEL: main + secrets: inherit + + web-test: + name: "Web tests" + uses: ./.github/workflows/reusable_web_test.yml + with: + CONCURRENCY: push-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + secrets: inherit + + upload-web: + name: "Upload Web" + needs: [build-web] + uses: ./.github/workflows/reusable_upload_web.yml + with: + CONCURRENCY: push-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + secrets: inherit + + build-js: + name: "Build JS" + uses: ./.github/workflows/reusable_build_js.yml + with: + CONCURRENCY: push-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + secrets: inherit + + upload-js: + name: "Upload JS" + needs: [build-js] + uses: ./.github/workflows/reusable_upload_js.yml + with: + CONCURRENCY: push-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + secrets: inherit + + build-examples: + name: "Build Examples" + needs: [build-wheel-linux-x64] + uses: ./.github/workflows/reusable_build_examples.yml + with: + CONCURRENCY: push-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + CHANNEL: main + WHEEL_ARTIFACT_NAME: linux-x64-wheel + secrets: inherit + + track-sizes: + name: "Track Sizes" + needs: [build-web, build-examples] + uses: ./.github/workflows/reusable_track_size.yml + with: + CONCURRENCY: push-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + WITH_EXAMPLES: true + secrets: inherit + + upload-examples: + name: "Upload Examples" + needs: [build-examples] + uses: ./.github/workflows/reusable_upload_examples.yml + with: + CONCURRENCY: push-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + secrets: inherit + + # ----------------------------------------------------------------------------------- + # Build rerun_c library binaries: + + build-rerun_c-and-upload-linux-arm64: + needs: [checks] + name: "Linux-Arm64: Build & Upload rerun_c" + uses: ./.github/workflows/reusable_build_and_upload_rerun_c.yml + with: + CONCURRENCY: push-linux-arm64-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + PLATFORM: linux-arm64 + secrets: inherit + + build-rerun_c-and-upload-linux-x64: + needs: [checks] + name: "Linux-x64: Build & Upload rerun_c" + uses: ./.github/workflows/reusable_build_and_upload_rerun_c.yml + with: + CONCURRENCY: push-linux-x64-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + PLATFORM: linux-x64 + secrets: inherit + + build-rerun_c-and-upload-macos-arm64: + needs: [checks] + name: "Mac-Arm64: Build & Upload rerun_c" + uses: ./.github/workflows/reusable_build_and_upload_rerun_c.yml + with: + CONCURRENCY: push-macos-arm64-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + PLATFORM: macos-arm64 + secrets: inherit + + # ----------------------------------------------------------------------------------- + # Build rerun-cli (rerun binaries): + + build-rerun-cli-and-upload-linux-arm64: + needs: [checks] + name: "Linux-arm64: Build & Upload rerun-cli" + uses: ./.github/workflows/reusable_build_and_upload_rerun_cli.yml + with: + CONCURRENCY: push-linux-arm64-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + PLATFORM: linux-arm64 + secrets: inherit + + build-rerun-cli-and-upload-linux-x64: + needs: [checks] + name: "Linux-x64: Build & Upload rerun-cli" + uses: ./.github/workflows/reusable_build_and_upload_rerun_cli.yml + with: + CONCURRENCY: push-linux-x64-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + PLATFORM: linux-x64 + secrets: inherit + + build-rerun-cli-and-upload-macos-arm64: + needs: [checks] + name: "Mac-arm64: Build & Upload rerun-cli" + uses: ./.github/workflows/reusable_build_and_upload_rerun_cli.yml + with: + CONCURRENCY: push-macos-arm64-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + PLATFORM: macos-arm64 + secrets: inherit + + # --------------------------------------------------------------------------- + # Build wheels: + + build-wheel-linux-arm64: + needs: [checks, build-rerun-cli-and-upload-linux-arm64] + name: "Linux-arm64: Build & Upload Wheels" + uses: ./.github/workflows/reusable_build_and_upload_wheels.yml + with: + CONCURRENCY: push-linux-arm64-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + PLATFORM: linux-arm64 + WHEEL_ARTIFACT_NAME: linux-arm64-wheel + MODE: "pypi" + secrets: inherit + + build-wheel-linux-x64: + needs: [checks, build-rerun-cli-and-upload-linux-x64] + name: "Linux-x64: Build & Upload Wheels" + uses: ./.github/workflows/reusable_build_and_upload_wheels.yml + with: + CONCURRENCY: push-linux-x64-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + PLATFORM: linux-x64 + WHEEL_ARTIFACT_NAME: linux-x64-wheel + MODE: "pypi" + secrets: inherit + + build-wheel-macos-arm64: + needs: [checks, build-rerun-cli-and-upload-macos-arm64] + name: "Macos-arm64: Build & Upload Wheels" + uses: ./.github/workflows/reusable_build_and_upload_wheels.yml + with: + CONCURRENCY: push-macos-arm64-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + PLATFORM: macos-arm64 + WHEEL_ARTIFACT_NAME: macos-arm64-wheel + MODE: "pypi" + secrets: inherit + + # --------------------------------------------------------------------------- + # Test wheels: + + test-wheel-linux-arm64: + needs: [checks, build-wheel-linux-arm64] + name: "linux-arm64: Test Wheels" + uses: ./.github/workflows/reusable_test_wheels.yml + with: + CONCURRENCY: push-linux-arm64-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + PLATFORM: linux-arm64 + WHEEL_ARTIFACT_NAME: linux-arm64-wheel + secrets: inherit + + test-wheel-linux-x64: + needs: [checks, build-wheel-linux-x64] + name: "Linux-x64: Test Wheels" + uses: ./.github/workflows/reusable_test_wheels.yml + with: + CONCURRENCY: push-linux-x64-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + PLATFORM: linux-x64 + WHEEL_ARTIFACT_NAME: linux-x64-wheel + secrets: inherit + + test-wheel-macos-arm64: + needs: [checks, build-wheel-macos-arm64] + name: "macos-arm64: Test Wheels" + uses: ./.github/workflows/reusable_test_wheels.yml + with: + CONCURRENCY: push-macos-arm64-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + PLATFORM: macos-arm64 + WHEEL_ARTIFACT_NAME: macos-arm64-wheel + secrets: inherit + + generate-pip-index: + name: "Generate Pip Index" + needs: + [build-wheel-linux-arm64, build-wheel-linux-x64, build-wheel-macos-arm64] + uses: ./.github/workflows/reusable_pip_index.yml + with: + CONCURRENCY: push-${{ github.ref_name }}-${{ inputs.CONCURRENCY }} + CHECK: false # we don't build wheels for all platforms on push-to-main + secrets: inherit diff --git a/.github/workflows/pr-trigger-reality-sync.yml b/.github/workflows/pr-trigger-reality-sync.yml new file mode 100644 index 0000000..5198fb1 --- /dev/null +++ b/.github/workflows/pr-trigger-reality-sync.yml @@ -0,0 +1,190 @@ +name: PR Trigger Reality Sync + +on: + issue_comment: + types: [created] + pull_request_target: + types: [synchronize] + +jobs: + # Post a helpful message when unauthorized users try to trigger sync + unauthorized-message: + if: | + github.event_name == 'issue_comment' && + github.event.issue.pull_request && + ( + contains(github.event.comment.body, '@rerun-bot reality-sync') || + contains(github.event.comment.body, '@rerun-bot sync-reality') + ) && + github.event.comment.user.type != 'Bot' && + github.event.comment.author_association != 'OWNER' && + github.event.comment.author_association != 'MEMBER' + runs-on: ubuntu-latest + steps: + - name: Create GitHub App token + id: app-token + uses: actions/create-github-app-token@v2 + with: + app-id: ${{ vars.SYNC_APP_ID }} + private-key: ${{ secrets.SYNC_APP_PRIVATE_KEY }} + owner: rerun-io + repositories: rerun + + - name: Post unauthorized message + env: + GH_TOKEN: ${{ steps.app-token.outputs.token }} + run: | + gh pr comment ${{ github.event.issue.number }} \ + --repo ${{ github.repository }} \ + --body "Sorry, only organization members can trigger reality-sync." + + trigger-import: + # For issue_comment: org members (OWNER/MEMBER) can trigger with '@rerun-bot reality-sync' or '@rerun-bot sync-reality' + # For pull_request_target: only auto-sync non-fork PRs (fork PRs require explicit comment trigger) + if: | + ( + github.event_name == 'issue_comment' && + github.event.issue.pull_request && + ( + contains(github.event.comment.body, '@rerun-bot reality-sync') || + contains(github.event.comment.body, '@rerun-bot sync-reality') + ) && + github.event.comment.user.type != 'Bot' && + ( + github.event.comment.author_association == 'OWNER' || + github.event.comment.author_association == 'MEMBER' + ) + ) || ( + github.event_name == 'pull_request_target' && + github.event.pull_request.head.repo.full_name == github.repository + ) + runs-on: ubuntu-latest + defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + steps: + - name: Create GitHub App token + id: app-token + uses: actions/create-github-app-token@v2 + with: + app-id: ${{ vars.SYNC_APP_ID }} + private-key: ${{ secrets.SYNC_APP_PRIVATE_KEY }} + owner: rerun-io + repositories: | + reality + rerun + + - name: Acknowledge command (eyes reaction) + if: github.event_name == 'issue_comment' + env: + GH_TOKEN: ${{ steps.app-token.outputs.token }} + run: | + gh api -X POST \ + /repos/${{ github.repository }}/issues/comments/${{ github.event.comment.id }}/reactions \ + -f content=eyes + + - name: Determine PR number + id: pr-info + run: | + if [ "${{ github.event_name }}" = "issue_comment" ]; then + echo "pr_number=${{ github.event.issue.number }}" >> $GITHUB_OUTPUT + echo "triggered_by=${{ github.event.comment.user.login }}" >> $GITHUB_OUTPUT + echo "trigger_type=comment" >> $GITHUB_OUTPUT + else + echo "pr_number=${{ github.event.pull_request.number }}" >> $GITHUB_OUTPUT + echo "triggered_by=${{ github.event.sender.login }}" >> $GITHUB_OUTPUT + echo "trigger_type=push" >> $GITHUB_OUTPUT + fi + + - name: Check for existing sync comment (push events only) + if: github.event_name == 'pull_request_target' + id: check-sync-comment + env: + GH_TOKEN: ${{ steps.app-token.outputs.token }} + run: | + PR_NUMBER="${{ steps.pr-info.outputs.pr_number }}" + echo "Checking PR #${PR_NUMBER} for existing sync comment…" + + # Look for "Sync complete" comment from the sync bot (GitHub App) + # Check performed_via_github_app.id matches our app to prevent spoofing + SYNC_APP_ID="${{ vars.SYNC_APP_ID }}" + SYNC_COMMENT=$(gh api "repos/${{ github.repository }}/issues/${PR_NUMBER}/comments" \ + | jq -r --arg app_id "$SYNC_APP_ID" '.[] | select((.performed_via_github_app.id | tostring == $app_id) and (.body | contains("Sync complete. Mirror PR in reality:"))) | .id' \ + | head -1) + + if [ -n "$SYNC_COMMENT" ]; then + echo "has_sync=true" >> $GITHUB_OUTPUT + echo "✓ Found existing sync comment, will re-sync on push" + else + echo "has_sync=false" >> $GITHUB_OUTPUT + echo "No existing sync comment found, skipping auto-sync" + fi + + - name: Get PR details + if: | + github.event_name == 'issue_comment' || + steps.check-sync-comment.outputs.has_sync == 'true' + env: + GH_TOKEN: ${{ steps.app-token.outputs.token }} + run: | + PR_NUMBER="${{ steps.pr-info.outputs.pr_number }}" + echo "Fetching PR details for PR #${PR_NUMBER}…" + gh pr view "$PR_NUMBER" \ + --repo ${{ github.repository }} \ + --json headRefName,headRepositoryOwner,headRepository,number,title,body,labels \ + > /tmp/pr_data.json + + echo "PR data:" + jq '.' /tmp/pr_data.json + + - name: Trigger reality sync workflow + if: | + github.event_name == 'issue_comment' || + steps.check-sync-comment.outputs.has_sync == 'true' + env: + GH_TOKEN: ${{ steps.app-token.outputs.token }} + run: | + echo "================================================" + echo "Triggering repository_dispatch to reality repo" + echo "Trigger type: ${{ steps.pr-info.outputs.trigger_type }}" + echo "================================================" + + # Construct the entire payload using jq to avoid shell substitution + # This ensures backticks and other special characters in title/body are handled safely + jq -n \ + --arg repo "${{ github.event.repository.name }}" \ + --arg current_repo "${{ github.repository }}" \ + --arg triggered_by "${{ steps.pr-info.outputs.triggered_by }}" \ + --slurpfile pr_data /tmp/pr_data.json \ + '{ + event_type: "sync-import-pr", + client_payload: { + repo: $repo, + pr_number: $pr_data[0].number, + head_ref: $pr_data[0].headRefName, + head_owner: $pr_data[0].headRepositoryOwner.login, + head_repo: $pr_data[0].headRepository.name, + title: $pr_data[0].title, + body: ($pr_data[0].body // ""), + labels: $pr_data[0].labels, + is_fork: (("\($pr_data[0].headRepositoryOwner.login)/\($pr_data[0].headRepository.name)") != $current_repo), + triggered_by: $triggered_by + } + }' > /tmp/dispatch_payload.json + + echo "Dispatch payload:" + jq '.' /tmp/dispatch_payload.json + + # Make the API call with the JSON payload + if gh api repos/rerun-io/reality/dispatches --input /tmp/dispatch_payload.json 2>&1; then + echo "✓ Successfully dispatched sync-import-pr event to reality repo" + echo "Note: repository_dispatch returns 204 No Content on success" + echo "The reality repo should now be processing the import workflow" + else + echo "::error::Failed to dispatch repository_dispatch event to reality repo" + echo "::error::This could be due to:" + echo "::error:: 1. Insufficient permissions on the GitHub App token" + echo "::error:: 2. Reality repo not found or not accessible" + echo "::error:: 3. Network issues" + exit 1 + fi diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..65dd605 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,590 @@ +name: Release +run-name: Release (${{ inputs.release-type }}) + +on: + workflow_dispatch: + inputs: + release-type: + description: "What kind of release is this?" + type: choice + options: + - alpha + - rc + - final + required: true + publish-crates: + description: "Publish crates (ignored for non-alpha release)" + type: boolean + required: false + default: true + +concurrency: + group: ${{ github.ref_name }} + cancel-in-progress: true + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +# wants to push commits and create a PR +permissions: + contents: write # Allow pushing commits + pull-requests: write # Allow creating PRs + packages: read # Allow reading packages + id-token: "write" + +jobs: + # Re-entrancy: + # - `version` is re-entrant because it doesn't commit/create PR if the version doesn't change, + # and the version doesn't change if we're already on the final version specified by the branch name. + # - `update-docs` is re-entrant because it overwrites history of the `gh-pages` branch, so any + # previous partial update will just be overwritten by the next successful run. + # - `publish-crates` is re-entrant because the `crates.py` script correctly handles publish failures + # by first checking if a crate has already been published before attempting to publish it. + # - `build-and-publish-wheels` is re-entrant because all the uploaded artifacts will be overwritten + # by any subsequent runs, and the final upload to PyPI has the `--skip-existing` flag, which ignores + # any wheels already uploaded. + # - `build-and-publish-web` is re-entrant for the same reason as `build-and-publish-wheels`, + # except that uploads are done to GCS instead of PyPI. + + checks: + timeout-minutes: 60 + name: "Checks" + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: 3.11 + + - name: Check links for `?speculative-link` + # This checks that we have no links with `?speculative-link` in its query params. + # We use those markers to get our link checker to ignore links to unreleased docs. + # + # NOTE: For alpha releases, we won't fully publish all our docs, + # so we skip the check here, because we won't be able to + # remove the markers yet. + run: | + if [ ${{ inputs.release-type }} != "alpha" ]; then + python3 scripts/ci/check_speculative_links.py + fi + + # NOTE: When updating this job, also remember to update `post-release-version-bump`. + version: + name: "Versioning" + runs-on: ubuntu-latest + outputs: + previous: ${{ steps.versioning.outputs.previous }} + current: ${{ steps.versioning.outputs.current }} + final: ${{ steps.versioning.outputs.final }} + git_tag: ${{ steps.versioning.outputs.git_tag }} + # will be set to `github.sha` if the pull request already exists + # this is the last (and not merge) commit in the release branch + release-commit: ${{ steps.commit.outputs.version_bump_commit_sha || github.sha }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.RERUN_BOT_TOKEN }} + + - uses: actions/setup-node@v4 + with: + node-version: "22.x" + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Update crate versions + id: versioning + run: | + echo Check that the release version matches expected format… + pixi run python scripts/ci/crates.py check-git-branch-name + + echo Parse the release version from the branch name… + # `prepare-release-0.8.1-alpha.N` -> `0.8.1` + release_version=$(pixi run python scripts/ci/crates.py get-version --from git --finalize) + + echo "release_version: $release_version" + + echo Store version before the update, so we can later detect if it changed… + previous=$(pixi run python scripts/ci/crates.py get-version) + + echo If the version minus prerelease/build metadata is not the same as the release version, then update it.… + if [ $(pixi run python scripts/ci/crates.py get-version --finalize) != $release_version ]; then + pixi run python scripts/ci/crates.py version --exact $release_version + fi + + echo If this is an 'rc', additionally set add '-rc.N'. This will also bump the 'N' if '-rc.N' is already set… + if [ ${{ inputs.release-type }} = "rc" ]; then + pixi run python scripts/ci/crates.py version --bump prerelease --pre-id=rc + fi + + echo If this is an 'alpha', set the version to whatever is in the git branch name.… + if [ ${{ inputs.release-type }} = "alpha" ]; then + pixi run python scripts/ci/crates.py version --exact $(pixi run python scripts/ci/crates.py get-version --from git) + fi + + echo If this is a 'final', set the version to the final release version… + if [ ${{ inputs.release-type }} = "final" ]; then + pixi run python scripts/ci/crates.py version --exact $release_version + fi + + echo Store version after the update, and the expected "final" release version… + current=$(pixi run python scripts/ci/crates.py get-version) + final=$(pixi run python scripts/ci/crates.py get-version --finalize) + + echo Output everything for use in other steps… + echo "previous=$previous" + echo "current=$current" + echo "final=$final" + + echo "previous=$previous" >> "$GITHUB_OUTPUT" + echo "current=$current" >> "$GITHUB_OUTPUT" + echo "final=$final" >> "$GITHUB_OUTPUT" + + # Pick what version we use for creating a github tag. + if [ ${{ inputs.release-type }} = "final" ]; then + git_tag=$final + else + git_tag=$current + fi + + # Verify that it wasn't created yet. + if [ $(git tag -l "$git_tag") ]; then + echo "Error: Version tag $git_tag already exists!" + exit 1 + fi + echo "git_tag=$git_tag" >> "$GITHUB_OUTPUT" + + - name: Update rerun_py & rerun_c version + run: | + pixi run python scripts/ci/update_rerun_py_and_c_version.py "${{ steps.versioning.outputs.current }}" + + - name: Update rerun_notebook package version + run: | + pixi run python scripts/ci/update_rerun_notebook_version.py "${{ steps.versioning.outputs.current }}" + + - name: Update JS package versions + run: | + pixi run node rerun_js/scripts/version.mjs "${{ steps.versioning.outputs.current }}" + + - run: pixi run toml-fmt + + # We must re-sync uv after bumping the version + - run: pixi run uv lock + + - name: Commit new version + id: commit + if: steps.versioning.outputs.previous != steps.versioning.outputs.current + run: | + git pull + git config --global user.name "rerun-bot" + git config --global user.email "bot@rerun.io" + git commit -am "Bump versions to ${{ steps.versioning.outputs.current }}" + git push + echo "version_bump_commit_sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" + + - name: Create pull request + env: + GH_TOKEN: ${{ secrets.RERUN_BOT_TOKEN }} + run: | + pr=$(gh pr view --json headRefName 2>/dev/null || echo "{}") + if echo "$pr" | jq -e '.headRefName' >/dev/null 2>&1; then + echo "PR already exists" + exit 0 + fi + + echo "PR does not exist, creating…" + + cat <<'EOF' > pr-body.txt + ### Next steps + - Test the release + - For alpha releases: + - [ ] If a GH release should be published for this alpha (give extra love to alphas deployed to Rerun Hub or when external testing is required): + - [ ] Create the GitHub release manually from the UI + - [ ] Stretch goal: generate a raw changelog and add it to the GH release with this disclaimer: + **DISCLAIMER**: This is an unreviewed, automatically generated changelog. We only provide fully reviewed changelogs for final releases. + - [ ] Merge or close the release PR + - **IFF** the release job succeeds and the link checker is happy, you may merge the PR. + - Otherwise, close the PR without merging. Cherrypick any interesting commit to `main`, but *not* the version bump one (it would introduce bad links). + - For non-alpha releases: + - For any added commits, run the release workflow in 'rc' mode again + - After testing, _ensure that this PR is mergeable to `main`_, then run the release workflow in 'final' mode + - Once the final release workflow finishes it will create a GitHub release for you. Then: + - [ ] Sanity check the build artifacts: + - [ ] pip install: does it install and run? + - [ ] cargo install of cli tool: does it install and run? + - [ ] C++ SDK zip: does it contain rerun_c for all platforms? + - [ ] Web Viewer: does it run and connect to Rerun Hub servers? + - [ ] Edit and publish the GitHub release: + - Do NOT create a GitHub release draft yourself! Let the release job do it. + - Populate the release with the changelog and a nice header video/picture + - Make sure `Set as latest release` is checked + - Click `Publish release` + - Once published, the release assets will sync to it automatically. + - [ ] Update the [google colab notebooks](https://colab.research.google.com/drive/1R9I7s4o6wydQC_zkybqaSRFTtlEaked_) to install this version and re-execute the notebook. + - [ ] Verify the auto-triggered [gradio-rerun-viewer release workflow](https://github.com/rerun-io/gradio-rerun-viewer/actions/workflows/auto_release_on_rerun.yml) succeeded (dispatched from `on_gh_release.yml` for final releases) + - [ ] Create a new branch from the prepare-release branch, rebase that one on main and sync it to reality so it can be merged. + - [ ] (A few hours later) Check on the [conda feedstock PR](https://github.com/conda-forge/rerun-sdk-feedstock/pulls) (ping Antoine and/or Nick if necessary) + + - [ ] Tests + - [ ] Windows + - [ ] Linux + - [ ] MacOS + EOF + + gh pr create \ + --base main \ + --head $(git branch --show-current) \ + --title "Release ${{ (inputs.release-type == 'alpha' && steps.versioning.outputs.current) || steps.versioning.outputs.final }}" \ + --label "⛴ release" \ + --label "exclude from changelog" \ + --fill \ + --body-file pr-body.txt + + uv-lock-check: + name: "Check uv.lock" + needs: [version] + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + ref: ${{ needs.version.outputs.release-commit }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Check uv.lock is up-to-date + run: pixi run uv-lock-check + + update-docs: + name: "Update Docs" + needs: [version, publish-web] + uses: ./.github/workflows/reusable_deploy_docs.yml + with: + CONCURRENCY: ${{ github.ref_name }} + PY_DOCS_VERSION_NAME: ${{ inputs.release-type == 'final' && needs.version.outputs.final || 'dev' }} + CPP_DOCS_VERSION_NAME: ${{ inputs.release-type == 'final' && 'stable' || 'dev' }} + JS_DOCS_VERSION_NAME: ${{ inputs.release-type == 'final' && needs.version.outputs.final || 'dev' }} + MARKDOWN_DOCS_VERSION_NAME: ${{ inputs.release-type == 'final' && needs.version.outputs.final || 'dev' }} + RELEASE_COMMIT: ${{ needs.version.outputs.release-commit }} + RELEASE_VERSION: ${{ needs.version.outputs.final }} + UPDATE_LATEST: ${{ inputs.release-type == 'final' }} + secrets: inherit + + publish-crates: + name: "Publish Crates" + if: inputs.release-type != 'alpha' || inputs.publish-crates + needs: [version, uv-lock-check] + uses: ./.github/workflows/reusable_release_crates.yml + with: + CONCURRENCY: ${{ github.ref_name }} + RELEASE_COMMIT: ${{ needs.version.outputs.release-commit }} + secrets: inherit + + publish-rerun_c: + name: "Build and Publish C/C++ SDKs" + needs: [version, uv-lock-check] + uses: ./.github/workflows/reusable_publish_rerun_c.yml + with: + release-version: ${{ needs.version.outputs.current }} + release-commit: ${{ needs.version.outputs.release-commit }} + concurrency: ${{ github.ref_name }} + secrets: inherit + + publish-rerun-cli: + name: "Publish rerun-cli" + needs: [version, uv-lock-check] + uses: ./.github/workflows/reusable_publish_rerun_cli.yml + with: + release-version: ${{ needs.version.outputs.current }} + release-commit: ${{ needs.version.outputs.release-commit }} + concurrency: ${{ github.ref_name }} + secrets: inherit + + publish-wheels: + name: "Build and Publish Wheels" + needs: [version, publish-rerun-cli] + uses: ./.github/workflows/reusable_publish_wheels.yml + with: + release-version: ${{ needs.version.outputs.current }} + concurrency: ${{ github.ref_name }} + release-commit: ${{ needs.version.outputs.release-commit }} + secrets: inherit + + web-test: + name: "Web tests" + needs: [version] + uses: ./.github/workflows/reusable_web_test.yml + with: + CONCURRENCY: ${{ github.ref_name }} + REF: ${{ needs.version.outputs.release-commit }} + secrets: inherit + + publish-web: + name: "Build and Publish Web" + needs: [version, publish-wheels, web-test] + uses: ./.github/workflows/reusable_publish_web.yml + with: + release-version: ${{ needs.version.outputs.current }} + release-commit: ${{ needs.version.outputs.release-commit }} + concurrency: ${{ github.ref_name }} + wheel-artifact-name: linux-x64-wheel + update-latest: ${{ inputs.release-type == 'final' }} + secrets: inherit + + publish-js: + name: "Publish JS" + needs: [version, uv-lock-check] + uses: ./.github/workflows/reusable_publish_js.yml + with: + release-version: ${{ needs.version.outputs.current }} + release-commit: ${{ needs.version.outputs.release-commit }} + concurrency: ${{ github.ref_name }} + secrets: inherit + + # Force-pushes `latest` and `docs-latest` to the contents of the release branch. + # The push to `docs-latest` also triggers a re-deploy of `rerun.io`. + update-latest-branch: + name: "Update Latest Branch" + if: inputs.release-type == 'final' && !cancelled() && !failure() + needs: + [ + version, + update-docs, + publish-crates, + publish-wheels, + publish-web, + publish-rerun_c, + publish-rerun-cli, + publish-js, + ] + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.RERUN_BOT_TOKEN }} + ref: ${{ needs.version.outputs.release-commit }} + + - name: Update latest branch + run: | + git config --global user.name "rerun-bot" + git config --global user.email "bot@rerun.io" + git fetch + git checkout ${{ github.ref_name }} + git push --force origin refs/heads/${{ github.ref_name }}:refs/heads/latest + git push --force origin refs/heads/${{ github.ref_name }}:refs/heads/docs-latest + + tag-release: + name: "Tag Release" + if: ${{ !cancelled() && !failure() }} + needs: + [ + version, + update-docs, + publish-crates, + publish-wheels, + publish-web, + publish-rerun_c, + publish-rerun-cli, + publish-js, + ] + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.RERUN_BOT_TOKEN }} + + - name: Release tag + env: + GH_TOKEN: ${{ secrets.RERUN_BOT_TOKEN }} + run: | + version="${{ needs.version.outputs.git_tag }}" + commit="${{ needs.version.outputs.release-commit }}" + + git tag $version $commit + git push origin $version + + - name: Create GH release + if: inputs.release-type == 'rc' || inputs.release-type == 'final' + env: + GH_TOKEN: ${{ secrets.RERUN_BOT_TOKEN }} + run: | + version="${{ needs.version.outputs.git_tag }}" + commit="${{ needs.version.outputs.release-commit }}" + + if [ ${{ inputs.release-type }} = "final" ]; then + pre_arg="" + else + pre_arg="--prerelease" + fi + + gh release create $version --verify-tag --draft --title $version $pre_arg + + - name: Create comment + if: inputs.release-type == 'rc' || inputs.release-type == 'final' + # GitHub API is very unreliable. We don't want to fail the entire workflow just because we couldn't post a comment. + continue-on-error: true + env: + GH_TOKEN: ${{ secrets.RERUN_BOT_TOKEN }} + run: | + pr_number=$(gh pr view --json number | jq '.number') + version="${{ needs.version.outputs.final }}" + + cat < comment-body.txt + The GitHub release draft for $version can be found in the [release list](https://github.com/rerun-io/rerun/releases). + + Add a description, changelog, and a nice header video/picture, then click 'Publish release'. + EOF + + gh pr comment $pr_number --body-file comment-body.txt + + # Bump versions to next minor+alpha after the release has finished, + # so that the release PR can be merged. + post-release-version-bump: + name: "Post-Release Version Bump" + # We don't need to bump versions for `rc` releases, because we don't merge those. + if: (inputs.release-type == 'alpha' || inputs.release-type == 'final') && !cancelled() && !failure() + needs: + [ + version, + update-docs, + publish-crates, + publish-wheels, + publish-web, + publish-rerun_c, + publish-rerun-cli, + publish-js, + ] + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.RERUN_BOT_TOKEN }} + + - uses: actions/setup-node@v4 + with: + node-version: "22.x" + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: git config + run: | + git config --global user.name "rerun-bot" + git config --global user.email "bot@rerun.io" + git checkout ${{ github.ref_name }} + git pull --rebase + + - name: Update crate versions + id: crates + run: | + pixi run python scripts/ci/crates.py version --bump auto + version="$(pixi run python scripts/ci/crates.py get-version)" + echo "version=$version" >> "$GITHUB_OUTPUT" + + - name: Update rerun_notebook package version + run: | + pixi run python scripts/ci/update_rerun_notebook_version.py "${{ steps.crates.outputs.version }}" + + - name: Update JS package versions + run: | + pixi run node rerun_js/scripts/version.mjs "${{ steps.crates.outputs.version }}" + + - name: Update rerun_py & rerun_c version + run: | + pixi run python scripts/ci/update_rerun_py_and_c_version.py "${{ steps.crates.outputs.version }}" + + - run: pixi run toml-fmt + + # We must re-sync uv after bumping the version + - run: pixi run uv lock + + - name: Commit new version + run: | + git commit -am "Bump versions to ${{ steps.crates.outputs.version }}" + git push + + comment-artifact-links: + name: "Link to artifacts" + if: ${{ !cancelled() && !failure() }} + needs: + [ + version, + update-docs, + publish-crates, + publish-wheels, + publish-web, + publish-rerun_c, + publish-rerun-cli, + publish-js, + ] + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.RERUN_BOT_TOKEN }} + + - name: Create comment + # GitHub API is very unreliable. We don't want to fail the entire workflow just because we couldn't post a comment. + continue-on-error: true + env: + GH_TOKEN: ${{ secrets.RERUN_BOT_TOKEN }} + run: | + pr_number=$(gh pr view --json number | jq '.number') + echo "pr_number: $pr_number" + short_commit_hash=$(echo ${{ needs.version.outputs.release-commit }} | cut -c1-7) + + if [ ${{ inputs.release-type }} = "final" ]; then + web_app_link="https://rerun.io/viewer/version/${{ needs.version.outputs.final }}" + rerun_io_docs_link="https://rerun.io/docs" + py_docs_link="https://ref.rerun.io/docs/python/${{ needs.version.outputs.final }}" + else + web_app_link="https://rerun.io/viewer/commit/$short_commit_hash" + rerun_io_docs_link="https://rerun.io/preview/$short_commit_hash/docs" + py_docs_link="https://ref.rerun.io/docs/python/dev" + fi + wheels_link="https://pypi.org/project/rerun-sdk/${{ needs.version.outputs.current }}" + crates_link="https://crates.io/crates/rerun/${{ needs.version.outputs.current }}" + npm_link="https://www.npmjs.com/package/@rerun-io/web-viewer/v/${{ needs.version.outputs.current }}" + rs_docs_link="https://docs.rs/rerun/${{ needs.version.outputs.current }}" + cpp_sdk_zip_link="https://build.rerun.io/commit/$short_commit_hash/rerun_cpp_sdk.zip" + + pip_install="pip install rerun-sdk==${{ needs.version.outputs.current }}" + cargo_install="cargo install rerun-cli@${{ needs.version.outputs.current }} --locked" + npm_install="npm install @rerun-io/web-viewer@${{ needs.version.outputs.current }}" + + cat < comment-body.txt + Version ${{ needs.version.outputs.current }} published successfully. + + | artifact | install | + | --------------------------------- | -------------- | + | [web app]($web_app_link) | | + | [wheels]($wheels_link) | $pip_install | + | [crates]($crates_link) | $cargo_install | + | [npm]($npm_link) | $npm_install | + | [docs]($rerun_io_docs_link) | | + | [py docs]($py_docs_link) | | + | [rs docs]($rs_docs_link) | | + | [cpp_sdk zip]($cpp_sdk_zip_link) | | + EOF + + gh pr comment $pr_number --body-file comment-body.txt diff --git a/.github/workflows/reusable_bench.yml b/.github/workflows/reusable_bench.yml new file mode 100644 index 0000000..5e59f79 --- /dev/null +++ b/.github/workflows/reusable_bench.yml @@ -0,0 +1,137 @@ +name: Reusable Bench + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + SAVE_BENCHES: + required: false + type: boolean + default: false + BENCH_NAME: + required: false + type: string + default: "" + COMPARE_TO: + required: false + type: string + default: "" + +concurrency: + group: ${{ inputs.CONCURRENCY }}-bench + cancel-in-progress: true + +env: + PYTHON_VERSION: "3.10" + + RUSTFLAGS: --deny warnings + RUSTDOCFLAGS: --deny warnings + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + # contents permission to update benchmark contents in gh-pages branch + contents: write + id-token: "write" + # deployments permission to deploy GitHub pages website + deployments: write + +jobs: + # --------------------------------------------------------------------------- + + rs-benchmarks: + name: Rust Criterion benchmarks + timeout-minutes: 60 + runs-on: ubuntu-latest-16-cores + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # we need full history + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - name: Set up Rust + uses: ./.github/actions/setup-rust + with: + cache_key: "build-linux" + # Cache will be produced by `reusable_checks/rs-lints` + save_cache: false + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Add SHORT_SHA env property with commit short sha + run: echo "SHORT_SHA=`echo ${{github.sha}} | cut -c1-7`" >> $GITHUB_ENV + + - name: Run benchmark + # Use bash shell so we get pipefail behavior with tee + # Running under `pixi` so we get `nasm` + run: | + pixi run cargo bench \ + --all-features \ + -p re_entity_db \ + -p re_log_encoding \ + -p re_query \ + -p re_tuid \ + -p re_video \ + -- --output-format=bencher | tee /tmp/${{ env.SHORT_SHA }} + + - name: "Set up Cloud SDK" + uses: "google-github-actions/setup-gcloud@v2" + with: + version: ">= 363.0.0" + + # TODO(jleibs) make this whole thing a python script + - name: "Upload bench to GCS based on SHA" + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: /tmp/${{ env.SHORT_SHA }} + destination: "rerun-builds/benches/" + process_gcloudignore: false + + - name: Download comparison bench from GCS + if: ${{ inputs.COMPARE_TO != '' }} + run: | + mkdir /tmp/compare/ + gsutil cp gs://rerun-builds/benches/${{inputs.COMPARE_TO}} /tmp/compare/${{ inputs.COMPARE_TO }} + + - name: Install cargo-benchcmp + run: pixi run cargo install cargo-benchcmp + + - name: Compare results with benchcmp + if: ${{ inputs.COMPARE_TO != '' }} + run: pixi run cargo benchcmp /tmp/compare/${{ inputs.COMPARE_TO }} /tmp/${{ env.SHORT_SHA }} > /tmp/bench_results.txt + + - name: "Upload bench-results to GCS" + if: ${{ inputs.COMPARE_TO != '' }} + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: /tmp/bench_results.txt + destination: "rerun-builds/commit/${{env.SHORT_SHA}}/" + process_gcloudignore: false + + - name: "Copy bench to named file" + if: ${{ inputs.BENCH_NAME != '' }} + run: cp /tmp/${{ env.SHORT_SHA }} /tmp/${{ inputs.BENCH_NAME }} + + # Don't upload the new named bench until the end in case the names are the same + - name: "Upload named bench to GCS" + if: ${{ inputs.BENCH_NAME != '' }} + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: /tmp/${{ inputs.BENCH_NAME }} + destination: "rerun-builds/benches/" + process_gcloudignore: false + + - name: Render benchmark result + if: github.ref == 'refs/heads/main' + run: | + pixi run python scripts/ci/render_bench.py crates \ + --after $(date -d"30 days ago" +%Y-%m-%d) \ + --output "gs://rerun-builds/graphs" diff --git a/.github/workflows/reusable_build_and_upload_rerun_c.yml b/.github/workflows/reusable_build_and_upload_rerun_c.yml new file mode 100644 index 0000000..c7d549f --- /dev/null +++ b/.github/workflows/reusable_build_and_upload_rerun_c.yml @@ -0,0 +1,172 @@ +name: Reusable Rerun-c Build + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + PLATFORM: + required: true + type: string + ADHOC_NAME: + required: false + type: string + default: "" + RELEASE_COMMIT: + required: false + type: string + default: "" + + workflow_dispatch: + inputs: + ADHOC_NAME: + required: false + type: string + description: "Name of the adhoc build, used for upload directory" + default: "" + PLATFORM: + type: choice + options: + - linux-arm64 + - linux-x64 + - windows-x64 + - macos-arm64 + description: "Platform to build for" + required: true + CONCURRENCY: + required: false + type: string + default: "adhoc" + description: "Concurrency group to use" + +concurrency: + group: ${{ inputs.CONCURRENCY }}-build-rerun_c + cancel-in-progress: true + +env: + RUSTFLAGS: --deny warnings + RUSTDOCFLAGS: --deny warnings + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + packages: "read" + id-token: "write" + +jobs: + set-config: + name: Set Config (${{ inputs.PLATFORM }}) + runs-on: ubuntu-latest-16-cores + outputs: + RUNNER: ${{ steps.set-config.outputs.runner }} + TARGET: ${{ steps.set-config.outputs.target }} + CONTAINER: ${{ steps.set-config.outputs.container }} + LIB_NAME: ${{ steps.set-config.outputs.lib_name }} + steps: + - name: Set runner and target based on platform + id: set-config + run: | + case "${{ inputs.PLATFORM }}" in + linux-arm64) + runner="ubuntu-arm-16-core" + target="aarch64-unknown-linux-gnu" + container="'ghcr.io/rerun-io/ci_docker:0.18.0'" + lib_name="librerun_c.a" + ;; + linux-x64) + runner="ubuntu-latest-16-cores" + target="x86_64-unknown-linux-gnu" + container="'ghcr.io/rerun-io/ci_docker:0.18.0'" + lib_name="librerun_c.a" + ;; + windows-x64) + runner="windows-latest-8-cores" + target="x86_64-pc-windows-msvc" + container="null" + lib_name="rerun_c.lib" + ;; + macos-arm64) + runner="macos-26" # Small runners, because building rerun_c is fast + target="aarch64-apple-darwin" + container="null" + lib_name="librerun_c.a" + ;; + *) echo "Invalid platform" && exit 1 ;; + esac + echo "runner=$runner" >> "$GITHUB_OUTPUT" + echo "target=$target" >> "$GITHUB_OUTPUT" + echo "container=$container" >> "$GITHUB_OUTPUT" + echo "lib_name=$lib_name" >> "$GITHUB_OUTPUT" + + rs-build-rerun_c: + name: Build rerun_c (${{ needs.set-config.outputs.RUNNER }}) + timeout-minutes: 60 + + needs: [set-config] + + runs-on: ${{ needs.set-config.outputs.RUNNER }} + container: + image: ${{ fromJson(needs.set-config.outputs.CONTAINER) }} + credentials: + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + steps: + - name: Show context + run: | + echo "GITHUB_CONTEXT": $GITHUB_CONTEXT + echo "JOB_CONTEXT": $JOB_CONTEXT + echo "INPUTS_CONTEXT": $INPUTS_CONTEXT + echo "ENV_CONTEXT": $ENV_CONTEXT + env: + ENV_CONTEXT: ${{ toJson(env) }} + GITHUB_CONTEXT: ${{ toJson(github) }} + JOB_CONTEXT: ${{ toJson(job) }} + INPUTS_CONTEXT: ${{ toJson(inputs) }} + + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.RELEASE_COMMIT || ((github.event_name == 'pull_request' && github.event.pull_request.head.ref) || '') }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Set up Rust and Authenticate to GCS + uses: ./.github/actions/setup-rust + with: + cache_key: "build-${{ inputs.PLATFORM }}" + save_cache: false + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + targets: ${{ needs.set-config.outputs.TARGET }} + + - name: Build rerun_c (release) + run: pixi run cargo build --locked -p rerun_c --release --target ${{ needs.set-config.outputs.TARGET }} + + - name: Get sha + id: get-sha + run: | + full_commit="${{ inputs.RELEASE_COMMIT || ((github.event_name == 'pull_request' && github.event.pull_request.head.sha) || github.sha) }}" + echo "sha=$(echo $full_commit | cut -c1-7)" >> "$GITHUB_OUTPUT" + + - name: "Upload rerun_c (commit)" + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "./target/${{ needs.set-config.outputs.TARGET }}/release/${{ needs.set-config.outputs.LIB_NAME }}" + destination: "rerun-builds/commit/${{ steps.get-sha.outputs.sha }}/rerun_c/${{ inputs.PLATFORM }}" + parent: false + process_gcloudignore: false + + - name: "Upload rerun_c (adhoc)" + if: ${{ inputs.ADHOC_NAME != '' }} + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "./target/${{ needs.set-config.outputs.TARGET }}/release/${{ needs.set-config.outputs.LIB_NAME }}" + destination: "rerun-builds/adhoc/${{inputs.ADHOC_NAME}}/rerun_c/${{ inputs.PLATFORM }}" + parent: false + process_gcloudignore: false diff --git a/.github/workflows/reusable_build_and_upload_rerun_cli.yml b/.github/workflows/reusable_build_and_upload_rerun_cli.yml new file mode 100644 index 0000000..3922283 --- /dev/null +++ b/.github/workflows/reusable_build_and_upload_rerun_cli.yml @@ -0,0 +1,232 @@ +name: Reusable Rerun CLI build & upload + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + PLATFORM: + required: true + type: string + ADHOC_NAME: + required: false + type: string + default: "" + RELEASE_COMMIT: + required: false + type: string + default: "" + + workflow_dispatch: + inputs: + ADHOC_NAME: + required: false + type: string + default: "" + description: "Name of the adhoc build, used for upload directory" + PLATFORM: + type: choice + options: + - linux-arm64 + - linux-x64 + - windows-x64 + - macos-arm64 + description: "Platform to build for" + required: true + CONCURRENCY: + required: false + type: string + default: "adhoc" + description: "Concurrency group to use" + +concurrency: + group: ${{ inputs.CONCURRENCY }}-build-rerun-cli + cancel-in-progress: true + +env: + PYTHON_VERSION: "3.10" + + RUSTFLAGS: --deny warnings + RUSTDOCFLAGS: --deny warnings + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + packages: "read" + id-token: "write" + +jobs: + set-config: + name: Set Config (${{ inputs.PLATFORM }}) + runs-on: ubuntu-latest + outputs: + RUNNER: ${{ steps.set-config.outputs.runner }} + TARGET: ${{ steps.set-config.outputs.target }} + CONTAINER: ${{ steps.set-config.outputs.container }} + BIN_NAME: ${{ steps.set-config.outputs.bin_name }} + steps: + - name: Set runner and target based on platform + id: set-config + run: | + case "${{ inputs.PLATFORM }}" in + linux-arm64) + runner="ubuntu-arm-16-core" + target="aarch64-unknown-linux-gnu" + container="'ghcr.io/rerun-io/ci_docker:0.18.0'" + bin_name="rerun" + ;; + linux-x64) + runner="ubuntu-latest-16-cores" + target="x86_64-unknown-linux-gnu" + container="'ghcr.io/rerun-io/ci_docker:0.18.0'" + bin_name="rerun" + ;; + windows-x64) + runner="windows-latest-16-cores" + target="x86_64-pc-windows-msvc" + container="null" + bin_name="rerun.exe" + ;; + macos-arm64) + runner="macos-26-xlarge" # See https://github.blog/2023-10-02-introducing-the-new-apple-silicon-powered-m1-macos-larger-runner-for-github-actions/ + target="aarch64-apple-darwin" + container="null" + bin_name="rerun" + ;; + *) echo "Invalid platform" && exit 1 ;; + esac + echo "runner=$runner" >> "$GITHUB_OUTPUT" + echo "target=$target" >> "$GITHUB_OUTPUT" + echo "container=$container" >> "$GITHUB_OUTPUT" + echo "bin_name=$bin_name" >> "$GITHUB_OUTPUT" + + build-rerun-cli: + name: Build rerun-cli (${{ needs.set-config.outputs.RUNNER }}) + timeout-minutes: 60 + + needs: [set-config] + + runs-on: ${{ needs.set-config.outputs.RUNNER }} + container: + image: ${{ fromJson(needs.set-config.outputs.CONTAINER) }} + credentials: + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + steps: + - name: Show context + run: | + echo "GITHUB_CONTEXT": $GITHUB_CONTEXT + echo "JOB_CONTEXT": $JOB_CONTEXT + echo "INPUTS_CONTEXT": $INPUTS_CONTEXT + echo "ENV_CONTEXT": $ENV_CONTEXT + env: + ENV_CONTEXT: ${{ toJson(env) }} + GITHUB_CONTEXT: ${{ toJson(github) }} + JOB_CONTEXT: ${{ toJson(job) }} + INPUTS_CONTEXT: ${{ toJson(inputs) }} + + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.RELEASE_COMMIT || ((github.event_name == 'pull_request' && github.event.pull_request.head.ref) || '') }} + + - name: Set up Rust and Authenticate to GCS + uses: ./.github/actions/setup-rust + with: + cache_key: "build-${{ inputs.PLATFORM }}" + save_cache: false + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + targets: ${{ needs.set-config.outputs.TARGET }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Build web-viewer (release) + run: pixi run rerun-build-web-release + + # This does not run in the pixi environment, doing so + # causes it to select the wrong compiler on macos-arm64 + - name: Build rerun-cli + run: | + pixi run cargo build \ + --locked \ + -p rerun-cli \ + --no-default-features \ + --features release_full \ + --release \ + --target ${{ needs.set-config.outputs.TARGET }} + + # Now that we already have a CLI binary, we can use it to check whether our man page is up to date. + - name: Compare man page to CLI docs + if: runner.os == 'Linux' + run: | + pixi run ./scripts/ci/check_cli_docs.py --rerun-exe "./target/${{ needs.set-config.outputs.TARGET }}/release/${{ needs.set-config.outputs.BIN_NAME }}" + + - name: Get sha + id: get-sha + run: | + full_commit="${{ inputs.RELEASE_COMMIT || ((github.event_name == 'pull_request' && github.event.pull_request.head.sha) || github.sha) }}" + echo "sha=$(echo $full_commit | cut -c1-7)" >> "$GITHUB_OUTPUT" + + # Wrap the macOS binary in a Rerun.app bundle so macOS uses "Rerun" as the + # dock label / "About" name instead of falling back to the binary filename. + - name: Bundle Rerun.app (macOS) + if: inputs.PLATFORM == 'macos-arm64' + run: | + version=$(pixi run python scripts/ci/crates.py get-version) + mkdir -p bundle-out + pixi run python scripts/ci/bundle_macos_app.py \ + --binary "./target/${{ needs.set-config.outputs.TARGET }}/release/${{ needs.set-config.outputs.BIN_NAME }}" \ + --icon crates/viewer/re_viewer/data/app_icon_mac.png \ + --info-plist scripts/ci/macos/Info.plist \ + --version "$version" \ + --output-dir bundle-out + tar -czf bundle-out/Rerun.app.tar.gz -C bundle-out Rerun.app + + - name: "Upload rerun-cli (commit)" + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "./target/${{ needs.set-config.outputs.TARGET }}/release/${{ needs.set-config.outputs.BIN_NAME }}" + destination: "rerun-builds/commit/${{ steps.get-sha.outputs.sha }}/rerun-cli/${{ inputs.PLATFORM }}" + parent: false + process_gcloudignore: false + + - name: "Upload Rerun.app (commit, macOS)" + if: inputs.PLATFORM == 'macos-arm64' + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "bundle-out/Rerun.app.tar.gz" + destination: "rerun-builds/commit/${{ steps.get-sha.outputs.sha }}/rerun-cli/${{ inputs.PLATFORM }}" + parent: false + process_gcloudignore: false + # The tarball is already gzip-compressed. Uploading with the action's default + # `gzip: true` sets `Content-Encoding: gzip` on the blob, so the download client + # transparently decompresses one layer while validating the checksum against the + # still-compressed stored hash — a guaranteed checksum mismatch. + gzip: false + + - name: "Upload rerun-cli (adhoc)" + if: ${{ inputs.ADHOC_NAME != '' }} + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "./target/${{ needs.set-config.outputs.TARGET }}/release/${{ needs.set-config.outputs.BIN_NAME }}" + destination: "rerun-builds/adhoc/${{inputs.ADHOC_NAME}}/rerun-cli/${{ inputs.PLATFORM }}" + parent: false + process_gcloudignore: false + + - name: "Upload Rerun.app (adhoc, macOS)" + if: ${{ inputs.ADHOC_NAME != '' && inputs.PLATFORM == 'macos-arm64' }} + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "bundle-out/Rerun.app.tar.gz" + destination: "rerun-builds/adhoc/${{inputs.ADHOC_NAME}}/rerun-cli/${{ inputs.PLATFORM }}" + parent: false + process_gcloudignore: false + # See the note on the commit upload above: keep the already-gzipped tarball raw. + gzip: false diff --git a/.github/workflows/reusable_build_and_upload_wheels.yml b/.github/workflows/reusable_build_and_upload_wheels.yml new file mode 100644 index 0000000..6c8a339 --- /dev/null +++ b/.github/workflows/reusable_build_and_upload_wheels.yml @@ -0,0 +1,238 @@ +name: Reusable Build Wheels + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + MODE: + description: "The build mode, either `pypi` or `pr`" + required: true + type: string + PLATFORM: + required: true + type: string + WHEEL_ARTIFACT_NAME: + required: false + type: string + default: "" + RELEASE_COMMIT: + required: false + type: string + default: "" + + workflow_dispatch: + inputs: + PLATFORM: + type: choice + options: + - linux-arm64 + - linux-x64 + - windows-x64 + - macos-arm64 + description: "Platform to build for" + required: true + MODE: + type: choice + required: false + options: + - pypi + - pr + - extra + description: "The build mode (`pypi` includes the web viewer, `pr` does not)" + CONCURRENCY: + required: false + type: string + default: "adhoc" + description: "Concurrency group to use" + WHEEL_ARTIFACT_NAME: + required: false + type: string + default: "" + description: "If set, will be saved under that name in the workflow artifacts" + RELEASE_COMMIT: + required: false + type: string + default: "" + description: "Release commit" + +concurrency: + group: ${{ inputs.CONCURRENCY }}-build-wheels + cancel-in-progress: true + +env: + PYTHON_VERSION: "3.10" + + RUSTFLAGS: --deny warnings + RUSTDOCFLAGS: --deny warnings + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + id-token: "write" + packages: "read" + +jobs: + # --------------------------------------------------------------------------- + + set-config: + name: Set Config (${{ inputs.PLATFORM }}) + runs-on: ubuntu-latest + outputs: + RUNNER: ${{ steps.set-config.outputs.runner }} + TARGET: ${{ steps.set-config.outputs.target }} + CONTAINER: ${{ steps.set-config.outputs.container }} + COMPAT: ${{ steps.set-config.outputs.compat }} + steps: + - name: Login to GHCR (with retries) + uses: nick-fields/retry@v3 + with: + timeout_seconds: 10 + max_attempts: 12 + retry_on: timeout + warning_on_retry: true + command: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin + - name: Set runner and target based on platform + id: set-config + run: | + case "${{ inputs.PLATFORM }}" in + linux-arm64) + runner="ubuntu-arm-16-core" + target="aarch64-unknown-linux-gnu" + container="'ghcr.io/rerun-io/ci_docker:0.18.0'" # Required to be manylinux compatible + compat="manylinux_2_28" + ;; + linux-x64) + runner="ubuntu-latest-16-cores" + target="x86_64-unknown-linux-gnu" + compat="manylinux_2_28" + container="'ghcr.io/rerun-io/ci_docker:0.18.0'" # Required to be manylinux compatible + ;; + windows-x64) + runner="windows-latest-32-cores" + target="x86_64-pc-windows-msvc" + container="null" + compat="manylinux_2_28" + ;; + macos-arm64) + runner="macos-26-xlarge" # See https://github.blog/2023-10-02-introducing-the-new-apple-silicon-powered-m1-macos-larger-runner-for-github-actions/ + target="aarch64-apple-darwin" + container="null" + compat="manylinux_2_28" + ;; + *) echo "Invalid platform" && exit 1 ;; + esac + echo "runner=$runner" >> "$GITHUB_OUTPUT" + echo "target=$target" >> "$GITHUB_OUTPUT" + echo "container=$container" >> "$GITHUB_OUTPUT" + echo "compat=$compat" >> "$GITHUB_OUTPUT" + + # --------------------------------------------------------------------------- + + build-wheels: + name: Build Wheels (${{ needs.set-config.outputs.RUNNER }}) + timeout-minutes: 60 + + needs: [set-config] + + runs-on: ${{ needs.set-config.outputs.RUNNER }} + container: + image: ${{ fromJson(needs.set-config.outputs.CONTAINER) }} + credentials: + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + steps: + - name: Show context + run: | + echo "GITHUB_CONTEXT": $GITHUB_CONTEXT + echo "JOB_CONTEXT": $JOB_CONTEXT + echo "INPUTS_CONTEXT": $INPUTS_CONTEXT + echo "ENV_CONTEXT": $ENV_CONTEXT + env: + ENV_CONTEXT: ${{ toJson(env) }} + GITHUB_CONTEXT: ${{ toJson(github) }} + JOB_CONTEXT: ${{ toJson(job) }} + INPUTS_CONTEXT: ${{ toJson(inputs) }} + + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.RELEASE_COMMIT || ((github.event_name == 'pull_request' && github.event.pull_request.head.ref) || '') }} + + - name: Set up Rust and Authenticate to GCS + uses: ./.github/actions/setup-rust + with: + cache_key: "build-${{ inputs.PLATFORM }}" + # Cache will be produced by `reusable_checks/rs-lints` + save_cache: false + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + targets: ${{ needs.set-config.outputs.TARGET }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Get sha + id: get-sha + run: | + full_commit="${{ inputs.RELEASE_COMMIT || ((github.event_name == 'pull_request' && github.event.pull_request.head.sha) || github.sha) }}" + echo "sha=$(echo $full_commit | cut -c1-7)" >> "$GITHUB_OUTPUT" + + - name: "Download rerun-cli" + run: | + if [ "${{ inputs.PLATFORM }}" = "macos-arm64" ]; then + # macOS gets the Rerun.app bundle so the dock label reads "Rerun" + # (see scripts/ci/bundle_macos_app.py). + pixi run fetch-artifact \ + --commit-sha ${{ steps.get-sha.outputs.sha }} \ + --artifact rerun-cli-macos-app \ + --platform ${{ inputs.PLATFORM }} \ + --dest rerun_py/rerun_sdk/rerun_cli + else + pixi run fetch-artifact \ + --commit-sha ${{ steps.get-sha.outputs.sha }} \ + --artifact rerun-cli \ + --platform ${{ inputs.PLATFORM }} \ + --dest rerun_py/rerun_sdk/rerun_cli + fi + + - name: Build + run: | + pixi run uvpy scripts/ci/build_and_upload_wheels.py \ + --mode ${{ inputs.MODE }} \ + --target ${{ needs.set-config.outputs.TARGET }} \ + --dir commit/${{ steps.get-sha.outputs.sha }}/wheels \ + --compat ${{ needs.set-config.outputs.COMPAT }} \ + --upload-gcs + + - name: Save wheel artifact + if: ${{ inputs.WHEEL_ARTIFACT_NAME != '' }} + uses: actions/upload-artifact@v4 + with: + name: ${{inputs.WHEEL_ARTIFACT_NAME}} + path: dist/${{ needs.set-config.outputs.TARGET }} + + # --------------------------------------------------------------------------- + # rerun_notebook support + + - name: "Build rerun_notebook" + # only build the notebook if we are building for pypi and running linux-x64 + if: ${{ (inputs.MODE == 'pypi' || inputs.MODE == 'extra') && inputs.PLATFORM == 'linux-x64' }} + run: | + rm -rf dist + pixi run js-build-base + pixi run uvpy scripts/ci/build_and_upload_rerun_notebook.py \ + --dir commit/${{ steps.get-sha.outputs.sha }}/wheels \ + --notebook-dir commit/${{ steps.get-sha.outputs.sha }}/notebook + + - name: Save rerun_notebook wheel artifact + if: ${{ (inputs.MODE == 'pypi' || inputs.MODE == 'extra') && inputs.PLATFORM == 'linux-x64' }} + uses: actions/upload-artifact@v4 + with: + name: rerun_notebook_wheel + path: dist diff --git a/.github/workflows/reusable_build_examples.yml b/.github/workflows/reusable_build_examples.yml new file mode 100644 index 0000000..4f02e62 --- /dev/null +++ b/.github/workflows/reusable_build_examples.yml @@ -0,0 +1,104 @@ +name: Reusable Build Examples + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + WHEEL_ARTIFACT_NAME: + required: true + type: string + CHANNEL: # `nightly`/`main`/`pr` + required: true + type: string + +concurrency: + group: ${{ inputs.CONCURRENCY }}-build-examples + cancel-in-progress: true + +env: + RUSTFLAGS: --deny warnings + RUSTDOCFLAGS: --deny warnings + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + id-token: "write" + +jobs: + rs-build-examples: + name: Build Examples + timeout-minutes: 60 + runs-on: ubuntu-latest-16-cores + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ (github.event_name == 'pull_request' && github.event.pull_request.head.ref) || '' }} + lfs: true + + - name: Set up Rust + uses: ./.github/actions/setup-rust + with: + cache_key: "build-web" + save_cache: false + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Download Rerun Wheel + uses: actions/download-artifact@v4 + with: + name: ${{ inputs.WHEEL_ARTIFACT_NAME }} + path: wheel + + - name: Download Rerun Notebook Wheel + uses: actions/download-artifact@v4 + with: + name: rerun_notebook_wheel + path: wheel + + - name: Install built wheel + run: | + pixi run python scripts/ci/uv_install_wheel.py --package rerun-sdk --dir wheel + pixi run python scripts/ci/uv_install_wheel.py --package rerun-notebook --dir wheel --platform-independent + + - name: Print wheel version + run: | + pixi run uv pip show rerun-sdk + pixi run uv pip show rerun-notebook + pixi run uvpy -m rerun --version + + - name: Get sha + id: get-sha + run: | + full_commit="${{ (github.event_name == 'pull_request' && github.event.pull_request.head.sha) || github.sha }}" + echo "sha=$(echo $full_commit | cut -c1-7)" >> "$GITHUB_OUTPUT" + + - name: Build examples + run: | + pixi run build-examples rrd --install \ + --channel ${{ inputs.CHANNEL }} \ + example_data + + - name: Build notebooks + run: | + pixi run build-examples notebook \ + --channel ${{ inputs.CHANNEL }} + + - name: Build & run snippets + run: | + pixi run build-examples snippets \ + example_data/snippets + + - name: Upload assets + uses: actions/upload-artifact@v4 + with: + name: example_data + path: example_data diff --git a/.github/workflows/reusable_build_js.yml b/.github/workflows/reusable_build_js.yml new file mode 100644 index 0000000..1bb9ee9 --- /dev/null +++ b/.github/workflows/reusable_build_js.yml @@ -0,0 +1,73 @@ +name: Reusable Build rerun_js + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + +concurrency: + group: ${{ inputs.CONCURRENCY }}-build-js + cancel-in-progress: true + +env: + RUSTFLAGS: --deny warnings + RUSTDOCFLAGS: --deny warnings + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + id-token: "write" + +jobs: + build: + name: Build rerun_js + timeout-minutes: 60 + runs-on: ubuntu-latest-16-cores + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - uses: actions/setup-node@v4 + with: + node-version: "22.x" + + - name: Install Yarn + run: npm install -g yarn + + - name: Set up Rust + uses: ./.github/actions/setup-rust + with: + cache_key: "build-web" + # Cache will be produced by `reusable_checks/rs-check-wasm` + save_cache: false + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Install yarn dependencies + run: pixi run yarn --cwd rerun_js install + + - name: Build rerun_js package + run: pixi run yarn --cwd rerun_js workspaces run build + + - name: Package rerun_js + run: | + pixi run yarn --cwd rerun_js workspaces run pack + mkdir rerun_js_package + cp rerun_js/*/*.tar.gz rerun_js_package/ + + - name: Upload rerun_js + uses: actions/upload-artifact@v4 + with: + name: rerun_js + path: rerun_js_package + compression-level: 0 # already compressed diff --git a/.github/workflows/reusable_build_web.yml b/.github/workflows/reusable_build_web.yml new file mode 100644 index 0000000..bf2cdba --- /dev/null +++ b/.github/workflows/reusable_build_web.yml @@ -0,0 +1,126 @@ +name: Reusable Build web viewer + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + RELEASE_VERSION: + required: false + type: string + default: "prerelease" + CHANNEL: # `nightly` or `main` + required: true + type: string + +concurrency: + group: ${{ inputs.CONCURRENCY }}-build-web + cancel-in-progress: true + +env: + RUSTFLAGS: --deny warnings + RUSTDOCFLAGS: --deny warnings + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "write" + id-token: "write" + pull-requests: "write" + +jobs: + rs-build-web-viewer: + name: Build web viewer + timeout-minutes: 60 + runs-on: ubuntu-latest-16-cores + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - name: Get sha + id: get-sha + run: | + full_commit="${{ (github.event_name == 'pull_request' && github.event.pull_request.head.sha) || github.sha }}" + echo "sha=$(echo $full_commit | cut -c1-7)" >> "$GITHUB_OUTPUT" + + - name: Status comment + if: github.event_name == 'pull_request' + # https://github.com/mshick/add-pr-comment + uses: mshick/add-pr-comment@v3.9.1 + # GitHub API is very unreliable. We don't want to fail the entire workflow just because we couldn't post a comment. + continue-on-error: true + with: + message-id: "web-viewer-build-status" + repo-token: ${{ secrets.GITHUB_TOKEN }} + message: | + Web viewer is being built. + + | Result | Commit | Link | Manifest | + | ------ | ------- | ----- | -------- | + | ⏳ | ${{ steps.get-sha.outputs.sha }} | https://rerun.io/viewer/pr/${{ github.event.pull_request.number }} | [`+nightly`](https://rerun.io/viewer/pr/${{ github.event.pull_request.number }}?manifest_url=https://app.rerun.io/version/nightly/examples_manifest.json) [`+main`](https://rerun.io/viewer/pr/${{ github.event.pull_request.number }}?manifest_url=https://app.rerun.io/version/main/examples_manifest.json) | + + View image diff on [kitdiff](https://rerun-io.github.io/kitdiff/?url=${{github.event.pull_request.html_url}}). + + Note: This comment is updated whenever you push a commit. + + - name: Set up Rust + uses: ./.github/actions/setup-rust + with: + cache_key: "build-web" + # Cache will be produced by `reusable_checks/rs-check-wasm` + save_cache: false + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Build web-viewer (release) + run: | + if [ ${{ inputs.CHANNEL }} = "nightly" ]; then + export DEFAULT_EXAMPLES_MANIFEST_URL="https://app.rerun.io/version/nightly/examples_manifest.json" + fi + pixi run rerun-build-web-release + + # We build a single manifest pointing to the `commit` + # All the `pr`, `main`, release tag, etc. variants will always just point to the resolved commit + - name: Build examples manifest + run: | + full_commit="${{ (github.event_name == 'pull_request' && github.event.pull_request.head.sha) || github.sha }}" + sha="$(echo $full_commit | cut -c1-7)" + + pixi run build-examples manifest \ + --base-url "https://app.rerun.io/commit/$sha" \ + --channel "${{ inputs.CHANNEL }}" \ + "crates/viewer/re_web_viewer_server/web_viewer/examples_manifest.json" + + - name: Upload web viewer + uses: actions/upload-artifact@v4 + with: + name: web_viewer + path: "crates/viewer/re_web_viewer_server/web_viewer" + + - name: Status comment + if: failure() && github.event_name == 'pull_request' + # https://github.com/mshick/add-pr-comment + uses: mshick/add-pr-comment@v3.9.1 + # GitHub API is very unreliable. We don't want to fail the entire workflow just because we couldn't post a comment. + continue-on-error: true + with: + message-id: "web-viewer-build-status" + repo-token: ${{ secrets.GITHUB_TOKEN }} + message: | + Web viewer failed to build. + + | Result | Commit | Link | Manifest | + | ------ | ------- | ----- | -------- | + | ❌ | ${{ steps.get-sha.outputs.sha }} | https://rerun.io/viewer/pr/${{ github.event.pull_request.number }} | [`+nightly`](https://rerun.io/viewer/pr/${{ github.event.pull_request.number }}?manifest_url=https://app.rerun.io/version/nightly/examples_manifest.json) [`+main`](https://rerun.io/viewer/pr/${{ github.event.pull_request.number }}?manifest_url=https://app.rerun.io/version/main/examples_manifest.json) | + + View image diff on [kitdiff](https://rerun-io.github.io/kitdiff/?url=${{github.event.pull_request.html_url}}). + + Note: This comment is updated whenever you push a commit. diff --git a/.github/workflows/reusable_bundle_and_upload_rerun_cpp.yml b/.github/workflows/reusable_bundle_and_upload_rerun_cpp.yml new file mode 100644 index 0000000..bedf940 --- /dev/null +++ b/.github/workflows/reusable_bundle_and_upload_rerun_cpp.yml @@ -0,0 +1,61 @@ +name: Reusable C++ bundling and upload + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + PLATFORM_FILTER: + required: false + type: string + RELEASE_COMMIT: + required: false + type: string + default: "" + +concurrency: + group: ${{ inputs.CONCURRENCY }}-bundle-and-upload-rerun-cpp + cancel-in-progress: true + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + id-token: "write" + +jobs: + bundle-and-upload-rerun_cpp: + name: Bundle and upload rerun_cpp_sdk.zip + runs-on: ubuntu-24.04 + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + ref: ${{ inputs.RELEASE_COMMIT || ((github.event_name == 'pull_request' && github.event.pull_request.head.ref) || '') }} + + - id: "auth" + uses: google-github-actions/auth@v2 + with: + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - name: "Set up Cloud SDK" + uses: "google-github-actions/setup-gcloud@v2" + with: + version: ">= 363.0.0" + + - name: Install python gcs library + run: | + pip3 install google-cloud-storage + + - name: Get sha + id: get-sha + run: | + full_commit="${{ inputs.RELEASE_COMMIT || ((github.event_name == 'pull_request' && github.event.pull_request.head.sha) || github.sha) }}" + echo "sha=$(echo $full_commit | cut -c1-7)" >> "$GITHUB_OUTPUT" + + - name: "Bundle and upload rerun_cpp_sdk.zip" + run: python3 ./scripts/ci/bundle_and_upload_rerun_cpp.py --git-hash ${{ steps.get-sha.outputs.sha }} --platform-filter=${{ inputs.PLATFORM_FILTER }} diff --git a/.github/workflows/reusable_checks.yml b/.github/workflows/reusable_checks.yml new file mode 100644 index 0000000..e546564 --- /dev/null +++ b/.github/workflows/reusable_checks.yml @@ -0,0 +1,346 @@ +name: "General checks: Lints, Tests, Docs" + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + CHANNEL: # `nightly`/`main`/`pr` + required: true + type: string + +concurrency: + group: ${{ inputs.CONCURRENCY }}-checks + cancel-in-progress: true + +env: + PYTHON_VERSION: "3.10" + + RUSTFLAGS: --deny warnings + RUSTDOCFLAGS: --deny warnings + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + id-token: "write" + +jobs: + no-codegen-changes: + name: Check if running codegen would produce any changes + timeout-minutes: 60 + runs-on: ubuntu-latest-16-cores + steps: + # Note: We explicitly don't override `ref` here. We need to see if changes would be made + # in a context where we have merged with main. Otherwise we might miss changes such as one + # PR introduces a new type and another PR changes the codegen. + - uses: actions/checkout@v4 + + - name: Set up Rust + uses: ./.github/actions/setup-rust + with: + cache_key: "build-linux" + save_cache: true + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Codegen check + run: pixi run codegen --force --check --warnings-as-errors + + - name: Codegen out-of-sync (protos) + run: pixi run codegen-protos-check + + # --------------------------------------------------------------------------- + + # NOTE: We don't want spurious failures caused by issues being closed, so this does not run on CI, + # at least for the time being. + # - name: Check for zombie TODOs + # run: | + # pixi run ./scripts/zombie_todos.py --token ${{ secrets.GITHUB_TOKEN }} + + rerun-lints: + name: Rerun lints + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Rerun lints + run: pixi run lint-rerun + + - name: Check dependencies + run: pixi run scripts/check_utils_dependencies.py + + - name: Check forbidden dependencies + run: pixi run python scripts/check_forbidden_dependencies.py + + - name: Check skills + run: pixi run python scripts/ci/check_skills.py + + toml-format-check: + name: Toml format check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Toml format check + run: pixi run toml-fmt-check + + uv-lock-check: + name: Check uv.lock is up-to-date + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Check uv.lock + run: pixi run uv-lock-check + + check-too-large-files: + name: Check for too large files + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Check for too large files + run: pixi run check-large-files + + check-publish-flags: + name: Check for wrong publish flags + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Check for wrong publish flags + run: pixi run check-publish-flags + + check-example-thumbnails: + name: Check example thumbnails + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Check example thumbnails + # Use uv run --frozen python instead of uvpy. + # It's nice to get valid checks here even if the uv lockfile is out-of-date + # uv-lock-check will independently validate the lockfile status. + run: pixi run uv run --frozen python ./scripts/ci/thumbnails.py check + + check-doc-order: + name: Check docs order + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Check docs order + run: pixi run uv run --frozen python ./scripts/ci/check_doc_order.py + + check-no-d2-code-blocks: + name: Check for D2 code blocks + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Check for D2 code blocks + # Use uv run --frozen python instead of uvpy. + # It's nice to get valid checks here even if the uv lockfile is out-of-date + # uv-lock-check will independently validate the lockfile status. + run: pixi run uv run --frozen python ./scripts/ci/check_d2_diagrams.py + + check-example-manifest-coverage: + name: Check example manifest coverage + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Check example manifest coverage + run: pixi run ./scripts/check_example_manifest_coverage.py + + - name: Check the migration guide redirect + run: pixi run python scripts/ci/check_migration_guide_redirect.py + + lint-md: + name: Lint markdown + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Run linter + run: | + # Single quoted because pixi does its own glob expansion + pixi run mdlint --glob 'docs/content/**/*.md' + pixi run mdlint --glob 'examples/python/*/README.md' + pixi run mdlint --glob 'examples/cpp/*/README.md' + pixi run mdlint --glob 'examples/rust/*/README.md' + + # --------------------------------------------------------------------------- + + spell-check: + name: Spell Check + runs-on: ubuntu-latest + steps: + - name: Checkout Actions Repository + uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - name: Check spelling of entire workspace + uses: crate-ci/typos@v1.45.1 + + # --------------------------------------------------------------------------- + + misc-formatting: + name: Misc formatting + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: prettier --check + run: pixi run misc-fmt-check + + # --------------------------------------------------------------------------- + + link-checker: + name: Check links + runs-on: ubuntu-latest + # do not fail entire workflow (e.g. nightly) if this is the only failing check + continue-on-error: true + env: + # lychee uses this to avoid GitHub rate limiting when checking github.com links. + # See https://github.com/lycheeverse/lychee#github-token + GITHUB_TOKEN: ${{ github.token }} + steps: + - uses: actions/checkout@v4 + with: + # For PRs, we need to fetch the base branch to compare against + fetch-depth: 0 + + - name: Set up Python + if: github.event_name == 'pull_request' + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Restore lychee cache + id: restore-cache + uses: actions/cache/restore@v4 + with: + path: .lycheecache + key: cache-lychee-${{ github.sha }} + restore-keys: cache-lychee- + + - name: Set up pixi for PR Link Checker + if: ${{ inputs.CHANNEL == 'pr' }} + uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + # For PRs: Check only links in added lines + - name: PR Link Checker (added lines only) + if: ${{ inputs.CHANNEL == 'pr' }} + run: | + # Fetch the base branch + git fetch origin ${{ github.base_ref }}:${{ github.base_ref }} + + # Run our custom PR link checker + pixi run link-check-pr origin/${{ github.base_ref }} + + # For nightly: Check all links in the entire codebase + - name: Full Link Checker + if: ${{ inputs.CHANNEL == 'nightly' }} + id: lychee + uses: lycheeverse/lychee-action@v2.8.0 + with: + fail: true + lycheeVersion: "v0.23.0" + # When given a directory, lychee checks only markdown, html and text files, everything else we have to glob in manually. + # If updating version or args update the pixi.toml to match. + args: | + --cache --max-cache-age 1d . --root-dir $(pwd) "**/*.md" "**/*.rs" "**/*.toml" "**/*.hpp" "**/*.cpp" "**/CMakeLists.txt" "**/*.py" "**/*.yml" diff --git a/.github/workflows/reusable_checks_cpp.yml b/.github/workflows/reusable_checks_cpp.yml new file mode 100644 index 0000000..8907042 --- /dev/null +++ b/.github/workflows/reusable_checks_cpp.yml @@ -0,0 +1,122 @@ +name: "C++ Tests on all platforms & compilers" + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + CHANNEL: + required: false + type: string # enum: 'nightly', 'main', or 'pr' + + workflow_dispatch: + inputs: + CONCURRENCY: + required: false + type: string + default: "adhoc" + CHANNEL: + required: false + type: string # enum: 'nightly', 'main', or 'pr' + +concurrency: + group: ${{ inputs.CONCURRENCY }}-checks_cpp + cancel-in-progress: true + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + id-token: "write" + +jobs: + matrix_prep: + runs-on: ubuntu-latest + outputs: + MATRIX: ${{ steps.set-matrix.outputs.matrix }} + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + - name: Load C++ test matrix + id: set-matrix + run: echo "matrix=$(jq -c . < ./.github/workflows/cpp_matrix_full.json)" >> $GITHUB_OUTPUT + + cpp-tests: + name: C++ build & test - ${{ matrix.name }} + timeout-minutes: 60 + needs: matrix_prep + strategy: + matrix: ${{ fromJson(needs.matrix_prep.outputs.MATRIX) }} + runs-on: ${{ matrix.runs_on }} + steps: + # Skipping the entire step would apparently require a separate job, not doing that here. + # Instead we keep checking for the `matrix.pr_ci` flag. + # See https://stackoverflow.com/questions/77186893/how-can-i-skip-the-whole-job-for-a-matrix-match-in-github-action + - uses: actions/checkout@v4 + if: ${{ github.event_name != 'pull_request' || matrix.pr_ci != false }} + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + if: ${{ github.event_name != 'pull_request' || matrix.pr_ci != false }} + with: + pixi-version: v0.71.3 + environments: cpp + + - name: Set up Rust + uses: ./.github/actions/setup-rust + if: ${{ github.event_name != 'pull_request' || matrix.pr_ci != false }} + with: + cache_key: ${{ matrix.cache_key }} + # Cache will be produced by `reusable_checks/rs-lints` + save_cache: false + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + # Workaround for ASAN issues on Github images https://github.com/actions/runner-images/issues/9491 + - name: Fix kernel mmap rnd bits + if: ${{ (github.event_name != 'pull_request' || matrix.pr_ci != false) && runner.os == 'Linux' }} + # Asan in llvm 14 provided in ubuntu 22.04 is incompatible with + # high-entropy ASLR in much newer kernels that GitHub runners are + # using leading to random crashes: https://reviews.llvm.org/D148280 + run: sudo sysctl vm.mmap_rnd_bits=28 + + - name: pixi run -e cpp cpp-clean + if: ${{ github.event_name != 'pull_request' || matrix.pr_ci != false }} + run: pixi run -e cpp cpp-clean + + - name: pixi run -e cpp cpp-build-all + if: ${{ github.event_name != 'pull_request' || matrix.pr_ci != false }} + run: ${{ matrix.extra_env_vars }} RERUN_WERROR=ON pixi run -e cpp cpp-build-all + + - name: pixi run -e cpp cpp-test + if: ${{ github.event_name != 'pull_request' || matrix.pr_ci != false }} + run: ${{ matrix.extra_env_vars }} RERUN_WERROR=ON pixi run -e cpp cpp-test + + - name: pixi run -e cpp cpp-build-all-shared-libs + if: ${{ inputs.CHANNEL == 'nightly' }} + run: ${{ matrix.extra_env_vars }} RERUN_WERROR=ON pixi run -e cpp cpp-build-all-shared-libs + + - name: additional_commands + if: ${{ github.event_name != 'pull_request' || matrix.pr_ci != false }} + run: ${{ matrix.additional_commands }} + + cpp-formatting: + name: C++ formatting check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + environments: cpp + + - name: Run clang format on all relevant files + run: pixi run -e cpp cpp-fmt-check diff --git a/.github/workflows/reusable_checks_doc_redirects.yml b/.github/workflows/reusable_checks_doc_redirects.yml new file mode 100644 index 0000000..8ce9aab --- /dev/null +++ b/.github/workflows/reusable_checks_doc_redirects.yml @@ -0,0 +1,36 @@ +name: "Doc Redirects Check" + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + +concurrency: + group: ${{ inputs.CONCURRENCY }}-checks_doc_redirects + cancel-in-progress: true + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + +jobs: + check-doc-redirects: + name: Check doc redirects + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || '' }} + fetch-depth: 0 # Need full history for git diff against main + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Check doc redirects + run: pixi run python scripts/ci/check_doc_redirects.py --base origin/main diff --git a/.github/workflows/reusable_checks_protobuf.yml b/.github/workflows/reusable_checks_protobuf.yml new file mode 100644 index 0000000..d8c8343 --- /dev/null +++ b/.github/workflows/reusable_checks_protobuf.yml @@ -0,0 +1,61 @@ +name: "Protobuf Checks: lints, BW compatibility, formatting, etc" + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + +concurrency: + group: ${{ inputs.CONCURRENCY }}-checks_protobuf + cancel-in-progress: true + +env: + # Make sure that git will not try and perform any kind of LFS filtering, otherwise + # this will completely break `buf` which invokes `git` under the hood. + GIT_LFS_SKIP_SMUDGE: 1 + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + id-token: "write" + +jobs: + pb-check: + name: "Protobuf Checks: lints, BW compatibility, formatting, etc" + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Fetch latest main (so we can grab the current schema snapshot) + run: time git fetch origin main # yes, we need full --depth for `buf` to work + + # NOTE(cmc): I'm keeping all the snapshot machinery around if it turns out we need something more robust + # than a pure git solution in the future. For now, convenience wins. + # + # - name: Schema snapshot out-of-sync + # run: pixi run pb-snapshot-check + # # continue-on-error: true + # + - name: Breaking changes + run: pixi run -q pb-breaking + if: success() || failure() # trigger this step even if the previous one failed + + - name: Lints + run: pixi run pb-lint + if: success() || failure() # trigger this step even if the previous one failed + + - name: Formatting + run: pixi run pb-fmt-check + if: success() || failure() # trigger this step even if the previous one failed diff --git a/.github/workflows/reusable_checks_python.yml b/.github/workflows/reusable_checks_python.yml new file mode 100644 index 0000000..80795f4 --- /dev/null +++ b/.github/workflows/reusable_checks_python.yml @@ -0,0 +1,85 @@ +name: "Python Checks: Lints & Docs" + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + +concurrency: + group: ${{ inputs.CONCURRENCY }}-checks_python + cancel-in-progress: true + +env: + PYTHON_VERSION: "3.10" + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + id-token: "write" + +jobs: + # --------------------------------------------------------------------------- + + py-lints: + name: Python lints (ruff, mypy, …) + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Python format check + run: pixi run py-fmt-check + + - name: Lint Python + run: pixi run py-lint + + - name: Notebook strip check + run: pixi run nb-strip-check + + # --------------------------------------------------------------------------- + + py-test-notebook: + name: Notebook widget unit tests + timeout-minutes: 10 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Run notebook tests + run: pixi run py-test-notebook + + # --------------------------------------------------------------------------- + + py-test-docs: + name: Test Python Docs + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Build via mkdocs + run: | + pixi run uv run --group docs mkdocs build --strict -f rerun_py/mkdocs.yml diff --git a/.github/workflows/reusable_checks_rust.yml b/.github/workflows/reusable_checks_rust.yml new file mode 100644 index 0000000..229160b --- /dev/null +++ b/.github/workflows/reusable_checks_rust.yml @@ -0,0 +1,271 @@ +name: "Rust Checks: Lints, Tests, Docs" + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + CHANNEL: + required: false + type: string # enum: 'nightly', 'main', or 'pr' + +concurrency: + group: ${{ inputs.CONCURRENCY }}-checks_rust + cancel-in-progress: true + +env: + RUSTFLAGS: --deny warnings + RUSTDOCFLAGS: --deny warnings + + # Improve diagnostics for crashes. + RUST_BACKTRACE: full + + # Sourced from https://vulkan.lunarg.com/sdk/home#linux + VULKAN_SDK_VERSION: "1.3.290.0" + + # Via: https://nexte.st/docs/installation/pre-built-binaries/#using-nextest-in-github-actions + # ANSI color codes should be supported by default on GitHub Actions. + CARGO_TERM_COLOR: always + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + id-token: "write" + +jobs: + # --------------------------------------------------------------------------- + + rs-lints: + name: Rust lints (fmt, check, clippy, doc) + timeout-minutes: 60 + runs-on: ubuntu-latest-16-cores + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + lfs: true + + - name: Set up Rust + uses: ./.github/actions/setup-rust + with: + cache_key: "build-linux" + save_cache: true + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Rust checks (PR subset) + if: ${{ inputs.CHANNEL == 'pr' }} + run: pixi run rs-check --only base_checks sdk_variations cargo_deny denied_sdk_deps wasm docs + + - name: Rust most checks (`main` branch subset) + if: ${{ inputs.CHANNEL == 'main' }} + run: pixi run rs-check --skip individual_crates docs_slow tests tests_without_all_features # Tests run in a separate job + + - name: Rust all checks (nightly) + if: ${{ inputs.CHANNEL == 'nightly' }} + run: pixi run rs-check --skip tests tests_without_all_features # Tests run in a separate job + + - name: .rrd backwards compatibility + # We don't yet guarantee backwards compatibility, but we at least check it + # so that we _know_ if/when we break it. + # See tests/assets/rrd/README.md for more + run: pixi run check-backwards-compatibility + + - name: Check dependency tree (no cycles) + run: pixi run python scripts/ci/crates.py check-dependency-tree + + rs-tests: + name: Test on Linux + timeout-minutes: 60 + runs-on: ubuntu-latest-16-cores + env: + RUSTDOCFLAGS: "" + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + lfs: true + + - name: Set up Rust + uses: ./.github/actions/setup-rust + with: + cache_key: "build-linux" + save_cache: true + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + # Install the Vulkan SDK, so we can use the software rasterizer. + # TODO(andreas): It would be nice if `setup_software_rasterizer.py` could do that for us as well (note though that this action here is very fast when cached!) + - name: Install Vulkan SDK + uses: rerun-io/install-vulkan-sdk-action@v1.1.0 + with: + vulkan_version: ${{ env.VULKAN_SDK_VERSION }} + install_runtime: true + cache: true + stripdown: true + + - name: Setup software rasterizer + run: pixi run python ./scripts/ci/setup_software_rasterizer.py + + - name: Rust tests + run: pixi run rs-check --only tests + + - name: Rust tests without --all-features (`main`/`nightly` channel) + if: ${{ inputs.CHANNEL != 'pr' }} + run: pixi run rs-check --only tests_without_all_features + + - name: Upload test results + uses: actions/upload-artifact@v4 + if: always() + with: + name: test-results-linux + path: | + **/tests/snapshots + **/tests/failures + + # Run tests on Mac and Windows (main channel) + mac-windows-tests-main: + name: Tests only (main) + timeout-minutes: 100 # Windows is very slow + strategy: + matrix: + include: + - runs_on: "macos-26-xlarge" + name: "macos" + - runs_on: "windows-latest-32-cores" + name: "windows" + + if: ${{ inputs.CHANNEL == 'main' }} + runs-on: ${{ matrix.runs_on }} + steps: + - uses: actions/checkout@v4 + with: + lfs: true + + - name: Set up Rust + uses: ./.github/actions/setup-rust + with: + cache_key: "build-${{ matrix.name }}" + save_cache: true + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + # Building with `--all-features` requires extra build tools like `nasm`. + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + # Install the Vulkan SDK, so we can use the software rasterizer. + # TODO(andreas): It would be nice if `setup_software_rasterizer.py` could do that for us as well (note though that this action here is very fast when cached!) + - name: Install Vulkan SDK + uses: rerun-io/install-vulkan-sdk-action@v1.1.0 + with: + vulkan_version: ${{ env.VULKAN_SDK_VERSION }} + install_runtime: true + cache: true + stripdown: true + + - name: Setup software rasterizer + run: pixi run python ./scripts/ci/setup_software_rasterizer.py + + - name: Rust tests + run: pixi run rs-check --only tests + + - name: Upload test results + uses: actions/upload-artifact@v4 + if: always() + with: + name: test-results-${{ matrix.name }} + path: | + **/tests/snapshots + **/tests/failures + + # Run all checks on Mac and Windows (nightly channel, split across multiple jobs) + mac-windows-checks-nightly: + name: ${{ matrix.platform.name }}${{ matrix.checks_group.label }} + timeout-minutes: 100 # Windows is very slow + strategy: + fail-fast: false + matrix: + platform: + - runs_on: "macos-26-xlarge" + name: "macos" + - runs_on: "windows-latest-32-cores" + name: "windows" + + checks_group: + - name: "base-and-deny" + checks: "base_checks sdk_variations cargo_deny denied_sdk_deps" + label: " (base & deny)" + - name: "wasm-and-examples" + checks: "wasm individual_examples" + label: " (wasm & examples)" + - name: "individual-crates" + checks: "individual_crates" + label: " (individual crates)" + - name: "docs" + checks: "docs docs_slow" + label: " (docs)" + - name: "tests" + checks: "tests" + label: " (tests)" + - name: "tests-default-features" + checks: "tests_without_all_features" + label: " (tests default features)" + + if: ${{ inputs.CHANNEL == 'nightly' }} + runs-on: ${{ matrix.platform.runs_on }} + steps: + - uses: actions/checkout@v4 + with: + lfs: true + + - name: Set up Rust + uses: ./.github/actions/setup-rust + with: + cache_key: "build-${{ matrix.platform.name }}-${{ matrix.checks_group.name }}" + save_cache: true + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + # Building with `--all-features` requires extra build tools like `nasm`. + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + # Install the Vulkan SDK, so we can use the software rasterizer. + # TODO(andreas): It would be nice if `setup_software_rasterizer.py` could do that for us as well (note though that this action here is very fast when cached!) + - name: Install Vulkan SDK + uses: rerun-io/install-vulkan-sdk-action@v1.1.0 + with: + vulkan_version: ${{ env.VULKAN_SDK_VERSION }} + install_runtime: true + cache: true + stripdown: true + + - name: Setup software rasterizer + run: pixi run python ./scripts/ci/setup_software_rasterizer.py + + - name: Rust checks + run: pixi run rs-check --only ${{ matrix.checks_group.checks }} + + - name: Upload test results + uses: actions/upload-artifact@v4 + if: always() + with: + name: test-results-${{ matrix.platform.name }}-${{ matrix.checks_group.name }} + path: | + **/tests/snapshots + **/tests/failures diff --git a/.github/workflows/reusable_deploy_docs.yml b/.github/workflows/reusable_deploy_docs.yml new file mode 100644 index 0000000..8442472 --- /dev/null +++ b/.github/workflows/reusable_deploy_docs.yml @@ -0,0 +1,246 @@ +name: "Reusable Deploy Docs" + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + JS_DOCS_VERSION_NAME: + required: true + type: string + PY_DOCS_VERSION_NAME: + required: true + type: string + CPP_DOCS_VERSION_NAME: + required: true + type: string + MARKDOWN_DOCS_VERSION_NAME: + required: true + type: string + description: | + Version label to upload markdown docs/examples under on GCS + (`gs://rerun-docs/prose/{label}/`). Use `dev` for non-final + releases / pushes to main, the semver string for final + releases, or `pr-{N}` for PR previews. + RELEASE_VERSION: + required: false + type: string + RELEASE_COMMIT: + required: false + type: string + UPDATE_LATEST: + required: false + type: boolean + default: false + +concurrency: + group: ${{ inputs.CONCURRENCY }}-deploy-docs + cancel-in-progress: true + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "write" + id-token: "write" + +env: + PYTHON_VERSION: "3.10" + + RUSTFLAGS: --deny warnings + RUSTDOCFLAGS: --deny warnings + +jobs: + # --------------------------------------------------------------------------- + + py-deploy-docs: + name: Python + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.RELEASE_COMMIT || (github.event_name == 'pull_request' && github.event.pull_request.head.ref || '') }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - id: "auth" + uses: google-github-actions/auth@v2 + with: + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - name: "Set up Cloud SDK" + uses: "google-github-actions/setup-gcloud@v2" + with: + version: ">= 363.0.0" + + - name: Build docs + run: pixi run uv run --group docs mkdocs build -f rerun_py/mkdocs.yml -d site + + - name: "Upload Python Docs (version)" + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "rerun_py/site" + destination: "rerun-docs/docs/python/${{ inputs.PY_DOCS_VERSION_NAME }}" + process_gcloudignore: false + parent: false + resumable: false + + - name: "Update URL rewrite rules for stable" + if: ${{ inputs.UPDATE_LATEST }} + run: | + pixi run uv run --group dev scripts/update_docs_url_rewrite.py --version ${{ inputs.PY_DOCS_VERSION_NAME }} --language python + + - name: "Update versions.json" + if: ${{ inputs.UPDATE_LATEST }} + run: | + VERSION=${{ inputs.PY_DOCS_VERSION_NAME }} + + echo "download existing" + gsutil cp gs://rerun-docs/docs/python/versions.json ./ + cat versions.json + + echo "remove `stable` alias" + jq -c 'map(.aliases |= map(select(. != "stable")))' versions.json > versions.json.new + cat versions.json.new + + echo "prepend new version with `stable` alias" + jq -c --arg v "$VERSION" '[{ version: $v, title: $v, aliases: ["stable"] }] + .' versions.json.new > versions.json + cat versions.json + + echo "overwrite the file on gcs" + gsutil cp ./versions.json gs://rerun-docs/docs/python/ + + # --------------------------------------------------------------------------- + + cpp-deploy-docs: + name: Cpp + runs-on: ubuntu-latest + steps: + - name: Show context + run: | + echo "GITHUB_CONTEXT": $GITHUB_CONTEXT + echo "JOB_CONTEXT": $JOB_CONTEXT + echo "INPUTS_CONTEXT": $INPUTS_CONTEXT + echo "ENV_CONTEXT": $ENV_CONTEXT + env: + ENV_CONTEXT: ${{ toJson(env) }} + GITHUB_CONTEXT: ${{ toJson(github) }} + JOB_CONTEXT: ${{ toJson(job) }} + INPUTS_CONTEXT: ${{ toJson(inputs) }} + + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.RELEASE_COMMIT || (github.event_name == 'pull_request' && github.event.pull_request.head.ref || '') }} + + - id: "auth" + uses: google-github-actions/auth@v2 + with: + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Doxygen C++ docs + run: pixi run -e cpp cpp-docs + + - name: "Upload C++ Docs (version)" + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "rerun_cpp/docs/html" + destination: "rerun-docs/docs/cpp/${{ inputs.RELEASE_VERSION }}" + process_gcloudignore: false + parent: false + resumable: false + + - name: "Upload C++ Docs (named)" + if: ${{ inputs.UPDATE_LATEST }} + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "rerun_cpp/docs/html" + destination: "rerun-docs/docs/cpp/${{ inputs.CPP_DOCS_VERSION_NAME }}" + process_gcloudignore: false + parent: false + resumable: false + + js-deploy-docs: + name: JS + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.RELEASE_COMMIT || (github.event_name == 'pull_request' && github.event.pull_request.head.ref || '') }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - id: "auth" + uses: google-github-actions/auth@v2 + with: + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - name: "Set up Cloud SDK" + uses: "google-github-actions/setup-gcloud@v2" + with: + version: ">= 363.0.0" + + - name: Build docs + run: pixi run js-docs + + - name: "Upload (version)" + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "rerun_js/docs" + destination: "rerun-docs/docs/js/${{ inputs.JS_DOCS_VERSION_NAME }}" + process_gcloudignore: false + parent: false + resumable: false + + - name: "Update URL rewrite rules for stable" + if: ${{ inputs.UPDATE_LATEST }} + run: | + pixi run uv run --group dev scripts/update_docs_url_rewrite.py --version ${{ inputs.JS_DOCS_VERSION_NAME }} --language js + + # --------------------------------------------------------------------------- + + md-deploy-docs: + name: Markdown + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.RELEASE_COMMIT || (github.event_name == 'pull_request' && github.event.pull_request.head.ref || '') }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - id: "auth" + uses: google-github-actions/auth@v2 + with: + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - name: "Upload markdown docs & examples to GCS" + env: + ISR_BYPASS_TOKEN: ${{ secrets.ISR_BYPASS_TOKEN }} + VERSION_LABEL: ${{ inputs.MARKDOWN_DOCS_VERSION_NAME }} + MARK_LATEST: ${{ inputs.UPDATE_LATEST }} + RERUN_COMMIT: ${{ inputs.RELEASE_COMMIT }} + run: | + ARGS=(upload --version "$VERSION_LABEL" --purge-token "$ISR_BYPASS_TOKEN") + if [ "$MARK_LATEST" = "true" ]; then + ARGS+=(--mark-latest) + fi + if [ -n "$RERUN_COMMIT" ]; then + ARGS+=(--rerun-commit "$RERUN_COMMIT") + fi + pixi run uv run scripts/ci/upload_docs.py "${ARGS[@]}" diff --git a/.github/workflows/reusable_deploy_landing_preview.yml b/.github/workflows/reusable_deploy_landing_preview.yml new file mode 100644 index 0000000..b3e049d --- /dev/null +++ b/.github/workflows/reusable_deploy_landing_preview.yml @@ -0,0 +1,101 @@ +name: Reusable Deploy Landing Preview + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + PR_NUMBER: + required: true + type: string + +concurrency: + group: ${{ inputs.CONCURRENCY }}-deploy-landing-preview + cancel-in-progress: true + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "write" + id-token: "write" + pull-requests: "write" + +jobs: + deploy: + name: Deploy + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ (github.event_name == 'pull_request' && github.event.pull_request.head.ref) || '' }} + + - name: Get sha + id: get-sha + run: | + full_commit="${{ (github.event_name == 'pull_request' && github.event.pull_request.head.sha) || github.sha }}" + echo "sha=$full_commit" >> "$GITHUB_OUTPUT" + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - id: "auth" + uses: google-github-actions/auth@v2 + with: + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - name: "Upload PR-preview markdown docs & examples to GCS" + env: + ISR_BYPASS_TOKEN: ${{ secrets.ISR_BYPASS_TOKEN }} + PR_NUMBER: ${{ inputs.PR_NUMBER }} + RERUN_COMMIT: ${{ steps.get-sha.outputs.sha }} + run: | + # PR previews live under `gs://rerun-docs/prose/pr-{N}/` and + # are not advertised in versions.json. The production website + # reads them directly via `/docs/pr-{N}/…`, so re-uploads + # must purge that subtree from the edge ISR cache. + pixi run uv run scripts/ci/upload_docs.py upload \ + --version "pr-${PR_NUMBER}" \ + --rerun-commit "$RERUN_COMMIT" \ + --purge-token "$ISR_BYPASS_TOKEN" + + - name: Create PR comment + uses: mshick/add-pr-comment@v2.8.2 + # GitHub API is very unreliable. We don't want to fail the entire workflow just because we couldn't post a comment. + continue-on-error: true + if: success() + with: + message-id: "vercel-preview" + repo-token: ${{ secrets.GITHUB_TOKEN }} + message: | + Latest documentation preview uploaded successfully. + + | Result | Commit | Link | + | ------ | ------- | ----- | + | ✅ | ${{ steps.get-sha.outputs.sha }} | https://rerun.io/docs/pr-${{ inputs.PR_NUMBER }} | + + Note: This comment is updated whenever you push a commit. + + - name: Create PR comment + uses: mshick/add-pr-comment@v2.8.2 + # GitHub API is very unreliable. We don't want to fail the entire workflow just because we couldn't post a comment. + continue-on-error: true + if: failure() + with: + message-id: "vercel-preview" + repo-token: ${{ secrets.GITHUB_TOKEN }} + message: | + Latest documentation preview failed to upload, check the CI for more details: + ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}?pr=${{ github.event.pull_request.number }} + + | Result | Commit | Link | + | ------ | ------- | ----- | + | ❌ | ${{ steps.get-sha.outputs.sha }} | unavailable | + + Note: This comment is updated whenever you push a commit. diff --git a/.github/workflows/reusable_pip_index.yml b/.github/workflows/reusable_pip_index.yml new file mode 100644 index 0000000..57bd874 --- /dev/null +++ b/.github/workflows/reusable_pip_index.yml @@ -0,0 +1,69 @@ +name: Reusable Pip Index + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + COMMIT: + required: false + type: string + default: "" + CHECK: + required: false + type: boolean + default: true + +concurrency: + group: ${{ inputs.CONCURRENCY }}-pip-index + cancel-in-progress: true + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + id-token: "write" + +jobs: + pr-summary: + name: Create a Pip Index file + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + ref: ${{ inputs.COMMIT || (github.event_name == 'pull_request' && github.event.pull_request.head.ref || '') }} + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: 3.11 + + - id: "auth" + uses: google-github-actions/auth@v2 + with: + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - name: "Set up Cloud SDK" + uses: "google-github-actions/setup-gcloud@v2" + with: + version: ">= 363.0.0" + + - name: Install deps + # TOOD(googleapis/python-api-core#848): unpin google-api-core when this is issue is fixed. + run: pip3 install google-cloud-storage==3.4.1 Jinja2==3.1.6 google-api-core==2.27.0 + + - name: Render pip index and upload to gcloud + run: | + full_commit="${{ inputs.COMMIT || (github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha) }}" + commit=$(echo $full_commit | cut -c1-7) + + python scripts/ci/generate_prerelease_pip_index.py \ + --title "Commit: $commit" \ + --dir "commit/$commit/wheels" \ + --upload \ + ${{ inputs.CHECK == 'true' && '--check' || '' }} diff --git a/.github/workflows/reusable_publish_js.yml b/.github/workflows/reusable_publish_js.yml new file mode 100644 index 0000000..2e944e5 --- /dev/null +++ b/.github/workflows/reusable_publish_js.yml @@ -0,0 +1,101 @@ +name: Build and publish JS + +on: + workflow_call: + inputs: + concurrency: + type: string + required: true + release-commit: + description: "Commit to release" + type: string + required: true + release-version: + type: string + required: true + +concurrency: + group: ${{ inputs.concurrency }}-publish-js + cancel-in-progress: true + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "write" + id-token: "write" + packages: "read" + +jobs: + get-commit-sha: + name: Get Commit Sha + runs-on: ubuntu-latest + outputs: + short-sha: ${{ steps.get-short-sha.outputs.short-sha }} + full-sha: ${{ steps.get-full-sha.outputs.full-sha }} + steps: + - name: "Set short-sha" + id: get-short-sha + run: echo "short-sha=$(echo ${{ inputs.release-commit }} | cut -c1-7)" >> $GITHUB_OUTPUT + + - name: "Set full-sha" + id: get-full-sha + run: echo "full-sha=${{ inputs.release-commit }}" >> $GITHUB_OUTPUT + + build: + runs-on: ubuntu-latest-16-cores + needs: [get-commit-sha] + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.release-commit }} + + - uses: actions/setup-node@v4 + with: + node-version: "22.x" + registry-url: "https://registry.npmjs.org" + + - name: Install Yarn + run: npm install -g yarn + + - name: Set up Rust + uses: ./.github/actions/setup-rust + with: + cache_key: "build-web" + save_cache: false + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Publish packages + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + run: | + pixi run node rerun_js/scripts/publish.mjs + + - name: "Upload rerun_js to GCS (version)" + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "rerun_js_package" + destination: "rerun-builds/version/${{ inputs.release-version }}/rerun_js" + parent: false + process_gcloudignore: false + headers: |- + cache-control: no-cache, max-age=0 + gzip: false + + # TODO(#11625): we need this for asset sync, in case the PR workflow fails (or doesn't run). See issue for details. + - name: "Upload rerun_js to GCS (commit)" + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "rerun_js_package" + destination: "rerun-builds/commit/${{ needs.get-commit-sha.outputs.short-sha }}/rerun_js" + parent: false + process_gcloudignore: false + headers: |- + cache-control: no-cache, max-age=0 + gzip: false diff --git a/.github/workflows/reusable_publish_rerun_c.yml b/.github/workflows/reusable_publish_rerun_c.yml new file mode 100644 index 0000000..5c65700 --- /dev/null +++ b/.github/workflows/reusable_publish_rerun_c.yml @@ -0,0 +1,67 @@ +name: Build and Publish C/C++ SDKs + +on: + workflow_call: + inputs: + concurrency: + type: string + required: true + release-version: + description: "Release Version Number (Must match Cargo.toml)" + type: string + required: true + release-commit: + description: "Which commit to build+publish" + type: string + required: true + +permissions: + contents: "read" + id-token: "write" + packages: "read" + +jobs: + linux-arm64: + name: "Linux-Arm64" + uses: ./.github/workflows/reusable_build_and_upload_rerun_c.yml + with: + CONCURRENCY: publish-rerun-c-linux-arm64-${{ github.ref_name }} + PLATFORM: linux-arm64 + RELEASE_COMMIT: ${{ inputs.release-commit }} + secrets: inherit + + linux-x64: + name: "Linux-x64" + uses: ./.github/workflows/reusable_build_and_upload_rerun_c.yml + with: + CONCURRENCY: publish-rerun-c-linux-x64-${{ github.ref_name }} + PLATFORM: linux-x64 + RELEASE_COMMIT: ${{ inputs.release-commit }} + secrets: inherit + + macos-arm64: + name: "Mac-Arm" + uses: ./.github/workflows/reusable_build_and_upload_rerun_c.yml + with: + CONCURRENCY: publish-rerun-c-macos-arm64-${{ github.ref_name }} + PLATFORM: macos-arm64 + RELEASE_COMMIT: ${{ inputs.release-commit }} + secrets: inherit + + windows-x64: + name: "Windows-x64" + uses: ./.github/workflows/reusable_build_and_upload_rerun_c.yml + with: + CONCURRENCY: publish-rerun-c-windows-${{ github.ref_name }} + PLATFORM: windows-x64 + RELEASE_COMMIT: ${{ inputs.release-commit }} + secrets: inherit + + bundle-and-upload-rerun_cpp: + name: "Bundle and upload rerun_cpp_sdk.zip" + needs: [linux-arm64, linux-x64, macos-arm64, windows-x64] + uses: ./.github/workflows/reusable_bundle_and_upload_rerun_cpp.yml + with: + CONCURRENCY: bundle-rerun-c-${{ github.ref_name }} + RELEASE_COMMIT: ${{ inputs.release-commit }} + secrets: inherit diff --git a/.github/workflows/reusable_publish_rerun_cli.yml b/.github/workflows/reusable_publish_rerun_cli.yml new file mode 100644 index 0000000..2cb9956 --- /dev/null +++ b/.github/workflows/reusable_publish_rerun_cli.yml @@ -0,0 +1,58 @@ +name: Build and publish wheels + +on: + workflow_call: + inputs: + concurrency: + type: string + required: true + release-version: + description: "Release Version Number (Must match Cargo.toml)" + type: string + required: true + release-commit: + description: "Which commit to build+publish" + type: string + required: true + +permissions: + contents: "read" + id-token: "write" + packages: "read" + +jobs: + linux-arm64: + name: "Linux-arm64" + uses: ./.github/workflows/reusable_build_and_upload_rerun_cli.yml + with: + CONCURRENCY: publish-rerun-cli-linux-arm64-${{ github.ref_name }} + PLATFORM: linux-arm64 + RELEASE_COMMIT: ${{ inputs.release-commit }} + secrets: inherit + + linux-x64: + name: "Linux-x64" + uses: ./.github/workflows/reusable_build_and_upload_rerun_cli.yml + with: + CONCURRENCY: publish-rerun-cli-linux-x64-${{ github.ref_name }} + PLATFORM: linux-x64 + RELEASE_COMMIT: ${{ inputs.release-commit }} + secrets: inherit + + macos-arm64: + name: "Mac-Arm" + uses: ./.github/workflows/reusable_build_and_upload_rerun_cli.yml + with: + CONCURRENCY: publish-rerun-cli-macos-arm64-${{ github.ref_name }} + PLATFORM: macos-arm64 + RELEASE_COMMIT: ${{ inputs.release-commit }} + secrets: inherit + + windows-x64: + name: "Windows-x64" + uses: ./.github/workflows/reusable_build_and_upload_rerun_cli.yml + with: + CONCURRENCY: publish-rerun-cli-windows-x64-${{ github.ref_name }} + PLATFORM: windows-x64 + RELEASE_COMMIT: ${{ inputs.release-commit }} + secrets: inherit diff --git a/.github/workflows/reusable_publish_web.yml b/.github/workflows/reusable_publish_web.yml new file mode 100644 index 0000000..9eb2613 --- /dev/null +++ b/.github/workflows/reusable_publish_web.yml @@ -0,0 +1,157 @@ +name: Build and publish web + +on: + workflow_call: + inputs: + concurrency: + type: string + required: true + release-version: + description: "Release Version Number (Must match Cargo.toml)" + type: string + required: true + release-commit: + description: "Commit to release" + type: string + required: true + wheel-artifact-name: + description: "Name of the wheel to use when running examples" + type: string + required: true + update-latest: + description: "Whether to update the latest version of app" + type: boolean + required: true + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "write" + id-token: "write" + packages: "read" + +jobs: + get-commit-sha: + name: Get Commit Sha + runs-on: ubuntu-latest + outputs: + short-sha: ${{ steps.get-short-sha.outputs.short-sha }} + full-sha: ${{ steps.get-full-sha.outputs.full-sha }} + steps: + - name: "Set short-sha" + id: get-short-sha + run: echo "short-sha=$(echo ${{ inputs.release-commit }} | cut -c1-7)" >> $GITHUB_OUTPUT + + - name: "Set full-sha" + id: get-full-sha + run: echo "full-sha=${{ inputs.release-commit }}" >> $GITHUB_OUTPUT + + build-web: + runs-on: ubuntu-latest-16-cores + needs: [get-commit-sha] + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.release-commit }} + lfs: true + + - id: "auth" + uses: google-github-actions/auth@v2 + with: + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - name: "Set up Cloud SDK" + uses: "google-github-actions/setup-gcloud@v2" + with: + version: ">= 363.0.0" + + - name: Set up Rust + uses: ./.github/actions/setup-rust + with: + cache_key: "build-web" + save_cache: false + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Bootstrap examples + run: | + pixi run py-sync-examples + + # built by `reusable_build_and_publish_wheels` + - name: Download Wheel + uses: actions/download-artifact@v4 + with: + name: ${{ inputs.wheel-artifact-name }} + path: wheel + + - name: Install built wheel + run: | + pixi run python scripts/ci/uv_install_wheel.py --package rerun-sdk --dir wheel + + - name: Print wheel version + run: | + pixi run uv pip show rerun-sdk + pixi run uvpy -m rerun --version + + - name: Build web-viewer (release) + run: | + pixi run rerun-build-web-release + + - name: Build examples + run: | + pixi run build-examples rrd --install \ + --channel "release" \ + crates/viewer/re_web_viewer_server/web_viewer/examples + + - name: Build & run snippets + run: | + pixi run build-examples snippets \ + crates/viewer/re_web_viewer_server/web_viewer/examples/snippets + + - name: Build examples manifest + run: | + pixi run build-examples manifest \ + --base-url "https://app.rerun.io/version/${{inputs.release-version}}" \ + --channel "release" \ + crates/viewer/re_web_viewer_server/web_viewer/examples_manifest.json + + - name: Upload app.rerun.io (versioned) + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "crates/viewer/re_web_viewer_server/web_viewer" + destination: "rerun-web-viewer/version/${{ inputs.release-version }}" + parent: false + process_gcloudignore: false + + - name: Upload app.rerun.io (commit) + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "crates/viewer/re_web_viewer_server/web_viewer" + destination: "rerun-web-viewer/commit/${{ needs.get-commit-sha.outputs.short-sha }}" + parent: false + process_gcloudignore: false + + # Upload extensionless HTML aliases (signed-in, signed-out) to the + # bucket root with the correct Content-Type. The OAuth redirect uses the + # origin (app.rerun.io/signed-in), not a versioned path. + - name: "Upload HTML aliases to bucket root" + run: | + cd crates/viewer/re_web_viewer_server/web_viewer + for f in *.html; do + name="${f%.html}" + if [ "$name" != "index" ] && [ "$name" != "index_bundled" ]; then + gcloud storage cp --content-type="text/html" "$f" "gs://rerun-web-viewer/${name}" + fi + done + + - name: Publish app.rerun.io + if: inputs.update-latest + run: | + gsutil -m cp -r 'gs://rerun-web-viewer/version/${{ inputs.release-version }}/*' gs://rerun-web-viewer/version/latest diff --git a/.github/workflows/reusable_publish_wheels.yml b/.github/workflows/reusable_publish_wheels.yml new file mode 100644 index 0000000..decfd13 --- /dev/null +++ b/.github/workflows/reusable_publish_wheels.yml @@ -0,0 +1,141 @@ +name: Build and publish wheels + +# To run this manually: +# 1. Build each platform using `scripts/ci/build_and_upload_wheels.py` +# 2. (optional) Generate index using `scripts/ci/generate_prerelease_pip_index.py` +# 3. Publish to PyPI using `scripts/ci/publish_wheels.py` + +on: + workflow_call: + inputs: + concurrency: + type: string + required: true + release-version: + description: "Release Version Number (Must match Cargo.toml)" + type: string + required: true + release-commit: + description: "Which commit to build+publish" + type: string + required: true + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + id-token: "write" + packages: "read" + +jobs: + get-commit-sha: + name: Get Commit Sha + runs-on: ubuntu-latest + outputs: + short-sha: ${{ steps.get-short-sha.outputs.short-sha }} + full-sha: ${{ steps.get-full-sha.outputs.full-sha }} + steps: + - name: "Set short-sha" + id: get-short-sha + run: echo "short-sha=$(echo ${{ inputs.release-commit }} | cut -c1-7)" >> $GITHUB_OUTPUT + + - name: "Set full-sha" + id: get-full-sha + run: echo "full-sha=${{ inputs.release-commit }}" >> $GITHUB_OUTPUT + + ## Build + + # Note: this also builds `rerun_notebook` + build-linux-x64: + name: "Linux-x64: Build Wheels" + needs: [get-commit-sha] + uses: ./.github/workflows/reusable_build_and_upload_wheels.yml + with: + CONCURRENCY: wheels-build-linux-x64-${{ inputs.concurrency }} + PLATFORM: linux-x64 + WHEEL_ARTIFACT_NAME: linux-x64-wheel + RELEASE_COMMIT: ${{ inputs.release-commit }} + MODE: "pypi" + secrets: inherit + + build-linux-arm64: + name: "Linux-arm64: Build Wheels" + needs: [get-commit-sha] + uses: ./.github/workflows/reusable_build_and_upload_wheels.yml + with: + CONCURRENCY: wheels-build-linux-arm64-${{ inputs.concurrency }} + PLATFORM: linux-arm64 + WHEEL_ARTIFACT_NAME: linux-arm64-wheel + RELEASE_COMMIT: ${{ inputs.release-commit }} + MODE: "pypi" + secrets: inherit + + build-windows-x64: + name: "Windows-x64: Build Wheels" + needs: [get-commit-sha] + uses: ./.github/workflows/reusable_build_and_upload_wheels.yml + with: + CONCURRENCY: wheels-build-windows-x64-${{ inputs.concurrency }} + PLATFORM: windows-x64 + WHEEL_ARTIFACT_NAME: windows-x64-wheel + RELEASE_COMMIT: ${{ inputs.release-commit }} + MODE: "pypi" + secrets: inherit + + build-macos-arm64: + name: "Macos-arm64: Build Wheels" + needs: [get-commit-sha] + uses: ./.github/workflows/reusable_build_and_upload_wheels.yml + with: + CONCURRENCY: wheels-build-macos-arm64-${{ inputs.concurrency }} + PLATFORM: macos-arm64 + WHEEL_ARTIFACT_NAME: macos-arm64-wheel + RELEASE_COMMIT: ${{ inputs.release-commit }} + MODE: "pypi" + secrets: inherit + + generate-wheel-index: + name: "Generate Pip Index" + needs: + [build-linux-x64, build-linux-arm64, build-windows-x64, build-macos-arm64] + uses: ./.github/workflows/reusable_pip_index.yml + with: + CONCURRENCY: generate-wheel-index-${{ inputs.concurrency }} + COMMIT: ${{ inputs.release-commit }} + secrets: inherit + + publish-wheels: + name: "Publish Wheels" + needs: [get-commit-sha, generate-wheel-index] + runs-on: ubuntu-latest-16-cores + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 # Don't do a shallow clone since we need it for finding the full commit hash + ref: ${{ inputs.release-commit }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - id: "auth" + uses: google-github-actions/auth@v2 + with: + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - name: "Set up Cloud SDK" + uses: "google-github-actions/setup-gcloud@v2" + with: + version: ">= 363.0.0" + + - name: Publish to PyPI + run: | + pixi run uvpy scripts/ci/publish_wheels.py \ + --version ${{ inputs.release-version }} \ + --dir "commit/${{ needs.get-commit-sha.outputs.short-sha }}/wheels" \ + --repository "${{ vars.PYPI_REPOSITORY }}" \ + --token "${{ secrets.MATURIN_PYPI_TOKEN }}" \ diff --git a/.github/workflows/reusable_release_crates.yml b/.github/workflows/reusable_release_crates.yml new file mode 100644 index 0000000..f92312d --- /dev/null +++ b/.github/workflows/reusable_release_crates.yml @@ -0,0 +1,44 @@ +name: Release crates + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + RELEASE_COMMIT: + required: false + type: string + +concurrency: + group: ${{ inputs.CONCURRENCY }}-release-crates + cancel-in-progress: true + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + id-token: "write" + packages: "read" + +jobs: + publish-crates: + name: "Publish Crates" + runs-on: ubuntu-latest-16-cores + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + ref: ${{ inputs.RELEASE_COMMIT || (github.event_name == 'pull_request' && github.event.pull_request.head.ref || '') }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Build web-viewer (release) + run: pixi run rerun-build-web-release + + - name: Publish + run: pixi run python scripts/ci/crates.py publish --token ${{ secrets.CRATES_IO_TOKEN }} diff --git a/.github/workflows/reusable_run_notebook.yml b/.github/workflows/reusable_run_notebook.yml new file mode 100644 index 0000000..951f641 --- /dev/null +++ b/.github/workflows/reusable_run_notebook.yml @@ -0,0 +1,92 @@ +# TODO(#9304): make the notebook export work +name: Reusable Build and Upload Notebook + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + WHEEL_ARTIFACT_NAME: + required: false + type: string + default: "" + +concurrency: + group: ${{ inputs.CONCURRENCY }}-run-notebook + cancel-in-progress: true + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + id-token: "write" + packages: "read" + +jobs: + run-notebook: + name: Run notebook + runs-on: ubuntu-latest-16-cores # Note that as of writing we need the additional storage page (14 gb of the ubuntu-latest runner is not enough). + container: + image: ghcr.io/rerun-io/ci_docker:0.18.0 # Required to run the wheel or we get "No matching distribution found for attrs>=23.1.0" during `pip install rerun-sdk` + credentials: + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Download Wheel + uses: actions/download-artifact@v4 + with: + name: ${{ inputs.WHEEL_ARTIFACT_NAME }} + path: wheel + + - name: Download Notebook Wheel + uses: actions/download-artifact@v4 + with: + name: rerun_notebook_wheel + path: wheel + + - name: Get version + id: get-version + run: | + pixi run 'echo "wheel_version=$(python scripts/ci/crates.py get-version)"' >> "$GITHUB_OUTPUT" + + - name: Install built wheel + run: | + pixi run python scripts/ci/uv_install_wheel.py --package rerun-sdk --dir wheel + pixi run python scripts/ci/uv_install_wheel.py --package rerun-notebook --dir wheel --platform-independent + + - name: Install Deps + run: pixi run uv pip install -r examples/python/notebook/requirements.txt + + - name: Create notebook + run: pixi run uv jupyter nbconvert --to=html --ExecutePreprocessor.enabled=True examples/python/notebook/cube.ipynb --output /tmp/cube.html + + - id: "auth" + uses: google-github-actions/auth@v2 + with: + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - name: Get sha + id: get-sha + run: | + full_commit="${{ (github.event_name == 'pull_request' && github.event.pull_request.head.sha) || github.sha }}" + echo "sha=$(echo $full_commit | cut -c1-7)" >> "$GITHUB_OUTPUT" + + - name: "Upload Notebook" + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "/tmp/cube.html" + destination: "rerun-builds/commit/${{ steps.get-sha.outputs.sha }}/notebooks" + parent: false + process_gcloudignore: false diff --git a/.github/workflows/reusable_sync_release_assets.yml b/.github/workflows/reusable_sync_release_assets.yml new file mode 100644 index 0000000..f9163f6 --- /dev/null +++ b/.github/workflows/reusable_sync_release_assets.yml @@ -0,0 +1,61 @@ +name: Sync assets with release + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + RELEASE_VERSION: + required: true + type: string + default: "" + WAIT_TIME_SECS: + required: false + type: number + default: 0 + +concurrency: + group: ${{ inputs.CONCURRENCY }}-sync-assets + cancel-in-progress: true + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "write" + id-token: "write" + +jobs: + sync-assets: + name: Upload assets from build.rerun.io + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - id: "auth" + uses: google-github-actions/auth@v2 + with: + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - name: "Set up Cloud SDK" + uses: "google-github-actions/setup-gcloud@v2" + with: + version: ">= 363.0.0" + + - name: Sync release assets & build.rerun.io + run: | + pixi run python ./scripts/ci/sync_release_assets.py \ + --github-release ${{ inputs.RELEASE_VERSION }} \ + --github-token ${{ secrets.GITHUB_TOKEN }} \ + --wait ${{ inputs.WAIT_TIME_SECS }} \ + --remove --update diff --git a/.github/workflows/reusable_test_wheels.yml b/.github/workflows/reusable_test_wheels.yml new file mode 100644 index 0000000..7a83f65 --- /dev/null +++ b/.github/workflows/reusable_test_wheels.yml @@ -0,0 +1,196 @@ +name: Reusable Test Wheels + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + PLATFORM: + required: true + type: string + WHEEL_ARTIFACT_NAME: + required: false + type: string + default: "" + RELEASE_COMMIT: + required: false + type: string + default: "" + FAST: + required: false + type: boolean + default: false + +concurrency: + group: ${{ inputs.CONCURRENCY }}-test-wheels + cancel-in-progress: true + +env: + PYTHON_VERSION: "3.10" + + RUSTFLAGS: --deny warnings + RUSTDOCFLAGS: --deny warnings + + RUST_BACKTRACE: "1" + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + packages: "read" + id-token: "write" + +jobs: + # --------------------------------------------------------------------------- + + set-config: + name: Set Config (${{ inputs.PLATFORM }}) + runs-on: ubuntu-latest-16-cores + outputs: + RUNNER: ${{ steps.set-config.outputs.runner }} + TARGET: ${{ steps.set-config.outputs.target }} + CONTAINER: ${{ steps.set-config.outputs.container }} + steps: + - name: Login to GHCR (with retries) + uses: nick-fields/retry@v3 + with: + timeout_seconds: 10 + max_attempts: 12 + retry_on: timeout + warning_on_retry: true + command: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin + - name: Set runner and target based on platform + id: set-config + + # TODO(#5525): at least this target is broken, maybe others — we currently only use linux-x64 and windows-x64 + run: | + case "${{ inputs.PLATFORM }}" in + linux-arm64) + runner="ubuntu-arm-16-core" + target="aarch64-unknown-linux-gnu" + container="'ghcr.io/rerun-io/ci_docker:0.18.0'" + ;; + linux-x64) + runner="ubuntu-latest-16-cores" + target="x86_64-unknown-linux-gnu" + container="'ghcr.io/rerun-io/ci_docker:0.18.0'" + ;; + windows-x64) + runner="windows-latest-16-cores" + target="x86_64-pc-windows-msvc" + container="null" + ;; + macos-arm64) + runner="macos-26-xlarge" # This is an Arm vm, https://docs.github.com/en/actions/using-github-hosted-runners/about-larger-runners/about-larger-runners#about-macos-larger-runners + target="aarch64-apple-darwin" + container="null" + ;; + *) echo "Invalid platform" && exit 1 ;; + esac + echo "runner=$runner" >> "$GITHUB_OUTPUT" + echo "target=$target" >> "$GITHUB_OUTPUT" + echo "container=$container" >> "$GITHUB_OUTPUT" + + # --------------------------------------------------------------------------- + + test-wheels: + name: Test Wheels (${{ needs.set-config.outputs.RUNNER }}) + timeout-minutes: 120 + + needs: [set-config] + + runs-on: ${{ needs.set-config.outputs.RUNNER }} + container: + image: ${{ fromJson(needs.set-config.outputs.CONTAINER) }} + credentials: + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + steps: + - name: Show context + run: | + echo "GITHUB_CONTEXT": $GITHUB_CONTEXT + echo "JOB_CONTEXT": $JOB_CONTEXT + echo "INPUTS_CONTEXT": $INPUTS_CONTEXT + echo "ENV_CONTEXT": $ENV_CONTEXT + env: + ENV_CONTEXT: ${{ toJson(env) }} + GITHUB_CONTEXT: ${{ toJson(github) }} + JOB_CONTEXT: ${{ toJson(job) }} + INPUTS_CONTEXT: ${{ toJson(inputs) }} + + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.RELEASE_COMMIT || ((github.event_name == 'pull_request' && github.event.pull_request.head.ref) || '') }} + lfs: true + + - name: Set up Rust + uses: ./.github/actions/setup-rust + with: + cache_key: "build-${{ inputs.PLATFORM }}" + # Cache will be produced by `reusable_checks/rs-lints` + save_cache: false + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Download Wheel + uses: actions/download-artifact@v4 + with: + name: ${{ inputs.WHEEL_ARTIFACT_NAME }} + path: wheel + + - name: Get version + id: get-version + run: pixi run 'echo "wheel_version=$(python scripts/ci/crates.py get-version)"' >> "$GITHUB_OUTPUT" + + - name: Install built wheel + run: | + pixi run python scripts/ci/uv_install_wheel.py --package rerun-sdk --dir wheel + + - name: Print wheel version + run: | + pixi run uv pip show rerun-sdk + pixi run uvpy -m rerun --version + + - name: Run unit tests (with linux arm64 opencv workaround) + if: ${{ inputs.PLATFORM == 'linux-arm64' }} + # Workaround for OpenCV TLS issue, see https://github.com/opencv/opencv/issues/14884#issuecomment-815632861 + run: LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libgomp.so.1 pixi run py-test-no-build + + - name: Run unit tests + if: ${{ inputs.PLATFORM != 'linux-arm64' }} + run: pixi run py-test-no-build + + - name: Run e2e test + run: RUST_LOG=debug pixi run uvpy scripts/run_python_e2e_test.py --no-build # rerun-sdk is already built and installed + + - name: Check for release checklist + if: ${{ inputs.FAST }} + # Only check that the release checklist executes successfully + run: RUST_LOG=warn RERUN_STRICT=1 PYTHONWARNINGS=error pixi run uvpy tests/python/release_checklist/main.py --stdout > /dev/null + + - name: Build C++ snippets + if: ${{ !inputs.FAST }} + # Separated out of compare_snippet_output.py run so we control the pixi environment. + # This used to cause issues on Windows during the setup of the pixi environment when running from inside `compare_snippet_output.py`. + run: pixi run cpp-build-snippets + + - name: Run docs/snippets/compare_snippet_output.py + if: ${{ !inputs.FAST }} + # explicit target because otherwise cargo loses the target cache… even though this is the target anyhow… + # --no-py-build because rerun-sdk is already built and installed + run: RUST_LOG=debug pixi run uvpy docs/snippets/compare_snippet_output.py --target ${{ needs.set-config.outputs.TARGET }} --no-py-build --no-cpp-build + + - name: Check the python library signatures + run: pixi run py-check-signatures + + - name: Report disk usage + if: always() # Run this even if a previous step fails. + run: df -h diff --git a/.github/workflows/reusable_track_size.yml b/.github/workflows/reusable_track_size.yml new file mode 100644 index 0000000..82a9f6c --- /dev/null +++ b/.github/workflows/reusable_track_size.yml @@ -0,0 +1,184 @@ +name: "Track Size" + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + PR_NUMBER: + required: false + type: number + WITH_EXAMPLES: + required: true + type: boolean + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: write + id-token: write + deployments: write + pull-requests: write + +jobs: + track-sizes: + name: "Track Sizes" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # we need full history + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - name: Get context + id: context + run: | + echo "short_sha=$(echo ${{ github.sha }} | cut -c1-7)" >> "$GITHUB_OUTPUT" + + - id: "auth" + uses: google-github-actions/auth@v2 + with: + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - name: "Set up Cloud SDK" + uses: "google-github-actions/setup-gcloud@v2" + with: + version: ">= 363.0.0" + + - name: Download web_viewer + uses: actions/download-artifact@v4 + with: + name: web_viewer + path: "crates/viewer/re_web_viewer_server/web_viewer" + + - name: Download examples + if: ${{ inputs.WITH_EXAMPLES }} + uses: actions/download-artifact@v4 + with: + name: example_data + path: example_data + + - name: Download base results + run: | + # Get base commit: + # 1. From the index file + # 2. From the latest commit in the base branch of the PR + # 3. From the latest commit in the current branch + index_path="gs://rerun-builds/sizes/index" + if [ "$(gsutil -q stat $index_path ; echo $?)" = 0 ]; then + gsutil cp $index_path "/tmp/base_index" + base_commit=$(cat /tmp/base_index) + else + if [ -n ${{ inputs.PR_NUMBER }} ]; then + base_commit=$(echo ${{ github.event.pull_request.base.sha }} | cut -c1-7) + else + base_commit=${{ steps.context.outputs.short_sha }} + fi + fi + echo "base commit: $base_commit" + + # Download data for base commit, or default to empty file + data_path="gs://rerun-builds/sizes/commit/$base_commit/data.json" + if [ "$(gsutil -q stat $data_path ; echo $?)" = 0 ]; then + gsutil cp $data_path "/tmp/prev.json" + else + echo "[]" > "/tmp/prev.json" + fi + + - name: Measure sizes + id: measure + run: | + entries=() + + entries+=("Wasm:crates/viewer/re_web_viewer_server/web_viewer/re_viewer_bg.wasm:MiB") + entries+=("JS:crates/viewer/re_web_viewer_server/web_viewer/re_viewer.js:kiB") + + if [ ${{ inputs.WITH_EXAMPLES }} = "true" ]; then + for file in example_data/*.rrd; do + name=$(basename "$file") + entries+=("$name:$file:MiB") + done + fi + + python3 scripts/ci/count_bytes.py "${entries[@]}" > /tmp/sizes.json + + python3 scripts/ci/count_dependencies.py -p re_sdk --no-default-features > /tmp/deps1.json + python3 scripts/ci/count_dependencies.py -p re_viewer --all-features > /tmp/deps2.json + python3 scripts/ci/count_dependencies.py -p rerun --all-features > /tmp/deps3.json + + # Merge the results, putting dependencies first (on top): + jq -s '.[0] + .[1] + .[2] + .[3]' /tmp/deps1.json /tmp/deps2.json /tmp/deps3.json /tmp/sizes.json > /tmp/data.json + + comparison=$( + python3 scripts/ci/compare.py \ + --threshold=2% \ + --before-header=${{ (inputs.PR_NUMBER && github.event.pull_request.base.ref) || 'Before' }} \ + --after-header=${{ github.ref_name }} \ + "/tmp/prev.json" "/tmp/data.json" + ) + { + echo 'comparison<> "$GITHUB_OUTPUT" + + if [ -n "$comparison" ]; then + echo "is_comparison_set=true" >> "$GITHUB_OUTPUT" + echo "is_comparison_set=true" + else + echo "is_comparison_set=false" >> "$GITHUB_OUTPUT" + echo "is_comparison_set=false" + fi + + echo "$entries" + echo "previous: $(cat /tmp/prev.json)" + echo "current: $(cat /tmp/data.json)" + echo "$comparison" + + - name: Upload data to GCS (commit) + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: /tmp/data.json + destination: "rerun-builds/sizes/commit/${{ steps.context.outputs.short_sha }}" + process_gcloudignore: false + + - name: Create index file + if: github.ref == 'refs/heads/main' + run: | + echo "${{ steps.context.outputs.short_sha }}" > "/tmp/index" + + - name: Upload index + if: github.ref == 'refs/heads/main' + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: /tmp/index + destination: "rerun-builds/sizes" + process_gcloudignore: false + + - name: Create PR comment + if: inputs.PR_NUMBER != '' && steps.measure.outputs.is_comparison_set == 'true' + # https://github.com/mshick/add-pr-comment + uses: mshick/add-pr-comment@v3.9.1 + # GitHub API is very unreliable. We don't want to fail the entire workflow just because we couldn't post a comment. + continue-on-error: true + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + message: | + # Size changes + + ${{ steps.measure.outputs.comparison }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Render benchmark result + if: github.ref == 'refs/heads/main' + run: | + pixi run python scripts/ci/render_bench.py sizes \ + --after $(date -d"180 days ago" +%Y-%m-%d) \ + --output "gs://rerun-builds/graphs" diff --git a/.github/workflows/reusable_upload_examples.yml b/.github/workflows/reusable_upload_examples.yml new file mode 100644 index 0000000..5eabf9e --- /dev/null +++ b/.github/workflows/reusable_upload_examples.yml @@ -0,0 +1,138 @@ +name: Reusable Upload Examples + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + ADHOC_NAME: + type: string + required: false + default: "" + MARK_TAGGED_VERSION: + required: false + type: boolean + default: false + RELEASE_VERSION: + required: false + type: string + default: "prerelease" + PR_NUMBER: + type: string + default: "" + NIGHTLY: + required: false + type: boolean + default: false + +concurrency: + group: ${{ inputs.CONCURRENCY }}-upload-examples + cancel-in-progress: true + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + id-token: "write" + +jobs: + upload-web: + name: Upload Examples to Google Cloud + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - name: Download assets + uses: actions/download-artifact@v4 + with: + name: example_data + path: example_data + + # Upload the wasm, html etc to a Google cloud bucket: + - id: "auth" + uses: google-github-actions/auth@v2 + with: + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - name: Get sha + id: get-sha + run: | + full_commit="${{ (github.event_name == 'pull_request' && github.event.pull_request.head.sha) || github.sha }}" + echo "sha=$(echo $full_commit | cut -c1-7)" >> "$GITHUB_OUTPUT" + + - name: "Upload examples (commit)" + if: ${{ !inputs.NIGHTLY }} + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "example_data" + destination: "rerun-web-viewer/commit/${{ steps.get-sha.outputs.sha }}/examples" + parent: false + process_gcloudignore: false + + - name: "Upload examples (tagged)" + if: inputs.MARK_TAGGED_VERSION + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "example_data" + destination: "rerun-web-viewer/version/${{ inputs.RELEASE_VERSION }}/examples" + parent: false + process_gcloudignore: false + + - name: "Upload examples (adhoc)" + if: ${{ inputs.ADHOC_NAME != '' }} + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "example_data" + destination: "rerun-web-viewer/adhoc/${{ inputs.ADHOC_NAME }}/examples" + parent: false + process_gcloudignore: false + + - name: "Upload examples (prerelease)" + if: github.ref == 'refs/heads/main' + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "example_data" + destination: "rerun-web-viewer/prerelease/examples" + parent: false + process_gcloudignore: false + headers: |- + cache-control: no-cache, max-age=0 + + - name: "Upload examples (main)" + if: github.ref == 'refs/heads/main' + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "example_data" + destination: "rerun-web-viewer/version/main/examples" + parent: false + process_gcloudignore: false + headers: |- + cache-control: no-cache, max-age=0 + + - name: "Upload examples (pr)" + if: ${{ inputs.PR_NUMBER != '' }} + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "example_data" + destination: "rerun-web-viewer/pr/${{ inputs.PR_NUMBER }}/examples" + parent: false + process_gcloudignore: false + headers: |- + cache-control: no-cache, max-age=0 + + - name: "Upload examples (nightly)" + if: ${{ inputs.NIGHTLY }} + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "example_data" + destination: "rerun-web-viewer/version/nightly/examples" + parent: false + process_gcloudignore: false + headers: |- + cache-control: no-cache, max-age=0 diff --git a/.github/workflows/reusable_upload_js.yml b/.github/workflows/reusable_upload_js.yml new file mode 100644 index 0000000..a8ee67c --- /dev/null +++ b/.github/workflows/reusable_upload_js.yml @@ -0,0 +1,147 @@ +name: Reusable Upload rerun_js + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + ADHOC_NAME: + type: string + required: false + default: "" + MARK_TAGGED_VERSION: + required: false + type: boolean + default: false + RELEASE_VERSION: + required: false + type: string + default: "prerelease" + PR_NUMBER: + required: false + type: string + default: "" + NIGHTLY: + required: false + type: boolean + default: false + +concurrency: + group: ${{ inputs.CONCURRENCY }}-upload-js + cancel-in-progress: true + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "write" + id-token: "write" + pull-requests: "write" + +jobs: + upload-web: + name: Upload rerun_js to google cloud + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - name: Download rerun_js package + uses: actions/download-artifact@v4 + with: + name: rerun_js + path: rerun_js_package + + # Upload the wasm, html etc to a Google cloud bucket: + - id: "auth" + uses: google-github-actions/auth@v2 + with: + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - name: Get sha + id: get-sha + run: | + full_commit="${{ (github.event_name == 'pull_request' && github.event.pull_request.head.sha) || github.sha }}" + echo "sha=$(echo $full_commit | cut -c1-7)" >> "$GITHUB_OUTPUT" + + - name: "Upload rerun_js (commit)" + if: ${{ !inputs.NIGHTLY }} + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "rerun_js_package" + destination: "rerun-builds/commit/${{ steps.get-sha.outputs.sha }}/rerun_js" + parent: false + process_gcloudignore: false + gzip: false + + - name: "Upload rerun_js (tagged)" + if: inputs.MARK_TAGGED_VERSION + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "rerun_js_package" + destination: "rerun-builds/version/${{inputs.RELEASE_VERSION}}/rerun_js" + parent: false + process_gcloudignore: false + gzip: false + + - name: "Upload rerun_js (adhoc)" + if: ${{ inputs.ADHOC_NAME != '' }} + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "rerun_js_package" + destination: "rerun-builds/adhoc/${{inputs.ADHOC_NAME}}/rerun_js" + parent: false + process_gcloudignore: false + gzip: false + + - name: "Upload rerun_js (prerelease)" + if: github.ref == 'refs/heads/main' + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "rerun_js_package" + destination: "rerun-builds/prerelease/rerun_js" + parent: false + process_gcloudignore: false + headers: |- + cache-control: no-cache, max-age=0 + gzip: false + + - name: "Upload rerun_js (main)" + if: github.ref == 'refs/heads/main' + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "rerun_js_package" + destination: "rerun-builds/version/main/rerun_js" + parent: false + process_gcloudignore: false + headers: |- + cache-control: no-cache, max-age=0 + gzip: false + + - name: "Upload rerun_js (pr)" + if: ${{ inputs.PR_NUMBER != '' }} + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "rerun_js_package" + destination: "rerun-builds/pr/${{ inputs.PR_NUMBER }}/rerun_js" + parent: false + process_gcloudignore: false + headers: |- + cache-control: no-cache, max-age=0 + gzip: false + + - name: "Upload rerun_js (nightly)" + if: ${{ inputs.NIGHTLY }} + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "rerun_js_package" + destination: "rerun-builds/version/nightly/rerun_js" + parent: false + process_gcloudignore: false + headers: |- + cache-control: no-cache, max-age=0 + gzip: false diff --git a/.github/workflows/reusable_upload_web.yml b/.github/workflows/reusable_upload_web.yml new file mode 100644 index 0000000..4446d5e --- /dev/null +++ b/.github/workflows/reusable_upload_web.yml @@ -0,0 +1,198 @@ +name: Reusable Upload Web + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + ADHOC_NAME: + type: string + required: false + default: "" + MARK_TAGGED_VERSION: + required: false + type: boolean + default: false + RELEASE_VERSION: + required: false + type: string + default: "prerelease" + PR_NUMBER: + required: false + type: string + default: "" + NIGHTLY: + required: false + type: boolean + default: false + +concurrency: + group: ${{ inputs.CONCURRENCY }}-upload-web + cancel-in-progress: true + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "write" + id-token: "write" + pull-requests: "write" + +jobs: + upload-web: + name: Upload web build to google cloud (wasm32 + wasm-bindgen) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + + - name: Download Web Viewer + uses: actions/download-artifact@v4 + with: + name: web_viewer + path: "crates/viewer/re_web_viewer_server/web_viewer" + + # Upload the wasm, html etc to a Google cloud bucket: + - id: "auth" + uses: google-github-actions/auth@v2 + with: + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - name: "Set up Cloud SDK" + uses: "google-github-actions/setup-gcloud@v2" + with: + version: ">= 363.0.0" + + - name: Get sha + id: get-sha + run: | + full_commit="${{ (github.event_name == 'pull_request' && github.event.pull_request.head.sha) || github.sha }}" + echo "sha=$(echo $full_commit | cut -c1-7)" >> "$GITHUB_OUTPUT" + + - name: "Upload web-viewer (commit)" + if: ${{ !inputs.NIGHTLY }} + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "crates/viewer/re_web_viewer_server/web_viewer" + destination: "rerun-web-viewer/commit/${{ steps.get-sha.outputs.sha }}" + parent: false + process_gcloudignore: false + + - name: "Upload web-viewer (tagged)" + if: inputs.MARK_TAGGED_VERSION + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "crates/viewer/re_web_viewer_server/web_viewer" + destination: "rerun-web-viewer/version/${{inputs.RELEASE_VERSION}}" + parent: false + process_gcloudignore: false + + - name: "Upload web-viewer (adhoc)" + if: ${{ inputs.ADHOC_NAME != '' }} + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "crates/viewer/re_web_viewer_server/web_viewer" + destination: "rerun-web-viewer/adhoc/${{inputs.ADHOC_NAME}}" + parent: false + process_gcloudignore: false + + - name: "Upload web-viewer (prerelease)" + if: github.ref == 'refs/heads/main' + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "crates/viewer/re_web_viewer_server/web_viewer" + destination: "rerun-web-viewer/prerelease" + parent: false + process_gcloudignore: false + headers: |- + cache-control: no-cache, max-age=0 + + - name: "Upload web-viewer (main)" + if: github.ref == 'refs/heads/main' + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "crates/viewer/re_web_viewer_server/web_viewer" + destination: "rerun-web-viewer/version/main" + parent: false + process_gcloudignore: false + headers: |- + cache-control: no-cache, max-age=0 + + - name: "Upload web-viewer (pr)" + if: ${{ inputs.PR_NUMBER != '' }} + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "crates/viewer/re_web_viewer_server/web_viewer" + destination: "rerun-web-viewer/pr/${{ inputs.PR_NUMBER }}" + parent: false + process_gcloudignore: false + headers: |- + cache-control: no-cache, max-age=0 + + - name: "Upload web-viewer (nightly)" + if: ${{ inputs.NIGHTLY }} + uses: google-github-actions/upload-cloud-storage@v3 + with: + path: "crates/viewer/re_web_viewer_server/web_viewer" + destination: "rerun-web-viewer/version/nightly" + parent: false + process_gcloudignore: false + headers: |- + cache-control: no-cache, max-age=0 + + # Upload extensionless HTML aliases (signed-in, signed-out) to the + # bucket root with the correct Content-Type. The OAuth redirect uses the + # origin (app.rerun.io/signed-in), not a versioned path. + - name: "Upload HTML aliases to bucket root" + run: | + cd crates/viewer/re_web_viewer_server/web_viewer + for f in *.html; do + name="${f%.html}" + if [ "$name" != "index" ] && [ "$name" != "index_bundled" ]; then + gcloud storage cp --content-type="text/html" "$f" "gs://rerun-web-viewer/${name}" + fi + done + + - name: Status comment + if: success() && github.event_name == 'pull_request' + # https://github.com/mshick/add-pr-comment + uses: mshick/add-pr-comment@v3.9.1 + # GitHub API is very unreliable. We don't want to fail the entire workflow just because we couldn't post a comment. + continue-on-error: true + with: + message-id: "web-viewer-build-status" + repo-token: ${{ secrets.GITHUB_TOKEN }} + message: | + Web viewer built successfully. + + | Result | Commit | Link | Manifest | + | ------ | ------- | ---- | -------- | + | ✅ | ${{ steps.get-sha.outputs.sha }} | https://rerun.io/viewer/pr/${{ github.event.pull_request.number }} | [`+nightly`](https://rerun.io/viewer/pr/${{ github.event.pull_request.number }}?manifest_url=https://app.rerun.io/version/nightly/examples_manifest.json) [`+main`](https://rerun.io/viewer/pr/${{ github.event.pull_request.number }}?manifest_url=https://app.rerun.io/version/main/examples_manifest.json) | + + View image diff on [kitdiff](https://rerun-io.github.io/kitdiff/?url=${{github.event.pull_request.html_url}}). + + Note: This comment is updated whenever you push a commit. + + - name: Status comment + if: failure() && github.event_name == 'pull_request' + # https://github.com/mshick/add-pr-comment + uses: mshick/add-pr-comment@v3.9.1 + # GitHub API is very unreliable. We don't want to fail the entire workflow just because we couldn't post a comment. + continue-on-error: true + with: + message-id: "web-viewer-build-status" + repo-token: ${{ secrets.GITHUB_TOKEN }} + message: | + Web viewer failed to build. + + | Result | Commit | Link | Manifest | + | ------ | ------- | ----- | + | ❌ | ${{ steps.get-sha.outputs.sha }} | https://rerun.io/viewer/pr/${{ github.event.pull_request.number }} | [`+nightly`](https://rerun.io/viewer/pr/${{ github.event.pull_request.number }}?manifest_url=https://app.rerun.io/version/nightly/examples_manifest.json) [`+main`](https://rerun.io/viewer/pr/${{ github.event.pull_request.number }}?manifest_url=https://app.rerun.io/version/main/examples_manifest.json) | + + View image diff on [kitdiff](https://rerun-io.github.io/kitdiff/?url=${{github.event.pull_request.html_url}}). + + Note: This comment is updated whenever you push a commit. diff --git a/.github/workflows/reusable_web_test.yml b/.github/workflows/reusable_web_test.yml new file mode 100644 index 0000000..74d5d41 --- /dev/null +++ b/.github/workflows/reusable_web_test.yml @@ -0,0 +1,62 @@ +name: Reusable Web tests + +on: + workflow_call: + inputs: + CONCURRENCY: + required: true + type: string + REF: + required: false + type: string + default: "" + +concurrency: + group: ${{ inputs.CONCURRENCY }}-web-test + cancel-in-progress: true + +env: + RUSTFLAGS: --deny warnings + RUSTDOCFLAGS: --deny warnings + RUST_BACKTRACE: full + CARGO_TERM_COLOR: always + +defaults: + run: + shell: bash --noprofile --norc -euo pipefail {0} + +permissions: + contents: "read" + id-token: "write" + +jobs: + web-test: + name: Browser tests + timeout-minutes: 60 + runs-on: ubuntu-latest-16-cores + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.REF || (github.event_name == 'pull_request' && github.event.pull_request.head.ref) || '' }} + + - name: Set up Rust + uses: ./.github/actions/setup-rust + with: + cache_key: "web-test" + save_cache: false + targets: wasm32-unknown-unknown + workload_identity_provider: ${{ secrets.GOOGLE_WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + + - uses: prefix-dev/setup-pixi@v0.10.0 + with: + pixi-version: v0.71.3 + + - name: Set up Firefox + uses: browser-actions/setup-firefox@v1 + + - name: Set up geckodriver + uses: browser-actions/setup-geckodriver@latest + + - name: Run Wasm browser tests + run: pixi run web-test diff --git a/.github/workflows/update_kittest_snapshots.yml b/.github/workflows/update_kittest_snapshots.yml new file mode 100644 index 0000000..80560fa --- /dev/null +++ b/.github/workflows/update_kittest_snapshots.yml @@ -0,0 +1,43 @@ +# This workflow can be triggered via kitdiff's "Update snapshots" button, when viewing snapshots +# from a specific run. +name: Update kittest snapshots +on: + workflow_dispatch: + inputs: + run_id: + description: "The run ID that produced the artifact" + required: true + type: string + +permissions: + actions: read + +jobs: + update-snapshots: + name: Update snapshots from artifact + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - uses: actions/checkout@v4 + with: + lfs: true + # We can't use the workflow token since that would prevent our commit to cause further workflows. + # See https://github.com/stefanzweifel/git-auto-commit-action#commits-made-by-this-action-do-not-trigger-new-workflow-runs + # This token should be a personal access token with at least Read and write permission to `Contents`. + # The commit action below will use the token this the code was checked out with. + token: "${{ secrets.SNAPSHOT_COMMIT_GITHUB_TOKEN }}" + + - name: Accept snapshots + env: + GH_TOKEN: ${{ github.token }} + RUN_ID: ${{ github.event.inputs.run_id }} + run: ./scripts/update_snapshots_from_ci.sh + + - name: Git status + run: git status + + - uses: stefanzweifel/git-auto-commit-action@v6 + with: + commit_message: "Update snapshot images" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bb27b84 --- /dev/null +++ b/.gitignore @@ -0,0 +1,106 @@ +.DS_Store +__MACOSX + +# C++ and CMake stuff: +*.a +*.bin +*.o +/.ccls-cache/ +/arrow/ +/build/ +**/build-msvc/ +**/CMakeFiles/ +**/CMakeCache.txt +**/Makefile +**/cmake_install.cmake +_deps +**/.cache/ +**/rerun_cpp/docs/html +**/rerun_cpp/docs/xml +*.tgz + +# User-specific VSCode C++ extension config: +.vscode/c_cpp_properties.json + +# Rust compile target directories. +# These should only be found in the repository root, so prefix them all with slashes: +/target +/target_pixi +/target_pixi_wasm +/target_ra +/target_wasm + +# Python virtual environment: +**/venv* +**/.venv* +/env/ + +# Python build artifacts: +__pycache__ +.mypy_cache +*.pyc +*.pyd +*.so +**/.ipynb_checkpoints/ +**/.pytest_cache + +# Pixi environment +.pixi + +# Generated shims (created by ensure-rerun-env) +scripts/pixi/uv +scripts/pixi/uv.exe +scripts/pixi/uvpy +scripts/pixi/uvpy.exe + +.gdb_history +perf.data* + +**/dataset/ + +# insta snapshot temp file: +*.pending-snap +*.snap.new + +# Screenshots from samples etc. +screenshot*.png + +# Saved example `.rrd` files +example_data + +# Various builds +dist +wheels + +# VSCode local tasks +.vscode/tasks.json + +# Screenshot comparison build +/compare_screenshot +**/tests/snapshots/**/*.diff.png +**/tests/snapshots/**/*.new.png +**/tests/snapshots/**/*.old.png + +# Mesa install +mesa +mesa.7z +mesa.tar.xz +icd.json + +# Temporary RRD files. Don't blanket ignore them since we check in some for backwards compatibility tests. +docs/snippets/**/*.rrd + +/meilisearch + +.claude +.pixi/* +justfile + +# heaptrack files +*.zst + +# Lychee link checker cache +.lycheecache + +# Saved pytest-benchmark results +/.benchmarks diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..8213882 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,17 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# RustRover generated files +misc.xml +prettier.xml +rust.xml +# We may want to share some inspection profiles, but by default ignore +inspectionProfiles/*xml + +# This is too disruptive +/*.iml diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/watcherTasks.xml b/.idea/watcherTasks.xml new file mode 100644 index 0000000..1e971a1 --- /dev/null +++ b/.idea/watcherTasks.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 0000000..bb5af00 --- /dev/null +++ b/.mcp.json @@ -0,0 +1,8 @@ +{ + "mcpServers": { + "rerun": { + "command": "./target/debug/re-viewer-mcp", + "args": [] + } + } +} diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..70d1644 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,18 @@ +rerun_cpp/docs/**/* + +rerun_py/docs/templates/** +rerun_py/site/** + +rerun_js/web-viewer/re_viewer_bg.js +rerun_js/web-viewer/re_viewer.js +crates/viewer/re_web_viewer_server/web_viewer/re_viewer.js + +.pixi +/build +/compare_screenshot +**/target +**/target_pixi +**/target_pixi_wasm +**/target_ra +**/target_wasm +**/venv* diff --git a/.prettierrc.toml b/.prettierrc.toml new file mode 100644 index 0000000..f9b1608 --- /dev/null +++ b/.prettierrc.toml @@ -0,0 +1,19 @@ +semi = true +tabWidth = 4 +trailingComma = "all" + +[[overrides]] +files = ["*.yml", "*.yaml"] +options = { tabWidth = 2 } + +[[overrides]] +files = ["*.js", "*.mjs", "*.cjs", "*.ts", "*.d.ts"] +options = { semi = true, tabWidth = 2 } + +[[overrides]] +files = [".prettierrc", "*.json", "*.css", "*.html"] +options = { tabWidth = 2 } + +[[overrides]] +files = ["*.ts"] +options = { parser = "typescript" } diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..2c07333 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.11 diff --git a/.run/viewer_fast.run.xml b/.run/viewer_fast.run.xml new file mode 100644 index 0000000..9066f63 --- /dev/null +++ b/.run/viewer_fast.run.xml @@ -0,0 +1,22 @@ + + + + diff --git a/.rustfmt.toml b/.rustfmt.toml new file mode 100644 index 0000000..2ecade5 --- /dev/null +++ b/.rustfmt.toml @@ -0,0 +1,6 @@ +# Enable these if you want to run `cargo +nightly fmt`: +# group_imports = "StdExternalCrate" +# imports_granularity = "Module" + +# To apply these, uncomment the above lines, then run `cargo +nightly fmt`. +# Then comment them again, and run `pixi run codegen --force && pixi run codegen-protos && cargo fmt` diff --git a/.typos.toml b/.typos.toml new file mode 100644 index 0000000..14b0a58 --- /dev/null +++ b/.typos.toml @@ -0,0 +1,254 @@ +# https://github.com/crate-ci/typos +# install: cargo install typos-cli +# run: typos + +[files] +extend-exclude = [ + ".typos.toml", + "*.snap", + "crates/viewer/re_ui/src/design_tokens.rs", + "examples/assets", + "rerun_cpp/src/rerun/archetypes/image.hpp", # TODO(emilk): remove once we remove from_greyscale8 + "rerun_cpp/src/rerun/archetypes/image_ext.cpp", # TODO(emilk): remove once we remove from_greyscale8 + "rerun_cpp/src/rerun/third_party/cxxopts.hpp", + "*.png", + "*.mp4", + "*.rrd", +] + +[default.extend-words] +FUL = "FUL" # forward-up-left coordinate system +Isse = "Isse" # It's a name +lod = "lod" # level-of-detail +ND = "ND" # np.NDArray +opf = "opf" # Open Photogrammetry Format (OPF) file +somes = "somes" # many `Some` +teh = "teh" # part of @teh-cmc +trak = "trak" # mp4 crate spelling +typ = "typ" # We cannot write "type" in rust +writeable = "writeable" # NumPy's attribute is `ndarray.flags.writeable`, not `writable` +ws = "ws" # web-sockets, as in "ws://…" +Yoh = "Yoh" # Part of @YohDeadfall + +# Use the more common spelling +adaptor = "adapter" +adaptors = "adapters" +framerate = "frame rate" + +# For consistency we prefer American English: +aeroplane = "airplane" +amortisation = "amortization" +amortise = "amortize" +amortised = "amortized" +amortises = "amortizes" +amortising = "amortizing" +analogue = "analog" +analyse = "analyze" +appetiser = "appetizer" +arbour = "arbor" +armour = "armor" +artefact = "artifact" +authorise = "authorize" +behaviour = "behavior" +calibre = "caliber" +#cancelled = "canceled" # allow 'cancelled' since Arrow uses it. +candour = "candor" +capitalise = "capitalize" +catalogue = "catalog" +categorisation = "categorization" +categorise = "categorize" +categorised = "categorized" +centralisation = "centralization" +centralise = "centralize" +centralised = "centralized" +centre = "center" +characterise = "characterize" +chequerboard = "checkerboard" +chequered = "checkered" +civilise = "civilize" +clamour = "clamor" +colonise = "colonize" +colour = "color" +coloured = "colored" +cosy = "cozy" +criticise = "criticize" +defence = "defense" +demeanour = "demeanor" +dialogue = "dialog" +distil = "distill" +doughnut = "donut" +dramatise = "dramatize" +draught = "draft" +emphasise = "emphasize" +endeavour = "endeavor" +enrol = "enroll" +epilogue = "epilog" +equalise = "equalize" +familiarise = "familiarize" +familiarised = "familiarized" +favour = "favor" +favourite = "favorite" +fibre = "fiber" +finalisation = "finalization" +finalise = "finalize" +finalised = "finalized" +finalises = "finalizes" +finalising = "finalizing" +flavour = "flavor" +fulfil = "fufill" +gaol = "jail" +generalisation = "generalization" +generalise = "generalize" +generalised = "generalized" +grey = "gray" +greys = "grays" +greyscale = "grayscale" +harbour = "habor" +honour = "honor" +humour = "humor" +initialisation = "initialization" +initialise = "initialize" +initialised = "initialized" +initialises = "initializes" +initialising = "initializing" +instalment = "installment" +instil = "instill" +itemise = "itemize" +itemised = "itemized" +jewellery = "jewelry" +kerb = "curb" +labour = "labor" +litre = "liter" +lustre = "luster" +maximisation = "maximization" +maximise = "maximize" +maximised = "maximized" +meagre = "meager" +metre = "meter" +minimisation = "minimization" +minimise = "minimize" +minimised = "minimized" +mobilise = "mobilize" +monologue = "monolog" +naturalise = "naturalize" +neighbour = "neighbor" +neighbourhood = "neighborhood" +neighbouring = "neighboring" +neighbours = "neighbors" +normalise = "normalize" +normalised = "normalized" +odour = "odor" +offence = "offense" +optimisation = "optimization" +optimise = "optimize" +optimised = "optimized" +optimising = "optimizing" +organise = "organize" +parlour = "parlor" +penalise = "penalize" +penalised = "penalized" +plough = "plow" +popularise = "popularize" +pretence = "pretense" +prioritisation = "prioritization" +prioritise = "prioritize" +prioritised = "prioritized" +programme = "program" +prologue = "prolog" +rancour = "rancor" +randomise = "randomize" +randomised = "randomized" +realise = "realize" +recognise = "recognize" +recognised = "recognized" +rigour = "rigor" +rumour = "rumor" +sabre = "saber" +satirise = "satirize" +saviour = "savior" +savour = "savor" +sceptical = "skeptical" +sceptre = "scepter" +sepulchre = "sepulcher" +serialisation = "serialization" +serialise = "serialize" +serialised = "serialized" +skilful = "skillful" +sombre = "somber" +specialisation = "specialization" +specialise = "specialize" +specialised = "specialized" +splendour = "splendor" +stabilise = "stabilize" +stabilised = "stabilized" +standardise = "standardize" +sulphur = "sulfur" +summarisation = "summarization" +summarise = "summarize" +summarised = "summarized" +symbolise = "symbolize" +synchronisation = "synchronization" +synchronise = "synchronize" +synchronised = "synchronized" +synchronises = "synchronizes" +synchronising = "synchronizing" +theatre = "theater" +tonne = "ton" +travelogue = "travelog" +tumour = "tumor" +utilisation = "utilization" +utilise = "utilize" +utilised = "utilized" +valour = "valor" +vaporise = "vaporize" +vigour = "vigor" +visualisation = "visualization" +visualise = "visualize" +visualised = "visualized" +# End of American English section + +# null-terminated is the name of the wikipedia article! +# https://en.wikipedia.org/wiki/Null-terminated_string +nullterminated = "null-terminated" +zeroterminated = "null-terminated" +zero-terminated = "null-terminated" + +[default] +extend-ignore-re = [ + # Work around for typos inside of hashes. These show up inside of ipynb. + # e.g. "f4e1caf9" -> `caf` should be `calf` + # Specifically limit ourselves to exactly 8 chars in a quoted string, or + # 16 character hashses following a leading underscore. + # Just don't spell "defaced" wrong. + "\"[a-f0-9]{8}\"", + "_[a-f0-9]{16}", + + + "np.arange", # Stands for "array range" and isn't a misspelling of "arrange". + "phc_[a-zA-Z0-9]*", # Posthog public key + "PNG.?", # Workaround for https://github.com/crate-ci/typos/issues/967 + + "_LEVL_", # Used in air_traffic_data.py + + "thrEEone", # Used in a test + + "notify_seeked", # Used in the `mcap` crate. + + # There's a crate with this name. + "cros_codecs", + "cros-codecs", + + "Secur32", # Referring to `Secur32.dll` on Windows. + + "muh_scalars", # Weird name introduced in `crates/viewer/re_view_time_series/tests/basic.rs` introduced in https://github.com/rerun-io/rerun/pull/10713 + + "isse", # Name + + "\"framerate\"", # ffmpeg/avfoundation container option name, not prose + + "@[a-zA-Z]+", # GitHub user names + + "\\[[a-f0-9]{7}\\]\\(https://github\\.com/rerun-io/rerun/commit/", # Commit SHA links in changelog + + "SELECTed", # Past tense of SQL SELECT +] diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..03e0df1 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,26 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "bufbuild.vscode-buf", + "charliermarsh.ruff", + "esbenp.prettier-vscode", + "fill-labs.dependi", + "gaborv.flatbuffers", + "github.vscode-github-actions", + "josetr.cmake-language-support-vscode", + "ms-python.mypy-type-checker", + "ms-python.python", + "ms-vscode.cmake-tools", + "ms-vscode.cpptools-extension-pack", + "ms-vsliveshare.vsliveshare", + "polymeilex.wgsl", + "rust-lang.rust-analyzer", + "streetsidesoftware.code-spell-checker", + "tamasfe.even-better-toml", + "vadimcn.vscode-lldb", + "wayou.vscode-todo-highlight", + "webfreak.debug", + "xaver.clang-format", // C++ formatter + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..4484127 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,196 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + // Python + { + "name": "Python Debugger: Current File", + "type": "debugpy", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal" + }, + // Rust: + { + "name": "Lauch C++ minimal example", + "type": "cppdbg", + "request": "launch", + "cwd": "${workspaceFolder}", + "program": "${workspaceFolder}/build/debug/examples/cpp/minimal/example_minimal", + "args": [], + "stopAtEntry": false, + "environment": [], + "externalConsole": false, + "MIMode": "lldb" + }, + { + "name": "Launch tests", + "type": "lldb", + "request": "launch", + "cargo": { + "args": [ + "test", + "--profile=debugging", + "-p=re_log_encoding", + "--no-run", + "--lib", + "--all-features" + ], + "filter": { + "kind": "lib" + } + }, + "cwd": "${workspaceFolder}" + }, + { + "name": "Debug 'rerun' (no args)", + "type": "lldb", + "request": "launch", + "cargo": { + "args": [ + "build", + "--profile=debugging", + "--package=rerun-cli", + "--no-default-features", + "--features=native_viewer" + ], + "filter": { + "name": "rerun", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}", + "env": { + "RUST_LOG": "debug" + } + }, + { + "name": "Debug 'rerun ../data.rrd'", + "type": "lldb", + "request": "launch", + "cargo": { + "args": [ + "build", + "--profile=debugging", + "--package=rerun-cli", + "--no-default-features", + "--features=native_viewer" + ], + "filter": { + "name": "rerun", + "kind": "bin" + } + }, + "args": [ + "../data.rrd" + ], + "cwd": "${workspaceFolder}", + "env": { + "RUST_LOG": "debug" + } + }, + { + "name": "Debug 'rerun' bar_chart.rrd from url", + "type": "lldb", + "request": "launch", + "cargo": { + "args": [ + "build", + "--profile=debugging", + "--package=rerun-cli", + "--no-default-features", + "--features=native_viewer" + ], + "filter": { + "name": "rerun", + "kind": "bin" + } + }, + "args": [ + "https://app.rerun.io/version/0.25.0/examples/snippets/bar_chart.rrd" + ], + "cwd": "${workspaceFolder}", + "env": { + "RUST_LOG": "trace" + } + }, + { + "name": "Debug 'minimal' example", + "type": "lldb", + "request": "launch", + "cargo": { + "args": [ + "build", + "--profile=debugging", + "--package=minimal", + ], + "filter": { + "name": "minimal", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}", + "env": { + "RUST_LOG": "trace" + } + }, + { + "name": "Debug re_renderer --example=multiview", + "type": "lldb", + "request": "launch", + "cargo": { + "args": [ + "build", + "--profile=debugging", + "--example=multiview" + ], + "filter": { + "name": "multiview", + "kind": "example" + } + }, + "args": [], + "cwd": "${workspaceFolder}" + }, + { + "name": "Debug 'codegen'", + "type": "lldb", + "request": "launch", + "cargo": { + "args": [ + "build", + "--profile=debugging", + "--package=re_types_builder", + ], + "filter": { + "name": "build_re_types", + "kind": "bin" + } + }, + "args": [ + "--force" // always run codegen, even if hashes hasn't changed + ], + "cwd": "${workspaceFolder}", + "env": { + "RAYON_NUM_THREADS": "1" // less confusing debugging experience + } + }, + { + "name": "(Windows) Launch & debug C++ snippet", + "type": "cppvsdbg", + "request": "launch", + "program": "${workspaceFolder}/build/debug/docs/snippets/video_auto_frames.exe", + "args": [ + "${workspaceFolder}/tests/assets/video/Big_Buck_Bunny_1080_10s_av1.mp4" + ], + "stopAtEntry": false, + "cwd": "${fileDirname}", + "environment": [], + "console": "externalTerminal" + }, + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..f3c08cc --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,68 @@ +{ + "editor.formatOnSave": true, + "editor.semanticTokenColorCustomizations": { + "rules": { + "*.unsafe:rust": "#eb5046" + } + }, + "files.autoGuessEncoding": true, + "files.insertFinalNewline": true, + "files.trimTrailingWhitespace": true, + "protoc": { + "options": [ + "--proto_path=crates/store/re_protos/proto", + ] + }, + "rust-analyzer.check.command": "clippy", + // Whether `--workspace` should be passed to `cargo check`. If false, `-p ` will be passed instead. + "rust-analyzer.check.workspace": false, + "rust-analyzer.cargo.allTargets": true, + // --all-features will set the `__ci` feature flag, which stops re_web_viewer_server/build.rs from requiring the web viewer to be built. + "rust-analyzer.cargo.features": "all", + // Use a separate target directory for Rust Analyzer so it doesn't prevent cargo/clippy from doing things. + "rust-analyzer.cargo.targetDir": "target_ra", + "rust-analyzer.check.invocationStrategy": "per_workspace", + "rust-analyzer.cargo.buildScripts.invocationStrategy": "per_workspace", + // Our build scripts are generating code. + // Having Rust Analyzer do this while doing other builds can lead to catastrophic failures. + // INCLUDING attempts to publish a new release! + "rust-analyzer.cargo.buildScripts.enable": false, + "rust-analyzer.cargo.extraEnv": { + "IS_IN_RERUN_WORKSPACE": "yes" + }, + "rust-analyzer.diagnostics.enable": false, // False positives + "rust-analyzer.imports.granularity.group": "module", // Matches our .rustfmt.toml and CODE_STYLE.md + "rust-analyzer.showUnlinkedFileNotification": false, + // Uncomment the following options and restart rust-analyzer to get it to check code behind `cfg(target_arch=wasm32)`. + // Don't forget to put it in a comment again before committing. + // "rust-analyzer.cargo.target": "wasm32-unknown-unknown", + // "rust-analyzer.cargo.cfgs": ["web","webgl","webgpu"], + "C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools", // Use cmake-tools to grab configs. + "C_Cpp.autoAddFileAssociations": false, + "cmake.buildDirectory": "${workspaceRoot}/build/debug", + "cmake.generator": "Ninja", // Use Ninja, just like we do in our just/pixi command. + "python.analysis.extraPaths": [ + "rerun_py/rerun_sdk" + ], + "ruff.configuration": "rerun_py/pyproject.toml", + "prettier.requireConfig": true, + "prettier.configPath": ".prettierrc.toml", + "[proto3]": { + "editor.defaultFormatter": "bufbuild.vscode-buf" + }, + "[python]": { + "editor.defaultFormatter": "charliermarsh.ruff" + }, + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[html]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[css]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[yaml]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, +} diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..d795669 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,204 @@ +# CLAUDE.md + +Guidance for LLMs working in this repo. + +## Project overview + +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. + +## Build system + +`pixi` for task management + deps. See `pixi.toml` for full task list. + +### Essential commands + +**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 viewer +- `pixi run uvpy script.py` - Run Python scripts with rerun SDK +- `cargo run -p ` - 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 files +- `pixi run cpp-fmt` - Format C++ files +- `pixi run toml-fmt` - Format TOML files + +**Testing:** +- `cargo clippy -p ` - Run rust checks before building +- `cargo nextest run --all-features --no-fail-fast -p ` - Run tests for specific crate + - Example: `cargo nextest run --all-features --no-fail-fast -p re_view_spatial` +- Use `cargo nextest` (not `cargo test`) for better output + parallelism +- Always use `--all-features` unless specific reason not to +- Use `--no-fail-fast` to gather all failures in single run + +**Snapshots:** +- **`insta` snapshots**: 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`'s `Harness::snapshot` + `TestContext` for mocking viewer. + - Results saved to `tests/snapshots/`, failures produce `diff.png` + - Update refs: `UPDATE_SNAPSHOTS=1` + - Update from failed CI run: `./scripts/update_snapshots_from_ci.sh` + - Best practices: see [egui_kittest README](https://github.com/emilk/egui/tree/master/crates/egui_kittest#snapshot-testing) + +## Code generation system + +**Critical: Never edit generated files directly.** All generated files marked "DO NOT EDIT" at top. + +### Type definition flow + +``` +.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 codegen` to regenerate + +### Extension pattern + +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) + +## Code conventions + +### General + +- use `…` instead of `...` +- Validate conventions via `pixi run lint-rerun ` (no file = check everything) +- Prose style (em vs en dash, sentence endings, casing) — see [`DESIGN.md`](DESIGN.md). In short: spaced em dash ` — `, never unspaced `word—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. + +## Architecture overview + +### Crate organization + +``` +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. + +### Type system hierarchy + +Three levels (generated from .fbs files): + +1. **Datatypes** (`rerun.datatypes.*`) - Basic types like Vec3D, Color +2. **Components** (`rerun.components.*`) - Named semantic wrappers (Position3D, Radius) +3. **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`. + +### Data flow + +``` +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) +``` + +### Blueprint system + +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}/` + +### Visualizers + +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. + +## Documentation snippets + +See [`docs/snippets/README.md`](docs/snippets/README.md) for running, building, finding snippets. Config in [`docs/snippets/snippets.toml`](docs/snippets/snippets.toml). + +## Python development workflow + +Python uses separate uv-managed .venv (not pixi's conda env): + +```bash +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 run +``` + +`uv` wrapper unsets `CONDA_PREFIX` for isolation from pixi's env. + +## Important notes + +- **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 docstring formatting + +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 `@deprecated` decorator (mkdocstrings renders it), don't duplicate in docstring +- Code blocks: markdown fenced blocks, not `.. code-block::` +- Params: numpy-style (`Parameters`, `Returns` with `----------`) + +## Documentation system + +See [`docs/README.md`](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 by `pixi run codegen` from `.fbs` files - don't edit +- **`docs/content/reference/cli.md`** auto-generated by `pixi run man` - don't edit +- **Code snippets** in `docs/snippets/all/` with Python, Rust, C++ implementations +- `pixi run py-docs-serve` previews Python API docs locally +- `pixi run -e cpp cpp-docs` builds C++ docs + +## Development references + +- [`ARCHITECTURE.md`](ARCHITECTURE.md) - Detailed architecture docs +- [`BUILD.md`](BUILD.md) - Full build instructions +- [`CODE_STYLE.md`](CODE_STYLE.md) - Code style guidelines +- [`CONTRIBUTING.md`](CONTRIBUTING.md) - Contribution guidelines +- [`DESIGN.md`](DESIGN.md) - UI design guidelines (GUI, CLI, docs, log messages) +- [`docs/README.md`](docs/README.md) - Documentation system (sites, builds, deployment) +- [`rerun_py/README.md`](rerun_py/README.md) - Python SDK instructions diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md new file mode 100644 index 0000000..1beecce --- /dev/null +++ b/ARCHITECTURE.md @@ -0,0 +1,291 @@ +# Rerun architecture + +This document describes the technical architecture of Rerun. + +## See also + +- [`BUILD.md`](BUILD.md) +- [`TESTING.md`](TESTING.md) +- [`rerun_py/README.md`](rerun_py/README.md) - build instructions for Python SDK +- [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md) +- [`CODE_STYLE.md`](CODE_STYLE.md) +- [`CONTRIBUTING.md`](CONTRIBUTING.md) +- [`RELEASES.md`](RELEASES.md) + +## The major components + +### Logging APIs + +It all starts with logging. You can log rich data (point clouds, images, etc.) with either our Python SDK or our Rust SDK. + +The logging SDK:s encodes the data using Apache Arrow (see more below). + +The logging data can be written to disk as `.rrd` files, or transmitted over gRPC to either a Rerun Viewer or a Rerun Server. + +### Rerun Viewer + +The Rerun Viewer is where log data is visualized. It is usually run as a native app, but can also be compiled to WebAssembly (Wasm) and run in a browser. + +#### Native Viewer + +The easiest way to launch the Viewer is directly from the logging API with `rr.init("rerun_example_app", spawn=True)`. However, the standalone Viewer can also be run from the command line, for example to view an `.rrd` file: `rerun mydata.rrd`. + +#### Web viewer + +You can try running the Viewer in a browser using `rr.serve()` in Python, or using `rerun --web-viewer mydata.rrd`. + +The web viewer consists of just a few small files - a thin `.html`, a `.wasm` blob, and an auto-generated `.js` bridge for the wasm. These files are served using the [`re_web_viewer_server`](https://github.com/rerun-io/rerun/tree/latest/crates/viewer/re_web_viewer_server) crate. + +The web viewer can load `.rrd` files (just drag-drop them into the browser), or read logging data streamed over gRPC. + +### `.rrd` files + +`.rrd` ("**R**e**r**un **D**ata") is just a bunch of log messages appended one after the other to a file. + +NOTE: `.rrd` files do not yet offer full backwards or forwards compatibility. However, the current version of Rerun will always be able to open `.rrd` files generated by the *previous* version. This is not guaranteed to work for files generated with older versions. + +## Technologies we use + +### Apache Arrow + +[Apache Arrow](https://arrow.apache.org/) is a language-independent columnar memory format for arbitrary data. We use it to encode the log data when transmitting it over the network or storing it in an `.rrd` file. We also use it in our in-RAM data store, [`re_chunk_store`](crates/store/re_chunk_store/README.md). + +In Rust, we use the [`arrow` crate](https://crates.io/crates/arrow). + +### `wgpu` + +The Rerun Viewer uses the [`wgpu`](https://github.com/gfx-rs/wgpu) graphics API. It provides a high-performance abstraction over Vulkan, Metal, D3D12, D3D11, OpenGLES, WebGL and [WebGPU](https://en.wikipedia.org/wiki/WebGPU). This lets us write the same code graphics code for native as for web. + +On web builds, we use WebGPU when available on the Web, but automatically fall back to a WebGL based emulation layer (with a more limited feature set). + +We have written our own high-level rendering crate on top of `wgpu`, called [`re_renderer`](crates/viewer/re_renderer/README.md). + +### `egui` + +The GUI in the Rerun Viewer is using [`egui`](https://www.egui.rs/), a cross-platform, [immediate mode GUI](https://github.com/emilk/egui#why-immediate-mode). + +We use [`eframe`](https://github.com/emilk/egui/tree/master/crates/eframe), the egui framework, to run `egui` on both native and web. + +### Wasm + +Wasm (short for [WebAssembly](https://webassembly.org/)) is a binary instruction format supported by all major browser. +The Rerun Viewer can be compiled to Wasm and run in a browser. + +Threading support in Wasm is nascent, so care must be taken that we don't spawn any threads when compiling for `wasm32`. + +Wasm has no access to the host system, except via JS calls (something that may change once [WASI](https://wasi.dev/) rolls out), so when compiling for `wasm32` you can NOT use the Rust standard library to: + +- Access files +- Read environment variables +- Get the current time (use [`instant`](https://crates.io/crates/instant) instead) +- Use networking (use [`ehttp`](https://github.com/emilk/ehttp), [`reqwest`](https://github.com/seanmonstar/reqwest), or [`ewebsock`](https://github.com/rerun-io/ewebsock) instead) +- etc + +## Immediate mode + +The Rerun Viewer uses an [immediate mode GUI](https://github.com/emilk/egui#why-immediate-mode), [`egui`](https://www.egui.rs/). This means that each frame the entire GUI is being laid out from scratch. + +In fact, the whole of the Rerun Viewer is written in an immediate mode style. Each rendered frame it will query the in-RAM data store, massage the results, and feed it to the renderer. + +The advantage of immediate mode is that is removes all state management. There is no callbacks that are called when some state has already changed, and the state of the blueprint is always in sync with what you see on screen. + +Immediate mode is also a forcing function, forcing us to relentlessly optimize our code. +This leads to a very responsive GUI, where there is no "hiccups" when switching data source or doing time scrubbing. + +Of course, this will only take us so far. In the future we plan on caching queries and work submitted to the renderer so that we don't perform unnecessary work each frame. We also plan on doing larger operation in background threads. This will be necessary in order to support viewing large datasets, e.g. several million points. The plan is still to do so within an immediate mode framework, retaining most of the advantages of stateless code. + +## Crates + +Here is an overview of the crates included in the project: + + + + + + + + + + + +### SDK/CLI/Wasm top-level crates + +| Crate | Description | +| --------- | ------------------------------------ | +| rerun-cli | Rerun native CLI binary crate | +| Rerun | Rerun Rust SDK and Viewer shim crate | +| rerun_c | Rerun C SDK | +| rerun_py | Rerun Python SDK | +| re_sdk | Rerun logging SDK | + +### Viewer crates + +##### UI crates + +| Crate | Description | +| ---------------------- |------------------------------------------------------------------------------------------------------------| +| re_arrow_ui | Show arrow data in a tree of rerun list_items and format arrow with syntax highlighting. | +| re_blueprint_tree | The UI for the blueprint tree in the left panel. | +| re_chunk_store_ui | A chunk store browser UI. | +| re_component_fallbacks | Provides default fallbacks for Rerun components in the fallback provider registry. | +| re_component_ui | Provides UI editors for Rerun component data for registration with the Rerun Viewer component UI registry. | +| re_dataframe_ui | Rich table widget over DataFusion. | +| re_gamepad | Gamepad input handling for the Rerun viewer. | +| re_memory_view | Flamegraph visualization for memory usage trees | +| re_plot | Plot ui components shared between time series and bar chart view. | +| re_recording_panel | The UI for the recording panel. | +| re_redap_browser | The UI and communication to implement the in-viewer redap server browser. | +| re_selection_panel | The UI for the selection panel. | +| re_time_panel | The time panel of the Rerun Viewer, allowing to control the displayed timeline & time. | +| re_time_ruler | Time ruler widget shared by the time panel and time-aware views. | +| re_view | Types & utilities for defining View classes and communicating with the Viewport. | +| re_view_bar_chart | A View that shows a single bar chart. | +| re_view_dataframe | A View that shows the data contained in entities in a table. | +| re_view_graph | A View that shows a graph (node-link diagram). | +| re_view_map | A View that shows geospatial data on a map. | +| re_view_spatial | Views that show entities in a 2D or 3D spatial relationship. | +| re_view_state_timeline | A view that shows state transitions as horizontal lanes over time. | +| re_view_tensor | A View dedicated to visualizing tensors with arbitrary dimensionality. | +| re_view_text_document | A simple View that shows a single text box. | +| re_view_text_log | A View that shows text entries in a table and scrolls with the active time. | +| re_view_time_series | A View that shows plots over Rerun timelines. | +| re_viewer | The Rerun Viewer | +| re_viewer_mcp | MCP server that allows agents to interact with the viewer. | +| re_viewport | The central viewport panel of the Rerun viewer. | + +##### UI support crates + +| Crate | Description | +| --------------------- | -------------------------------------------------------------------- | +| re_context_menu | Support crate for context menu and actions. | +| re_data_ui | Provides UI elements for Rerun component data for the Rerun Viewer. | +| re_renderer | A wgpu-based renderer for all your visualization needs. | +| re_renderer_examples | Examples for re_renderer | +| re_ui | Rerun GUI theme and helpers, built around egui | +| re_viewer_context | Rerun Viewer state that is shared with the viewer's code components. | +| re_viewport_blueprint | The data model description of the viewport panel. | + +### Application-level store + +| Crate | Description | +| --------------- | --------------------------------------------------------------- | +| re_dataframe | The Rerun public data APIs. | +| re_datafusion | DataFusion interfaces to Rerun gRPC queries | +| re_entity_db | In-memory storage of Rerun entities | +| re_log_encoding | Helpers for encoding and transporting Rerun log messages | +| re_protos | Rerun remote store gRPC API types | +| re_query | Querying data in the re_chunk_store | +| re_server | In-memory data server | +| re_tf | Dealing with spatial transforms & transform frames | +| re_sdk_types | The built-in Rerun data types, component types, and archetypes. | + +### Low-level store + +| Crate | Description | +| -------------- | --------------------------------------------------------------------------------------------- | +| re_chunk | A chunk of Rerun data, encoded using Arrow. Used for logging, transport, storage and compute. | +| re_chunk_store | An in-memory time series database for Rerun log data, based on Apache Arrow. | +| re_log_types | The basic building blocks of the Rerun data types and tables. | +| re_sorbet | Rerun arrow metadata and record batch definitions. | +| re_types_core | The core traits and types that power Rerun's data model. | + +### Data flow + +| Crate | Description | +| -------------------- | ----------------------------------------------------------------- | +| re_redap_client | Official client for the Rerun Data Protocol | +| re_redap_tests | Official test suite for the Rerun Data Protocol | +| re_importer | Handles importing of Rerun data from file using importer plugins | +| re_parquet | Parquet file loading with configurable column grouping | +| re_mp4_reader | Mp4 video file loading into Rerun chunks | +| re_data_source | Handles loading of Rerun data from different sources | +| re_grpc_client | Client for the legacy StoreHub API | +| re_grpc_server | Server for the legacy StoreHub API | +| re_web_viewer_server | Serves the Rerun web viewer (Wasm and HTML) over HTTP | + +### Build support + +| Crate | Description | +| ----------------- | ---------------------------------------------------------------- | +| re_build_info | Information about the build. Use together with re_build_tools | +| re_build_tools | build.rs helpers for generating build info | +| re_dev_tools | Various tools for Rerun development. Each tool has a subcommand. | +| re_protos_builder | Generates code for Rerun remote store gRPC API | +| re_types_builder | Generates code for Rerun's SDKs from flatbuffers definitions. | + +### Utilities + +| Crate | Description | +| -------------------- | --------------------------------------------------------------------------------------------- | +| re_analytics | Rerun's analytics SDK | +| re_arrow_util | Helpers for working with arrow | +| re_auth | Authentication and authorization helpers | +| re_backoff | Simple backoff logic used for retries. | +| re_byte_size | Calculate the heap-allocated size of values at runtime | +| re_byte_size_derive | Derive macro for `re_byte_size::SizeBytes` | +| re_capabilities | Capability tokens | +| re_case | Case conversions, the way Rerun likes them | +| re_crash_handler | Detect panics and signals, logging them and optionally sending them to analytics. | +| re_error | Helpers for handling errors. | +| re_format | Miscellaneous tools to format and parse numbers, durations, etc. | +| re_grpc_headers | Rerun gRPC header conventions (`x-rerun-*` consts, version interceptor, tower layers). | +| re_lenses | A collection of lenses for mapping component data to Rerun semantic types. | +| re_lenses_core | Core lens types and composable Arrow array transformations | +| re_log | Helpers for setting up and doing text logging in the Rerun crates. | +| re_log_channel | An in-memory channel of Rerun data messages | +| re_mcap | Convert MCAP into Rerun-compatible data. | +| re_memory | Run-time memory tracking and profiling. | +| re_mutex | A wrapper around `parking_lot::Mutex` useful for debugging deadlocks. | +| re_perf_telemetry | In and out of process performance profiling utilities for Rerun & Redap | +| re_quota_channel | A mpsc channel that applies backpressure based on byte size | +| re_ros_msg | Parsing and deserializing ROS messages | +| re_rvl | Codecs for depth compression including RVL and PNG. | +| re_span | An integer range that always has a non-negative length | +| re_string_interner | Yet another string interning library | +| re_test_mocks | In-process server doubles (`MockOtlpCollector`, `MockPostHog`) for OTel/PostHog test capture. | +| re_tracing | Helpers for tracing/spans/flamegraphs and such. | +| re_tuid | 128-bit Time-based Unique Identifier | +| re_uri | Parsing and constructing of Rerun URIs | +| re_video | Video decoding library | + +### Test crates + +| Crate | Description | +| ---------------- | ------------------------------------------------------------- | +| re_test_context | Provides a test context that builds on `re_viewer_context. | +| re_test_viewport | Extends the `re_test_context` with viewport-related features. | + +### Deprecated crates + +| Crate | Description | +| -------- | -------------------------- | +| re_types | Old name of `re_sdk_types` | + +### Dependencies and docs + +In order to get a dependency graph for our in-house crates and their docs, we recommend you run: + +``` +cargo install cargo-depgraph +cargo depgraph --all-deps --workspace-only --all-features --dedup-transitive-deps | dot -Tpng > /tmp/rerun-deps.png +open /tmp/rerun-deps.png +``` + +and: + +``` +cargo doc --no-deps --open +``` + +and then browse through the `re_*` crates. diff --git a/BUILD.md b/BUILD.md new file mode 100644 index 0000000..f50b63a --- /dev/null +++ b/BUILD.md @@ -0,0 +1,322 @@ +# Building Rerun +This is a guide to how to build Rerun. + + +## See also +* [`rerun_py/README.md`](rerun_py/README.md) - build instructions for Python SDK +* [`ARCHITECTURE.md`](ARCHITECTURE.md) +* [`TESTING.md`](TESTING.md) +* [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md) +* [`CODE_STYLE.md`](CODE_STYLE.md) +* [`CONTRIBUTING.md`](CONTRIBUTING.md) +* [`RELEASES.md`](RELEASES.md) + + +## Getting started with the repository + +First, install the Rust toolchain using the installer from . + +Then, clone the repository: +```sh +git clone git@github.com:rerun-io/rerun.git +cd rerun +``` + +Now install the `pixi` package manager: + +Make sure `cargo --version` prints `1.92.0` once you are done. + +### Python/PyO3 configuration (important!) + +This workspace uses [PyO3](https://pyo3.rs/) for Python bindings. Many crates have a transitive +dependency on `pyo3-build-config`, which requires a configuration file to be present. + +**If you see this error:** +``` +error: failed to parse contents of PYO3_CONFIG_FILE +caused by: + - 0: failed to open PyO3 config file at /path/to/rerun/rerun_py/pyo3-build.cfg + - 1: No such file or directory (os error 2) +``` + +**Run `pixi run ensure-pyo3-build-cfg` to generate the config file:** + +This file is normally generated automatically by pixi activation scripts, but if you're running +`cargo` directly outside of pixi, you'll need to generate it first. The configuration is +referenced in `.cargo/config.toml`: +```toml +PYO3_CONFIG_FILE = { value = "rerun_py/pyo3-build.cfg", relative = true } +``` + +For more details, see [Python build configuration](#python-build-configuration-automatic) below. + +If you are using an Apple-silicon Mac (M1, M2), make sure `rustc -vV` outputs `host: aarch64-apple-darwin`. If not, this should fix it: + +```sh +rustup set default-host aarch64-apple-darwin && rustup install 1.92.0 +``` + +## Git-lfs + +We use [git-lfs](https://git-lfs.com/) to store big files in the repository, such as UI test snapshots. +We aim to keep this project buildable without the need of git-lfs (for example, icons and similar assets are checked in to the repo as regular files). +However, git-lfs is generally required for a proper development environment, e.g. to run tests. + +### Setting up git-lfs + +The TL;DR is to install git-lfs via your favorite package manager (`apt`, Homebrew, MacPorts, etc.) and run `git lfs install`. +See the many resources available online more details. + +You can ensure that everything is correctly installed by running `git lfs ls-files` from the repository root. +It should list some test snapshot files. + +### Useful git-lfs commands +``` +# Install git-lfs in the repo (installs git hooks) +git lfs install + +# Move a file to git lfs +git lfs track "path/to/file/or/pattern" # OR manually edit .gitattributes +git add --renormalize . # Moves already added files to lfs (according to .gitattributes) + +# Move a file from lfs to regular git +git lfs untrack "path/to/file/or/pattern" # OR manually edit .gitattributes +git add --renormalize . # Moves already added files to regular git (according to .gitattributes) + +# Push to a contributor remote (see https://github.com/cli/cli/discussions/8794#discussioncomment-8695076) +git push --no-verify + +# Push git lfs files to contributor remote: +git push origin $(git branch --show-current) && git push --no-verify && git push origin --delete $(git branch --show-current) +``` + +See also [this section in the egui docs](https://github.com/emilk/egui/blob/eceb0b11c9f8e68d96c33c1f4af0335b3e66376d/CONTRIBUTING.md#working-with-git-lfs). + +## Validating your environment +You can validate your environment is set up correctly by running: +```sh +pixi run check-env +``` + + +## Building and running the Viewer + +Use this command for building and running the viewer: + +```sh +pixi run rerun +``` + + +## Running the Rust examples + +All Rust examples are set up as separate executables, so they can be run by specifying the corresponding package, for example: + +```sh +cargo run -p dna +``` + +They will either connect to an already running rerun viewer, or spawn a new one. +In debug builds, it will spawn `target/debug/rerun` if it exists, otherwise look for `rerun` on `PATH`. + + +## Building and installing the Rerun Python SDK + +Rerun is available as a package on PyPi and can be installed with `pip install rerun-sdk`. + +Additionally, nightly dev wheels from head of `main` are available at . + + +### Building from source +If you want to build from source, you can do so easily in the Pixi environment: +```sh +pixi run py-build +``` + +Or to create a wheel: +```sh +pixi run py-build-wheel +``` + +You can run scripts that depend on rerun within the uv environment. For example: +```sh +pixi run uv run examples/python/minimal/minimal.py` +``` + +### Running the Python examples +You can also install all rerun example and their dependencies into the same uv environment using: +```sh +pixi run py-build-examples +``` + +Each example is installed as a target within the uv environment. For example: +```sh +pixi run uv run plots +``` + +### Tests & tooling + +```sh +# Run the unit tests +pixi run py-test + +# Run the linting checks +pixi run py-lint + +# Run the formatter +pixi run py-fmt +``` + +See also [`TESTING.md`](TESTING.md) for an overview of our testing infrastructure. + +### Building an installable Python wheel +The `py-build-wheels-sdk-only` command builds a whl file: +```sh +pixi run py-build-wheels-sdk-only +``` +Which you can then install in your own Python environment: +```sh +pip install ./dist/CURRENT_ARCHITECTURE/*.whl +``` + +**IMPORTANT**: unlike the official wheels, wheels produced by this method do _not_ contain the viewer, so they may only be used for logging purposes. + +## Building and installing the Rerun C++ SDK + +On Windows you have to have a system install of Visual Studio 2022 in order to compile the SDK and samples. + +All other dependencies are downloaded by Pixi! You can run tests with: +```sh +pixi run -e cpp cpp-test +``` +and build all C++ artifacts with: +```sh +pixi run -e cpp cpp-build-all +``` + +The Pixi build commands export a `compile_commands.json` compilation database to the build directory. +This can be useful for developer tools, e.g. for [setting up IntelliSense in VSCode](https://code.visualstudio.com/docs/cpp/configure-intellisense#_compilecommandsjson-file). + +## Building the docs + +High-level documentation for Rerun can be found at [https://rerun.io/docs](https://rerun.io/docs). It is built from the separate repository [rerun-docs](https://github.com/rerun-io/rerun-docs). + +- 🌊 [C++ API docs](https://ref.rerun.io/docs/cpp) are built with `doxygen` and hosted on GitHub. Use `pixi run -e cpp cpp-docs` to build them locally. For details on the C++ doc-system, see [Writing Docs](rerun_cpp/docs/writing_docs.md). +- 🐍 [Python API docs](https://ref.rerun.io/docs/python) are built via `mkdocs` and hosted on GitHub. For details on the Python doc-system, see [Writing Docs](rerun_py/docs/writing_docs.md). +- 🦀 [Rust API docs](https://docs.rs/rerun/) are hosted on . You can build them locally with: `cargo doc --all-features --no-deps --open`. + +## Building for the web + +If you want to build a standalone Rerun executable that contains the web-viewer and a gRPC server, +you need to install the `wasm32-unknown-unknown` Rust target and ensure the `web_viewer` feature flag is set when building rerun. +This is automatically done by this shortcut which builds & runs the web viewer: +``` +pixi run rerun-web +``` + +If you're on Windows you have to make sure that your git client creates symlinks, +otherwise you may get errors during the build. +Run `git config --show-scope --show-origin core.symlinks` to check if symlinks are enabled. +You may need to turn on Windows developer mode in order to give the `mklink` command sufficient permissions. +See also this [Stack Overflow reply](https://stackoverflow.com/questions/5917249/git-symbolic-links-in-windows/59761201#59761201) on the issue. + + +## Improving compile times + +As of today, we link everything statically in both debug and release builds, which makes custom linkers and split debuginfo the two most impactful tools we have at our disposal in order to improve compile times. + +These tools can be configured through your `Cargo` configuration, available at `$HOME/.cargo/config.toml`. + +### macOS + +On x64 macOS, use the [zld](https://github.com/michaeleisel/zld) linker and keep debuginfo in a single separate file. + +Pre-requisites: +- Install [zld](https://github.com/michaeleisel/zld): `brew install michaeleisel/zld/zld`. + +`config.toml` (x64): +```toml +[target.x86_64-apple-darwin] +rustflags = [ + "-C", + "link-arg=-fuse-ld=/usr/local/bin/zld", + "-C", + "split-debuginfo=packed", +] +``` + +On Apple-silicon Mac (M1, M2), the default settings are already pretty good. The default linker is just as good as `zld`. Do NOT set `split-debuginfo=packed`, as that will make linking a lot slower. You can set `split-debuginfo=unpacked` for a small improvement. + +`config.toml` (M1, M2): +```toml +[target.aarch64-apple-darwin] +rustflags = [ + "-C", + "split-debuginfo=unpacked", +] +``` + +### Linux + +On Linux, use the [mold](https://github.com/rui314/mold) linker and keep DWARF debuginfo in separate files. + +Pre-requisites: +- Install [mold](https://github.com/rui314/mold) through your package manager. + +`config.toml`: +```toml +[target.x86_64-unknown-linux-gnu] +linker = "clang" +rustflags = [ + "-C", + "link-arg=-fuse-ld=/usr/bin/mold", + "-C", + "split-debuginfo=unpacked", +] +``` + +### Windows + +On Windows, use LLVM's `lld` linker and keep debuginfo in a single separate file. + +Pre-requisites: +- Install `lld`: +``` +cargo install -f cargo-binutils +rustup component add llvm-tools-preview +``` + +`config.toml`: +```toml +[target.x86_64-pc-windows-msvc] +linker = "rust-lld.exe" +rustflags = [ + "-C", + "split-debuginfo=packed", +] +``` + +### Python build configuration (automatic) + +The repository is configured to automatically generate a `PYO3_CONFIG_FILE` for stable +Python builds. This file (`rerun_py/pyo3-build.cfg`) is automatically created when you +first run any `pixi run` command, and ensures consistent cargo caching whether you build +via `pixi run py-build`, `uv sync --package rerun-sdk`, or other methods. + +The configuration is referenced in `.cargo/config.toml`: +```toml +PYO3_CONFIG_FILE = { value = "rerun_py/pyo3-build.cfg", relative = true } +``` + +If you need to regenerate this file (e.g., after changing Python versions), run: +```sh +pixi run ensure-pyo3-build-cfg +``` + +To inspect what configuration pyo3 is using, you can run: +```sh +PYO3_PRINT_CONFIG=1 pixi run py-build +``` + +For more details on pyo3 build configuration, see the +[PyO3 Building and Distribution documentation](https://pyo3.rs/main/building-and-distribution.html). diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..6027022 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,6632 @@ +# Rerun changelog + +## [0.34.1](https://github.com/rerun-io/rerun/compare/0.34.0...0.34.1) - 2026-07-07 + +### 🔎 Details + +#### 🪳 Bug fixes +- Fix: auto-refresh collections when opening a recording [9d40120](https://github.com/rerun-io/rerun/commit/9d40120bc4a83e7403c9487674f860339cdc83d3) +- Better error for unsupported mp4 codec [949b6a8](https://github.com/rerun-io/rerun/commit/949b6a89cc53fc22726a15797d69070609281129) +- Fix stack overflow for live-streamed data [1f3f5af](https://github.com/rerun-io/rerun/commit/1f3f5af16af5d82fc9987364cb5df77eaf399464) + +#### 📦 Dependencies +- Patch `tonic-web-wasm-client` with cherry-picked trailer changes [7436cda](https://github.com/rerun-io/rerun/commit/7436cda05cb74b8ff092b4b64dfdf65092074be6) + + +## [0.34.0](https://github.com/rerun-io/rerun/compare/0.33.1...0.34.0) - 2026-07-06 + +🧳 Migration guide: https://rerun.io/docs/reference/migration/migration-0-34 + +### ✨ Overview & highlights + +#### Viewer MCP + +We've added a MCP that allows an llm agent to see and interact with the Viewer! +You could ask your agent to + - verify its work looks as expected in the Viewer. + - debug a bug when something doesn't show up right. + - explore a recording or dataset to search for specific patterns. + +The agent has full control over the Viewer, meaning it can see and click any widget. + +Here's an example where Claude Sonnet was asked to create a fancy particle animation of the Rerun logo and verify its +work using the mcp in the open Viewer (sped up by a lot, except when showing the end result): + +https://github.com/user-attachments/assets/14ffe7ed-6000-4193-900c-627784682125 + +Once it wrote the script, it logged the recording to the Viewer, and then iterated until the result looked as requested. +It adjusted the camera position, improved the particle rendering by looking at different frames in the animation, +and then debugged why the fade out animation was still showing particles on the last frame. + +
+ Full prompt + + > /goal Create a new rerun python example in this folder that uses reruns 2D shapes to recreate the rerun logo (rerun-wordmark-black.svg). + > There should be a nice fade-in animation in the beginning, 10 frames duration. Then pause a bit with the full rerun logo visible and then + > the shapes should explosively fade away with a 20 frame animation before the recording ends. + > + > You may only stop once the recreated logo in the viewer looks close to the provided svg (black text, white background). + > Use the mcp to verify in the open viewer, don't ever kill it. Once done, launch an opus agent and ask it to judge how + > closely it looks to the original image. Keep going until it's convinced that it looks close. +
+ +See our [mcp docs](https://rerun.io/docs/reference/viewer/mcp) to get started. + +#### Learning course + +https://rerun.io/learn is a great way to learn how the Rerun data model covers the full physical AI experiment loop. +It is a short, hands-on course for robotics ML engineers who want the full robot learning data loop in one place: +``` +raw data -> RRD -> derived layers -> dataset queries -> training -> evaluation +``` + +#### Rerun agent skills + +We added new skills to the Rerun repo to make it easier to investigate existing robotics data with Rerun. +You can install the skills in your project via: +```sh +npx skills add rerun-io/rerun +``` + +The new [learning course](https://rerun.io/learn) also shows how these agent skills can be used to collect, refine and train with robotics data. + +#### `VoxelGridMap` archetype + +Rerun now supports sparse voxel grids through a new [`VoxelGridMap`](https://rerun.io/docs/reference/types/archetypes/voxel_grid_map) archetype (thanks to [@makeecat](https://github.com/makeecat) for the contribution!). +The archetype supports sparse indexing, anisotropic voxel sizes, pose offsets, and optional explicit colors or values & colormap per voxel. + +Rerun's MCAP importer now also converts the *dense* ROS `nav2_msgs/VoxelGrid` and Foxglove `VoxelGrid` formats to Rerun `VoxelGridMap`. + +And if you wonder how the smooth 3D navigation through the [voxel scene](https://github.com/ephtracy/voxel-model) in this video was done, see below! + + +https://github.com/user-attachments/assets/87fb80da-66dd-4fcd-8b35-ab553696f536 + +#### 🎮 Gamepad support in 3D views + +You can now use a gamepad to navigate 3D views in the native viewer. +This makes it easier to do fine-grained, complex maneuvers with varying speed - e.g. for navigating large scenes or for screen videos. +Analog sticks control the eye position and look target, shoulder triggers move the eye up and down, and shoulder buttons accelerate/decelerate. + +**Note:** The gamepad feature is currently experimental and can be activated through the settings menu. +Switch the 3D view's eye controls to `FirstPerson` for optimal experience. +Under the hood, we use the [`gilrs`](https://crates.io/crates/gilrs) crate that supports a wide range of devices. + +#### Drag & drop components + +You can now drag & drop a component right from the streams panel to visualize it in a Time series view or Status timeline. + + + +https://github.com/user-attachments/assets/d70587a9-2020-4ae8-9cf3-0fef54dcf896 + +#### Transform debugging tool + +We added a new debugging UI for visual introspection of the 3D transform cache. +This allows to view the tree structure of the transform hierarchy, including potentially disconnected trees, and inspect the latest stored values of each frame node or transform edge. +The UI supports horizontal and vertical tree layout and you can filter by transform type (e.g. static or temporal). + +**Note:** this UI is currently a tab in the dev panel (accessible via "Toggle dev panel" in the menu or ctrl/cmd+shift+m). +But we are open to making this a dedicated view in the future - let us know if you have any feedback! + + +https://github.com/user-attachments/assets/b4b1ea6e-bce9-4e88-9ede-262f545e3b47 + +### ⚠️ Breaking changes + +- **SDK**: If you relied on the `log_tick` timeline being automatically created, you'll now have to call `set_log_tick_enabled(true)`. +- **Python**: `rr.send_dataframe` is now stricter for more correctness. See the migration guide for more details. +- **Python**: The deprecated python module `rerun.recording` has been removed; Use `rerun.experimental.RrdReader` instead. +- **SDK**: Several deprecated `DatasetEntry` methods have been removed. +- **SDK**: `ParquetReader` column rules have been removed in favor of [lenses](https://rerun.io/docs/concepts/query-and-transform/lenses). + +🧳 Migration guide: https://rerun.io/docs/reference/migration/migration-0-34 + +### 🔎 Details + +#### 🪵 Log API +- Make `log_tick` timeline OPT-IN [f734978](https://github.com/rerun-io/rerun/commit/f734978e091b52ddc04f7781a6d396441f526a7c) +- Allow to change shading of `Points3D` [cd7fa3e](https://github.com/rerun-io/rerun/commit/cd7fa3ebde1979239a59c720f5f81ad26e33fcf5) +- Extract out re_mp4_reader from importer [6eeeede](https://github.com/rerun-io/rerun/commit/6eeeede8fff1e95706fdb14f2070cbe3815d16d9) +- Add stream-mode support and Python `Mp4Reader` LazyChunkStream binding [e87dd89](https://github.com/rerun-io/rerun/commit/e87dd89d96e6942e020f03bb0fa7b5e46ef56340) + +#### 🐍 Python API +- Add headless viewer mode [7e31c42](https://github.com/rerun-io/rerun/commit/7e31c42409b7c3d3f00b7d28c28573c65240597a) +- rerun-sdk[datafusion] and rerun-sdk[dataplatform] extras are now rerun-sdk[catalog] [182cbb0](https://github.com/rerun-io/rerun/commit/182cbb03b8218cf69607cf77c78453960368904a) +- Remove deprecated `Recording` and related APIs [2156155](https://github.com/rerun-io/rerun/commit/2156155687b619944cebebd7bdc91864524a3641) +- Split dataloader queries into windowed and keyframe-anchored [9ccc89e](https://github.com/rerun-io/rerun/commit/9ccc89e4b3f4be2f0c01e673d6f752896f544b90) +- Introduce direct `ChunkStore` querying with `.reader()` [d14018e](https://github.com/rerun-io/rerun/commit/d14018eb59f2ad7c7bb8624670e084b2b318c65d) +- Fix `ViewerClient.close` not closing subprocesses on Windows [2bc53b6](https://github.com/rerun-io/rerun/commit/2bc53b634414ef0f7ce209e4c7fb1ac55a0adacc) +- feature-removal: drop custom indices [4dd9c78](https://github.com/rerun-io/rerun/commit/4dd9c7843f6d5af7b075b84a8eb9ab38f76bfa5c) +- Deprecate `DatasetEntry.manifest()` [fd24de9](https://github.com/rerun-io/rerun/commit/fd24de9ddec4cb9096441b53af49bd2b135eae13) +- Make `Chunk.from_record_batch` more flexible [d1771d4](https://github.com/rerun-io/rerun/commit/d1771d4042e91b95ee0044f8f0491463557f4876) +- Remove `column_rules` from `ParquetReader` API [d18da8e](https://github.com/rerun-io/rerun/commit/d18da8e2b298f3d0cc02d0656dccc514b610a0eb) +- Add casting capability to derive lens [f76a7d5](https://github.com/rerun-io/rerun/commit/f76a7d5b2738db5bbda24f089a24147d753b3c91) +- Introduce `pack` built-in function to lenses [a5ea965](https://github.com/rerun-io/rerun/commit/a5ea96557b4c1f424ff183ea7d0503c63e5c3ca3) +- Introduce `DeriveLens` helpers for common components [a93eb62](https://github.com/rerun-io/rerun/commit/a93eb62232a480f834abf0797d6d8d8706573ae8) +- Add support for duration timelines to `FixedRateSampler` [45bddb7](https://github.com/rerun-io/rerun/commit/45bddb7dc2e8eb3ef7cdec743a657f36b756deaf) + +#### 🦀 Rust API +- Add headless viewer mode [7e31c42](https://github.com/rerun-io/rerun/commit/7e31c42409b7c3d3f00b7d28c28573c65240597a) + +#### 🪳 Bug fixes +- Take grpc server into account when purging viewer memory [f83f167](https://github.com/rerun-io/rerun/commit/f83f167346dd13cac9b0386a7b9ea4bc2e9bdf38) +- Move relative time view range when moving time cursor [e9b22c5](https://github.com/rerun-io/rerun/commit/e9b22c564dae9966c22dfd24d321ab6ea5e21a99) +- Don't show loader for encoded images when playing before their encoding data has been loaded [c2eed0a](https://github.com/rerun-io/rerun/commit/c2eed0afa179e2f3dd4222e1c023d4f99c9ce646) +- GC ever growing fields in `ChunkStore` [f5747cf](https://github.com/rerun-io/rerun/commit/f5747cf69134a43ea51bc3ac7a6fbd68bba75edd) +- Fix clicking in-view links to entities outside of view (usually via transform tree) [b82a1d9](https://github.com/rerun-io/rerun/commit/b82a1d93e17a7cc860cb47ec9a16c7f5a30b7118) +- add missing `App::logic` callbacks to examples [#12810](https://github.com/rerun-io/rerun/pull/12810) (thanks [@adsick](https://github.com/adsick)!) +- Do not delete "duplicate" chunks that contain transform data [11b90ed](https://github.com/rerun-io/rerun/commit/11b90ed9fa6d3a82edff8c3879b6fbaca76ce24c) +- Fix sort order of `null` values in table UI [8a0f7c5](https://github.com/rerun-io/rerun/commit/8a0f7c5df1ffc328309b8f82efdfc8b7ba66f324) +- Navigate back after closing [71ecad0](https://github.com/rerun-io/rerun/commit/71ecad026799879df7e9eaf8b8e9ea371fcc71b8) +- Fix custom visualizer example showing a black viewer [e068ce8](https://github.com/rerun-io/rerun/commit/e068ce834d84ede9dfa420bcfcf2553f693c93ed) +- Fix `face_rendering` on arkit_scenes example [3d04f6f](https://github.com/rerun-io/rerun/commit/3d04f6f954a7a79a12f4198d14cd1cdc7b682063) +- Fix ROS 2 reflection decoding of byte/char, empty specs, and wstring [be0a632](https://github.com/rerun-io/rerun/commit/be0a632076d7775406846ed63341660c33a0ab57) +- Handle codec changing for video-likes [f7466ef](https://github.com/rerun-io/rerun/commit/f7466efea1945e1b9a3dd5db7256d142f8e99de7) +- Retain entry list in recording panel on refresh [e7357ba](https://github.com/rerun-io/rerun/commit/e7357baa3858a7cc9f174c194e40d443ab908697) +- Don't buffer & fetch more of entities based on what's hovered [d9b3008](https://github.com/rerun-io/rerun/commit/d9b3008f8431ec1d8b40a891b6e810fffaa89252) +- `rerun rrd optimize`: continue on error [63e0882](https://github.com/rerun-io/rerun/commit/63e08824e5e7781104008a64e8273ebf387122a7) +- Look at `source_component` and `selector` when assigning colors to plots [71e2cf7](https://github.com/rerun-io/rerun/commit/71e2cf7cb75507d0df347a52b645d5ccab52efeb) +- Fix viewer hang when loading static compressed images [b9acd34](https://github.com/rerun-io/rerun/commit/b9acd34aa2c90631759cbeb426082a68230a2f69) + +#### 🌁 Viewer improvements +- Temporary time pause on scrubbing [bfea333](https://github.com/rerun-io/rerun/commit/bfea333d6fba8766288becf83b10bf5f0b6fa451) +- Experimental gamepad support for 3D spatial views (native only) [da470f7](https://github.com/rerun-io/rerun/commit/da470f7c0330a4bcc68f9da44ac4c5c287545a6a) +- Rename memory panel -> dev panel [c54e7b8](https://github.com/rerun-io/rerun/commit/c54e7b808c807016d53b3e1b5d6d628ab6548a02) +- Show rejection reason on state component drop [b6a764d](https://github.com/rerun-io/rerun/commit/b6a764d8f732cfdd202a97935a5ed1d42c7d2b41) +- Table blueprint registration instead of base64 encoded table blueprints [f2a2805](https://github.com/rerun-io/rerun/commit/f2a2805b3b112c9b0e44a35b802a21d062efc5f3) +- Hold command/control to see and drag all preview timelines [91286ba](https://github.com/rerun-io/rerun/commit/91286ba89e849c88c9d50673aeb9edb6d2e55f75) +- Improve default & visualizer reporting for `GridMap` colormap [e8386c5](https://github.com/rerun-io/rerun/commit/e8386c5f5434c4c0d3f1c7dac7dbfe1a9b1a7bb4) +- Table blueprint registration for segment tables [0c60d04](https://github.com/rerun-io/rerun/commit/0c60d046d4071478bc4f89e8c0c5ba85f60005ef) +- Add sparse VoxelGridMap archetype [fa40ec1](https://github.com/rerun-io/rerun/commit/fa40ec12509b73ec9cce3a808c95f2d9db3c335a) (thanks [@makeecat](https://github.com/makeecat)!) +- Expose `App::current_query()` for external viewer [#12811](https://github.com/rerun-io/rerun/pull/12811) (thanks [@adsick](https://github.com/adsick)!) +- Don't play time forward when video is buffering [c4c6832](https://github.com/rerun-io/rerun/commit/c4c6832bb0b7399f12eebf644b6bbe0027791855) +- Local catalog server [3c6b02e](https://github.com/rerun-io/rerun/commit/3c6b02e91d489ea2ab125ac5c40d1cf82af5c81e) +- Drag & drop scalars into time series view [ae4a157](https://github.com/rerun-io/rerun/commit/ae4a15776f75b385a2a79598254b041e4e68bafd) +- Always buffer time [81384a4](https://github.com/rerun-io/rerun/commit/81384a43489d9273aef52cbc44484426a8e47f6a) +- Visualize transform trees in dev panel [a534ac6](https://github.com/rerun-io/rerun/commit/a534ac61ea388f33699940fb93981060e96fbf92) +- Query only visible parts of the state timeline [9118c03](https://github.com/rerun-io/rerun/commit/9118c03effe1c6d04cae8257de8e3e7fe2948a85) +- Add `rerun viewer-mcp` [aa56c88](https://github.com/rerun-io/rerun/commit/aa56c88190ab5c4337f6acc6708c94a90454a5aa) +- Hide screenshot notification on automated screenshots (scripts, mcp) [8924417](https://github.com/rerun-io/rerun/commit/8924417429de45fe52e9c8f073590b82727bb299) +- State timeline view is now stable [0a26a8b](https://github.com/rerun-io/rerun/commit/0a26a8bfb9b161edee370d34578f415ec3354068) + +#### 🗄️ OSS server +- Fix slow registration calls from OSS Catalog Server [5b74d8f](https://github.com/rerun-io/rerun/commit/5b74d8f078302e01afa0355162f301611d603122) + +#### 🚀 Performance improvements +- Cache string interning calls [a05a4f8](https://github.com/rerun-io/rerun/commit/a05a4f8bb018063e4a63b62036e447df0801fa28) +- Skip empty visualizers [7d6aeef](https://github.com/rerun-io/rerun/commit/7d6aeef7e928365ee92171d9e60edfb25ac5ebf4) +- Don't load blueprint for previews [e861b9e](https://github.com/rerun-io/rerun/commit/e861b9e6edf07b7312c0c2a35565c90828922c43) +- Redap client connection pool [5406d3a](https://github.com/rerun-io/rerun/commit/5406d3a69604bbb18bf89178d8c0ed9a6d095f2b) +- Replace `cdr-encoding` with `re_cdr` [d2bc3b8](https://github.com/rerun-io/rerun/commit/d2bc3b8dd2165639fc1cb0665dfc2ad9fbc8441e) +- Make the .ply parser ~10x faster using a custom PropertyAccess [6f8fb76](https://github.com/rerun-io/rerun/commit/6f8fb7648a0ec4e663a730ef6247ec8b41f46ab6) + +#### 🧑‍🏫 Examples +- Local Vector Search example [0a336d5](https://github.com/rerun-io/rerun/commit/0a336d52015e542b2f075bc704cc6b8e2ae8e591) + +#### 🖼 UI improvements +- Add button to copy server URL [15aeda9](https://github.com/rerun-io/rerun/commit/15aeda909ef500d951e827c5153a79dc9cdac4ee) +- Implement `WatchEvents` in `re_server` [8e07bdb](https://github.com/rerun-io/rerun/commit/8e07bdbe47cdb8cf39bb275e76914edf4545f849) +- Show average bitrate for selected video [9e28016](https://github.com/rerun-io/rerun/commit/9e2801688eae710d283f82552806598b4ee67bff) + +#### 🧢 MCAP +- MCAP: add support for ROS `nav2_msgs/VoxelGrid` [651c140](https://github.com/rerun-io/rerun/commit/651c14069735aa4a3d200ec5578c5f0dca1f7359) +- MCAP: add support for `foxglove.VoxelGrid` [c8580c1](https://github.com/rerun-io/rerun/commit/c8580c11928c2354b905819ef33f029b917a83e1) +- Move sensor_msgs/msg/MagneticField to lens [fe9b74f](https://github.com/rerun-io/rerun/commit/fe9b74f233f9e017f594636799b354b466d0138e) + +#### 🧑‍💻 Dev-experience +- Add Rerun agent skills [6732840](https://github.com/rerun-io/rerun/commit/673284042dda3d6ff218c6c2e954315cbcfc9aa7) +- Show bound and connect URLs when serving web viewer [#12753](https://github.com/rerun-io/rerun/pull/12753) (thanks [@terror](https://github.com/terror)!) +- Skills: mandate the idiomatic reader+lens pipeline (steer away from hand-built chunks) [c436da5](https://github.com/rerun-io/rerun/commit/c436da5a61956bb3645de61993b29997d0695e59) + +#### 📚 Docs +- Document catalog entry renaming and directory delimiter [57da6f3](https://github.com/rerun-io/rerun/commit/57da6f3da88e57a23e6d2d6d46990988df30780d) + +#### 📦 Dependencies +- chore: update lance, datafusion, and arrow [47d29ff](https://github.com/rerun-io/rerun/commit/47d29ffce4c53610471469b56d20d7cab6516b18) + +#### 🤷‍ Other +- Push down selected components to `fuzzy_descriptors` [92f2281](https://github.com/rerun-io/rerun/commit/92f22810ea0789323f72e3d116ed8bba8b99b053) +- Add RRD footers section to `rerun rrd stats` [4ab8388](https://github.com/rerun-io/rerun/commit/4ab838881f2fd4a4996be25b02b9510ca43d52fd) +- Bound server chunk scans with per-segment index-value pushdown [990166c](https://github.com/rerun-io/rerun/commit/990166c2f284a29bd63a6f03f103b70de7a1ac81) +- sdk: retry+backoff on behalf of the customer [2ef0fde](https://github.com/rerun-io/rerun/commit/2ef0fde4e08b54de30a456a6fd435163f3cee2d2) + +## [0.33.1](https://github.com/rerun-io/rerun/compare/0.33.0...0.33.1) - 2026-06-22 + +### 🔎 Details + +#### 🪳 Bug fixes +- Do not delete "duplicate" chunks that contain transform data [b2ac735](https://github.com/rerun-io/rerun/commit/b2ac735c15cba853d9e38b41412d5671ac16e06c) + +#### 🌁 Viewer improvements +- Temporary time pause on scrubbing [c7578b9](https://github.com/rerun-io/rerun/commit/c7578b9406b0f5d19237d13085155144f6fd38e6) + +## [0.33.0](https://github.com/rerun-io/rerun/compare/0.32.2...0.33.0) - 2026-05-29 + +🧳 Migration guide: https://rerun.io/docs/reference/migration/migration-0-33 + +### ✨ Overview & highlights + +After our large [0.32.0](https://github.com/rerun-io/rerun/releases/tag/0.32.0) release, this one is more focused but still has some great new things in store for you! + +#### Headless viewer + +This release comes with a new headless mode for the viewer! +Together with smaller improvements to the screenshot API, this can be an invaluable tool for automation and LLM usage. + +```python +import rerun.blueprint as rrb +from rerun.experimental import ViewerClient + +# Spawn a headless viewer; the client owns its lifetime. +# ⚠️ you need a graphics driver to run this (software rasterizers like lavapipe are fine too!). +with ViewerClient(spawn=True, headless=True) as viewer: + rec = rr.RecordingStream("rerun_example_screenshot") + rec.connect_grpc(url=viewer.url) + + view = rrb.Spatial3DView(name="my blue 3D", background=[100, 149, 237]) + rec.send_blueprint(view) + + # Screenshot only the view we created earlier. + viewer.save_screenshot("my_view.png", view_id=view.id) + + # Disconnect the RecordingStream before the headless viewer shuts down. + rec.disconnect() +``` + +We're planning more features for `ViewerClient` Python object, including an MCP server allowing agents to fully instrument the Viewer. +Stay tuned! + +#### Push-down filtering on chunk processing + +This release brings a significant optimization to pipelines in the shape of: + +```python +from rerun.experimental import RrdReader + +lazy_store = RrdReader(...).store() +stream = lazy_store.stream().filter(...) +# more stream operations +``` + +The filter is now pushed down to `RrdReader`, which will selectively load the matching chunks only. +This massively accelerates targeted data extraction from large RRDs (e.g. extract a joint data from a RRD that also contains multiple video streams). + +#### Improvements on experimental state timeline view + +We're continue to perfect the state timeline view, and this release brings this lot of improvements: + +https://github.com/user-attachments/assets/b7549593-363f-4e13-ab9b-184d6434fc19 + +- Support for numbers and boolean components, not just strings. +- Drag a component right from the streams tree into a state timeline. +- Highlight the time range of a state by hovering it. +- Clear state by logging an empty string or a `Clear` message: the timeline shows a gap until the next state value. + +#### Improvements on experimental dataset review + +Amongst other improvements, we made the play behavior much nicer for our experimental dataset review and table blueprint feature: + + + +https://github.com/user-attachments/assets/4543af53-52ca-4488-90b0-8c365f9fb89b + +#### Nicer native Viewer title bars on Windows & some Linux desktops + +On MacOS we used to have a compact title bar for a very long time. Now the same feature comes finally to Windows +and some Linux desktops. + +Before: + + + bulky title bar before + + + + +✨ After ✨: + + + compact title bar after + + + + + + +If you experience any issues with this you can turn it off in the settings menu. + +### ⚠️ Breaking changes + +The Python optional-dependency extra for catalog/query API tools has been renamed to `catalog`. + +| Before | After | +|------------------------------|-----------------------| +| `pip install rerun-sdk[dataplatform]` | `pip install rerun-sdk[catalog]` | +| `pip install rerun-sdk[datafusion]` | `pip install rerun-sdk[catalog]` | + +🧳 Migration guide: https://rerun.io/docs/reference/migration/migration-0-33 + +### 🔎 Details + +#### 🪵 Log API +- Fix problem of intermixing different store messages in one rrd [bee551f](https://github.com/rerun-io/rerun/commit/bee551f0a8f993007563ddde6a97dfe20e4993c6) + +#### 🐍 Python API +- Add `trim_metadata_keys` argument to `Chunk.format` [2d6cd8d](https://github.com/rerun-io/rerun/commit/2d6cd8db8064106d9b0a40036a3161d79018f83a) +- Allow `#when` anchors without `#time_selection` [1c242c8](https://github.com/rerun-io/rerun/commit/1c242c86c7e5c2435d44461680efb805de1c07e3) +- Optional Hub ingestion of customer SDK traces [5a362a3](https://github.com/rerun-io/rerun/commit/5a362a322131957ce4f874e2f16a053083a08cb7) +- Remove segment id validation with `dataset.reader(..., using_index_value=...)` [7846d38](https://github.com/rerun-io/rerun/commit/7846d3826e6dfbd578ac68d88889a427b003a8cf) +- Dedup video stream samples in video decoder [d341ba4](https://github.com/rerun-io/rerun/commit/d341ba465d45aecda5a2ddcedd6b8ad791adadf3) +- Pushdown `LazyChunkStore.filter()` to `LazyStore` [99a2149](https://github.com/rerun-io/rerun/commit/99a21494776e3ce431e6aa22f397fc989b996b11) +- Add headless viewer mode [b050087](https://github.com/rerun-io/rerun/commit/b05008774816aab3b18f2b3dbc434ac2b871a72d) +- rerun-sdk[datafusion] and rerun-sdk[dataplatform] extras are now rerun-sdk[catalog] [fcb5b13](https://github.com/rerun-io/rerun/commit/fcb5b13a34d4e0862d4a633838ff6f8344257bc4) + +#### 🦀 Rust API +- Increase the re_sdk viewer spawn timeout to 4s [230cde6](https://github.com/rerun-io/rerun/commit/230cde680c96cdfb9529b8f8a36370ae786f3f59) +- Optional Hub ingestion of customer SDK traces [5a362a3](https://github.com/rerun-io/rerun/commit/5a362a322131957ce4f874e2f16a053083a08cb7) +- Add headless viewer mode [b050087](https://github.com/rerun-io/rerun/commit/b05008774816aab3b18f2b3dbc434ac2b871a72d) + +#### 🪳 Bug fixes +- Create spatial topology from schema instead of from chunk data (fixing to sometimes never pull data) [3fffd8b](https://github.com/rerun-io/rerun/commit/3fffd8b91de671adace05000075aecc7861703b1) +- Respect play state from blueprint with Catalog Server [35613c9](https://github.com/rerun-io/rerun/commit/35613c988d83a2fe646392f96cea043f136e2e69) +- Fix orbital zoom clamp panic on tiny scenes [6f1bcde](https://github.com/rerun-io/rerun/commit/6f1bcde8e963c748878c5ad6309f83ec84f3cf43) +- Fix notification id collision [a453f9a](https://github.com/rerun-io/rerun/commit/a453f9af9596a5642f344d2d223385053a29f17a) +- Fix previews repeatedly opening log sources [4e03a27](https://github.com/rerun-io/rerun/commit/4e03a27433bcd5c62e7b2d6331cd3dfadb24bfb1) +- Fix video issues after GC at start of recording [9670f20](https://github.com/rerun-io/rerun/commit/9670f206c05bef8ef3181fbf68fc07ad39fc24cc) +- Dataloader: skip predicate keyframes [c8b963f](https://github.com/rerun-io/rerun/commit/c8b963f42d3e5a7405cac5c57c3b2526d73c71e2) +- Default Safari to WebGL — Safari 26.4 broke 3D under WebGPU [#12789](https://github.com/rerun-io/rerun/pull/12789) +- Fix occasional Viewer hangs on some Wayland systems [1f7680c](https://github.com/rerun-io/rerun/commit/1f7680c46d47c28d606486a297485754537e5852) +- Fix handling of png encoded depth images on the web [bcfbd22](https://github.com/rerun-io/rerun/commit/bcfbd22a846b876c9ab18fa8c1e8e3da8e85fa01) +- MCAP: resolve field type ambiguities in message schema reflection [0ce185b](https://github.com/rerun-io/rerun/commit/0ce185beff0284fe86c939aa5f237618903718b0) +- Implement unclamped `SetTime` and fix `#when` anchors [d33a6ab](https://github.com/rerun-io/rerun/commit/d33a6abbe4229325fb693c11a38d64f21e1622e2) +- Fix encoded rvl images [717b40d](https://github.com/rerun-io/rerun/commit/717b40d5ef5e43e65a5692ba052983bbb1906fe7) +- MCAP: fix `sensor_msgs/PointCloud2` offsets for extra fields [20fe293](https://github.com/rerun-io/rerun/commit/20fe293ea4d741e6d6a75b872e7f7772bd0379d2) +- Fix AV1 OBU walker cursor drift [c61b60b](https://github.com/rerun-io/rerun/commit/c61b60b4bf551f8125e0acab9b596914e90795cd) +- `Clear` log support for state timeline [639c5e6](https://github.com/rerun-io/rerun/commit/639c5e60ec59f0fafeb988f5d572731a6b2f6e8c) +- Take grpc server into account when purging viewer memory [09b0192](https://github.com/rerun-io/rerun/commit/09b0192ce32c2a5f820133bc865d5afb2341fe97) + +#### 🌁 Viewer improvements +- Emit `VideoStream::is_keyframe` in `rrd optimize` [ab74f37](https://github.com/rerun-io/rerun/commit/ab74f37dca39cab50143bfd5579c21eaa2c825a6) +- Opening a url with a timestamp anchor now always pauses the recording [24827ea](https://github.com/rerun-io/rerun/commit/24827ea8a53f97bb2701e41588a9d032f55e6690) +- Add a copy button to image previews [8e5e5ad](https://github.com/rerun-io/rerun/commit/8e5e5adf6defc5ac4bf2db2d69c24651c35e5187) +- Components from timeline panel can be dropped to State timeline [e68e001](https://github.com/rerun-io/rerun/commit/e68e001b3c5e7aa302b557cfcb63b6eaca97daef) +- Show loading indicator for dataset previews [9e811e5](https://github.com/rerun-io/rerun/commit/9e811e5f266495dac3f14b79e5c365cc5e79f569) +- State timeline accepts numbers and booleans [de849aa](https://github.com/rerun-io/rerun/commit/de849aa5759f5bc33412caa41f96cf132274241c) +- Compact title bar on Linux & Windows [475fc45](https://github.com/rerun-io/rerun/commit/475fc450bfa226c05c1d6c1d9026a2523e73c95a) +- Surface errors when loading a URI [e3aabd7](https://github.com/rerun-io/rerun/commit/e3aabd76e899b6f8e345bfd9ba6f20fe4bc3eb84) +- Add "Show/Hide in all views" entity context menu actions [aa49fc4](https://github.com/rerun-io/rerun/commit/aa49fc4a1f2c8a342488add6e378b5b0cbfcbc80) (thanks [@ollema](https://github.com/ollema)!) +- Individual controllable time playing for previews [4b17956](https://github.com/rerun-io/rerun/commit/4b179567296d56d6180413d6856fe5fef18770c1) +- Vertical scroll support for state timelines [6dc3e49](https://github.com/rerun-io/rerun/commit/6dc3e49215b21e5ba42b693dcafebbfe784d6ede) +- Fixes last state in timeline extending to infinity [a13dc44](https://github.com/rerun-io/rerun/commit/a13dc448758bafe355571bfea2b6550c006f4e79) +- Hovered state highlights time range in time-based views [5258852](https://github.com/rerun-io/rerun/commit/52588526b1c0e6c1eb0b4c67b4d8e8ffaf03c665) +- Make webdecoder more robust against spurious decoding problems [fb2e5d1](https://github.com/rerun-io/rerun/commit/fb2e5d19c18c3305466826b58f945730cfc1e4e1) + +#### 🚀 Performance improvements +- Faster queries: do not split or compact chunks [0cb8ffb](https://github.com/rerun-io/rerun/commit/0cb8ffb76146623d425e9d9838ba80573b6850f0) +- re_server: refresh schema cache after add_layer [2e736c4](https://github.com/rerun-io/rerun/commit/2e736c44fcac8144933896dd8b29edfd7566ca3f) +- Separate is keyframe chunk [85fe857](https://github.com/rerun-io/rerun/commit/85fe8576a3d412a8135f3b98723f6a4e15268ead) +- Speed up queries over single columns [5bc08c6](https://github.com/rerun-io/rerun/commit/5bc08c6d1315e7ebaba8bee15bb1c40fb0a41309) +- Enable SIMD on wasm [3bcaca0](https://github.com/rerun-io/rerun/commit/3bcaca0205907a747bb521207798a383047b53eb) +- Making dataloader keyframe aware [203d7ce](https://github.com/rerun-io/rerun/commit/203d7cede037383a6d7e75d63c6a9ba09f32b90d) +- Speedup for points & line rendering on Apple Silicon in some situations [b8b0ced](https://github.com/rerun-io/rerun/commit/b8b0cede37b0243d05d9e33fd40baf517450a07c) +- Cache RGB8 image histograms [#12800](https://github.com/rerun-io/rerun/pull/12800) (thanks [@waamm](https://github.com/waamm)!) + +#### 🧑‍🏫 Examples +- Add example for preprocessing a robot recording via chunk API [396a512](https://github.com/rerun-io/rerun/commit/396a512b1003ce7a761d1bad8aa4587c342fce0b) + +#### 📚 Docs +- Adding overview to Getting Started [473abad](https://github.com/rerun-io/rerun/commit/473abad01fc3279abe32b95761d33bba7ad1e31e) +- Moving install and setup from overview to getting started on resources page [f1de7a4](https://github.com/rerun-io/rerun/commit/f1de7a4551d69045dc39c1586b7c96af26cd66f7) +- Make more reference material available in the side bar [ba868d9](https://github.com/rerun-io/rerun/commit/ba868d9b5badc449b92b1ce16aa7e4bdaa163653) +- Simplifying docs guide [0ca2c5f](https://github.com/rerun-io/rerun/commit/0ca2c5fe1fa482886587e6d703dee914e34a9793) +- Add migration note for legacy ROS 1 data [de6a430](https://github.com/rerun-io/rerun/commit/de6a4300e4e3bcfd67f6f7e3ee5babf0105122f0) +- Fix custom-data doc page claiming you can't visualize custom data, instead redirect to pages that explain how [7bad539](https://github.com/rerun-io/rerun/commit/7bad539208fbaa0cb1294478b0720ab1f922cc91) + +#### 🖼 UI improvements +- Respect Wayland compositor preferences for client/server-side decorations [0c00f57](https://github.com/rerun-io/rerun/commit/0c00f57c3c234dca0ff7e76933a39731f99c2c91) +- Add a nicer About-menu [6645dbe](https://github.com/rerun-io/rerun/commit/6645dbed5488a65e51c5e629488bf247151dbf21) +- Reset states timeline view via double-click [36cf84d](https://github.com/rerun-io/rerun/commit/36cf84d07333e0a4fc843f72afa145ce090f4c6b) + +#### 🧢 MCAP +- Keep MCAP channels without schema as raw data [7b87ed0](https://github.com/rerun-io/rerun/commit/7b87ed00abffc504dc5e2f516baf1431e5f05eb7) +- MCAP: Add lens for ROS 2 geometry_msgs/PoseStamped [be7012c](https://github.com/rerun-io/rerun/commit/be7012cd29b91eb2f10bb6d67efead66edcae34e) +- Move std_msgs/String to lens [06fef1c](https://github.com/rerun-io/rerun/commit/06fef1c32f33732c78b4689c083fd4faa0556f10) +- Move rcl_interfaces/msg/Log to lens [325b28f](https://github.com/rerun-io/rerun/commit/325b28fe01e13a2bfdc447b9e19803e4c0939df5) + +#### 📈 Analytics +- Datafusion metrics [fdbb66f](https://github.com/rerun-io/rerun/commit/fdbb66f9d349dc9e5c5d6c9be637b15e7b36d4a9) + +#### 🧑‍💻 Dev-experience +- Include trace-id in error message on failed registration [bab7682](https://github.com/rerun-io/rerun/commit/bab7682765163e1321fe4fa8605ce5e5b69088fa) + + +## [0.32.2](https://github.com/rerun-io/rerun/compare/0.32.1...0.32.2) - 2026-05-20 + +### 🔎 Details + +#### 🪳 Bug fixes +- Create spatial topology from schema instead of from chunk data (fixing to sometimes never pull data) [6c015b9](https://github.com/rerun-io/rerun/commit/6c015b99335b91b974be6ab2fb524b4381e38a02) +- Respect play state from blueprint with Catalog Server [58aa9c5](https://github.com/rerun-io/rerun/commit/58aa9c55f88b3ef1b2848d1e64422ef5e17303b6) +- Fix orbital zoom clamp panic on tiny scenes [d039a5f](https://github.com/rerun-io/rerun/commit/d039a5f2c92ddecf723624b29291792c136c6593) +- Fix video issues after GC at start of recording [e230962](https://github.com/rerun-io/rerun/commit/e230962e3dbaa9a8400eca8616f9174b8964c654) + +#### 🌁 Viewer improvements +- Opening a url with a timestamp anchor now always pauses the recording [9977cd1](https://github.com/rerun-io/rerun/commit/9977cd103163f4d53e65d1882cc1c30cab8426e3) + +#### 🚀 Performance improvements +- re_server: refresh schema cache after add_layer [fefa95e](https://github.com/rerun-io/rerun/commit/fefa95e07d5a4cff58c40cef8242fb9e011ce996) +- Speed up queries over single columns [0a6e2d8](https://github.com/rerun-io/rerun/commit/0a6e2d8bb8637e59019e48bbf6e78b50018f3994) + +#### 🧢 MCAP +- Keep MCAP channels without schema as raw data [7d3e0d5](https://github.com/rerun-io/rerun/commit/7d3e0d57651ca5c8ac4dded299d9f7bdbe03cc22) + +## [0.32.1](https://github.com/rerun-io/rerun/compare/0.32.0...0.32.1) - 2026-05-15 + +### 🔎 Details + +#### 🪵 Log API +- Fix problem of intermixing different store messages in one rrd [5620f47](https://github.com/rerun-io/rerun/commit/5620f47064a46c4733eea1189e7757d898340a9b) + +## [0.32.0](https://github.com/rerun-io/rerun/compare/0.31.4...0.32.0) - 2026-05-13 - Chunk Processing, Pytorch dataloader, Dataset Review + +🧳 Migration guide: https://rerun.io/docs/reference/migration/migration-0-32 + +### ✨ Overview & highlights + +#### Python chunk processing API + +This release introduces a chunk processing API designed for systematic and efficient wrangling of robotics data. +It includes: +- A `Chunk` object for inspecting, creating, and manipulating chunks. +- Readers for common file formats (RRD, MCAP, Parquet, URDF, and more to come) which output streams of chunks. +- A composable `LazyChunkStream` class to define memory-bounded chunk-based filtering and transformation pipelines. +- Lenses: an expressive and performant API to manipulate component data in chunks. +- A multithreaded, GIL-free, native engine for pipeline execution that is designed for distributed execution in the future. +- Interoperability with a catalog server and the Rerun SDK logging API. + +In addition to enabling powerful data wrangling pipelines, the chunk processing API is significant for offering read/write chunk-level control of RRD files down to the raw Arrow data. + +_Note_: this API is experimental and subject to breaking changes as we continue to improve it. + +#### Experimental dataset review +You can now build tables of recording previews configured with arbitrary blueprints! + + + +https://github.com/user-attachments/assets/7acf9671-c46a-4355-a50f-2670cc80c4d9 + +Clickable flags let you curate data directly from the table: toggles update a boolean flag column and are written back to the server. + +To try it out, enable the experimental options in the Viewer's settings and try the two Python examples: +[`table_grid_with_flags`](./examples/python/table_grid_with_flags/) for basic grids with clickable flags, +and [`table_blueprints`](./examples/python/table_blueprints/) for the full preview experience. + +Limitations, or why this is still experimental: +* previews don't yet work directly on raw datasets; you have to send a special table to the server instead (see examples) +* table blueprints are currently text-encoded in table metadata, this is subject to change +* depending on the number and content of previews, overall runtime performance can be poor, especially in the browser +* many UX details are still unfinished + +#### Experimental state timeline view + +A new experimental view for visualizing discrete state transitions over time as horizontal colored lanes, useful for state machines, mode transitions, and similar discrete signals. Log state changes with the new `StateChange` archetype; configure their display on the UI or using `StateConfiguration` in the blueprint API. + + + State timeline view + + +Read [our guide](https://rerun.io/docs/howto/visualization/state-timeline) to get started. Feedback is appreciated! + +#### `GridMap` archetype and MCAP support for ROS occupancy grids + +Rerun now supports 2D grid maps, as used e.g. in robot mapping & navigation applications, through a new `GridMap` archetype. + +* A `GridMap` is an image buffer with defined cell size per pixel, which can be embedded as a textured rectangle in a 3D scene. +* `GridMap` has a regular `ImageBuffer` component, so you can also send color images (e.g. to do custom color-mapping in your code). +* For layering of multiple maps you can optionally set draw order and opacity when logging, or separately in the viewer / blueprint. +* The visualizer also supports the colormap options that RViz users are familiar with, selectable at log time or in the viewer / blueprint. +* In a 3D scene, the map appears at the entity's coordinate frame (either entity-path based or with TF-style named frame like `CoordinateFrame("map")`). Additionally, an optional translation & rotation offset can be specified. + +For ROS 2 users: +* 🧢 Rerun's MCAP importer automatically loads ROS 2 `nav_msgs/OccupancyGrid` messages as `GridMap`s. +* 📖 Our [ROS 2 guide](https://rerun.io/docs/howto/integrations/ros2-nav-turtlebot) also shows an example how you can log `GridMap` from your custom ROS nodes. + +Here's a demo video showing a typical ROS 2 MCAP recording with multiple map and costmap layers in Rerun: + + + +https://github.com/user-attachments/assets/f31b712d-2dd7-4e45-bb6a-0e103e7016b3 + +#### OSS catalog server now streams from disk + +The OSS server (`rerun server` and `rr.server.Server`) no longer eagerly loads RRDs in memory when registering datasets. +It instead uses the manifest embedded in the RRDs to load chunks on demand when serving requests. +This greatly extends the amount of data that can be registered and queried for a given memory budget, and makes registration orders of magnitude faster. + +_Note_: This requires the RRDs to have a manifest, which most modern RRDs have. +Legacy RRDs are still eagerly loaded. +Use the `rerun rrd optimize` CLI to migrate and optimize legacy RRDs. + +#### Plot improvements + + + new tooltip for plots + + +- Performance improvement for scenes with many series. Moved from egui CPU tesselation to GPU line rendering. +- Redesigned tooltips. Hovering over a plot now shows a cleaner, more compact tooltip with color swatches matching each series. Also it is visually obvious now when events were actually logged. +- Better NaN & Infinity handling. Time series views now gracefully handle non-finite values: the Y-axis range ignores them, isolated data points surrounded by NaN are drawn as dots instead of disappearing, and aggregation skips over non-finite values rather than corrupting nearby points + + +#### Performance improvements + +This release comes with a few significant performance improvements. Among other things: + +* Visualizing scenes with many transforms on the same entity (as it is often the case with `tf`-style named transforms) will now perform vastly better +* Plot line tessellation is now GPU accelerated, using the same rendering path as our 3D lines +* Web viewer now decodes images using the web decoder, resulting in much smoother play of raw-image "videos" +* various improvements to `rrd optimize` (former `rrd compact`) to produce more streaming & object storage friendly data +* MCAP decoder is now multithreaded + +#### New branding + + new rerun app icon +
+ + + new rerun app icon + + +You may have noticed a new Rerun logo and app icon! We've also slightly tweaked our color palette. Stay tuned for more exciting news! + +#### Docs feedback on the website. + +As a part of our [website](https://rerun.io/) update, we've also added a feedback form to all our documentation pages. So you can add your feedback directly to the respective topic. + + + feedback form + + + + +### ☁️ Highlights for Rerun Hub customers + +Several improvements in the open-source Rerun SDK are designed specifically to work with Rerun Hub. + Here are the key updates that are especially relevant if you're a customer of Rerun Hub: + +#### Direct fetch from object storage for commercial `Rerun Hub` customers + +The SDK will now fetch chunk data directly from the object store that holds your recordings, without needing to proxy the data through the server. +This allows for better performance in highly parallel workloads, as well as lower latency when the client is located close to the data store. + +The old proxy path is still supported, and can be opted into using the `RERUN_CHUNK_STRATEGY=grpc` environment variable. + +#### Experimental training dataloader + +You can now train PyTorch models directly against the Rerun OSS server, with no intermediate export step! + +The new highly experimental `rerun.experimental.dataloader` module exposes Rerun recordings as iterable or map-style PyTorch datasets, streaming encoded images, scalars, and compressed video (`h264`/`h265`/`av1`) on the fly. Random access, multi-worker prefetching, and DDP support work out of the box. + +Each field accepts an optional `window=(start_offset, end_offset)` parameter, an inclusive range relative to the current index. When set, the field yields the slice of values across that window instead of a single sample. For example, `window=(1, CHUNK_SIZE)` returns the next `CHUNK_SIZE` action values after every observation, making action-chunking policies a single query per batch. + +See the new [LeRobot ACT training example](https://github.com/rerun-io/rerun/tree/main/examples/python/dataloader). + +Expect breaking changes between releases while we iterate on the design. For large-scale training, Rerun Hub offers a higher-performance backend. + +### ⚠️ Breaking changes + +* "Data loaders" renamed to "importers" to avoid confusion with the widely-used ML/PyTorch "dataloader" concept +* Rust Lenses API has been restructured +* `rerun rrd compact` renamed to `rerun rrd optimize`, has profiles and new defaults +* `DatasetEntry.register` requires a sequence of URIs (Python) +* URDF importer now loads the static transforms of the model to the `/tf_static` entity by default +* MCAP metadata and statistics are now saved to `__mcap_metadata` + +🧳 Full Migration guide: https://rerun.io/docs/reference/migration/migration-0-32 + +### 🔎 Details + +#### 🪵 Log API +- Group URDF collision entity paths by geometry type [a394117](https://github.com/rerun-io/rerun/commit/a3941179b52acc61e1b144c746fef8db8e58f182) +- Add Parquet Dataloader with some workarounds for merging columns [c1ee446](https://github.com/rerun-io/rerun/commit/c1ee446ee9f437847c15033a249be640ac89bc2b) +- Optionally add struct grouping on parquet columns [ae22b4d](https://github.com/rerun-io/rerun/commit/ae22b4d3afa5e71f2a2043c1c45090a5640f2bd1) +- Introduce `GridMap` archetype & visualizer [d74cb27](https://github.com/rerun-io/rerun/commit/d74cb277052ebd41ce5a981d75591a57fea3fc66) +- Rename "DataLoader" to Importer [11cd1c2](https://github.com/rerun-io/rerun/commit/11cd1c24b1c55228c48d3c9e9ca4bc465d73c2d3) +- Use `/tf_static` as default in URDF importer & make configurable in `UrdfTree` [1f01a57](https://github.com/rerun-io/rerun/commit/1f01a572e774ad49112d7e658dab16c60617877a) +- Expose `mimic` joints from URDF [cf4c652](https://github.com/rerun-io/rerun/commit/cf4c65255afed1aeded9f61d513b6fe75fd4b0f5) +- Add RViz-style "Map" and "Costmap" color options for `GridMap` [c452a48](https://github.com/rerun-io/rerun/commit/c452a482638f9a4271596f2ec382f76d5e7695be) +- Add `stream() -> LazyChunkStream` to Python `UrdfTree` [dc51f60](https://github.com/rerun-io/rerun/commit/dc51f60554cc634133b5582e26ccb8c2769d4aa7) +- Renames ChunkBatcherConfig::ALWAYS to ALWAYS_TEST_ONLY [46c20b8](https://github.com/rerun-io/rerun/commit/46c20b85ed0ae39292feae2a50355fdad87d4c0e) +- Opt-out from generating a FileSink footer [0a78f28](https://github.com/rerun-io/rerun/commit/0a78f2817f15c50e00f6ea222227d9358dcf0eea) +- Add `UrdfTree::compute_joint_transform_batches` for lens/chunk pipelines [efd045c](https://github.com/rerun-io/rerun/commit/efd045cdf953d6c3b97f764cdea9560df6fbcab4) +- Add snippet showing a `GridMap` at a specific pose [2e99c68](https://github.com/rerun-io/rerun/commit/2e99c681e9f4789ce92803bda1e5edc76bb5788b) + +#### 🐍 Python API +- Introduce `LazyChunkStream` [a0ce421](https://github.com/rerun-io/rerun/commit/a0ce421f4ca9b3e2406b73efd3e63fb8ee03b8b4) +- Introduce `McapLoader` to produce `LazyChunkStream` from MCAP file [ef51623](https://github.com/rerun-io/rerun/commit/ef51623f8fa45f0bf130b5a55b4b72db7cd43051) +- Expose `Selector` in Python SDK [ffc088d](https://github.com/rerun-io/rerun/commit/ffc088dbf39e767eb02488c0786672517275682b) +- Introduce Python `ChunkStore` object [9294554](https://github.com/rerun-io/rerun/commit/9294554075197fff676000f29f5090f6b35ab771) +- Add ability to compact `ChunkStore` [5dd9f23](https://github.com/rerun-io/rerun/commit/5dd9f2315abb2ae885cb45108512431db32fa4c3) +- Use Lenses to manipulate `ChunkStream` in Python SDK [72ff520](https://github.com/rerun-io/rerun/commit/72ff520451de6c187262fcf10f62e954aa00785e) +- Make notebook display loading spinner when waiting on send_table [ea09906](https://github.com/rerun-io/rerun/commit/ea09906cf3d6b87b16ad55239983a85ec44e5421) +- Make `RrdLoader` produce lazy `ChunkStore` [2e804c4](https://github.com/rerun-io/rerun/commit/2e804c40b316cfcc483a55e2f5edf2b8a227bb8d) +- Add `map` and `flat_map` method to `LazyChunkStream` [393680c](https://github.com/rerun-io/rerun/commit/393680c7dd2337b4fcd59d1851fd38e525ab5664) +- Add `Chunk` construction methods: `from_columns` and `from_record_batch` [547d650](https://github.com/rerun-io/rerun/commit/547d650fcb6665942a06b4c010e65aaead585e14) +- Add `exists_ok` option to `CatalogClient.create_dataset` [8d4e1b3](https://github.com/rerun-io/rerun/commit/8d4e1b307774554255968c485ae28ffb067aeece) +- Add `Chunk.apply_lenses()` API [88fea86](https://github.com/rerun-io/rerun/commit/88fea86e302742ef1982a60dd126829b27f0818c) +- Expose split-size-ratio in python [c21a5b8](https://github.com/rerun-io/rerun/commit/c21a5b8cd0701044ea1f34e0f30be922eb25269b) +- Initial torch dataloader [dca28f2](https://github.com/rerun-io/rerun/commit/dca28f27b0fc936d7e043ceaf41895bab84b84b7) +- Rename `rrd compact` to `rrd optimize` [c5b027b](https://github.com/rerun-io/rerun/commit/c5b027ba02d8fb1fbf30bdda7ab7b430ce90383f) +- Add `apply_selector` methods to `Chunk` [5a20bd6](https://github.com/rerun-io/rerun/commit/5a20bd679677cbbfb0f808e774a3c654c47d7ac2) +- Use `Mapping`-based `LensOutput` and improve naming [2fc409e](https://github.com/rerun-io/rerun/commit/2fc409e5f1a74fa91abf4dcb8fdbb1b3b583830d) +- Add Map-style torch dataset [ebb9953](https://github.com/rerun-io/rerun/commit/ebb9953034baa59817326f3c1fdbaa508149cd2f) +- Make task cancellation API public, add `.cancel()` on RegistrationHandle [260d119](https://github.com/rerun-io/rerun/commit/260d1198c83768c7ef25d35cad1658036006f437) +- Add documentation page for lenses [1cb99e5](https://github.com/rerun-io/rerun/commit/1cb99e5c24ee2fa386d14d2c225fc298873527e2) +- Add include & exclude topic filter options to MCAP importer [1b586fa](https://github.com/rerun-io/rerun/commit/1b586fa604479d55891b057b9dc4c74e44bafdf9) +- Further simplify Lenses API in Python and Rust [65d744a](https://github.com/rerun-io/rerun/commit/65d744ae34b317af2caf36c42ef939477b6ee00c) +- Allow creating a `Chunk` copy with a new entity path [3d8f97c](https://github.com/rerun-io/rerun/commit/3d8f97cf76886f3e6cc8795c19afccabe4ba10f3) +- Make `Selector` picklable [db20691](https://github.com/rerun-io/rerun/commit/db206917263291fb433a1d5db8199fb3e8bc0390) +- Add `dataset.segment_store(segment_id)` to create a lazy `ChunkStore` [524b5cc](https://github.com/rerun-io/rerun/commit/524b5cc3ad543a699cc1579f58fc4b038d0ae97d) +- Introduce optimization profiles and change default [d3488bc](https://github.com/rerun-io/rerun/commit/d3488bc7f5fb640ff3bbe583d1414873d8ea7410) +- Split off `LazyStore` from `ChunkStore` (now returned by `dataset.segment_store()` and `RrdReader.store()`) [fa63189](https://github.com/rerun-io/rerun/commit/fa631894c4f2f0805a1b643dd8d068c841105159) +- Improve dataloader config [b96a985](https://github.com/rerun-io/rerun/commit/b96a9859bcf412f24ba8444138a2ce8fd49d7a3f) +- Add support for multi-store RRD to `RrdReader` [41ed51a](https://github.com/rerun-io/rerun/commit/41ed51ac0d37f4f80c8834a33a38b8587f8a32d1) +- Rename `send_chunk` to `send_chunks` and accepts stores and `LazyChunkStream` [c8e0965](https://github.com/rerun-io/rerun/commit/c8e0965fb50f4d70599f448b4175dd563e72cdf1) +- Deprecate `rerun.recording` [8b52512](https://github.com/rerun-io/rerun/commit/8b52512035c9afc58e543c07862ac14cb4bc677e) +- Fix disconnect footgun [4833706](https://github.com/rerun-io/rerun/commit/483370692c187865c9a694264897a5d4e02a5166) + +#### 🦀 Rust API +- Introduce `at_entity` instead of `*_output_columns_at` [8e65ff0](https://github.com/rerun-io/rerun/commit/8e65ff0504a58753a93a46645ef566cb4f436602) +- Decouple entity path filtering from `Lens` definition [80ab3a9](https://github.com/rerun-io/rerun/commit/80ab3a9db06644caadc646f194f5a6bd64d1a779) +- Pushdown filters for select [215e8aa](https://github.com/rerun-io/rerun/commit/215e8aa3f7f23ce1b84724793ef51c61eda23b27) +- Rework chunk output produced by Lenses [dbeef05](https://github.com/rerun-io/rerun/commit/dbeef05a3457e4def4bc1162719659fae9dbbc11) +- schema evolution: widen record-batch on read [838a669](https://github.com/rerun-io/rerun/commit/838a669d2f2090d22395a481b2dcd08012ebc92c) +- Unify `Chunk`-based APIs between Rust and Python [a171102](https://github.com/rerun-io/rerun/commit/a1711026c976b1a4b9a1dc4669a7994d43da4b4c) +- Add `apply_selector` methods to `Chunk` [5a20bd6](https://github.com/rerun-io/rerun/commit/5a20bd679677cbbfb0f808e774a3c654c47d7ac2) +- Enforce one-to-one mapping of `LensOutput` to target entity [b5709e5](https://github.com/rerun-io/rerun/commit/b5709e5c3ca2c0454ac42bf635a0317a89261ed9) +- Add documentation page for lenses [1cb99e5](https://github.com/rerun-io/rerun/commit/1cb99e5c24ee2fa386d14d2c225fc298873527e2) +- Further simplify Lenses API in Python and Rust [65d744a](https://github.com/rerun-io/rerun/commit/65d744ae34b317af2caf36c42ef939477b6ee00c) +- Allow creating a `Chunk` copy with a new entity path [3d8f97c](https://github.com/rerun-io/rerun/commit/3d8f97cf76886f3e6cc8795c19afccabe4ba10f3) +- Add `GraphView` to rust blueprint api [9327b5f](https://github.com/rerun-io/rerun/commit/9327b5f93e962e4a3e506b8202884f7b82e18b52) + +#### 🪳 Bug fixes +- Fix our python 3.10 support [7d4716d](https://github.com/rerun-io/rerun/commit/7d4716dd5e6bf36203cd246731b2d530ece6dc38) +- Fix MCAP CLI decoder identifier list [5b170a4](https://github.com/rerun-io/rerun/commit/5b170a499f9f016b5fb47abb4b6dedb031b2aaf2) +- Fix bug where shapes defined with UI units were scaled incorrectly [7e7ec15](https://github.com/rerun-io/rerun/commit/7e7ec157f4c772b235f1bbff57a5dcde75db412c) +- Improve `rerun download` [1c9aa10](https://github.com/rerun-io/rerun/commit/1c9aa10c1c8984dd63606f4d3c534cd6505e9cd4) +- Fix off-by-one bug in video stream cache [f0484ee](https://github.com/rerun-io/rerun/commit/f0484eedaaa7263d19a3c3386955930829cfb0d0) +- Fix: Hyperlinks shown in tables wouldn't resize [f16707e](https://github.com/rerun-io/rerun/commit/f16707e0cd651d04453fa6ff8e59e69d39faf528) +- Fix range queries on 3D points in `SpatialView3D` [e8dc5e0](https://github.com/rerun-io/rerun/commit/e8dc5e0a3febf793433c72646bf838a938add107) +- Fix plot view time range ui [45de0cb](https://github.com/rerun-io/rerun/commit/45de0cbcf63b2d2280d1e0136d64ea3fe3a990e4) +- Make arrow keys pause playback [37009c0](https://github.com/rerun-io/rerun/commit/37009c04050e7d5ac968a5b2f50e9f0addfc6f95) +- Fix silent error swallowing in gRPC streaming, add error injection testing infrastructure [ec01f7a](https://github.com/rerun-io/rerun/commit/ec01f7a3c167467a37e5c78e616b7aa2dbc67e17) +- Fix `follow` not being propagated to `http` URLs with extensions [09d5f94](https://github.com/rerun-io/rerun/commit/09d5f94c98bf06aa84ab6f041cc13ef0f21f3537) +- Fix renderer registration order influencing draw order [97db1a1](https://github.com/rerun-io/rerun/commit/97db1a16382f5ae689d2e6a76dfedd7654e2802a) +- Unify `rerun//` and `rerun+https` at parse time, fixing Viewer bugs for incorrectly distinguishing them [69ff58d](https://github.com/rerun-io/rerun/commit/69ff58d66a1e8c7ca524bca4b7daf0f691842710) +- Add `SystemCommand::RemoveRedapServer` for more thorough cleanup [52bc3ea](https://github.com/rerun-io/rerun/commit/52bc3ea69bad2a4b73ea3019e4b9b7a728c281a4) +- Close recordings when a server is removed [ad7371f](https://github.com/rerun-io/rerun/commit/ad7371f3cbaada95147577eed60c7d71da59a516) +- Fix visualizations not showing up when initial data was empty [c867040](https://github.com/rerun-io/rerun/commit/c867040a23cb78b4a27d766fabb5ce9e00c44ca2) +- Fix reflection of "pure-constant" ROS2 message schemas [fefbf6d](https://github.com/rerun-io/rerun/commit/fefbf6d57e68e7e84c04285809188c7107fc1d79) +- Handle large video file error gracefully [#12744](https://github.com/rerun-io/rerun/pull/12744) (thanks [@AyushAgrawal-A2](https://github.com/AyushAgrawal-A2)!) +- Use row id instead of byte span for video streams [645e57b](https://github.com/rerun-io/rerun/commit/645e57b732d09a53a873d00162050a61bbf0b6b0) +- Return empty tensor on video decoder cold-start instead of raising [13f92e5](https://github.com/rerun-io/rerun/commit/13f92e594c909cfd6c1136065ee24a35f945645a) + +#### 🌁 Viewer improvements +- Cluster overlapping coplanar `TexturedRect`s and use draw order for tie-breaking [76b64c1](https://github.com/rerun-io/rerun/commit/76b64c137d96bf189b3cb683d6f6328017ef92a3) +- Always open recording in background from context menu [a173287](https://github.com/rerun-io/rerun/commit/a1732872bf29cd9addff622f343e06d4bd020f07) +- Improve implicit handling of invalid instance pose rotations [e65a6ce](https://github.com/rerun-io/rerun/commit/e65a6ce8f21a41dc3c8ff0bcf2f1ddbdb9367704) +- Use optional `pose` of Foxglove `PointCloud` (if set) [fee2815](https://github.com/rerun-io/rerun/commit/fee28155cd4e077501b67acc36d5aac2aac15467) +- LeRobot loader: Add support for flat feature names [a493658](https://github.com/rerun-io/rerun/commit/a493658e85bd534fff07f1eacdb141d502caae0e) +- Select `message_log_time` as default timeline for MCAP [b687bd6](https://github.com/rerun-io/rerun/commit/b687bd644f405106d8e13357719e68b9f6e4b3d3) +- Properly handle outline masks of overlapping coplanar rectangles [617a7c2](https://github.com/rerun-io/rerun/commit/617a7c2a25f49d80b5a691178dbd75b357275219) +- New liftable shape limit to avoid unresponsive viewer [a4f6223](https://github.com/rerun-io/rerun/commit/a4f62231ae91b8bf19fa646abfd4d0c0b75b881b) +- Add configurable CORS policy for rerun proxy and re_server [8baa142](https://github.com/rerun-io/rerun/commit/8baa142ffc5e81a8574e6bc9629d35d012036af9) +- Smarter `VideoStream` streaming [2f73783](https://github.com/rerun-io/rerun/commit/2f73783025afeb9c026fe7032a73d1a98946506b) +- Support focusing specific 3D points in viewer [ddda5cf](https://github.com/rerun-io/rerun/commit/ddda5cf159f5c50ee6a42a5bc9b6e32190e4b516) +- Experimental grid layout & flagging for tables [9b6bf71](https://github.com/rerun-io/rerun/commit/9b6bf710021a495a7b96e3f24bf73b7b0e634157) +- Make panel state toggable while inspecting tables/server [2eb8fb0](https://github.com/rerun-io/rerun/commit/2eb8fb07d3792d16048195c789f6e8b5ff49d276) +- Streaming info panel (as part of memory panel) [597fdd4](https://github.com/rerun-io/rerun/commit/597fdd4cfbceeb28bd1bddf5ddb11f1a0e4dce5b) +- Respect `up_axis` in Collada (.dae) mesh importer [#12708](https://github.com/rerun-io/rerun/pull/12708) (thanks [@Abhisheklearn12](https://github.com/Abhisheklearn12)!) +- Improve handling of NaN & Infinity values in time series view [055777f](https://github.com/rerun-io/rerun/commit/055777ff5b32eaaeb8fe04f16d28d50449a46e3d) +- By default, fetch similar chunks 30 seconds of playtime forward [7c0680e](https://github.com/rerun-io/rerun/commit/7c0680e5d4b740acc710b366249c32b141ac12dd) +- Remember memory limit between viewer relaunches [1eb763a](https://github.com/rerun-io/rerun/commit/1eb763a34328802de7644bffccd7b1aa156e7997) +- Add support for duration columns in lerobot datasets [1cd0abc](https://github.com/rerun-io/rerun/commit/1cd0abc9cbbe14d6c4c8773432a4cb59ed6eda34) +- Support hierarchical dataset naming in viewer [efa2f23](https://github.com/rerun-io/rerun/commit/efa2f234e968e8888a6ca6d53f39170c5b319b48) +- Display `.` separated dataset in a folder hierarchy [a217309](https://github.com/rerun-io/rerun/commit/a21730943085d8a0742eae8e2d225eef11310535) +- Full VP8+VP9 support on native & web [a1642b4](https://github.com/rerun-io/rerun/commit/a1642b4f8213ac2c00d51bb6a630c30705d84a3b) (thanks [@AyushAgrawal-A2](https://github.com/AyushAgrawal-A2)!) +- Use video player for encoded depth images [c3af7d5](https://github.com/rerun-io/rerun/commit/c3af7d530a5933e624e1404c14c1c62a2ff78a1a) +- Better log console formatting [bd4c866](https://github.com/rerun-io/rerun/commit/bd4c866309dbb7ff0f6bb847d9e897f570d655a1) +- Make text document configuration part of the blueprint [e6ae09a](https://github.com/rerun-io/rerun/commit/e6ae09aa979231084768cd6c8f776f9bf5da563f) +- Experimental preview renders for tables with data set URLs [b133946](https://github.com/rerun-io/rerun/commit/b133946c4fccc0f0f08893e3bf422b6a373cde0d) +- Add `VideoStream.is_keyframe` component [d50eab6](https://github.com/rerun-io/rerun/commit/d50eab6d9d276f88d44c0c133a7e5a2c3e868642) +- Limit 2D & 3D view zoom out [e43c172](https://github.com/rerun-io/rerun/commit/e43c172407300cc4eb8b979a9fa78ea30c73206f) +- Make previews always play looping [90b5b01](https://github.com/rerun-io/rerun/commit/90b5b0134f9eb74c14c34908b30ab43c6af3ca62) +- Fix arrows blowing up when cap behind camera [db571f7](https://github.com/rerun-io/rerun/commit/db571f7035b311d77e9c6015298a4d288faa27f2) +- Add Ellipses2D archetype [2cbf5ff](https://github.com/rerun-io/rerun/commit/2cbf5ff4d5c68850e538ef75a1913b71fbecdcf6) +- Clamp time controls [8af40e2](https://github.com/rerun-io/rerun/commit/8af40e283df04b9d4d26123fc09c201b9751d8df) + +#### 🗄️ OSS server +- Lazy RRD loading in OSS server [4aea4a5](https://github.com/rerun-io/rerun/commit/4aea4a570a245949314f97b282e011c708efce01) +- No longer cache chunks in OSS server [853591a](https://github.com/rerun-io/rerun/commit/853591a3d143da30e79aea113c35af6435728124) + +#### 🚀 Performance improvements +- Decode encoded images using our video-player system, and use the web video decoder [794a722](https://github.com/rerun-io/rerun/commit/794a722d64c46e8c643af7d43c86aa92c2ea7135) +- Drop details from the manifest that aren't needed to reduce manifest memory bloat [612e9ef](https://github.com/rerun-io/rerun/commit/612e9ef5a75a1b9f3e8fa3d81b1142903b83d7a6) +- `rerun rrd compact`: split by video GoP boundaries [2485570](https://github.com/rerun-io/rerun/commit/248557024b14e95257659d63fdadb105ac5a2f87) +- By default, only prefetched what is visible [b509f91](https://github.com/rerun-io/rerun/commit/b509f91d244128339a2e3204a39ca66c6564197d) +- Speed up `DatasetView.reader`: only fetch schema once [b266938](https://github.com/rerun-io/rerun/commit/b26693866da4ae496aceb58042cc232d5b1aeae9) +- Huge speedup transform lookups for overlapping transform chunks [803337d](https://github.com/rerun-io/rerun/commit/803337de7dc94e19613946a9b34d7a914107511d) +- Don't traverse through parent entities in queries if there are no cleared entities at all [a873b22](https://github.com/rerun-io/rerun/commit/a873b22737798756abcac6c25bf8ff7194a6221e) +- Fix not taking fast paths in line/point for using default radii [5fb7c3d](https://github.com/rerun-io/rerun/commit/5fb7c3d00ff2e1a31c9c9e510100d3dfb2253a1f) +- `CatalogClient`: Add RTT and bandwidth probes [87c5e05](https://github.com/rerun-io/rerun/commit/87c5e056326f62a106ce4215775fdb2b53ce3199) +- Improve performance of Protobuf reflection [3969825](https://github.com/rerun-io/rerun/commit/39698253c8346639fc5d5b52c750717a8b4f7eb2) +- `register` now takes a list of URIs [9ec5265](https://github.com/rerun-io/rerun/commit/9ec52651803e0c2c0716e3a16d4631957926b6c2) +- Parallelize mcap decoder [6ccfcbf](https://github.com/rerun-io/rerun/commit/6ccfcbfc6fa8a1b28459440c895a9bbd6cfa6a6b) +- Emit sparse `is_keyframe` marker chunks when running optimize [ec6dff0](https://github.com/rerun-io/rerun/commit/ec6dff03c046f4a2a0e4b2726f208a268d424108) + +#### 🧑‍🏫 Examples +- Add dataloader training example [8cd8acb](https://github.com/rerun-io/rerun/commit/8cd8acb4f3bdad51b97a94174289ed103a8e835c) +- Add snippet demonstrating `LineStrips3D` with `VisibleTimeRange` [80dd138](https://github.com/rerun-io/rerun/commit/80dd1381273fad507f0516e0fe4000b0369f5c79) +- Use blueprint, component ui and type reflection in `custom_view` example [e64abd0](https://github.com/rerun-io/rerun/commit/e64abd0f695be3b7f66b0816c1b53f361c1c96f4) +- Subscribe to occupancy grids in ROS node example [b4a46c5](https://github.com/rerun-io/rerun/commit/b4a46c561713ac895848e122f63b635d800677c8) + +#### 📚 Docs +- Clearer behavior for `CoordinateFrame("")` [5bf9c4a](https://github.com/rerun-io/rerun/commit/5bf9c4a6027ce525a11c35dc9ff43e77324c3e6d) +- Move "Installing Rerun" into Getting Started [0296f67](https://github.com/rerun-io/rerun/commit/0296f67bd56b1ed1625b08e9054d86d13d01767d) +- Reduce python docs footguns [4e158e1](https://github.com/rerun-io/rerun/commit/4e158e1c6221f79ad5dbb4e1cb03b1f73f8c7903) +- Split "Set up a project" out of Log and Ingest [d0d63bc](https://github.com/rerun-io/rerun/commit/d0d63bc775ef6c3964563c7ea2d52df3f9a619b1) + +#### 🖼 UI improvements +- New tooltip redesign [b1a9d82](https://github.com/rerun-io/rerun/commit/b1a9d8285846b4dabce5e29f43af28cb94b7bb07) +- Reduce the size of chevrons in the UI [3f63fa1](https://github.com/rerun-io/rerun/commit/3f63fa12db53e75a6a06f15b2d6d615ff47202a9) +- Highlight invalid frame ID input and show `tf#/` suggestions if applicable [2dbe13a](https://github.com/rerun-io/rerun/commit/2dbe13afaae8627bebe776b1c1231110492d1e38) +- Status visualizer configuration [bb83ed7](https://github.com/rerun-io/rerun/commit/bb83ed70fd5817905a667e93f868986bb11d0e35) +- Update our icon ✨ [0677bbf](https://github.com/rerun-io/rerun/commit/0677bbf87ea4bffce0edd77cc64226a34c9d1d57) +- change colors for new brand colors [27c9036](https://github.com/rerun-io/rerun/commit/27c90366696241da2e2ff7deea9cf97f330fc7eb) + +#### 🕸️ Web +- Add progress bar to rerun-js and handle incomplete wasm downloads [ad551bd](https://github.com/rerun-io/rerun/commit/ad551bdf95f7abe2d1544693042ddf79fdd76e2a) +- Add rerun-js login setting and default to hiding the login button [0d14814](https://github.com/rerun-io/rerun/commit/0d148144f367852084ea48767412f9198c0f1b95) +- web_viewer: support overriding theme via ?theme= URL param [34b9958](https://github.com/rerun-io/rerun/commit/34b9958d5500741787350ae74bf3cf927a7b0fbb) + +#### 🎨 Renderer improvements +- GPU accelerated time series plot drawing [8e9635b](https://github.com/rerun-io/rerun/commit/8e9635b3223528322db2d695b8b6aa45f3a1a037) + +#### 🧢 MCAP +- Add `Selector::pipe` for calling anonymous functions [ea50667](https://github.com/rerun-io/rerun/commit/ea50667657307293eabf14c1b4bb0e6947605928) +- Support Foxglove `LocationFix` & `LocationFixes` [28fe84e](https://github.com/rerun-io/rerun/commit/28fe84e2769ec652919dd0075b5b22010273d62c) +- Split `Runtime` out of `Selector` [0febb36](https://github.com/rerun-io/rerun/commit/0febb36710b8e4efecb0b17890625986e6fa463d) +- Transition Lenses to be `Selector`-based [75e965a](https://github.com/rerun-io/rerun/commit/75e965a4c18784cb645ddf2f1765e80dc16da1c3) +- Lenses should not drop unrelated columns [849efb4](https://github.com/rerun-io/rerun/commit/849efb4a17b37882d2113f35af03bfb72d949971) +- MCAP: Add lens for ROS 2 `nav_msgs/OccupancyGrid` [c87a9ae](https://github.com/rerun-io/rerun/commit/c87a9aeeaded70cad02d2b802913b9d4d8fec02f) +- Write MCAP metadata to `__mcap_metadata` instead of `__properties` [3352bb6](https://github.com/rerun-io/rerun/commit/3352bb63b8bd3732e26d17da13c01f0a4c87e873) +- Write MCAP stats & info to `__mcap_properties` instead of `__properties` [31159e1](https://github.com/rerun-io/rerun/commit/31159e18323d2b73ab8f22ffa64144977d6296f4) +- Decode MCAP attachment records into `__mcap_attachments` [004539a](https://github.com/rerun-io/rerun/commit/004539a793449ae28df1561c309d93715bedf60f) + +#### 📈 Analytics +- More SDK analytics [fc6c8c7](https://github.com/rerun-io/rerun/commit/fc6c8c79fdd8201fef8119a66f9b1540d2a2f8da) + +#### 🧑‍💻 Dev-experience +- Add `rerun.tracing_session()` for support correlation [ec9f048](https://github.com/rerun-io/rerun/commit/ec9f048dfbd83fef934dcd4f19c752618c2ec81a) + +#### 📦 Dependencies +- Update datafusion to 52.5.0 [2832f82](https://github.com/rerun-io/rerun/commit/2832f8264a303e5ad8187183178c0f399a845205) +- Unpin wasm-bindgen [#12737](https://github.com/rerun-io/rerun/pull/12737) (thanks [@anassinator](https://github.com/anassinator)!) + +#### 🤷‍ Other +- Add option to split chunks with large component size differences for different archetypes [b0e6f90](https://github.com/rerun-io/rerun/commit/b0e6f90b3abcb7599d94d561774ff03b0b310dc4) +- Run `rerun rrd optimize` on a folder of recordings [9ccb8b2](https://github.com/rerun-io/rerun/commit/9ccb8b2f8d731e78f2ffb8b04dbe0e1d60fe54ee) + +## [0.31.4](https://github.com/rerun-io/rerun/compare/0.31.3...0.31.4) - 2026-04-29 + +### 🔎 Details + +#### 🪳 Bug fixes +- Prompt login on whoami failure [a312a99](https://github.com/rerun-io/rerun/commit/a312a99) +- Ensure proper `on_new_store` book-keeping for all messages [029e245](https://github.com/rerun-io/rerun/commit/029e245) +- Fix visualizations not showing up when initial data was empty [c867040a](https://github.com/rerun-io/rerun/commit/c867040a) +- Fix `follow` not being propagated to `http` URLs with extensions [09d5f94c](https://github.com/rerun-io/rerun/commit/09d5f94c) + +#### 🕸️ Web +- Web view add open options [#12731](https://github.com/rerun-io/rerun/pull/12731) + +## [0.31.3](https://github.com/rerun-io/rerun/compare/0.31.2...0.31.3) - 2026-04-13 + +### 🔎 Details + +#### 🪳 Bug fixes +- Fix plot view time range ui [3922bea](https://github.com/rerun-io/rerun/commit/3922bea85919bc3ad1570a74a21ae8580e36ea66) + +#### 📚 Docs +- Clearer behavior for `CoordinateFrame("")` [4b5c2f0](https://github.com/rerun-io/rerun/commit/4b5c2f084fbe015ba30a33534fbfa2e48cad8eab) + +#### 🖼 UI improvements +- Spacebar toggles play/pause, never enables following [#12722](https://github.com/rerun-io/rerun/pull/12722) (thanks [@wolfd](https://github.com/wolfd)!) + +#### 📦 Dependencies +- Update datafusion to 52.5.0 [87af7a9](https://github.com/rerun-io/rerun/commit/87af7a93bb031330679e7ecdca956b65a668ffbb) + + +## [0.31.2](https://github.com/rerun-io/rerun/compare/0.31.1...0.31.2) - 2026-04-08 + +### 🔎 Details + +#### 🪳 Bug fixes +- Fix MCAP CLI decoder identifier list [24f2604](https://github.com/rerun-io/rerun/commit/24f26047da9433924d7a00d7039be18cbe19c9ca) +- Fix bug where shapes defined with UI units were scaled incorrectly [9a28f8e](https://github.com/rerun-io/rerun/commit/9a28f8e089d30680bc14ab59653ca8d7b2e5d308) +- Fix off-by-one bug in video stream cache [e4eddc9](https://github.com/rerun-io/rerun/commit/e4eddc9a1ed798c60ae696e7e605c5a80279db30) +- Fix range queries on 3D points in `SpatialView3D` [213957c](https://github.com/rerun-io/rerun/commit/213957c5cd2dbbb7acfffd894310d7ec58ef7f5e) + +#### 📚 Docs +- Fix typo in micro-batching documentation [#12716](https://github.com/rerun-io/rerun/pull/12716) (thanks [@wolfd](https://github.com/wolfd)!) + +#### 🕸️ Web +- Add progress bar to rerun-js and handle incomplete wasm downloads [476a178](https://github.com/rerun-io/rerun/commit/476a1780a52cf99b600d51a184e16028a05f6cce) +- Add rerun-js login setting and default to hiding the login button [3203577](https://github.com/rerun-io/rerun/commit/320357798161a7663dea5777bec8d73431585239) + +#### 🤷‍ Other +- Stop creating the search index into `docs.rs` [6afa84b](https://github.com/rerun-io/rerun/commit/6afa84bfaf501cacb46cbdf5a63ea626473cd1a1) + +## [0.31.1](https://github.com/rerun-io/rerun/compare/0.31.0...0.31.1) - 2026-03-31 + +### 🔎 Details + +#### 🪳 Bug fixes +- Fix our python 3.10 support [2ee1f4f](https://github.com/rerun-io/rerun/commit/2ee1f4f8f8d3651e6eefcbb632e14ed4662531f8) + + +## [0.31.0](https://github.com/rerun-io/rerun/compare/0.30.2...0.31.0) - 2026-03-30 - component mappings & prettier primitives + +🧳 Migration guide: https://rerun.io/docs/reference/migration/migration-0-31 + +### ✨ Overview & highlights + +#### Component mappings + + +https://github.com/user-attachments/assets/18954263-1b34-4819-869d-02fa8117d6a3 + +You can now map components more generally. Want to display your mesh as a point cloud? Just add a point cloud visualizer and select the vertex positions as the source. + +#### Prettier primitives + + +https://github.com/user-attachments/assets/4e523454-4b3c-492b-a2a4-463f0f17ec51 + +Our 3D primitives got a new default look! + +#### Performance improvements + +- Optimization for point clouds, videos shared among views, data ingestion, and recordings with many entities. + + +### ⚠️ Breaking changes + +- MCAP "layers" renamed to "decoders" [cf0a800](https://github.com/rerun-io/rerun/commit/cf0a800770845d4a88c0d5671b246c45c1f3507d) +- `rr.Server` and `rr.CatalogClient`: `address` parameter/method renamed to `url`; `rerun server --address` is now `--host` [#12402](https://github.com/rerun-io/rerun/pull/12402) +- `Entry.update(name=…)` is deprecated in favor of `Entry.set_name(…)` [#12370](https://github.com/rerun-io/rerun/pull/12370) + +🧳 Migration guide: https://rerun.io/docs/reference/migration/migration-0-31 + +### 🔎 Details + +#### 🪵 Log API +- Redesign Lens `Op` API to be `Selector`-based [d962bfe](https://github.com/rerun-io/rerun/commit/d962bfe1b77ebd20ed4c619622505fdda98a43db) +- Add cull mode for front/back face culling on `Mesh3D` [be5a50f](https://github.com/rerun-io/rerun/commit/be5a50ff0e7c2bd92db47cf38d16d4c3ff960b21) +- Add `frame_prefix` to `UrdfTree` for multi-robot URDF setups [8e27391](https://github.com/rerun-io/rerun/commit/8e273910d1fe92c536d33e9876e85f866b6166e2) + +#### 🐍 Python API +- Improve `DynamicArchetype` docs with example on how to use builtin batch types [2052af5](https://github.com/rerun-io/rerun/commit/2052af5526f429dfb882452bac69046f09a7104a) +- Narrow typing for dynamic archetype [7b0bfaf](https://github.com/rerun-io/rerun/commit/7b0bfafcff27884b59546eada88872dad51b411e) +- Fix wrong variable in error message for extra args in log() [#12674](https://github.com/rerun-io/rerun/pull/12674) (thanks [@jashshah999](https://github.com/jashshah999)!) +- Allow re-registering the same blueprint to a dataset [fd03bf0](https://github.com/rerun-io/rerun/commit/fd03bf01e118c4c1245e4d08c2e41563cf707d29) +- Fix `using_index_value` not accepting pyarrow data of the correct types [62b8ac3](https://github.com/rerun-io/rerun/commit/62b8ac3fdec5abad48e9dba3ecbbbc6219acfbf7) +- Fix passing color columns with one element in the python sdk [e312d36](https://github.com/rerun-io/rerun/commit/e312d36e37a2e2c1c0e5426e9a77876d15c3f834) +- Entity filter: do not include all properties if a single property is included [5d3a25f](https://github.com/rerun-io/rerun/commit/5d3a25f3c3c24cb242ef1a241dcd925d6443de9c) +- Support binary stream [0a05422](https://github.com/rerun-io/rerun/commit/0a05422ed4b1caa6a43593555dd2b30f0bbfc6dd) +- Reuse precomputed timelines dict in send_columns instead of re-iterating indexes [#12673](https://github.com/rerun-io/rerun/pull/12673) (thanks [@jashshah999](https://github.com/jashshah999)!) +- Add description back to python package [6ab7971](https://github.com/rerun-io/rerun/commit/6ab7971d88444509e84a2ede36d3b3dff142fa92) +- Add `save()` to `Recording` [4ab863a](https://github.com/rerun-io/rerun/commit/4ab863a68a0225f443a91d8c79b49b2cd1583480) +- Add `compress()` and `as_pil_image()` to `DepthImage` with PNG compression [bde6870](https://github.com/rerun-io/rerun/commit/bde68700b3e0e58061b8a6332f23c64a703a1e0b) +- Introduce `Chunk` API to the Python SDK [32eb891](https://github.com/rerun-io/rerun/commit/32eb8912030e573450c1f4f0c76e08a7c105e141) +- Adds `rr.logout` to Python SDK [97af60e](https://github.com/rerun-io/rerun/commit/97af60e47d168fc57d1de866753df9e96020f326) +- Disable cloud vector & full-text-search for now [3da7180](https://github.com/rerun-io/rerun/commit/3da7180f138adaca596ab551c00c961ba2f5fff4) +- Add ContentFilter for cleaner filter_contents [8ce6d13](https://github.com/rerun-io/rerun/commit/8ce6d134ea789acc4073d9ed3913ee9a18a03e8e) +- Add cloud provider details to end point [c8dd0c8](https://github.com/rerun-io/rerun/commit/c8dd0c8978dc9ef6d898b27a79630f3f36d9c17e) +- Add component descriptor helper to Python archetype classes [8a2ef31](https://github.com/rerun-io/rerun/commit/8a2ef31bbd0979716c95d38a748e584a698db62f) + +#### 🦀 Rust API +- Rust `BlueprintActivation` default now matches python behavior [6d06892](https://github.com/rerun-io/rerun/commit/6d06892d43c1aac31ec3756afbd1bdeae4da2c19) +- Update MSRV to 1.92 [52b51ea](https://github.com/rerun-io/rerun/commit/52b51ea68e30ecef4f259b0a2f65edaa3159f23d) + +#### 🪳 Bug fixes +- Fixes recording staying open when user logs out [80ab340](https://github.com/rerun-io/rerun/commit/80ab340688ae045b7201c6b89b4179ac154e5ddf) +- Selection panel: show all values at the latest time stamp [474dbe8](https://github.com/rerun-io/rerun/commit/474dbe8a5694fd4ff031b78a15c89628ed374d9f) +- Gracefully handle Rrd Manifest failures [900edfd](https://github.com/rerun-io/rerun/commit/900edfdfc81dc182b110296b8e06f41001d4ac1e) +- Fix docs urls being loaded as data sources [80e3ce6](https://github.com/rerun-io/rerun/commit/80e3ce680cfafb80d60e863d84b9c0de94e5f52f) +- Fix: fix clicking names of color maps [92529ca](https://github.com/rerun-io/rerun/commit/92529ca9ba227e5e629176da1ecd8dd29423866f) +- Fix rare ui id conflict in list item content [0966696](https://github.com/rerun-io/rerun/commit/09666960eafc6a8b6c215643d0b28f503dbc1c05) +- Fix drag'n'drop issue on web [2d97010](https://github.com/rerun-io/rerun/commit/2d9701073e5f6f7945c0b4107a2664bb851ac44a) +- Handle `?url=rerun+http://…` in web viewer [0a47b41](https://github.com/rerun-io/rerun/commit/0a47b41dba92e4462f5ecfbd710213522a8e51a1) +- Fix weird tooltip sizes in streams view [0d98570](https://github.com/rerun-io/rerun/commit/0d985702eb03c7518ced87139184239270a88b00) +- Fix showing empty label boxes for various 2d & 3d visualizations [9c547ce](https://github.com/rerun-io/rerun/commit/9c547ce5d1f70815f77c0bab084cfa69dcfeb956) +- Fix bounding box calculation for GLB/GLTF & DAE meshes [8382f14](https://github.com/rerun-io/rerun/commit/8382f1492d14b1e47aa8e42b3c609952d9d15bc1) +- Fix eye camera being affected by previous recording of the same application/dataset [1b9a60f](https://github.com/rerun-io/rerun/commit/1b9a60fc99799cd91665af102c26ff344bd227c6) +- Ignore NaN/Inf values for bounding box calculations used in 3d eye camera operations [3e26be7](https://github.com/rerun-io/rerun/commit/3e26be7f35ec6bab974367ecfda02cc8b505e80d) +- Ensure that share modals are always on top [8d8eb40](https://github.com/rerun-io/rerun/commit/8d8eb407f37312a075bb564ce2d90e998f6c75ae) +- Add zoom in limit to camera, because zooming in too far broke the view [4534001](https://github.com/rerun-io/rerun/commit/45340013b495c48d1f242c4c5ef23bfb062795e2) +- Bump `lz4_flex` to prevent web viewer crashes [9355dd8](https://github.com/rerun-io/rerun/commit/9355dd8dc1c40926b9ae55216952b62df6490284) +- Improve handling of texture creation errors [ea4283e](https://github.com/rerun-io/rerun/commit/ea4283e4bf85b670e170513ed1c4f843bfbb514a) +- Fix prematurely resetting to Welcome screen even if stream finished properly [46d86eb](https://github.com/rerun-io/rerun/commit/46d86ebd4b17a1c544b8ab9a8572f48d0bd8dfd2) +- Fix flipping chunks between loaded/unloaded when hovering time panel [0e51fa6](https://github.com/rerun-io/rerun/commit/0e51fa6ea3fd2e4adb8c40bb4d1ac98adef44de6) +- Fix unset/reset not being greyed out for previously cleared out values [45f6ed2](https://github.com/rerun-io/rerun/commit/45f6ed2cb9430b2354002e164fd14066818c7861) +- Fix default blueprint not being activated for Redap segments [e66cb92](https://github.com/rerun-io/rerun/commit/e66cb928f8b1d12826b201f90c0db7b07f772639) +- Don't close active recording when opening settings [ea86ae9](https://github.com/rerun-io/rerun/commit/ea86ae9baad9a3d480b228bf0930e1bf0258be90) +- Fix some AV1 videos not playing in the WebViewer [c062098](https://github.com/rerun-io/rerun/commit/c062098388e9738463be7936b37d5e5b0e1454d5) +- Fix `sensor_msgs::PointCloud2` MCAP parser for empty point clouds [#12684](https://github.com/rerun-io/rerun/pull/12684) (thanks [@Woodii1998](https://github.com/Woodii1998)!) +- Stop time control following if set time is called [acba7b3](https://github.com/rerun-io/rerun/commit/acba7b3bd76e2ae9f589987e7b293138a2844559) +- Support LeRobot feature names on the `ListArray` path [30a86e1](https://github.com/rerun-io/rerun/commit/30a86e1daa8f3f9b953fd5b40585c5ab4296ea94) + +#### 🌁 Viewer improvements +- Support custom bool types in plots [888a9e8](https://github.com/rerun-io/rerun/commit/888a9e8f75fb63a8b51c1ff6f87b9957f3fe0b93) +- Add util to compute column of `Transform3D` updates for URDF joints [#12666](https://github.com/rerun-io/rerun/pull/12666) +- Unified color swatches [c020c80](https://github.com/rerun-io/rerun/commit/c020c807258773ce5e770a2fc26276cff53b1bf3) +- Make more visualizer errors point to specific components that are in an invalid state [19b2c79](https://github.com/rerun-io/rerun/commit/19b2c79aad92d96c41e71288c9cd0c1e169b16cc) +- Add context menu to visualizer pills on time series view [136a2d1](https://github.com/rerun-io/rerun/commit/136a2d1c8fadc3ec5fde72888c616d4022ad4ead) +- Make many more required components ui editable [2f791ad](https://github.com/rerun-io/rerun/commit/2f791adb8b5f370703178c6718d44317d7efd3a3) +- Limit number of plots only for non-builtin components and increase the limit [0d66ceb](https://github.com/rerun-io/rerun/commit/0d66ceb08f20df4d007934f234568c2002d82517) +- Show _all_ visualizable scalars on time series add-visualizer menu [90bf07b](https://github.com/rerun-io/rerun/commit/90bf07bfd76193e91716cbeb1084eb02fb994e72) +- Stop warning on synthetic `oneof` protobuf fields [975d3ba](https://github.com/rerun-io/rerun/commit/975d3baee9b878decb5ff54fc2c2e30b6222f99c) +- Allow saving image previews in the selection panel [6e09d66](https://github.com/rerun-io/rerun/commit/6e09d6655e812839c4d96948a3d4b6417b65b73b) +- Support plotting components that contain `FixedSizeListArray` [53d2864](https://github.com/rerun-io/rerun/commit/53d286417bf228afe9987e8855b20caa0c846c67) +- Add `!` operator to `Selector` to assert non-`null` values [a53c683](https://github.com/rerun-io/rerun/commit/a53c683bb70594bb0fa83ebbd68b29d882817a33) +- Allow all visualizers to be created for any datatype match [5d5c2f2](https://github.com/rerun-io/rerun/commit/5d5c2f2f52f2f275c9528846fd5863986576986b) +- Fix overrides in blueprints created by a native viewer no showing up on the web viewer and vice versa [74a30f2](https://github.com/rerun-io/rerun/commit/74a30f2f08cd9b21205886f3325a45da04d9e103) +- Displays WorkOS organization when logged in [784c7b5](https://github.com/rerun-io/rerun/commit/784c7b5df379db71e4f435262f76e0cc579d2582) +- Use full recording schema in manifest ingestion [6589388](https://github.com/rerun-io/rerun/commit/6589388d770ba08a2078e48114fdaf878e8b030a) +- Change default fill mode for primitives [9d54afd](https://github.com/rerun-io/rerun/commit/9d54afddd516aa6ca2e6768f4929bec31d049d67) +- Fixes logout + login into a different account [15d18e7](https://github.com/rerun-io/rerun/commit/15d18e7bd230a9ac7029ca278d940c20f2b0dd51) +- Fix spamming errors when trying to show static scalars in the time series view [f9ca495](https://github.com/rerun-io/rerun/commit/f9ca49536b1d852e9bba7037f0a358c50c83ee70) +- Ensure that URDF primitives are colored correctly [25ee3cb](https://github.com/rerun-io/rerun/commit/25ee3cb27e5a5db80d9551614ab7a76634bfbcce) +- Add 5% vertical margin to time series plot bounds [5beb61e](https://github.com/rerun-io/rerun/commit/5beb61e5313ea41bb8ed6ced62aa0eeb6e896aec) +- Ignore outliers for focusing on 2d & 3d point clouds [b367ae9](https://github.com/rerun-io/rerun/commit/b367ae90de2c569b3259748df2e3c5bd4a63be85) +- Limit amount of heuristic lineseries from arbitrary sources [2f6d88f](https://github.com/rerun-io/rerun/commit/2f6d88f6f223ff26b4fe53eb68e61c7b99093dd6) +- Adds cancel button to login flow [900887f](https://github.com/rerun-io/rerun/commit/900887fdcb866ffcd50ded1af41e517b0edd5fc8) +- Add `magnification_filter` component to all image archetypes & add bicubic filtering [2c1ccee](https://github.com/rerun-io/rerun/commit/2c1cceebcdfcedfcdabf819f636c14344d0f54c0) +- Truncate strings in syntax highlighted arrow ui to 100 chars [d06fc95](https://github.com/rerun-io/rerun/commit/d06fc956bd9d005eda3a8f0cfc3d13ea3f3cb03a) +- Show login information on token mismatches in viewer [710ccd9](https://github.com/rerun-io/rerun/commit/710ccd9bebba0a40f42f34afabceec926a53cc56) +- Allow cpu->gpu transfer buffer to shrink again [4977603](https://github.com/rerun-io/rerun/commit/4977603f043889429a9ee58e57e34ff8421e4696) +- Fixes login in Safari [750f65f](https://github.com/rerun-io/rerun/commit/750f65f3fb97fe5c66f3de79134323f65bc87e5c) +- Add support for subtasks in LeRobot loader [464ff56](https://github.com/rerun-io/rerun/commit/464ff567d995bdf34945e650026dbf6ccde52a25) + +#### 🗄️ OSS server +- Allow OSS server to register existing segments to new datasets [d0b8f78](https://github.com/rerun-io/rerun/commit/d0b8f780d01447a158b22c16a438acd509e98288) + +#### 🚀 Performance improvements +- Remove collapsing time gaps for performance reasons [eb0b67a](https://github.com/rerun-io/rerun/commit/eb0b67af333256c9eafebe86f42e56923c077955) +- Share video players between views, de-duplicating video decoding work between pinholes and 2d views [64f1003](https://github.com/rerun-io/rerun/commit/64f100332a1c971cf0d9f339dcfa796535cbfdae) +- Support progressive ingest of the rrd manifest [9a67723](https://github.com/rerun-io/rerun/commit/9a67723fe6ee4bbd2a73cb3d2402501008c7f7d2) +- Performance improvements for many views + many entities [8f297fe](https://github.com/rerun-io/rerun/commit/8f297fec7324feca12be5c3b8eae05cf6c74b84e) +- Speed up many-entities (Refactor view class store subscriber) [e24407f](https://github.com/rerun-io/rerun/commit/e24407f936bd0ade4313e832a0939484a958fc0d) +- Much faster 3D point clouds [cb62f8c](https://github.com/rerun-io/rerun/commit/cb62f8c1b421bc79f28d429bfe83018c8703e908) +- Add `ChunkStoreDiff::SchemaAddition` and use it for heuristics [822ac41](https://github.com/rerun-io/rerun/commit/822ac413a502a2e34e9af0462e242660eb3b0d33) + +#### 🧑‍🏫 Examples +- Add any scalar example [ffd1687](https://github.com/rerun-io/rerun/commit/ffd168732b991ffb39ee67049a5f62681bff7e87) + +#### 📚 Docs +- Add generalized example (snippet + doc page) for component mappings [41cb42f](https://github.com/rerun-io/rerun/commit/41cb42f2add056d206bc931a0ae8fa340bf43058) +- Corrected the docs example for the `DynamicArchetype` [64d466d](https://github.com/rerun-io/rerun/commit/64d466d8bd2694939fff2341936d3e70191aea1c) +- Adding snippet showing how to register a dataset as a subset of an existing dataset [09814c0](https://github.com/rerun-io/rerun/commit/09814c0a83423f9efd3913c9314171b8fc8e309c) + +#### 🖼 UI improvements +- Visibility control from scalar visualizer list [5f03f15](https://github.com/rerun-io/rerun/commit/5f03f15a03ed5d9ce2627d0f9ccee6f08ef55a05) +- Make arrow values expandable if they don't fit [b30522c](https://github.com/rerun-io/rerun/commit/b30522c7e3f3f4e4e904f80a1bdeb7fe04eb6c30) +- Add scrolling to column popup [a9a00ad](https://github.com/rerun-io/rerun/commit/a9a00ad58e15028aed1ca4adfc429a478f82ac11) +- Allow to switch between recordings in chunk store browser [d449525](https://github.com/rerun-io/rerun/commit/d44952577dd6ff44392021d3ca4ea42702043d59) +- Don't flicker videos to black when there's unloaded samples [dc8c31f](https://github.com/rerun-io/rerun/commit/dc8c31ffa05034ec31fa704d9f7fbecaeea8e053) +- Show tooltip even when hovering play head in the time series view [d8bd248](https://github.com/rerun-io/rerun/commit/d8bd248376bd7c1440071b5210c2f8a63f566877) +- Show number of columns and rows in the recording ui [29a88f9](https://github.com/rerun-io/rerun/commit/29a88f9cf4b9fa68806ca2c30151e488bd4f9c03) +- Collapse multi-line labels if there are too many on screen [2916462](https://github.com/rerun-io/rerun/commit/2916462609f769bd8fe6b1cd33d4f3d7e46e73f2) +- Fix slow resizing of table columns [299969c](https://github.com/rerun-io/rerun/commit/299969cddc89bcbecde2ea184ab0f47e6fb849ae) +- Default to only showing active timeline in dataframe and log views [4df6c62](https://github.com/rerun-io/rerun/commit/4df6c62c4cd5c2f3296df64778df3909fefc39a6) +- Refactor chunk browser UI [5b6017b](https://github.com/rerun-io/rerun/commit/5b6017b596fb5de1bebc74b1f062a2a6cc51f6d1) +- Add cmd-K as secondary shortcut for command palette [6d5d512](https://github.com/rerun-io/rerun/commit/6d5d5120bfb421407391dfe54dc996b6361938bb) +- Add fade to scroll areas to indicate that scrolling is possible [c0b8685](https://github.com/rerun-io/rerun/commit/c0b868559c25054185609583ee3aa1eced5f6247) +- Better time range deselect UX [c947940](https://github.com/rerun-io/rerun/commit/c947940acf79fa0b0df60de6bd49bd19fad96034) +- Better legend ui on plot views (time series & bar chart) [bc7393b](https://github.com/rerun-io/rerun/commit/bc7393b88bbb52ddc14290ce8f261aa49d7774c0) + +#### 🕸️ Web +- Enable WebGPU rendering on Safari (MacOS Tahoe+ only) [76bd562](https://github.com/rerun-io/rerun/commit/76bd562982cc15572c743cc818dfe07836dd2b9a) +- Update wasm-bindgen to 0.2.108 [7314d4d](https://github.com/rerun-io/rerun/commit/7314d4d82f679928bea5a4b1c9133a12fc18e6a8) +- Fix(web-viewer): clean up loader when startup is interrupted [#12696](https://github.com/rerun-io/rerun/pull/12696) (thanks [@Woodii1998](https://github.com/Woodii1998)!) + +#### 🧢 MCAP +- Protobuf schema evolution and optional field support in Lenses [75a6dbc](https://github.com/rerun-io/rerun/commit/75a6dbcaca457dc557fc1821bbb2deed65043a56) +- Improve Lenses errors and debug output [47596e0](https://github.com/rerun-io/rerun/commit/47596e0436de132662ce54753f975020a25e9ced) +- Support also "sec" & "nsec" in `TimeSpecToNanos` [f7eb4cd](https://github.com/rerun-io/rerun/commit/f7eb4cd091970b7350977b8f127afa92b160ddd3) +- Add a list of available layers to mcap convert cli [bc46df7](https://github.com/rerun-io/rerun/commit/bc46df75e5e81915a2a1e4f62a5c5ce7dd03431a) +- Add `--timestamp-offset-ns` option to MCAP CLI [787e6cc](https://github.com/rerun-io/rerun/commit/787e6cc087e57a831f2d4a9e906636a1f46ebf4d) +- Decode MCAP metadata records into `__properties` [0b43178](https://github.com/rerun-io/rerun/commit/0b43178d2c6198cb3fd801d104dc53f2f434fd15) +- Split `re_arrow_combinators` into `re_lenses` and `re_lenses_core` [a9f4ca3](https://github.com/rerun-io/rerun/commit/a9f4ca3776e75a7280a769fefb5cf076f3de477a) +- Rename MCAP `Layer` to `Decoder` [cf0a800](https://github.com/rerun-io/rerun/commit/cf0a800770845d4a88c0d5671b246c45c1f3507d) +- Default to UNIX epoch timestamp timeline in MCAP decoders [bb6aee5](https://github.com/rerun-io/rerun/commit/bb6aee556ffa66e67ca9427c9da67aa17bbe6889) +- Support protobuf messages with `Map` and arbitrary `oneof` fields [5ba2817](https://github.com/rerun-io/rerun/commit/5ba2817aec62a42c8504cd4774d4f483d55c227d) +- Create static timeline for /tf_static ROS 2 MCAP channels [959f77f](https://github.com/rerun-io/rerun/commit/959f77f5408414c0bbd2936ddcc7fe5d6cfcbf4b) +- Ignore empty MCAP channels [f0c99c5](https://github.com/rerun-io/rerun/commit/f0c99c5b743cf7cf341ca4c3375ebbb43cc44ade) +- Ignore 'rosbag2' metadata field [357aab8](https://github.com/rerun-io/rerun/commit/357aab8c821f6d51c33a1d49afbcef92848b3f85) +- Load URDF from `/robot_description` ROS 2 string topics in MCAP [426fcfc](https://github.com/rerun-io/rerun/commit/426fcfc2d699a7e721ed5d36e8b44eadeb737921) +- Make `Selector` evaluation `ArrayRef`-based [35dff31](https://github.com/rerun-io/rerun/commit/35dff31f0aeb15cb2067fcdd807ac2a25e9faeb5) +- Remove lenses that produce static columns [95ba113](https://github.com/rerun-io/rerun/commit/95ba113387f7416830b0057a627cf63bf5e5f8e8) + +#### 📦 Dependencies +- Upgrade `jsonwebtoken` to 10.3 [10a42b6](https://github.com/rerun-io/rerun/commit/10a42b6e8021463e2e8829b0915ff7fc2105cf57) + +#### 🤷‍ Other +- Add `--new` flag to always spawn a new viewer even if another one is already using the default port [874d3a8](https://github.com/rerun-io/rerun/commit/874d3a844b16322b9609b5b1490966657a191aa6) +- Add `rerun download` to download full recording from server [ac95098](https://github.com/rerun-io/rerun/commit/ac9509840b9024ac1538270a7b82d19da649fa11) +- Fix `rerun rrd stats` reporting identical compressed/uncompressed sizes [5ac9604](https://github.com/rerun-io/rerun/commit/5ac960404ffb3919353870a28e2e1cdf8d8d53d4) + +## [0.30.2](https://github.com/rerun-io/rerun/compare/0.30.1...0.30.2) - 2026-03-11 + +### ✨ Overview + +Among many other things, this patch addresses a security advisory ([SNYK-RUST-JSONWEBTOKEN-15189005](https://security.snyk.io/vuln/SNYK-RUST-JSONWEBTOKEN-15189005)) and adds a [new example](https://rerun.io/examples/robotics/any_scalar)! + +### 🔎 Details + +#### 🐍 Python API +- Expose executable_name and executable_path in Python spawn() [#12685](https://github.com/rerun-io/rerun/pull/12685) + +#### 🪳 Bug fixes +- Handle `?url=rerun+http://…` in web viewer [5f2d65d](https://github.com/rerun-io/rerun/commit/5f2d65da30c83e8de0d2129feaff57f9461c3806) +- Fix weird tooltip sizes in streams view [92403bb](https://github.com/rerun-io/rerun/commit/92403bbac8a9fbfed94753929a9cf0633088dd00) + +#### 🚀 Performance improvements +- Share video players between views, de-duplicating video decoding work between pinholes and 2d views [ed236da](https://github.com/rerun-io/rerun/commit/ed236dadfc72a824d6abd34afa76a39bac1c518c) + +#### 🧑‍🏫 Examples +- Add any scalar example [3f58058](https://github.com/rerun-io/rerun/commit/3f580585a08c301dc304051dc9ee6f769fd8e819) + +#### 🖼 UI improvements +- Show tooltip even when hovering play head in the time series view [e44fbf0](https://github.com/rerun-io/rerun/commit/e44fbf0336c01bf7454a8edfd8ffa32c02f5d11e) + +#### 🧢 MCAP +- Add a list of available layers to mcap convert cli [89f18dc](https://github.com/rerun-io/rerun/commit/89f18dc6fc2953cf24c5449127bffae9e4cd06d2) +- Decode MCAP metadata records into `__properties` [cc8f1c2](https://github.com/rerun-io/rerun/commit/cc8f1c23e21a863f805759decf41febd2655f756) + +#### 📦 Dependencies +- Upgrade `jsonwebtoken` to 10.3 [312c3b8](https://github.com/rerun-io/rerun/commit/312c3b88e63ebd96411442dfd6ba7c30d5026059) + +#### 🧢 MCAP +- MCAP "layers" have been renamed to "decoders". The CLI flag `-l`/`--layer` is now `-d`/`--decoder`. + +## [0.30.1](https://github.com/rerun-io/rerun/compare/0.30.0...0.30.1) - 2026-03-04 + +### ✨ Overview & highlights + +This patch on top of [0.30.0](https://github.com/rerun-io/rerun/releases/0.30.0) comes not only with a random assortment of bug fixes +but also some small improvements to the Viewer. + +Most notably it's now possible to inspect values that were logged on the same timestamp! +image + +### 🔎 Details + +#### 🐍 Python API +- Allow re-registering the same blueprint to a dataset [cafbec9](https://github.com/rerun-io/rerun/commit/cafbec9b874aedad35e48da14a709f5205571aab) +- Fix `using_index_value` not accepting pyarrow data of the correct types [c59df09](https://github.com/rerun-io/rerun/commit/c59df09001094f6b494039ec13ab6cd35f97438e) + +#### 🪳 Bug fixes +- Gracefully handle Rrd Manifest failures [f14e343](https://github.com/rerun-io/rerun/commit/f14e343fc09a481e76f8898d8fbfe987a4161b80) +- Fix docs urls being loaded as data sources [3eb98db](https://github.com/rerun-io/rerun/commit/3eb98dbbb4ade0478ba333e05f02fb7bb942e989) +- Fix fix clicking names of color maps [700b590](https://github.com/rerun-io/rerun/commit/700b590dca0f658b750197f9be5b9bc3495b9dfd) +- Fix rare ui id conflict in list item content [352f7c8](https://github.com/rerun-io/rerun/commit/352f7c8b5b659fa815d3bc436c54b6d28ca05396) +- Fix drag'n'drop issue on web [956ed91](https://github.com/rerun-io/rerun/commit/956ed9185dd952bad4fc64b9ec8bad9980fa3b45) + +#### 🌁 Viewer improvements +- Selection panel: show all values at the latest time stamp [36ff7ff](https://github.com/rerun-io/rerun/commit/36ff7ff8c6c6ab1e03696a35fb9a181885ea3073) +- Limit number of plots only for non-builtin components and increase the limit [f4fb62b](https://github.com/rerun-io/rerun/commit/f4fb62b5c87a587fc2709c583734980a5b830b36) +- Show _all_ visualizable scalars on time series add-visualizer menu [0da70a5](https://github.com/rerun-io/rerun/commit/0da70a54338e9dedc37a56a943fe4e297925718c) +- Stop warning on synthetic `oneof` protobuf fields [84ee94e](https://github.com/rerun-io/rerun/commit/84ee94eb68b30eb48cec3ccbbfca2884a3b8b2f3) + +#### 📚 Docs +- Corrected the docs example for the `DynamicArchetype` [32c37e8](https://github.com/rerun-io/rerun/commit/32c37e855b9ad2a99f38f6d63b456fc4843de179) + +#### 🖼 UI improvements +- Make arrow values expandable if they don't fit [4edd93e](https://github.com/rerun-io/rerun/commit/4edd93e30d2457d90a344cf107ca96e79a3ba083) +- Add scrolling to column popup [7dbd933](https://github.com/rerun-io/rerun/commit/7dbd9339c70c03426a4f8fe54b8499750a7bbe9a) + +#### 🧢 MCAP +- Support also "sec" & "nsec" in `TimeSpecToNanos` [31c9a43](https://github.com/rerun-io/rerun/commit/31c9a4388d8ec3dbcd2469ebdd26190ae5459a3b) + +## [0.30.1](https://github.com/rerun-io/rerun/compare/0.30.0...0.30.1) - 2026-03-04 + +### ✨ Overview & highlights + +This patch on top of [0.30.0](https://github.com/rerun-io/rerun/releases/0.30.0) comes not only with a random assortment of bug fixes +but also some small improvements to the Viewer. + +Most notably it's now possible to inspect values that were logged on the same timestamp! +image + +### 🔎 Details + +#### 🐍 Python API +- Allow re-registering the same blueprint to a dataset [cafbec9](https://github.com/rerun-io/rerun/commit/cafbec9b874aedad35e48da14a709f5205571aab) +- Fix `using_index_value` not accepting pyarrow data of the correct types [c59df09](https://github.com/rerun-io/rerun/commit/c59df09001094f6b494039ec13ab6cd35f97438e) + +#### 🪳 Bug fixes +- Gracefully handle Rrd Manifest failures [f14e343](https://github.com/rerun-io/rerun/commit/f14e343fc09a481e76f8898d8fbfe987a4161b80) +- Fix docs urls being loaded as data sources [3eb98db](https://github.com/rerun-io/rerun/commit/3eb98dbbb4ade0478ba333e05f02fb7bb942e989) +- Fix fix clicking names of color maps [700b590](https://github.com/rerun-io/rerun/commit/700b590dca0f658b750197f9be5b9bc3495b9dfd) +- Fix rare ui id conflict in list item content [352f7c8](https://github.com/rerun-io/rerun/commit/352f7c8b5b659fa815d3bc436c54b6d28ca05396) +- Fix drag'n'drop issue on web [956ed91](https://github.com/rerun-io/rerun/commit/956ed9185dd952bad4fc64b9ec8bad9980fa3b45) + +#### 🌁 Viewer improvements +- Selection panel: show all values at the latest time stamp [36ff7ff](https://github.com/rerun-io/rerun/commit/36ff7ff8c6c6ab1e03696a35fb9a181885ea3073) +- Limit number of plots only for non-builtin components and increase the limit [f4fb62b](https://github.com/rerun-io/rerun/commit/f4fb62b5c87a587fc2709c583734980a5b830b36) +- Show _all_ visualizable scalars on time series add-visualizer menu [0da70a5](https://github.com/rerun-io/rerun/commit/0da70a54338e9dedc37a56a943fe4e297925718c) +- Stop warning on synthetic `oneof` protobuf fields [84ee94e](https://github.com/rerun-io/rerun/commit/84ee94eb68b30eb48cec3ccbbfca2884a3b8b2f3) + +#### 📚 Docs +- Corrected the docs example for the `DynamicArchetype` [32c37e8](https://github.com/rerun-io/rerun/commit/32c37e855b9ad2a99f38f6d63b456fc4843de179) + +#### 🖼 UI improvements +- Make arrow values expandable if they don't fit [4edd93e](https://github.com/rerun-io/rerun/commit/4edd93e30d2457d90a344cf107ca96e79a3ba083) +- Add scrolling to column popup [7dbd933](https://github.com/rerun-io/rerun/commit/7dbd9339c70c03426a4f8fe54b8499750a7bbe9a) + +#### 🧢 MCAP +- Support also "sec" & "nsec" in `TimeSpecToNanos` [31c9a43](https://github.com/rerun-io/rerun/commit/31c9a4388d8ec3dbcd2469ebdd26190ae5459a3b) + +## [0.30.0](https://github.com/rerun-io/rerun/compare/0.29.2...0.30.0) - 2026-02-25 - plot any scalar & on-demand streaming + +🧳 Migration guide: https://rerun.io/docs/reference/migration/migration-0-30 + +### ✨ Overview & highlights + +#### 📈 Plot any scalar + + + +https://github.com/user-attachments/assets/cb10e8fd-7428-44ae-9f22-37fd721a357f + +You can now plot any scalar value, even if it lacks Rerun semantics in time series views. For instance, this lets you plot any value in an MCAP file. + +In addition to plotting scalars from MCAP files, it is now possible to visualize arbitrary scalar components that were logged using `AnyValues` or `DynamicArchetype`. The supported data types are: + +- `Float32` and `Float64` +- `Int8`, `Int16`, `Int32`, and `Int64` +- `UInt8`, `UInt16`, `UInt32`, and `UInt64` +- `Boolean` +- Any of the above nested inside of [Arrow structs](https://arrow.apache.org/docs/format/Intro.html#struct). + +This also makes it possible to log and visualize multiple scalars to the same entity, which can drastically reduce the size of the resulting `.rrd` files. + +_Note that by default, and without blueprints, views are still only spawned for entities with Rerun semantics._ + +Time series views for entities with custom scalar components need to be spawned either: + +- from the context menu of the streams, +- by adding a view from the blueprint panel, +- or by specifying a blueprint using the Python or Rust SDK. + +The components that should be visualized can be selected via a new dropdown menu from the completely revised visualizer section in the selection panel. + + + New Source dropdown menu + + +To quickly navigate to the desired visualizer, each time series view now shows an overview of it's current visualizers. + + + List of visualizer in view selection panel. + + +For more details please refer to our documentation: + +- [Customize views](https://rerun.io/docs/concepts/visualization/customize-views) +- [Plot any scalar](https://rerun.io/docs/howto/visualization/plot-any-scalar) +- [Component mappings outside of plotting](https://rerun.io/docs/howto/visualization/component-mappings), shown on the example of a colored point cloud + +And finally, thanks to a contribution from [@vfilter](https://github.com/vfilter), the series lines visualizer now also supports different interpolation modes to render staircase (or step) functions: + + + Dropdown of different interpolation modes + + +#### 📡 On-demand streaming / larger-than-RAM +The Rerun Viewer now supports _on-demand streaming_, when connected to either the OSS server or [Rerun Hub](https://5li7zhj98k8.typeform.com/to/a5XDpBkZ?typeform-source=rerun.io). + +With on-demand streaming, whatever you are currently viewing will be downloaded first. +This includes time-scrubbing to the end of a very long recording and quickly seeing what is there, or viewing only one camera feed of many. + +Of course, your memory limit will be respected, and when you change your view or move the time cursor, the stale data will be evicted and the new data downloaded. + +This also means that the web viewer can finally view recordings larger than the 4GiB limit enforced by Wasm32, as long as those recordings are served by a Rerun server. + +It also means that Rerun Hub users can view huge recordings, larger than what fits into RAM. +The OSS server, however, still loads everything into RAM before serving it. + +Usage: + +``` +> rerun server -d folder_with_large_recordings +``` + +Then either open the native viewer: + +``` +> rerun "rerun+http://127.0.0.1:51234" +``` + +Or the web viewer: + +``` +> rerun --serve-web "rerun+http://127.0.0.1:51234" +``` + +#### 🦾 Support for many more MCAP message types +Like in the previous releases, we're continually expanding our support for common robotics data to make it easier for users to load their existing recordings. + +This release adds support for Foxglove Protobuf schemas to our built-in MCAP data loader, in addition to the existing set of supported ROS 2 messages. + +You can find an overview of all the messages that are currently supported [here](https://rerun.io/docs/concepts/logging-and-ingestion/mcap/message-formats). + + + + Complex scene imported from MCAP + + + + +#### 🎨 Extend existing views without forking +Previously, extending the Viewer with custom Rust code required creating an entirely new view type, +even if you just wanted to add a single new visualization to the existing 3D view. + +Now, you can register custom visualizers that plug directly into existing views, using fully custom archetypes & shaders in the process! + + + +https://github.com/user-attachments/assets/df609f10-5515-49bc-86fd-6940cc25706f + +In practice this works currently only well for 2D, 3D, and Map views but we'll keep working towards +making the Viewer more and more modular & extensible! + +For more details, see the [custom visualizer example](https://github.com/rerun-io/rerun/tree/latest/examples/rust/custom_visualizer) and the [viewer rust extension docs](https://rerun.io/docs/howto/visualization/extend-ui) for a general overview. + +### ⚠️ Breaking changes + +- **Python**: `segment_url_udf` and `segment_url_with_timeref_udf` have been removed +- **Python**: `segment_url` parameter names have been updated +- **CLI**: `.rrd` files are no longer tailed by default +- **SDK**: `SeriesVisible` component type has been removed + +🧳 Migration guide: https://rerun.io/docs/reference/migration/migration-0-30 + + +### 🔎 Details + +#### 🪵 Log API +- Fix performance regression with `--server-memory-limit 0` [cfc9a4c](https://github.com/rerun-io/rerun/commit/cfc9a4cab52b5ffe53861961418081f91e7be4e1) +- Remove `SeriesVisible` component in favor of `Visible` [1fca08a](https://github.com/rerun-io/rerun/commit/1fca08ad65a86b0879e175ee984f931a523c6e17) +- `rerun rrd verify` now checks for the presence of RRD manifests [2000ba5](https://github.com/rerun-io/rerun/commit/2000ba543f76d026fabc0aee3c9b92ae5da7aaca) +- Footer-preserving RRD routing [b56a145](https://github.com/rerun-io/rerun/commit/b56a145262bc434542151776b569881522f735b5) + +#### 🌊 C++ API +- Build C++ snippets into a single executable to avoid link time overhead [b0a3876](https://github.com/rerun-io/rerun/commit/b0a3876bc26ae1caff59ad1bf230279182522bb9) + +#### 🐍 Python API +- Basic Rust & Python blueprint API for component mappings [c6d7409](https://github.com/rerun-io/rerun/commit/c6d7409bcd94402e219b4d31c682fef52eb3b340) +- Ensure that `import rerun_sdk.rerun` can be used [196c658](https://github.com/rerun-io/rerun/commit/196c658c2037a3cee7c2e7c25bda499074b4199e) +- Expose `on_duplicate` in the Python SDK [e909e20](https://github.com/rerun-io/rerun/commit/e909e20b7a97eb2666421afa95052e4431fcb5db) +- Small conversion improvement [383d37d](https://github.com/rerun-io/rerun/commit/383d37db68ae92a16eaf2f669090db1142e39ef2) +- Table entry APIs: provide a hint for single-row list data [cb38397](https://github.com/rerun-io/rerun/commit/cb3839758c45d0464c1d507ebc460cb854df5d3a) +- Add hint to prepend `api.` on connection error [a2ef1b3](https://github.com/rerun-io/rerun/commit/a2ef1b316b09823b74baf55fe0311a0911d935a7) +- No longer return all columns when `filter_content()` matches nothing [5997d6f](https://github.com/rerun-io/rerun/commit/5997d6f932cc58954250d86a023b8667b9bd9e32) +- Remove deprecated UDFs [b078e18](https://github.com/rerun-io/rerun/commit/b078e181367782d23ba37fc14fcc6ca795054a86) +- Allow access to redap token from python sdk [bc2ce79](https://github.com/rerun-io/rerun/commit/bc2ce79f72521773fdbef31576cb00a49473fd8d) +- Expose "rerun_registration_status" to `DatasetEntry.manifest()` [881cee6](https://github.com/rerun-io/rerun/commit/881cee6003b5ae0146850597782452fca3ac5faa) +- Correctly handle lists in `AnyValues`/`DynamicArchetype` `.columns` [d2b53da](https://github.com/rerun-io/rerun/commit/d2b53da9ff1274c502968dc62fe96172a0a2ec9f) +- Atomic (un)registrations [153acd1](https://github.com/rerun-io/rerun/commit/153acd1410d9daab045222ce7be69bde27b50723) +- The `url` argument of `CatalogClient.create_table()` is now a prefix [1eb6c79](https://github.com/rerun-io/rerun/commit/1eb6c790d7c26f47da8dcfc88942713d97d57a42) +- notebook: Re-export viewer event types [4c7d978](https://github.com/rerun-io/rerun/commit/4c7d97826a284371291155a5bb67359fb025b3de) +- Add `entity_paths()`, `archetypes()`, and `component_types()` methods to `Schema` [015f1fc](https://github.com/rerun-io/rerun/commit/015f1fc22c6aa8b7af3b42fecf6feaf81dff2ef0) +- Error when querying an unknown index [74a27df](https://github.com/rerun-io/rerun/commit/74a27dfb1c1257d6edbabbf42f28afe8bb043d2b) +- Rename `rerun-sdk[datafusion]` to `rerun-sdk[dataplatform]` and add pandas dependency [b82cd06](https://github.com/rerun-io/rerun/commit/b82cd060273a20ce2a5b99b3b591bce654182710) +- Add (and document) time range and selection support to `segment_url` [b2e7eff](https://github.com/rerun-io/rerun/commit/b2e7eff71b53e75d3a6d34c1804773ccc483f648) + +#### 🦀 Rust API +- Basic Rust & Python blueprint API for component mappings [c6d7409](https://github.com/rerun-io/rerun/commit/c6d7409bcd94402e219b4d31c682fef52eb3b340) +- Move URDF joint transform computation to Rust [4e10aea](https://github.com/rerun-io/rerun/commit/4e10aeac7fd4213f20337081ea4c738bdf69c1f6) +- Allow for custom visualizer with custom shader that integrates into existing view + example [3bf7120](https://github.com/rerun-io/rerun/commit/3bf71204daed7b1d218f6fb145c20d87d0215e36) +- Improve feature-gating in Rust SDK (removes datafusion & co from the SDK deps) [#12659](https://github.com/rerun-io/rerun/pull/12659) (thanks [@paulzhng](https://github.com/paulzhng)!) + +#### 🪳 Bug fixes +- Fix first-person camera having zero speed in zero-sized scenes [#12535](https://github.com/rerun-io/rerun/pull/12535) (thanks [@Shivam-Bhardwaj](https://github.com/Shivam-Bhardwaj)!) +- Fix heuristic for `target_frame` in 3D views for scenes with pinholes & named frames [3c678cc](https://github.com/rerun-io/rerun/commit/3c678cccb0e0e64bbaa2f02c6d6b0ed270bd319d) +- Fix `sensor_msgs::PointCloud2` MCAP parser for small pointclouds [6491b95](https://github.com/rerun-io/rerun/commit/6491b955fb3d4d31f14ef0a6ac0d41398c3d3cf4) +- Bug fix: allow copying selected text [4094a91](https://github.com/rerun-io/rerun/commit/4094a918637ad60efb27677701e0ae4d86e1b1a6) +- Fix viewer error list jumping around [a1c976c](https://github.com/rerun-io/rerun/commit/a1c976cb3cdeb460e28a4f66420779cbe065ee5e) +- Fix potential video deadlock [3827b1d](https://github.com/rerun-io/rerun/commit/3827b1dde88d5b6a2dc1e02501b0ca21cc46764f) +- Fix drawing visualizations too often whenever there's multiple visualizer instructions of the same type on an entity [2f52aae](https://github.com/rerun-io/rerun/commit/2f52aaeb8e7b2204af1fbf29a090bc0884f9d445) +- Fix table config button symbol for light-mode [55747b5](https://github.com/rerun-io/rerun/commit/55747b524ae2ad672d2926e5cd877af2513a806e) +- Lenses: Use nullability of input rather than the output [d4398f5](https://github.com/rerun-io/rerun/commit/d4398f5593428b6bbf3803707814b37ed07e7557) +- Ensure we report file loading errors on web [febbffc](https://github.com/rerun-io/rerun/commit/febbffcdd0f672be1aec72f1ebeeeefe43c665e2) +- Recover from failing to load RrdManifest [ad214ca](https://github.com/rerun-io/rerun/commit/ad214ca5d40112fcc3e460acb21283647801b679) +- Fix transparent annotation classes not leading to transparent segmentation image [55578c3](https://github.com/rerun-io/rerun/commit/55578c35e314d284dfb82b0089ff26e26b2191e4) +- Make the "copy" button work for components in the time panel tree [8f788a9](https://github.com/rerun-io/rerun/commit/8f788a9d92cd37bdff6e84dcf344d743ab3bb433) +- Fix deadlock when loading LeRobot datasets [#12652](https://github.com/rerun-io/rerun/pull/12652) +- Fix NV12/YUYV ROS2 images being incorrectly loaded as depth [04beb77](https://github.com/rerun-io/rerun/commit/04beb777f4a49e6f720b09207fb5873ae22dacc0) +- Don't include redo-buffer when saving blueprints [85cc4f9](https://github.com/rerun-io/rerun/commit/85cc4f96e00fb5b9b4a68e6249917832c9c7abc3) +- Address issue where `.dae` with multiple triangle groups is not rendered [83e96bf](https://github.com/rerun-io/rerun/commit/83e96bf585dc7e9f708af6952d506e8013959078) +- Don't reset video player on keyframe boundary for AV1 [3bcd9b8](https://github.com/rerun-io/rerun/commit/3bcd9b87d02b1af80e3bfb7c4ad42d6483f0d274) +- Fix mono8/mono16 image channel classification [#12660](https://github.com/rerun-io/rerun/pull/12660) +- Set AR for wasm development build on macOS [7945601](https://github.com/rerun-io/rerun/commit/7945601bb1b162fc09e79640419a0216c9d14e8e) +- Fix interactions going through popups to the timepanel [1efc8c1](https://github.com/rerun-io/rerun/commit/1efc8c131d4f13c3238972c7bcf7957e2685833e) +- Fix arrow key stepping on sequence timeline [1c6a71c](https://github.com/rerun-io/rerun/commit/1c6a71c77be2619a3c7abb6eb5c22a6fbbdbf2be) +- Fix bad errors for unknown transform frames from overrides & view target frame [36ab981](https://github.com/rerun-io/rerun/commit/36ab981f133a3c97f76df0e9aa2ad939759bb1bb) + +#### 🌁 Viewer improvements +- Extract `Selectors` from (nested) `StructArray` fields [8319663](https://github.com/rerun-io/rerun/commit/8319663a38d538adb20b2785c107d3394a969dce) +- Video player fetching missing chunks and less memory usage with big gops [2596f4e](https://github.com/rerun-io/rerun/commit/2596f4ed342ef5fa5363354c82699d53783f7792) +- Stop offering to visualize static scalar data as time series (would previously emitting a visualization error) [cc8c82c](https://github.com/rerun-io/rerun/commit/cc8c82c53e5bf9c7aad62f279f24de3537e268de) +- Source selector for visualizer components [#12548](https://github.com/rerun-io/rerun/pull/12548) +- Implement `Selector` when resolving component mappings [81879fd](https://github.com/rerun-io/rerun/commit/81879fd3f0cdbe3938865b4fa8ad2ba7b383ff24) +- New (simpler) heuristic for spawning time series views [53fc1fe](https://github.com/rerun-io/rerun/commit/53fc1fe6e938b08d0a4e5dc9a4ac32a920d10d50) +- Show at most 20 time series plots per entity, hide legend for more than 20 plots [b103ed5](https://github.com/rerun-io/rerun/commit/b103ed5dcc16a1384ac63bf75e5596b3b31d0d06) +- Visualizers can now report warnings & multiple errors [67f8ef1](https://github.com/rerun-io/rerun/commit/67f8ef1c1f2b48e7e5d8a56d4ca0fdcf508e717b) +- Populate source mappings with nested struct fields in time series [7365386](https://github.com/rerun-io/rerun/commit/73653863f8a027953b96d6a0c3e517f7c6e0c96a) +- Add `ListArray` support for field extraction into `Selectors` [6f769d6](https://github.com/rerun-io/rerun/commit/6f769d6316f59e0fb30a2283d5aea5fda5323c23) +- Adds visualizer list to time series view selection [127efa6](https://github.com/rerun-io/rerun/commit/127efa6c9ae311b3ec1338b6d2f0d87558867a79) +- Make labels in spatial view translucent [2c376b1](https://github.com/rerun-io/rerun/commit/2c376b1565acd23f16cc7af2ce7951153afd90d7) +- Fix sometimes not showing correct values in visualizer ui [a4839ce](https://github.com/rerun-io/rerun/commit/a4839ce5db37e35b5631d7eaf2b46874acf1c45c) +- Show error when rerun_js viewer panics or fails to load [3f7a96d](https://github.com/rerun-io/rerun/commit/3f7a96d4cfb5ac884818d36ad4c991b83098b911) +- Visualizer list now shows color codes for time series data [2a4ef19](https://github.com/rerun-io/rerun/commit/2a4ef194388e7a22d000372da2def99848f382fd) +- Tweak `spawn_heuristics` and `recommended_visualizers` for time series views [cebc107](https://github.com/rerun-io/rerun/commit/cebc10792fa11f0175b8c1105132b8f0f53d20f7) +- Fix color array display, allow editing color arrays in some cases [1e17b86](https://github.com/rerun-io/rerun/commit/1e17b862b6099a3401f7cffacb5f54668efb35b6) +- Move Visualizer list above View properties in selection panel [be57aca](https://github.com/rerun-io/rerun/commit/be57aca16aa4088aa4d8f8d02abef5ce1f9403f7) +- Visualizers can be deleted right from the visualizer list [0c57f9e](https://github.com/rerun-io/rerun/commit/0c57f9e590b1b2dd689f7e9903b91e3e91830575) +- Show the root transform when visualizing transform trees [84388a9](https://github.com/rerun-io/rerun/commit/84388a9a5f2bb42280799a64bdbc40583d201a14) +- `RecommendedVisualizer` now contains all nested `Float*Arrays` [27a7fbd](https://github.com/rerun-io/rerun/commit/27a7fbd8cf310055894af74122fcc61a362a72bf) +- Different severities for video decoder errors [384c078](https://github.com/rerun-io/rerun/commit/384c07811be2dc653e9d257b936aad7369ab945d) +- Fix showing fallback values for empty required components in visualizer UI [c8bf060](https://github.com/rerun-io/rerun/commit/c8bf0608bb71ec93b00daf21071176fa8cf04683) +- Fix plot legend items disappearing when they have the same name [9c95786](https://github.com/rerun-io/rerun/commit/9c95786970763b35a75c70fd0b85b2237885ed64) +- Visualizers can be added right from a view's selection [2e0f4cf](https://github.com/rerun-io/rerun/commit/2e0f4cf7154cfcaac206e8274bd682741218e691) +- Make columns reorderable by entity in the dataframe view [e1e439e](https://github.com/rerun-io/rerun/commit/e1e439e0ceb4604334d4e33f00e68a90613e99e2) +- Allow loading arbitrary data loader files (mcaps, pngs, ...) via http urls [a02a22b](https://github.com/rerun-io/rerun/commit/a02a22b90a2c91b3c9b979c76b8ec83bd5b67477) +- Drop cached videos once all referencing episodes are loaded [#12653](https://github.com/rerun-io/rerun/pull/12653) +- Add auto-scroll feature and time indicator to the dataframe view [514f1f3](https://github.com/rerun-io/rerun/commit/514f1f32de4e0e87ecd45ce624145f9625b185e5) +- Add `InterpolationMode` component for step function rendering [#12657](https://github.com/rerun-io/rerun/pull/12657) (thanks [@vfilter](https://github.com/vfilter)!) +- Allow loading extensionless http urls via magic bytes detection [daf7a35](https://github.com/rerun-io/rerun/commit/daf7a35ebd5b25a3b53c7fda9d4b6c77dee0e705) +- Fixes performance issue of too many time series plots [a74b382](https://github.com/rerun-io/rerun/commit/a74b382b9ce0b413f14d96d4a2f264e1f4b2abe8) +- Support `(U)Int16` in time series plots [6bb58e4](https://github.com/rerun-io/rerun/commit/6bb58e489ba76c1744599e222180f9a358720933) + +#### 🗄️ OSS server +- Test handling of schema conflict and make OSS server compliant [c618910](https://github.com/rerun-io/rerun/commit/c6189106664d039a28312f1ac3007de99c979dc5) +- Fix table entry name leaking upon creation failure [af77d4e](https://github.com/rerun-io/rerun/commit/af77d4e0e2e40232b4fc5d3d8fe1dac44e429da7) + +#### 🚀 Performance improvements +- Improve memory budgeting [ce48297](https://github.com/rerun-io/rerun/commit/ce48297e29e520ca4a3b83293657921bf6d29a9f) +- Only initialize the transform cache for the active timeline [a2f945b](https://github.com/rerun-io/rerun/commit/a2f945b4ce3d58d632573b8d026cbb45f3b5cee8) +- Remove larger-than-ram feature flag [a4a8d56](https://github.com/rerun-io/rerun/commit/a4a8d560eb69b65a1db0120f28557b9bb026a660) +- Fix: don't reload meshes after a GC [0259c43](https://github.com/rerun-io/rerun/commit/0259c43f199342e7a1863b385b76c03e85760fc0) +- Do faster lineage check in release builds [e9c0def](https://github.com/rerun-io/rerun/commit/e9c0defcf49c6843b35f39d5206da87b34707f7b) +- Optimization: skip calculating size of time histogram [33a492d](https://github.com/rerun-io/rerun/commit/33a492dc2f6172e05120938804ec7f0b03aad2e0) +- Change VideoStreamCache eviction policy: keep cache around until GC [d517c3c](https://github.com/rerun-io/rerun/commit/d517c3c0ea940bf343adc459ab20b27507206158) +- Change default plot bounds to follow time cursor [d2cf5d2](https://github.com/rerun-io/rerun/commit/d2cf5d2f68049d6bef96c5b355020c2539ce45b1) +- Make handling of out of order video chunks much faster [f050460](https://github.com/rerun-io/rerun/commit/f050460c8b37c83beb0a0c33cf504d79e2aeb206) + +#### 🧑‍🏫 Examples +- Rerun to LeRobot export example [#12541](https://github.com/rerun-io/rerun/pull/12541) +- Add ROS TF example [#12603](https://github.com/rerun-io/rerun/pull/12603) +- Add webpage example [e2fd7f6](https://github.com/rerun-io/rerun/commit/e2fd7f65fa0b264f68a61935aba33ef54ff20ab4) + +#### 📚 Docs +- Add a disambiguation from RViz to the README [90faabb](https://github.com/rerun-io/rerun/commit/90faabb4f83659302f186bcddb0813178cb8d366) +- Add snippet demonstrating conversion of custom mcap protobuf file to rrd [ebd731c](https://github.com/rerun-io/rerun/commit/ebd731c992e2f68eb3f0085742cbe7ff2a047a1a) +- Adding snippet to convert mcap with send_column [f2b3770](https://github.com/rerun-io/rerun/commit/f2b3770e827d3ad01799cf425a05c6c446c48efe) +- Adding urdf import support to protobuf convert snippets [8be967d](https://github.com/rerun-io/rerun/commit/8be967d22d17766c13b00f5dc34c714f127b00e2) +- Add documentation for converting custom data to rrd using log/send_column [f8cf13c](https://github.com/rerun-io/rerun/commit/f8cf13c6686b0dd06e518ec0b8ebe24017bc75ab) +- Update MCAP message support documentation [a77922a](https://github.com/rerun-io/rerun/commit/a77922a46338cc1037d5c97ef9680e9879c86f2f) +- Add layer identifier "foxglove" to `rerun mcap convert` [1436027](https://github.com/rerun-io/rerun/commit/14360275483603361d0c05ce522046344b226fed) + +#### 🖼 UI improvements +- Show that other timelines have data on timeline loader [47bf28f](https://github.com/rerun-io/rerun/commit/47bf28f7377bf09230ddf38151db43c58cfdc3fa) +- Improve error messages regarding arrow datatypes [b3c395e](https://github.com/rerun-io/rerun/commit/b3c395eb019764073fc128d1ff39e56fdecb4b1b) +- Fix moving text cursor with cmd-arrows [cd90f34](https://github.com/rerun-io/rerun/commit/cd90f346f2b591d8c3e79e06476c72e9a93d1596) +- Don't auto-pause when moving time cursor [647cd11](https://github.com/rerun-io/rerun/commit/647cd11131b6e5cc0feb8949dc45251190905ee6) +- Value previews in source dropdown [6d41da9](https://github.com/rerun-io/rerun/commit/6d41da96aa7ac95f7825067bdeba535baa30c2f0) +- Only allow ui edits of visualizer components where they actually have an impact [b3fa1fc](https://github.com/rerun-io/rerun/commit/b3fa1fc5fcdd3467543263b68bb8739422f8d162) + +#### 🕸️ Web +- Expose theme setting on web-viewer notebook [beaee9c](https://github.com/rerun-io/rerun/commit/beaee9c6acb9618555263943d2297943be618181) +- react-web-viewer: improve parameter handling logic [07a76ca](https://github.com/rerun-io/rerun/commit/07a76ca7b66e63d1c235b31226931994b5e27f44) + +#### 🧢 MCAP +- Support some Foxglove messages in MCAP data loader via lenses [7e05213](https://github.com/rerun-io/rerun/commit/7e052135ecdf6eb93e99df73dcf8b2c7088b849a) +- Support Foxglove `Log` protobuf message in MCAP loader [f7cdf09](https://github.com/rerun-io/rerun/commit/f7cdf09ed685b50cfbdc92cd4a2d6fcf572528d9) +- Support `foxglove.FrameTransform` in MCAP data loader [a018942](https://github.com/rerun-io/rerun/commit/a0189422daed372c6209f45caca1a35a9b752962) +- Support `foxglove.RawImage` in MCAP data loader [ff7db99](https://github.com/rerun-io/rerun/commit/ff7db996617cf6bcc5d53c7a82f7e45558b7e87c) +- Support `foxglove.PointCloud` in MCAP data loader [9e8e34b](https://github.com/rerun-io/rerun/commit/9e8e34bdc9bcbf8a05001c987b264f1b9dc90ecc) +- Add ROS2 MCAP support for Float64Array, Float64MultiArray, and Joy messages [512d0e6](https://github.com/rerun-io/rerun/commit/512d0e638261b4b2a504bd46f8690933445f0e36) + +#### 🤷‍ Other +- Refactor `add to new view` section [8871a13](https://github.com/rerun-io/rerun/commit/8871a1307614ab97763e22f782d7d9805fa5676a) +- Add `rerun auth logout` [7b3ae54](https://github.com/rerun-io/rerun/commit/7b3ae543dc0de39cf382aefc435f420de99ef223) +- `rerun rrd split` [9bde24f](https://github.com/rerun-io/rerun/commit/9bde24fb5860f507bec155da377f40c1b8b0359e) +- Add `--follow` option to explicitly follow files and URLs [c34a84b](https://github.com/rerun-io/rerun/commit/c34a84b5382620033182bb41719d1e1de74f10c6) + + +## [0.29.2](https://github.com/rerun-io/rerun/compare/0.29.1...0.29.2) - 2026-02-13 - Bug fixes and documentation update + +### ✨ Overview & highlights + +This patch release contains bug fixes and adds a documentation guide with an example for [converting existing data to Rerun](https://rerun.io/docs/howto/logging-and-ingestion/convert-existing-data). + +### 🔎 Details + +#### 🪵 Log API +- Fix performance regression with `--server-memory-limit 0` [cefbdf6](https://github.com/rerun-io/rerun/commit/cefbdf65bdde603b19c2c4d1855ea78916afd979) + +#### 🐍 Python API +- notebook: Re-export viewer event types [51d949e](https://github.com/rerun-io/rerun/commit/51d949e9bad07fcb2c47c02e8c57da35262f9c44) + +#### 🪳 Bug fixes +- Fix table config button symbol for light-mode [57b0121](https://github.com/rerun-io/rerun/commit/57b0121cf23993e48ab780f12fbcbddb433fb78a) +- Fix drag-and-drop of `.mcap` files on web [#12631](https://github.com/rerun-io/rerun/pull/12631) +- Ensure we report file loading errors on web [7fd794e](https://github.com/rerun-io/rerun/commit/7fd794ed39f480764da6c4a6c01b47426265cbf0) + +#### 🌁 Viewer improvements +- Show error when rerun_js viewer panics or fails to load [04e7ae8](https://github.com/rerun-io/rerun/commit/04e7ae8fe761b2e982c55575f62dc4925e6afead) + +#### 📚 Docs +- Add snippet demonstrating conversion of custom MCAP protobuf file to RRD [53fbeeb](https://github.com/rerun-io/rerun/commit/53fbeeb7ee0485242b504fb666bd7b6f8cc8e90a) +- Add documentation for converting custom data to RRD using log/send_column [815d45c](https://github.com/rerun-io/rerun/commit/815d45c25e23851629f2ab77d9c8446e5aa87da0) + +#### 🖼 UI improvements +- Fix moving text cursor with cmd-arrows [13f7124](https://github.com/rerun-io/rerun/commit/13f71249f36ba9a5b5d99cfbc54630bf1041f898) +- Improve error messages regarding arrow datatypes [48f4637](https://github.com/rerun-io/rerun/commit/48f4637e7f95ef11d9dd55309dd3cda3afe26733) + + +## [0.29.1](https://github.com/rerun-io/rerun/compare/0.29.0...0.29.1) - 2026-02-06 - Improved labels, bug fixes & performance improvements + +### ✨ Overview & highlights + +This is mainly a patch release with some fixes and improvements. + +We also included a change that makes labels translucent. This makes them less obtrusive and improves visibility of overlapping labels, as shown in the image segmentation example below. + + Example of translucent labels in Rerun 0.29.1 + + +### 🔎 Details + +#### 🐍 Python API +- Ensure that `import rerun_sdk.rerun` can be used [fd28cd3](https://github.com/rerun-io/rerun/commit/fd28cd3946567929b6e968d9df07bec5a67eabb0) +- Allow access to redap token from Python SDK [51506ca](https://github.com/rerun-io/rerun/commit/51506caeb34a6edadbca4c8938c0039fb0e35a51) + +#### 🪳 Bug fixes +- Fix viewer error list jumping around [05ae689](https://github.com/rerun-io/rerun/commit/05ae6895c38fc8fd74583e86fb6747b7d3017497) +- Fix potential video deadlock [eefacdf](https://github.com/rerun-io/rerun/commit/eefacdf68e51abb5c4755d1754cee272ae7e5ad8) + +#### 🌁 Viewer improvements +- Make labels in spatial view translucent [ec62ad9](https://github.com/rerun-io/rerun/commit/ec62ad908332e110f4ade168ae9d78286c6cbf5b) + +#### 🚀 Performance improvements +- Do faster lineage check in release builds [0d546c0](https://github.com/rerun-io/rerun/commit/0d546c05912bb33aae8a06f252bab5749265521c) + + +## [0.29.0](https://github.com/rerun-io/rerun/compare/0.28.2...0.29.0) - 2026-01-28 - URDF improvements, improved ROS 2 docs, and memory panel + +🧳 Migration guide: https://rerun.io/docs/reference/migration/migration-0-29 + +### ✨ Overview & highlights + + +#### URDF loader improvements + +In the previous 0.28 release, we overhauled Rerun's [built-in URDF loader](https://rerun.io/docs/howto/logging-and-ingestion/urdf) to work with TF-style transforms with `parent` and `child` frames. +Now, taking advantage of these entity-path-independent transforms, we simplified the hierarchy in which URDF assets are stored. +Collision and visual meshes are now below separate entity path roots, making it easy to toggle one or the other. +Additionally, the paths are now more compact to make it easier to scroll through them. + + +https://github.com/user-attachments/assets/7a3f6112-e87f-4249-977b-ed9944e2c356 + + + +#### `UrdfTree` utility in Python + +We added a [`UrdfTree` Python utility](https://rerun.io/docs/howto/logging-and-ingestion/urdf#urdf-utilities-python) that can be used to simplify operations with URDF models, e.g.: +* accessing links and joints +* computing transforms from joint states +* retrieving geometry entity paths for links + +We also updated our [`animated_urdf.py` demo](https://github.com/rerun-io/rerun/tree/main/examples/python/animated_urdf) to use this utility, showing for example how you can dynamically change the color of a gripper link based on its angle. + + +https://github.com/user-attachments/assets/e0b6882f-b5dd-47d9-9afc-3ea30bc38e28 + + +#### Experimental screenshots from Python + +There's now an experimental screenshot API which allows to take screenshots of the Viewer or individual views: +```py +# Connect to a local viewer. +viewer = ViewerClient() +# Screenshot the entire viewer. +viewer.save_screenshot("entire_viewer.jpg") +# Screenshot only the view we created earlier. +viewer.save_screenshot("my_view.png", view_id=view.id) +``` +For a full snippet check [here](https://github.com/rerun-io/rerun/blob/0.29.0/docs/snippets/all/howto/screenshot.py). + +⚠️ There's still a lot of [rough edges](https://github.com/rerun-io/rerun/issues/12482) and this API may change in the future. + + +#### Improved target frame selection UI + +The target frame selection UI now shows matching suggestions, making it easier to select a frame name from the transforms in your data. + + +https://github.com/user-attachments/assets/4ba25a41-de6a-4209-bd06-c31a33d8d993 + + + +#### Updated ROS 2 example & documentation + +We refreshed the documentation showing examples of how some ROS concepts and messages can be mapped to Rerun, together with an updated Python node example. The documentation page can be found [here](https://rerun.io/docs/howto/integrations/ros2-nav-turtlebot). + + + Rerun viewer showing data streamed from the example ROS node + + + + + + +#### Improved memory panel + +You can now get some insight on which parts of your recording use how much memory in the viewer using the improved memory panel: + +image + + +### ⚠️ Breaking changes +- **Python**: New API for visualizer overrides - `VisualizerOverrides` removed, now pass visualizer objects directly (e.g., `rr.SeriesLines()`) +- **Python**: `Entry.update()` deprecated in favor of `Entry.set_name()` +- **Python**: `CatalogClient` and `Server` constructor parameters renamed (`addr` → `url`/`host`) +- **Python**: Removed deprecated `rerun.dataframe` module (use `rerun.server.Server` and `rerun.catalog` instead) +- **Python**: Removed deprecated `rerun.catalog` APIs from 0.28 +- **Python**: Internal submodules moved to underscore-prefixed names (e.g., `rr.color_conversion` → `rr._color_conversion`) +- **CLI**: `rerun server --addr` renamed to `rerun server --host` +- **Blueprint**: Component overrides from `.rbl` files created in previous versions cannot be loaded in 0.29 +- **Catalog server**: Datasets need re-registration to populate `name` and `start_time` in segment table + +🧳 Check the migration guide for details: https://rerun.io/docs/reference/migration/migration-0-29 + + +### 🔎 Details + +#### 🪵 Log API +- Fix dropping of entities when using `rerun rrd filter` [#12584](https://github.com/rerun-io/rerun/pull/12584) +- Apply backpressure in gRPC proxy server [cac538e](https://github.com/rerun-io/rerun/commit/cac538e05e122ad7363aa99248d14a9c4a411581) +- Enforce `Selector` usage in `re_sdk::lenses` [521c796](https://github.com/rerun-io/rerun/commit/521c7967355c4a0cf06d9fcf4e2b52001e79bc87) + +#### 🐍 Python API +- Allow tables to be created without providing a URL [#12132](https://github.com/rerun-io/rerun/pull/12132) +- Remove deprecated dataframe API (`rerun.dataframe`) [#12320](https://github.com/rerun-io/rerun/pull/12320) +- Remove deprecated APIs in `rerun.catalog` [#12321](https://github.com/rerun-io/rerun/pull/12321) +- Deprecate `Entry.update` in favor of `Entry.set_name` [#12370](https://github.com/rerun-io/rerun/pull/12370) +- Fix missing `child_frame`/`parent_frame` arguments from pinhole constructor [#12360](https://github.com/rerun-io/rerun/pull/12360) +- Use visualizer objects in blueprint override API [#12345](https://github.com/rerun-io/rerun/pull/12345) +- Rename `address` to `url` or `host` depending on context [#12402](https://github.com/rerun-io/rerun/pull/12402) +- Check for unset attr from extension class init [#12376](https://github.com/rerun-io/rerun/pull/12376) +- Add time axis in snippet in time series view snippet [#12506](https://github.com/rerun-io/rerun/pull/12506) +- Fix `RecordingStream` so it has a unique recording id when none is provided [eb14e16](https://github.com/rerun-io/rerun/commit/eb14e163c0d58df77244b69281b160cd6f47416f) +- Do not assume top-level bindings in `RecordingStream.__del__` [201e7c3](https://github.com/rerun-io/rerun/commit/201e7c31680fcd69e8ab4d7625340a32e7133c94) +- Fix rare deadlock in Python send/log API [7f72b23](https://github.com/rerun-io/rerun/commit/7f72b23203ce842dbfb3dd334c7cde6bfd70378e) +- Catch keyboard interrupt in `rerun-sdk` CLI and return exit codes [#12496](https://github.com/rerun-io/rerun/pull/12496) +- Make `rr.experimental.ViewerClient.send_table` more flexible [ba733ad](https://github.com/rerun-io/rerun/commit/ba733ad9b1ec1677028fbd21a00634276a991871) + +#### 🦀 Rust API +- Allow tables to be created without providing a URL [#12132](https://github.com/rerun-io/rerun/pull/12132) +- Rust SDK: `blueprint` support [#12307](https://github.com/rerun-io/rerun/pull/12307) (thanks [@sectore](https://github.com/sectore)!) +- Update MSRV to 1.90 [#12337](https://github.com/rerun-io/rerun/pull/12337) +- Make `RecordingStreamBuilder::with_blueprint()` apply to everything, not just `spawn()` [#12347](https://github.com/rerun-io/rerun/pull/12347) (thanks [@kpreid](https://github.com/kpreid)!) +- Rust SDK: Change default server memory limit [5cb7213](https://github.com/rerun-io/rerun/commit/5cb7213e90823092ec67ae805419a9dd19660c09) +- Update ply-rs-bw to 3.0.0 (corrected) [#12593](https://github.com/rerun-io/rerun/pull/12593) (thanks [@bourumir-wyngs](https://github.com/bourumir-wyngs)!) + +#### 🪳 Bug fixes +- Fix bad error reporting when registering a (faulty) RRD URI built from a relative path [#12309](https://github.com/rerun-io/rerun/pull/12309) +- Only do `furthest_from` GC when we can download chunks again [#12363](https://github.com/rerun-io/rerun/pull/12363) +- URDF loader: use `InstancePoses3D` for geometry scale [#12371](https://github.com/rerun-io/rerun/pull/12371) +- Fix incorrect handling for cameras and depth images for 3D views that use target frames other than the scene root [#12361](https://github.com/rerun-io/rerun/pull/12361) +- Fix OSS server locking up when asked for many chunks at once [#12384](https://github.com/rerun-io/rerun/pull/12384) +- Fix GC sometimes not collecting anything [#12398](https://github.com/rerun-io/rerun/pull/12398) +- URDF: Bundle pose + mesh scale in single `InstancePoses3D` [#12385](https://github.com/rerun-io/rerun/pull/12385) (thanks [@yujeong1jeong](https://github.com/yujeong1jeong)!) +- Don't show error for implicit transform axes if we're already showing named transforms [#12419](https://github.com/rerun-io/rerun/pull/12419) +- Fix opening link with only time selection in fragment [#12428](https://github.com/rerun-io/rerun/pull/12428) +- Fix decoding errors for MCAP files with gaps in protobufs [#12436](https://github.com/rerun-io/rerun/pull/12436) +- Fix time point sharing for duration timelines [#12466](https://github.com/rerun-io/rerun/pull/12466) +- Fix transforms & videos breaking when receiving new data in the background [#12452](https://github.com/rerun-io/rerun/pull/12452) +- Fix ignoring nested `oneof` fields in `protobuf` MCAP messages [#12462](https://github.com/rerun-io/rerun/pull/12462) +- Fix early disconnect with `--newest-first` [#12484](https://github.com/rerun-io/rerun/pull/12484) +- Fix: tap stream view to move time cursor [#12476](https://github.com/rerun-io/rerun/pull/12476) +- Fix `RecordingInfo` properties not included in the segment table [3781b18](https://github.com/rerun-io/rerun/commit/3781b1867ea70193d9b2a0479874b70c68c4debb) +- Fix DAE import crash caused by duplicate XML id attributes [#12555](https://github.com/rerun-io/rerun/pull/12555) (thanks [@yujeong1jeong](https://github.com/yujeong1jeong)!) +- Warn when logging transform at `/` without set `parent_frame` [#12588](https://github.com/rerun-io/rerun/pull/12588) +- Fix `sensor_msgs::PointCloud2` MCAP parser for small pointclouds [f705229](https://github.com/rerun-io/rerun/commit/f7052295f59bac02ee4d987284facdda406256ed) + +#### 🌁 Viewer improvements +- Automatically cast to `Float64Array` in time series views [#12342](https://github.com/rerun-io/rerun/pull/12342) +- Show loaded indicator when time panel is collapsed [#12396](https://github.com/rerun-io/rerun/pull/12396) +- Video stream changes to support out of order samples [#12277](https://github.com/rerun-io/rerun/pull/12277) +- Measure and display network latency to redap servers [#12426](https://github.com/rerun-io/rerun/pull/12426) +- Enable vulkan backend for Mac Viewer builds, select graphics adapter more explicitly internally [#12449](https://github.com/rerun-io/rerun/pull/12449) +- More robust world grid rendering [#12444](https://github.com/rerun-io/rerun/pull/12444) +- Display downloaded & max size of recording in selection panel [#12429](https://github.com/rerun-io/rerun/pull/12429) +- Allow multiple visualizers of same type per `Entity` [#12275](https://github.com/rerun-io/rerun/pull/12275) +- Warn if an entity has multiple `CoordinateFrame` instances [#12514](https://github.com/rerun-io/rerun/pull/12514) +- Fix case of unstable camera image plane distance [#12559](https://github.com/rerun-io/rerun/pull/12559) +- Simplify memory panel with more tabs [9dada34](https://github.com/rerun-io/rerun/commit/9dada34153435b37fbbf2e4269f70ce8eee37c70) + +#### 🚀 Performance improvements +- Implement backpressure in `re_log_channel` [3a25a25](https://github.com/rerun-io/rerun/commit/3a25a25db3765fac3dba445d3002c95906ebf7e2) + +#### 🧑‍🏫 Examples +- Modernize `ros_node` example and documentation [#11968](https://github.com/rerun-io/rerun/pull/11968) +- Add MCAP example [#12353](https://github.com/rerun-io/rerun/pull/12353) +- Add eye control example [#12459](https://github.com/rerun-io/rerun/pull/12459) +- Use optical flow tracking in detect and track objects example [#12564](https://github.com/rerun-io/rerun/pull/12564) +- Show dynamic mesh update in `animated_urdf.py` example [#12571](https://github.com/rerun-io/rerun/pull/12571) + +#### 📚 Docs +- Reshuffle documentation organization [#12355](https://github.com/rerun-io/rerun/pull/12355) +- Update documentation about MCAP ROS 2 message support [#12406](https://github.com/rerun-io/rerun/pull/12406) +- feat: Add the SAM 3D Body example [#12499](https://github.com/rerun-io/rerun/pull/12499) (thanks [@pablovela5620](https://github.com/pablovela5620)!) +- Add how to guide on querying videos [5a36526](https://github.com/rerun-io/rerun/commit/5a36526c61f70ffdbbcf776378b81b7af0e3b703) +- Mention memory limit settings UI in docs [50ebee6](https://github.com/rerun-io/rerun/commit/50ebee6475a186064db7a30ed90ea96ab10549ed) +- docs(sdk): add thread safety warning for log() with mutexes [#12579](https://github.com/rerun-io/rerun/pull/12579) (thanks [@ecto](https://github.com/ecto)!) + +#### 🖼 UI improvements +- Add user menu [#12336](https://github.com/rerun-io/rerun/pull/12336) +- Larger than ram time panel UI [#12338](https://github.com/rerun-io/rerun/pull/12338) +- Improved auth section in server modal [#12369](https://github.com/rerun-io/rerun/pull/12369) +- Show info message after screenshot from command palette [#12465](https://github.com/rerun-io/rerun/pull/12465) +- Display chunk download bandwidth [#12451](https://github.com/rerun-io/rerun/pull/12451) +- Fix icon colors in light theme [edac1a1](https://github.com/rerun-io/rerun/commit/edac1a15d6aec2e344017bcf9b8148af8e6389bd) + + +## [0.28.2](https://github.com/rerun-io/rerun/compare/0.28.1...0.28.2) - 2025-12-18 - Fix RRD compaction, plot panning, and Collada mesh loader + +### ✨ Overview & highlights + +**Fixes to `.rrd` Chunk handling.** + +We revised our Chunk slicing logic to prevent `.rrd` files ballooning in sizes. This also fixes the problem of broken `.rrd` files that contain tensors. + +**Collada (`.dae`) mesh support.** + +This patch adds native support for Collada (`.dae`) meshes, a common format used with URDF files. You can now load URDFs that reference `.dae` assets without manual mesh conversion! + + + screenshot of a loaded mesh + + + + + + +### 🔎 Details + +#### 🐍 Python API +- Improve the docstrings related to serve_gpc APIs [#12314](https://github.com/rerun-io/rerun/pull/12314) +- Add Python support for `UrdfTree` [#12310](https://github.com/rerun-io/rerun/pull/12310) + +#### 🪳 Bug fixes +- Don't force absolute time views after panning [#12297](https://github.com/rerun-io/rerun/pull/12297) +- Introduce deep Chunk slicing [#12312](https://github.com/rerun-io/rerun/pull/12312) + +#### 🌁 Viewer improvements +- Collada (`.dae`) mesh loader [#10288](https://github.com/rerun-io/rerun/pull/10288) +- Add option to hide all notification popups/toasts [#12354](https://github.com/rerun-io/rerun/pull/12354) + +#### 📚 Docs +- docs: Fix parameter name from 'color' to 'colors' [#12294](https://github.com/rerun-io/rerun/pull/12294) (thanks [@Ivan-Zhong](https://github.com/Ivan-Zhong)!) + +## [0.28.1](https://github.com/rerun-io/rerun/compare/0.28.0...0.28.1) - 2025-12-18 - Fix some telemetry, depth images, and logging + +#### 🪵 Log API +- Ensure that `flush` waits for all data loaders to finish [#12281](https://github.com/rerun-io/rerun/pull/12281) + +#### 🪳 Bug fixes +- Fix video errors having black rectangle around them [#12284](https://github.com/rerun-io/rerun/pull/12284) +- Fix RVL depth decoding for non-quantized images [#12289](https://github.com/rerun-io/rerun/pull/12289) + +#### 🌁 Viewer improvements +- Fix image planes not working correctly in some named-transform frame scenarios [#12276](https://github.com/rerun-io/rerun/pull/12276) +- Fix auto-size for 2d views with RVL encoded depth image not working [#12288](https://github.com/rerun-io/rerun/pull/12288) +- Restore depth image visualizers to 2D view kind (fix heuristic) [#12290](https://github.com/rerun-io/rerun/pull/12290) +- Add dataloader for encoded depth image (to allow `log_from_file` & dragdrop) [#12287](https://github.com/rerun-io/rerun/pull/12287) + +#### 🤷‍ Other +- Improved error message when `rrd compare --unordered` fails [#12282](https://github.com/rerun-io/rerun/pull/12282) + +## [0.28.0](https://github.com/rerun-io/rerun/compare/0.27.2...0.28.0) - 2025-12-18 - Transforms, URDF, LeRobotV3, and Catalog API improvements + +🧳 [Migration guide](https://rerun.io/docs/reference/migration/migration-0-28) + +### ✨ Overview & highlights + +**Transform system overhaul.** This release brings significant improvements to how transforms are handled, especially from ROS or MCAP-based systems. You can now decouple spatial relationships from entity paths by using `CoordinateFrame` to associate entities with named frames, and `Transform3D` with `child_frame`/`parent_frame` parameters to define relationships between frames — similar to ROS tf2. Pinhole cameras also support this system. Additionally, axis visualization has moved to its own `TransformAxes3D` archetype. + +Much more can be found at our revamped docs page [here](https://rerun.io/docs/concepts/transforms). + +**Improved URDF and MCAP Transform support.** Parent and child frame components are now available in the `Transform3D` archetype, meaning you can send transforms to a single entity instead of using the entity path to inform the structure (note, for URDFs this is required). Additionally, ROS2’s `tf2_msgs/TFMessage` and `PoseStamped` messages are automatically parsed as `Transform3D` and `InstancePoses3D` , respectively, from MCAP files. + +**AV1 video codec support.** `VideoStream` now supports the AV1 codec alongside existing formats. + +**Catalog API refinements (Python).** The Python catalog API has been substantially reworked: "partition" terminology is now "segment," table operations have moved to `TableEntry` objects, and the query interface has been simplified with methods like `filter_segments()`, `filter_contents()`, and `reader()`. + +**Viewer usability improvements.** New keyboard shortcuts let you switch between recordings (`cmd` + `option` + `↑/↓`) and navigate the timeline (`←/→` to move by 0.1s. Add `shift` for 1s. `home/end` to jump to beginning or end). + +Forward/back navigation is now available on native viewers as well. + +**New dataloaders.** Added LeRobot v3 dataloader support. + +## ⚠️ Breaking changes + +🧳 Migration guide: [https://rerun.io/docs/reference/migration/migration-0-28](https://rerun.io/docs/reference/migration/migration-0-28) + +**Transactional transform behavior (important!):** +Changes to `Transform3D`, `InstancePose3D`, or `Pinhole` transform properties are now treated transactionally. Updating any component resets all other transform components — the viewer no longer looks back in time for previously logged values. If you relied on partial updates (e.g., logging only rotation while keeping a previous translation), you must now re-log all components together. If you always logged the same components on every call or used the standard constructors, no changes are needed. [#11911](https://github.com/rerun-io/rerun/pull/11911) + +```python +rr.log("simple", rr.Transform3D(translation=[1.0, 2.0, 3.0])) +# In 0.27: This clears the translation — it will NOT inherit the previous value +rr.log("simple", rr.Transform3D.from_fields(scale=2)) +``` + +**Transform3D archetype changes:** + +- `Transform3D::axis_length` has moved to the new `TransformAxes3D` archetype [#11925](https://github.com/rerun-io/rerun/pull/11925) +- `CoordinateFrame::frame_id` renamed to `CoordinateFrame::frame` [#11991](https://github.com/rerun-io/rerun/pull/11991) +- Redundant `Pose*` component types removed in favor of general counterparts (e.g., `PoseTranslation3D` → `Translation3D`) [#11905](https://github.com/rerun-io/rerun/pull/11905) + +**URDF loader changes:** +Transform updates for URDF models now require `parent_frame` and `child_frame` fields to be set (matching URDF joint specifications), and must include both rotation and translation. This aligns with ROS tf2 conventions and allows sending all transform updates on a single entity. [#12005](https://github.com/rerun-io/rerun/pull/12005) + +**Deprecated API removal:** +Items marked deprecated before 0.27 have been removed, including old `Timeline`, `TimeColumn`, `Asset3D`, `AssetVideo`, `Image`, and `Pinhole` methods. [#12204](https://github.com/rerun-io/rerun/pull/12204) + +**MCAP timeline naming:** +MCAP timelines renamed from `log_time`/`publish_time` to `message_log_time`/`message_publish_time` to avoid conflicts with SDK timestamps. [#12145](https://github.com/rerun-io/rerun/pull/12145) + +**Python Catalog API (breaking changes):** + +- The `rerun_partition_id` column is now `rerun_segment_id` +- `entries()`, `datasets()`, `tables()` now return lists of entry objects instead of DataFrames +- `get_table()` returns a `TableEntry` object instead of a DataFrame — use `.reader()` to get the DataFrame +- `DataframeQueryView` removed; use `filter_segments()`, `filter_contents()`, and `reader()` instead [#12151](https://github.com/rerun-io/rerun/pull/12151) +- `register()` and `register_batch()` merged into single `register()` returning `RegistrationHandle` [#12187](https://github.com/rerun-io/rerun/pull/12187) +- `search_fts()` and `search_vector()` now return DataFrames directly (no `.df()` needed) [#12198](https://github.com/rerun-io/rerun/pull/12198) + +**Python Catalog API (deprecated, still work):** + +- "Partition" renamed to "segment" throughout (e.g., `partition_table()` → `segment_table()`) [#12059](https://github.com/rerun-io/rerun/pull/12059) +- Method renames: `get_dataset_entry` → `get_dataset`, `get_table_entry` → `get_table`, etc. [#12112](https://github.com/rerun-io/rerun/pull/12112) +- Table writes moved from `CatalogClient` to `TableEntry` (`append()`, `overwrite()`, `upsert()`) [#12114](https://github.com/rerun-io/rerun/pull/12114) +- `Schema` types moved from `rerun.dataframe` to `rerun.catalog` [#12135](https://github.com/rerun-io/rerun/pull/12135) +- Search index methods renamed: `create_fts_index()` → `create_fts_search_index()`, etc. [#12198](https://github.com/rerun-io/rerun/pull/12198) + +### 🔎 Details + +#### 🪵 Log API +- Transform3D no longer sets all its components to empty array by default [#11911](https://github.com/rerun-io/rerun/pull/11911) +- Move `Transform3D::axis_length` into its own `TransformAxes3D` archetype [#11925](https://github.com/rerun-io/rerun/pull/11925) +- Add `show_frame` option on `TransformAxes3D` [#11977](https://github.com/rerun-io/rerun/pull/11977) +- Rename `CoordinateFrame::frame_id` to `CoordinateFrame::frame` [#11991](https://github.com/rerun-io/rerun/pull/11991) +- RRD footers 1: framing [#12044](https://github.com/rerun-io/rerun/pull/12044) +- RRD footers 2: RRD manifests [#12047](https://github.com/rerun-io/rerun/pull/12047) +- RRD footers 3: encoding/decoding manifests [#12048](https://github.com/rerun-io/rerun/pull/12048) +- Add option to specify `target_frame` to `SpatialInformation` [#12040](https://github.com/rerun-io/rerun/pull/12040) +- Remove redundant `Pose*` components [#11905](https://github.com/rerun-io/rerun/pull/11905) +- Add `OutputMode` option to Lenses [#12107](https://github.com/rerun-io/rerun/pull/12107) +- Load URDF with frame IDs and named transforms [#12005](https://github.com/rerun-io/rerun/pull/12005) +- RRD manifests: implement `chunk_byte_size_uncompressed` support [#12194](https://github.com/rerun-io/rerun/pull/12194) +- Disable merging compaction for video samples [#12270](https://github.com/rerun-io/rerun/pull/12270) + +#### 🌊 C++ API +- Make component type registration thread-safe in C++ SDK [#11907](https://github.com/rerun-io/rerun/pull/11907) +- Don't install signal handlers into rerun_c outside of DEBUG mode [#11956](https://github.com/rerun-io/rerun/pull/11956) + +#### 🐍 Python API +- Fix dataframe queries failing on empty datasets [#11846](https://github.com/rerun-io/rerun/pull/11846) +- Add lint to check if rust classes have __str__, fix or exclude all existing [#11928](https://github.com/rerun-io/rerun/pull/11928) +- Partition-to-segment rename (wave 1): redap layer [#12017](https://github.com/rerun-io/rerun/pull/12017) +- Partition-to-segment rename (wave 3): Python SDK [#12059](https://github.com/rerun-io/rerun/pull/12059) +- Rework notebook auth to use device code flow [#12128](https://github.com/rerun-io/rerun/pull/12128) +- Catalog API update 1: listing entries [#12103](https://github.com/rerun-io/rerun/pull/12103) +- Catalog API update 2: getting and creating entries [#12112](https://github.com/rerun-io/rerun/pull/12112) +- Catalog API update 3: editing tables [#12114](https://github.com/rerun-io/rerun/pull/12114) +- Catalog API update 4: schema [#12135](https://github.com/rerun-io/rerun/pull/12135) +- Catalog API update 5: dataset query [#12151](https://github.com/rerun-io/rerun/pull/12151) +- Catalog API update 6: register APIs [#12187](https://github.com/rerun-io/rerun/pull/12187) +- Catalog API update 7: `segment_table` and blueprint APIs [#12191](https://github.com/rerun-io/rerun/pull/12191) +- Catalog API update 8: search indexes [#12198](https://github.com/rerun-io/rerun/pull/12198) +- Remove items marked as deprecated before 0.27 [#12204](https://github.com/rerun-io/rerun/pull/12204) +- [python] Automatically disconnected recordings when they go fully out of scope [#12220](https://github.com/rerun-io/rerun/pull/12220) + +#### 🦀 Rust API +- Make `RecordingStream::disabled()` a `const fn` [#11829](https://github.com/rerun-io/rerun/pull/11829) (thanks [@kpreid](https://github.com/kpreid)!) +- Fix double memcpy in Rust blob serialization of image and other blob-based types [#11842](https://github.com/rerun-io/rerun/pull/11842) (thanks [@joelreymont](https://github.com/joelreymont)!) +- Remove items marked as deprecated before 0.27 [#12204](https://github.com/rerun-io/rerun/pull/12204) + +#### 🪳 Bug fixes +- Fix rare case for incorrect queries for some cases of out of order logging [#11892](https://github.com/rerun-io/rerun/pull/11892) +- Fix exiting tracking with inputs [#11915](https://github.com/rerun-io/rerun/pull/11915) +- Fix the visible time range for the time series view [#11938](https://github.com/rerun-io/rerun/pull/11938) +- Fix sharing links to time ranges on duration timelines [#11948](https://github.com/rerun-io/rerun/pull/11948) +- Fix opening non-recording URLs on startup [#11981](https://github.com/rerun-io/rerun/pull/11981) +- Fix `ChunkId` clash due to chunk splitting [#12008](https://github.com/rerun-io/rerun/pull/12008) +- Fix scroll bar / resize handle flicker in selection panel [#12020](https://github.com/rerun-io/rerun/pull/12020) (thanks [@kratos2377](https://github.com/kratos2377)!) +- Fix infinite redraw that sometimes happened in a spatial 3d view [#12030](https://github.com/rerun-io/rerun/pull/12030) +- Do input from the perspective of spin [#12068](https://github.com/rerun-io/rerun/pull/12068) +- Fix incorrect displayed transform for some cases of logging transforms at a previously shown time [#12088](https://github.com/rerun-io/rerun/pull/12088) +- Fix links to time points [#12163](https://github.com/rerun-io/rerun/pull/12163) +- Fix timepanel size being rounded down [#12208](https://github.com/rerun-io/rerun/pull/12208) +- Fix missing data after saving a time slice as .rrd [#12239](https://github.com/rerun-io/rerun/pull/12239) + +#### 🌁 Viewer improvements +- Add `av1` support to `VideoStream` [#11849](https://github.com/rerun-io/rerun/pull/11849) +- Improved transform query semantics [#11901](https://github.com/rerun-io/rerun/pull/11901) +- Text log view blueprint properties [#11896](https://github.com/rerun-io/rerun/pull/11896) +- Order partitions by opening order [#11936](https://github.com/rerun-io/rerun/pull/11936) +- Allow visualizers to report runtime errors [#11962](https://github.com/rerun-io/rerun/pull/11962) +- Instanced drawing of `TransformAxes3D` via `InstancePose3D` [#11970](https://github.com/rerun-io/rerun/pull/11970) +- Add utility for sampling video from `VideoDataDescription` [#11972](https://github.com/rerun-io/rerun/pull/11972) +- Relax visualizability constraints and handle invalid transforms as visualization errors instead [#11973](https://github.com/rerun-io/rerun/pull/11973) +- Native back and forth navigation [#11974](https://github.com/rerun-io/rerun/pull/11974) +- Add support to explicit child/parent transform frames for `Pinhole` [#11988](https://github.com/rerun-io/rerun/pull/11988) +- Eye rotation or translation with inputs stops using fallbacks for both [#12025](https://github.com/rerun-io/rerun/pull/12025) +- Transform frame ancestors in UI [#12006](https://github.com/rerun-io/rerun/pull/12006) +- Better discovery for view's visualizer errors [#12015](https://github.com/rerun-io/rerun/pull/12015) +- Partition-to-segment rename (wave 2): `re_uri` [#12050](https://github.com/rerun-io/rerun/pull/12050) +- Make `InstancePose3D` consistently interact with transform frames [#12021](https://github.com/rerun-io/rerun/pull/12021) +- Gracefully exit on `ctrl c` [#12079](https://github.com/rerun-io/rerun/pull/12079) +- Add `NavSatService::Unknown` to ROS2 parsing [#12106](https://github.com/rerun-io/rerun/pull/12106) +- Add exclusions for 2d visualizables in 3d and vice-versa [#12087](https://github.com/rerun-io/rerun/pull/12087) +- Replace time trimming urls with time selection [#12154](https://github.com/rerun-io/rerun/pull/12154) +- Better target frame fallback [#12127](https://github.com/rerun-io/rerun/pull/12127) +- LeRobot v3 dataloader [#12071](https://github.com/rerun-io/rerun/pull/12071) +- Allow specifying widths of `BarChart` bars [#12090](https://github.com/rerun-io/rerun/pull/12090) (thanks [@bilsen](https://github.com/bilsen)!) +- Support `png` & `rvl` depth images via new `EncodedDepthImage` archetype + integration with viewer and `re_mcap` [#11877](https://github.com/rerun-io/rerun/pull/11877) (thanks [@makeecat](https://github.com/makeecat)!) +- Show `TransformAxes3D` for out-of-hierarchy `Transform`s [#12262](https://github.com/rerun-io/rerun/pull/12262) + +#### 🗄️ OSS server +- Add static/temporal chunk query filtering to OSS server [#11984](https://github.com/rerun-io/rerun/pull/11984) +- Expose `/version` from oss server [#12108](https://github.com/rerun-io/rerun/pull/12108) +- Add support for creating dataset from list of RRDs to `rerun.server.Server` [#12225](https://github.com/rerun-io/rerun/pull/12225) + +#### 🚀 Performance improvements +- JIT compaction in ChunkStore can now split chunks in addition to merging them [#11921](https://github.com/rerun-io/rerun/pull/11921) +- Cache dataset schema [#11808](https://github.com/rerun-io/rerun/pull/11808) +- Simplify transform resolution cache's tracking based on new atomic-latest-at semantics [#11909](https://github.com/rerun-io/rerun/pull/11909) +- Add FPS to metrics [#11904](https://github.com/rerun-io/rerun/pull/11904) +- GC: target chunks furthest from time cursor [#12217](https://github.com/rerun-io/rerun/pull/12217) + +#### 🧑‍🏫 Examples +- Add EgoExo Forge and VistaDream examples [#11883](https://github.com/rerun-io/rerun/pull/11883) + +#### 📚 Docs +- Make python api doc search match more things [#11946](https://github.com/rerun-io/rerun/pull/11946) +- Remove load_recording docs [#11997](https://github.com/rerun-io/rerun/pull/11997) +- Mark frame based transform apis as stable [#12028](https://github.com/rerun-io/rerun/pull/12028) +- Add new (snippet) example for using pinholes with 3D->2D & 2D->3D projection [#12033](https://github.com/rerun-io/rerun/pull/12033) +- Complete overhaul of transform manual page [#12034](https://github.com/rerun-io/rerun/pull/12034) +- Document built-in URDF loader [#12056](https://github.com/rerun-io/rerun/pull/12056) + +#### 🖼 UI improvements +- Add shortcuts to switch between recordings [#11637](https://github.com/rerun-io/rerun/pull/11637) +- Allow to load URDF files via file dialog [#11941](https://github.com/rerun-io/rerun/pull/11941) +- Load URDF file into the current recording, if one exists already [#11944](https://github.com/rerun-io/rerun/pull/11944) +- Add shortcuts to navigate the timeline [#11933](https://github.com/rerun-io/rerun/pull/11933) +- Make transform frame edit not experimental [#12057](https://github.com/rerun-io/rerun/pull/12057) +- Add memory budget to setting panel [#12190](https://github.com/rerun-io/rerun/pull/12190) +- Show server auth modal on auth errors when loading recording [#12121](https://github.com/rerun-io/rerun/pull/12121) + +#### 🧢 MCAP +- Rename MCAP timelines to avoid conflicts with SDK timestamps [#12145](https://github.com/rerun-io/rerun/pull/12145) +- Parse `PoseStamped` from ROS 2 MCAPs as `InstancePoses3D` [#11879](https://github.com/rerun-io/rerun/pull/11879) +- Parse `tf2_msgs/TFMessage` from ROS 2 MCAPs as `Transform3D`s [#12224](https://github.com/rerun-io/rerun/pull/12224) +- Parse `frame_id` fields of ROS 2 MCAP messages as `CoordinateFrame` [#12238](https://github.com/rerun-io/rerun/pull/12238) + +#### 🧑‍💻 Dev-experience +- cpp: Export `compile_commands.json` via Pixi [#11898](https://github.com/rerun-io/rerun/pull/11898) + +#### 🗣 Refactors +- Partition-to-segment rename (wave 4): rename everything else [#12085](https://github.com/rerun-io/rerun/pull/12085) + +#### 📦 Dependencies +- Use `scuffle-av1` for parsing av1 headers [#11910](https://github.com/rerun-io/rerun/pull/11910) +- Update `walkers` (map widget) to 0.50.0 [#12024](https://github.com/rerun-io/rerun/pull/12024) (thanks [@podusowski](https://github.com/podusowski)!) + +#### 🤷‍ Other +- DPF: create_index: deprecate num_partitions [#11920](https://github.com/rerun-io/rerun/pull/11920) +- Add partition table context menu and row selection [#11908](https://github.com/rerun-io/rerun/pull/11908) +- Implement the search service [#11954](https://github.com/rerun-io/rerun/pull/11954) +- Add `MapProvider::MapboxLight` [#12083](https://github.com/rerun-io/rerun/pull/12083) (thanks [@sectore](https://github.com/sectore)!) +- Implement streaming for datafusion table [#12162](https://github.com/rerun-io/rerun/pull/12162) +- Add Rerun Hub section to welcome page [#12051](https://github.com/rerun-io/rerun/pull/12051) +- Add support for server side filtering of DataFusion DataFrames [#12147](https://github.com/rerun-io/rerun/pull/12147) +- Fix compaction of recordings containing video streams [35810c74187c250925e958a8f095756915313ce7](https://github.com/rerun-io/rerun/commit/35810c74187c250925e958a8f095756915313ce7) +- Python SDK: Add timeout_sec argument to flush [f69d249e5c6bc5225d8f2f0be384243ab9dacf03](https://github.com/rerun-io/rerun/commit/f69d249e5c6bc5225d8f2f0be384243ab9dacf03) + + +## [0.27.2](https://github.com/rerun-io/rerun/compare/0.27.1...0.27.2) - 2025-11-14 - Fix compatibility with dependency + +- Fix non semver compliant breaking changes in `ply-rs` breaking Rust builds [#11890](https://github.com/rerun-io/rerun/pull/11890) + +## [0.27.1](https://github.com/rerun-io/rerun/compare/0.27.0...0.27.1) - 2025-11-13 - Bug fixes and performance improvements + +#### 🪳 Bug fixes +- Respect timepoint in URDF loader [#11866](https://github.com/rerun-io/rerun/pull/11866) +- Fix pinhole color fallback showing the wrong color [#11861](https://github.com/rerun-io/rerun/pull/11861) +- Fix broken `delete_entries` and entries table not updated [#11872](https://github.com/rerun-io/rerun/pull/11872) +- Don't smooth velocity after WASD input [#11858](https://github.com/rerun-io/rerun/pull/11858) +- URDF loader: Use global material if inline material is absent [#11869](https://github.com/rerun-io/rerun/pull/11869) + +#### 🚀 Performance improvements +- When closing recordings (and blueprints), drop them on separate threads for UI responsiveness [#11834](https://github.com/rerun-io/rerun/pull/11834) (thanks [@kpreid](https://github.com/kpreid)!) +- Remove frame lag when creating loop region [#11862](https://github.com/rerun-io/rerun/pull/11862) +- Reverted [#11766](https://github.com/rerun-io/rerun/pull/11766) because of performance issues with the time panel. + +## [0.27.0](https://github.com/rerun-io/rerun/compare/0.26.2...0.27.0) - 2025-11-10 - Viewer improvements and more blueprint configuration +### ✨ Overview & highlights + +#### 🟦 more properties configurable from blueprint +The viewer is now even more configurable via blueprints. With more options for time series, bar chart, graph views, time panel, and the 3D view. With the latter now having the option to control the 3D eye position and look target. + + + time series view blueprint example + + + + + + + + 3D spatial view blueprint example + + + + + + + +#### ⌨🖱️User Interface improvements +We’ve changed the interaction of the time panel! Now the top bar is only for making selections, while the bottom panel is for moving the time cursor. Hold down shift for snap-to-grid! You can also click on events now to select them. + +https://github.com/user-attachments/assets/3cabd74c-8227-4e9d-bd42-fdff36f0466e + +You can now also use just a keyboard to navigate in panels with trees (blueprint / streams / recordings). + +### ⚠️ Breaking changes +- Dropped support for python 3.9, and the minimum supported version is now 3.10. +- Official Intel (x86) macOS binaries are no longer provided (compiling from source is still possible). +- Removed the option to specify the current time cursor via Blueprint. + +See the +🧳 [Migration guide](https://rerun.io/docs/reference/migration/migration-0-27) for more details. + +### 🔎 Details + +#### 🪵 Log API +- Functionality to `add_time_column` via lenses [#11596](https://github.com/rerun-io/rerun/pull/11596) + +#### 🌊 C++ API +- CMake: Download Arrow from Tarball URL Instead of Git [#11558](https://github.com/rerun-io/rerun/pull/11558) (thanks [@threeal](https://github.com/threeal)!) +- Fix in-repo CMake build not resolving builds of rerun_c that weren't made with pixi [#11751](https://github.com/rerun-io/rerun/pull/11751) + +#### 🐍 Python API +- Expose view container visibility in python blueprint api [#11602](https://github.com/rerun-io/rerun/pull/11602) +- Drop Python 3.9 Support [#11426](https://github.com/rerun-io/rerun/pull/11426) +- Try to avoid timestamp footguns [#11601](https://github.com/rerun-io/rerun/pull/11601) +- py-sdk: add register_prefix SDK call [#11600](https://github.com/rerun-io/rerun/pull/11600) +- [Python] Improve errors in mesh3d_ext [#11662](https://github.com/rerun-io/rerun/pull/11662) (thanks [@iwanders](https://github.com/iwanders)!) +- Return optional DebugInfo with `memory_used` as part of CreateIndexResponse [#11691](https://github.com/rerun-io/rerun/pull/11691) +- Add a new `target_partition_num_rows` API parameter to the CreateIndex API [#11686](https://github.com/rerun-io/rerun/pull/11686) +- Add Ability to Launch OSS Server From Python [#11689](https://github.com/rerun-io/rerun/pull/11689) +- Our IndexValuesLike type is overly strict. Allow np.datetime64 inputs [#11721](https://github.com/rerun-io/rerun/pull/11721) +- Add play state, loop mode and loop selection to blueprint [#11664](https://github.com/rerun-io/rerun/pull/11664) +- Index management APIs: Python bindings, types cleanup, and index statistics [#11729](https://github.com/rerun-io/rerun/pull/11729) +- Remove time from blueprint [#11823](https://github.com/rerun-io/rerun/pull/11823) + +#### 🦀 Rust API +- Make `Debug` for Utf8 datatype derived component types readable [#11780](https://github.com/rerun-io/rerun/pull/11780) + +#### 🪳 Bug fixes +- Fix handling of components that only vary by descriptors [#11593](https://github.com/rerun-io/rerun/pull/11593) +- Fix selection panel infinite redraw [#11623](https://github.com/rerun-io/rerun/pull/11623) +- Allow editing times in the time panel [#11774](https://github.com/rerun-io/rerun/pull/11774) +- Allow moving text cursor while holding down options/alt [#11773](https://github.com/rerun-io/rerun/pull/11773) +- Fix 3D eye speed-up modifier not working with scroll-to-zoom [#11814](https://github.com/rerun-io/rerun/pull/11814) + +#### 🌁 Viewer improvements +- Background of graph view is now blueprint configurable [#11522](https://github.com/rerun-io/rerun/pull/11522) +- Enable multiple instance poses for `Points3D` [#11572](https://github.com/rerun-io/rerun/pull/11572) +- Disable toast when copying component path [#11495](https://github.com/rerun-io/rerun/pull/11495) +- Add cyclic colormap [#11498](https://github.com/rerun-io/rerun/pull/11498) +- Allow eye-camera tracking arbitrary entities in 3D view [#11554](https://github.com/rerun-io/rerun/pull/11554) (thanks [@Gentlegg](https://github.com/Gentlegg)!) +- Introduce experimental `CoordinateFrame` archetype [#11674](https://github.com/rerun-io/rerun/pull/11674) +- Add experimental `child_frame` & `parent_frame` to `Transform3D` [#11730](https://github.com/rerun-io/rerun/pull/11730) +- Expose `TimeSeries` time range & zoom in the Blueprint API [#11621](https://github.com/rerun-io/rerun/pull/11621) +- Improve data density visualization by sampling dense chunks [#11766](https://github.com/rerun-io/rerun/pull/11766) +- 3D eye position and other properties in blueprint [#11788](https://github.com/rerun-io/rerun/pull/11788) +- Support arbitrary transform frame based hierarchies, fully independent of entity hierarchy [#11790](https://github.com/rerun-io/rerun/pull/11790) +- Removing time selection with context menu [#11845](https://github.com/rerun-io/rerun/pull/11845) + +#### 🗄️ OSS server +- Add support for layers in OSS server [#11532](https://github.com/rerun-io/rerun/pull/11532) +- Add support for properties in OSS server [#11630](https://github.com/rerun-io/rerun/pull/11630) +- Simplify `CreateIndexRequest` [#11636](https://github.com/rerun-io/rerun/pull/11636) +- Improve column projection specification and implement it for OSS server [#11687](https://github.com/rerun-io/rerun/pull/11687) +- Index management APIs [#11693](https://github.com/rerun-io/rerun/pull/11693) +- Add support for blueprint dataset [#11758](https://github.com/rerun-io/rerun/pull/11758) +- Add support for renaming entries [#11777](https://github.com/rerun-io/rerun/pull/11777) + +#### 🚀 Performance improvements +- Perform transform tree walk only once per frame, rather than for every View [#11470](https://github.com/rerun-io/rerun/pull/11470) +- Significantly improve transform ingestion speed [#11655](https://github.com/rerun-io/rerun/pull/11655) +- Update mimalloc allocator from v2 to v3 [#11703](https://github.com/rerun-io/rerun/pull/11703) +- Small performance improvement for many entities [#11720](https://github.com/rerun-io/rerun/pull/11720) (thanks [@joelreymont](https://github.com/joelreymont)!) + +#### 🧑‍🏫 Examples +- Create and write tables in the Rerun server [#11694](https://github.com/rerun-io/rerun/pull/11694) + +#### 📚 Docs +- Clarify that 0B memory limit for grpc server only makes sense if client/server are connected from the start [#11599](https://github.com/rerun-io/rerun/pull/11599) +- Add documentation to dataframe query workflow and fix api rendering for bindings [#11650](https://github.com/rerun-io/rerun/pull/11650) +- Expose all the python apis I could find for web docs [#11709](https://github.com/rerun-io/rerun/pull/11709) +- Reorganize Docs Overview / Getting Started [#11781](https://github.com/rerun-io/rerun/pull/11781) + +#### 🖼 UI improvements +- Fix blueprint / streams tree navigation ignoring focus [#11574](https://github.com/rerun-io/rerun/pull/11574) +- Keyboard navigation in tree UIs (left panel, streams panel, etc.) [#11595](https://github.com/rerun-io/rerun/pull/11595) +- Improve formatting of durations and timestamps [#11659](https://github.com/rerun-io/rerun/pull/11659) +- When scrubbing time, intelligently round to a nice value [#11658](https://github.com/rerun-io/rerun/pull/11658) +- Hold down shift for snap to grid when moving time cursor [#11757](https://github.com/rerun-io/rerun/pull/11757) +- Time panel: pick sub-second precision based on zoom level [#11761](https://github.com/rerun-io/rerun/pull/11761) +- Change how to select loop region in the time panel [#11675](https://github.com/rerun-io/rerun/pull/11675) +- Click events in the streams view [#11806](https://github.com/rerun-io/rerun/pull/11806) + +#### 🗣 Refactors +- Transform computations are internally now using double precision [#11756](https://github.com/rerun-io/rerun/pull/11756) + +#### 🤷‍ Other +- Add client object table writing functions [#11657](https://github.com/rerun-io/rerun/pull/11657) +- No longer providing official Intel Macs binaries for rerun [#11719](https://github.com/rerun-io/rerun/pull/11719) + +## [0.26.2](https://github.com/rerun-io/rerun/compare/0.26.1...0.26.2) - 2025-10-27 - More bug fixes + +- Add missing `line_radii` and `fill_mode` params to `Capsules3D` in Python SDK [#11660](https://github.com/rerun-io/rerun/pull/11660) (thanks [@yunho-c](https://github.com/yunho-c)!) +- Fix pressing the play button sometimes going to follow mode [#11609](https://github.com/rerun-io/rerun/pull/11609) +- Fix hiding all tabs in a tab-view breaking undo [#11619](https://github.com/rerun-io/rerun/pull/11619) +- Fix color picker on default & override disappearing when trying to edit [#11651](https://github.com/rerun-io/rerun/pull/11651) +- Fix `ViewerEvent::TimeUpdate` viewer callback not emitted during playback [#11639](https://github.com/rerun-io/rerun/pull/11639) + + +## [0.26.1](https://github.com/rerun-io/rerun/compare/0.26.0...0.26.1) - 2025-10-21 - Bug fixes + +- Fix `cargo install rerun-cli` requiring `protoc` on `PATH` [#11592](https://github.com/rerun-io/rerun/pull/11592) +- Switch to newly received recordings even if `SetStoreInfo` message is missing [#11568](https://github.com/rerun-io/rerun/pull/11568) + + +## [0.26.0](https://github.com/rerun-io/rerun/compare/0.25.1...0.26.0) - 2025-10-13 - Viewer improvements and table filtering upgrades + +### ✨ Overview & highlights + +We have started aiming for a higher release cadence, with smaller, more frequent releases. + +#### 🧩 Blueprint improvements + +Blueprints now give you more control over playback and visualization settings. +You can define playback speed and FPS directly in blueprints, and manage time and timeline behavior through them as well. +The Blueprint panel is now always resizable, and we've added support for customizing plot backgrounds. + + + +#### Table filtering upgrades + +Table filtering just got a lot more capable. You can now filter on timestamps, use new string operators like `starts with`, `ends with`, and `does not contain`, and combine these with improved numeric and boolean filtering. + + + +### ⚠️ Breaking changes + +#### 🐍 Python SDK + +The `blocking` argument for `flush` has been removed, use the new `timeout_sec` argument instead, for non-blocking calls, set `timeout_sec=0`. +Mostly you can just call `.flush()` with no arguments. + +We also have started using named arguments (kw-args) for more of our functions, this will make it easier for us to evolve our APIs in the future, when adding new arguments, or renaming old ones. + +See the +🧳 [Migration guide](https://rerun.io/docs/reference/migration/migration-0-26) for more details. + +### 🔎 Details + +#### 🪵 Log API +- Merge `DroppableEncoder` and `Encoder` into a single facility [#11446](https://github.com/rerun-io/rerun/pull/11446) +- Encoder: simplified APIs and improved discoverability [#11450](https://github.com/rerun-io/rerun/pull/11450) +- Introduce `Lens` as a concept for semantic mapping of arbitrary data [#11394](https://github.com/rerun-io/rerun/pull/11394) + +#### 🐍 Python API +- Add module definition to all `pyclasses` [#11268](https://github.com/rerun-io/rerun/pull/11268) +- Python SDK: Add `timeout_sec` argument to `flush` [#11295](https://github.com/rerun-io/rerun/pull/11295) +- Python SDK: remove `blocking` argument of `flush` [#11314](https://github.com/rerun-io/rerun/pull/11314) +- Fix instances of `newest_first` not working correctly [#11326](https://github.com/rerun-io/rerun/pull/11326) +- Update Schema to make query view requirements clearer [#11287](https://github.com/rerun-io/rerun/pull/11287) +- Fix error when logging `AnyValues` with empty columns [#11322](https://github.com/rerun-io/rerun/pull/11322) +- Include "outer nullability" when we format column datatypes [#11339](https://github.com/rerun-io/rerun/pull/11339) +- Fix error message for what package to install [#11398](https://github.com/rerun-io/rerun/pull/11398) +- Py-SDK: More kw-args [#11384](https://github.com/rerun-io/rerun/pull/11384) +- Add meaningful equality comparisons to many rust wrappers [#11401](https://github.com/rerun-io/rerun/pull/11401) +- Remove deprecated methods from `AnyValues` [#11390](https://github.com/rerun-io/rerun/pull/11390) (thanks [@Weijun-H](https://github.com/Weijun-H)!) +- Introduce the dataset manifest and remove layer information from the partition table [#11423](https://github.com/rerun-io/rerun/pull/11423) +- Make time and timeline controlled by blueprint [#11405](https://github.com/rerun-io/rerun/pull/11405) + +#### 🦀 Rust API +- Remove deprecated methods from `AnyValues` [#11390](https://github.com/rerun-io/rerun/pull/11390) (thanks [@Weijun-H](https://github.com/Weijun-H)!) + +#### 🪳 Bug fixes +- Fix edge case for parsing videos with constant frame size [#11226](https://github.com/rerun-io/rerun/pull/11226) +- Fix title bar height on macOS Tahoe [#11241](https://github.com/rerun-io/rerun/pull/11241) +- Blueprint panel can now always be resized [#11046](https://github.com/rerun-io/rerun/pull/11046) +- Fix rare issue where video stream sample indices would be determined incorrectly, breaking video inspection UI & playback [#11308](https://github.com/rerun-io/rerun/pull/11308) +- Fix links to custom timelines [#11333](https://github.com/rerun-io/rerun/pull/11333) +- Fix url edit warning spam [#11330](https://github.com/rerun-io/rerun/pull/11330) +- Fix race condition for ui adjustments while loading recordings from redap client [#11365](https://github.com/rerun-io/rerun/pull/11365) +- Fix formatting and parsing of component paths in URLs [#11364](https://github.com/rerun-io/rerun/pull/11364) +- Share button on notebook no longer uses the current base url for web viewer urls [#11379](https://github.com/rerun-io/rerun/pull/11379) +- Enable "Close current recording" only when there's a recording [#11353](https://github.com/rerun-io/rerun/pull/11353) +- Do not include metadata when rendering table in html [#11463](https://github.com/rerun-io/rerun/pull/11463) +- Data loaders: fix multiple nasty bugs when working with virtual FDs (e.g. `<(...)` FIFOs) [#11486](https://github.com/rerun-io/rerun/pull/11486) +- Fix data corruption during compression of large chunks [#11525](https://github.com/rerun-io/rerun/pull/11525) + +#### 🌁 Viewer improvements +- Keep last paused time in web-viewer url [#11246](https://github.com/rerun-io/rerun/pull/11246) +- Add limited support for out-of-order video stream samples [#11307](https://github.com/rerun-io/rerun/pull/11307) +- Better video stream errors for missing samples & key frames [#11310](https://github.com/rerun-io/rerun/pull/11310) +- Add optional viewer url parameter to web app options [#11296](https://github.com/rerun-io/rerun/pull/11296) +- Add spectral colormap [#11298](https://github.com/rerun-io/rerun/pull/11298) +- Better gRPC errors [#11335](https://github.com/rerun-io/rerun/pull/11335) +- Fix `UnixEpoch` display/parsing inconsistency [#11491](https://github.com/rerun-io/rerun/pull/11491) +- Blueprint plot background [#11494](https://github.com/rerun-io/rerun/pull/11494) +- Put playback speed and fps in blueprint [#11490](https://github.com/rerun-io/rerun/pull/11490) + +#### 🗄️ OSS server +- Add table support to OSS server [#11356](https://github.com/rerun-io/rerun/pull/11356) + +#### 🚀 Performance improvements +- Determine per-view overrides in parallel (-> faster many entities + many views on native) [#11439](https://github.com/rerun-io/rerun/pull/11439) +- Improve many-entity performance by fixing redundant `AnnotationContext` lookups (also affects scene without annotation contexts) [#11445](https://github.com/rerun-io/rerun/pull/11445) + +#### 🧑‍🏫 Examples +- refactor: Move examples for notebook viewer and callbacks to `examples/python` [#11416](https://github.com/rerun-io/rerun/pull/11416) (thanks [@Weijun-H](https://github.com/Weijun-H)!) + +#### 📚 Docs +- Add how to connect the server to the CLI command output [#11400](https://github.com/rerun-io/rerun/pull/11400) + +#### 🖼 UI improvements +- Add copy-button to the recording link table item [#11242](https://github.com/rerun-io/rerun/pull/11242) +- Add copy link context menu to server entries [#11235](https://github.com/rerun-io/rerun/pull/11235) +- Add support for displaying timezone with our timestamps [#11234](https://github.com/rerun-io/rerun/pull/11234) +- Show loading screen when opening link [#11270](https://github.com/rerun-io/rerun/pull/11270) +- Support filtering by timestamp in table view [#11227](https://github.com/rerun-io/rerun/pull/11227) +- Add `starts with`/`ends with` string filters to table [#11341](https://github.com/rerun-io/rerun/pull/11341) +- Mark valid data ranges in timeline when loading data via range-limited URL [#11340](https://github.com/rerun-io/rerun/pull/11340) +- Add `does not contain` operator to string column filtering [#11349](https://github.com/rerun-io/rerun/pull/11349) +- Copy button on some selection items [#11337](https://github.com/rerun-io/rerun/pull/11337) +- Add `is not` to timestamp filtering [#11366](https://github.com/rerun-io/rerun/pull/11366) +- Add `is not` to nullable boolean filter [#11371](https://github.com/rerun-io/rerun/pull/11371) +- Treat`!=` filtering of numerical column as the inverse of `==` (aka. outer-NOT and ALL semantics) [#11372](https://github.com/rerun-io/rerun/pull/11372) +- Add context menu button to copy partition name [#11378](https://github.com/rerun-io/rerun/pull/11378) +- Store (and display) recordings in insertion order [#11415](https://github.com/rerun-io/rerun/pull/11415) + +#### 🎨 Renderer improvements +- Export `BindGroupEntry` type to re_renderer rust dependents [#11406](https://github.com/rerun-io/rerun/pull/11406) (thanks [@Weijun-H](https://github.com/Weijun-H)!) + +#### 🧢 MCAP +- Add support for `enum` in protobuf MCAP messages [#11280](https://github.com/rerun-io/rerun/pull/11280) +- Represent enums from `protobuf` messages as `StructArray` [#11458](https://github.com/rerun-io/rerun/pull/11458) +- Reflection-based `protobuf` parser only returns single component [#11459](https://github.com/rerun-io/rerun/pull/11459) +- Add reflection based support for deserializing ROS2 MCAP [#11367](https://github.com/rerun-io/rerun/pull/11367) +- Reflection-based ROS2 parser now only returns single component [#11480](https://github.com/rerun-io/rerun/pull/11480) + +#### 🧑‍💻 Dev-experience +- Improve rrd loading errors by checking FourCC first [#11265](https://github.com/rerun-io/rerun/pull/11265) + +#### 📦 Dependencies +- Update to wgpu 26 [#11300](https://github.com/rerun-io/rerun/pull/11300) +- Update DataFusion to version 49.0.2 [#11291](https://github.com/rerun-io/rerun/pull/11291) + + +## [0.25.1](https://github.com/rerun-io/rerun/compare/0.25.0...0.25.1) - 2025-09-19 - Bug fixes +- Fix vector search [#11259](https://github.com/rerun-io/rerun/pull/11259) +- Fix space origin editor resetting & closing immediately [#11251](https://github.com/rerun-io/rerun/pull/11251) +- Fix some menu buttons closing unexpectedly [#11247](https://github.com/rerun-io/rerun/pull/11247) +- Fix table UI not saying switch to when opening a certain links [#11237](https://github.com/rerun-io/rerun/pull/11237) +- Use short name in component defaults menu [#11264](https://github.com/rerun-io/rerun/pull/11264) + + +## [0.25.0](https://github.com/rerun-io/rerun/compare/0.24.1...0.25.0) - 2025-09-16 - Syntax highlighting, table filtering, transparent objects + +🧳 [Migration guide](https://rerun.io/docs/reference/migration/migration-0-25) + +### ✨ Overview & highlights + +#### Syntax highlighting + +Our data frames and selection panel now feature prettier colors based on data types. + +![syntax highlight](https://static.rerun.io/syntax_highlight/8ee40cdb412715ca485fcec277d9d086d40177ef/full.png) + +#### Table filtering + +We are busy working on a powerful filtering feature for our arrow dataframe widget used for tables (sent with `ViewerClient.send_table()`) as well as the Rerun server browser (entry list, partition list, and remote tables). This release introduces support for filtering boolean, integer, floating point, and string columns, with more coming in future releases. (Note that the text log views and dataframe views are using a different widget which does not support filtering.) + +![table_filtering](https://github.com/user-attachments/assets/13775e9a-b564-4faa-91ac-2c36379e8140) + +#### Transparent objects + +We finally support transparency for meshes & various shapes (boxes, ellipsoids, etc.)! + +https://github.com/user-attachments/assets/5a78cf2c-1e11-4f5f-a8a4-4e5d503f4cd9 + +Source of transparency ("alpha") is a bit limited for now: +* color component on all of `Boxes3D`, `Ellipsoids3D`, `Capsules3D` & `Cylinders3D` +* `Mesh3D`'s albedo factor +* `Asset3D` albedo color (depends on the underlying model format) + +Naturally, there's still a lot of places missing where we'd like to add transparency support! + +#### Experimental MCAP support + +Rerun has experimental, partial support for importing data from MCAP files. We support a subset of ROS2/CDR and Protocol Buffers messages. Development is ongoing, feel free to share your use cases! + +### ⚠️ Breaking changes + +We removed the `--serve`, `--drop-at-latency` and `-o` CLI arguments, deprecated Python 3.9 and changed `archetype` specification in `AnyValues`. + +We also removed `flush_timeout_sec` parameter to out connect functions. Instead you can specify a maximum wait time in the calls to `flush`, but usually this isn't needed, as the new blocking behavior is also much smarter. + +See the +🧳 [Migration guide](https://rerun.io/docs/reference/migration/migration-0-25) for more details. + +### 🔎 Details + +#### 🪵 Log API +- Add explicit timeout to flush API [#11008](https://github.com/rerun-io/rerun/pull/11008) +- Make archetype and URDF loaders honor `entity_path_prefix` [#11085](https://github.com/rerun-io/rerun/pull/11085) +- Keep static log messages longer in the proxy [#11091](https://github.com/rerun-io/rerun/pull/11091) + +#### 🌊 C++ API +- Fix `flush_blocking` destroying C++ recording stream [#10885](https://github.com/rerun-io/rerun/pull/10885) +- Respect `CMAKE_BUILD_TYPE` when building the Rust code [#11023](https://github.com/rerun-io/rerun/pull/11023) +- Add options to gRPC proxy server to replay _newest_ data first [#11118](https://github.com/rerun-io/rerun/pull/11118) +- Prevent arow_cpp from configuring/building/installing all the time [#11093](https://github.com/rerun-io/rerun/pull/11093) (thanks [@eliemichel](https://github.com/eliemichel)!) + +#### 🐍 Python API +- Add `__len__` to codegened Python datatypes [#10774](https://github.com/rerun-io/rerun/pull/10774) +- Remove '-o' shorthand for stdout from script_add_args [#11043](https://github.com/rerun-io/rerun/pull/11043) (thanks [@kabouzeid](https://github.com/kabouzeid)!) +- Deprecate python 3.9 [#11090](https://github.com/rerun-io/rerun/pull/11090) +- Bump datafusion-python to 48.0.0 [#11089](https://github.com/rerun-io/rerun/pull/11089) +- Improve numpy 1 compatibility [#11129](https://github.com/rerun-io/rerun/pull/11129) (thanks [@Benjamin-Tan](https://github.com/Benjamin-Tan)!) +- Split AnyValues into AnyValues and DynamicArchetype [#11045](https://github.com/rerun-io/rerun/pull/11045) + +#### 🦀 Rust API +- Update MSRV to 1.88 [#10832](https://github.com/rerun-io/rerun/pull/10832) +- Split AnyValues into AnyValues and DynamicArchetype [#11045](https://github.com/rerun-io/rerun/pull/11045) + +#### 🪳 Bug fixes +- Fix panic on bad STL files (e.g. for URDFs) [#10855](https://github.com/rerun-io/rerun/pull/10855) +- Fix `Ellipsoids3D` archetype not showing in 2D view projections [#10922](https://github.com/rerun-io/rerun/pull/10922) +- Fix unwanted eye (camera) movement when using shortcuts [#8975](https://github.com/rerun-io/rerun/pull/8975) (thanks [@kailiuca](https://github.com/kailiuca)!) +- Fix opacity heuristic for images/segmentation when scene changes [#11014](https://github.com/rerun-io/rerun/pull/11014) +- Fix 3D eye camera reset not resuming tracking scene bounding box [#11037](https://github.com/rerun-io/rerun/pull/11037) +- Fix mesh cache eviction issue [#11079](https://github.com/rerun-io/rerun/pull/11079) +- Fix recording to split in two when loading an URDF [#11086](https://github.com/rerun-io/rerun/pull/11086) +- Fix for single channel textures displayed only in the red channel [#11101](https://github.com/rerun-io/rerun/pull/11101) +- Fix columns menu closing on click [#11119](https://github.com/rerun-io/rerun/pull/11119) +- Fix sharing selection as a fragment [#11161](https://github.com/rerun-io/rerun/pull/11161) +- Fix UI glitch when connected twice to the same server [#11185](https://github.com/rerun-io/rerun/pull/11185) +- Fix tooltips sometimes being way too big [#11190](https://github.com/rerun-io/rerun/pull/11190) +- Fix incorrect application id when dragging and dropping files [#11197](https://github.com/rerun-io/rerun/pull/11197) +- Fix wrong rendering of some texture formats in light mode [#11225](https://github.com/rerun-io/rerun/pull/11225) + +#### 🌁 Viewer improvements +- Integrate basic MCAP loader from `rerun-io/rerun-mcap` [#10721](https://github.com/rerun-io/rerun/pull/10721) +- Support scroll-/pinch-to-zoom with first person eye control [#10783](https://github.com/rerun-io/rerun/pull/10783) +- Low-level Arrow conversion of `protobuf`-encoded MCAP messages [#10791](https://github.com/rerun-io/rerun/pull/10791) +- Support flexible x-axis for bars in BarChart [#10675](https://github.com/rerun-io/rerun/pull/10675) (thanks [@Xiao-Chenguang](https://github.com/Xiao-Chenguang)!) +- Customize color and line width of `Pinhole` camera frustum [#10842](https://github.com/rerun-io/rerun/pull/10842) +- CLI now consistently forward URLs to native/web viewer when possible [#10909](https://github.com/rerun-io/rerun/pull/10909) +- Fix closing recordings/tables that are still being loaded showing up again [#10963](https://github.com/rerun-io/rerun/pull/10963) +- Persist fallback token [#10970](https://github.com/rerun-io/rerun/pull/10970) +- Allow opening web viewer links directly [#10928](https://github.com/rerun-io/rerun/pull/10928) +- Add keyboard shortcut to copy entity hierarchy [#10938](https://github.com/rerun-io/rerun/pull/10938) +- Add H.265 support for native & `VideoStream` [#10994](https://github.com/rerun-io/rerun/pull/10994) +- Support sharing URLs for catalog server datasets & tables [#11038](https://github.com/rerun-io/rerun/pull/11038) +- New open from URL dialog & main menu entry [#11040](https://github.com/rerun-io/rerun/pull/11040) +- Add archetypes for MCAP metadata [#11062](https://github.com/rerun-io/rerun/pull/11062) +- Add `opacity` setting for `VideoStream` & `VideoAsset` [#11113](https://github.com/rerun-io/rerun/pull/11113) +- Add MCAP parsers for scalar sensor messages [#11078](https://github.com/rerun-io/rerun/pull/11078) +- Remove custom number formatting on copy [#11148](https://github.com/rerun-io/rerun/pull/11148) +- Implement fallback mode for raw MCAP layer [#11136](https://github.com/rerun-io/rerun/pull/11136) +- Support basic transparency for `Mesh3D`/`Asset3D`/`Boxes3D`/`Ellipsoids3D`/`Capsules3D`/`Cylinders3D` [#11132](https://github.com/rerun-io/rerun/pull/11132) +- New link sharing dialog for detailed link sharing [#11137](https://github.com/rerun-io/rerun/pull/11137) + +#### 🚀 Performance improvements +- Prevent 100% CPU Usage when running gRPC server by sleeping instead of yielding [#10944](https://github.com/rerun-io/rerun/pull/10944) (thanks [@nisseknudsen](https://github.com/nisseknudsen)!) + +#### 📚 Docs +- Fixed highlighting of Python code in docs [#10920](https://github.com/rerun-io/rerun/pull/10920) (thanks [@YohDeadfall](https://github.com/YohDeadfall)!) +- Correct 'altitude' to 'latitude' in documentation [#10998](https://github.com/rerun-io/rerun/pull/10998) (thanks [@skalldri](https://github.com/skalldri)!) +- Added release calendar for Python [#11081](https://github.com/rerun-io/rerun/pull/11081) + +#### 🖼 UI improvements +- Log all low-level MCAP primitives + raw messages as fallback [#10769](https://github.com/rerun-io/rerun/pull/10769) +- Add arrow data tree view and syntax highlighting [#10777](https://github.com/rerun-io/rerun/pull/10777) +- Add debug information about caches on the memory panel [#11055](https://github.com/rerun-io/rerun/pull/11055) +- Implement full text filtering for string-based columns of the table widget [#11061](https://github.com/rerun-io/rerun/pull/11061) +- Add support for filtering on boolean columns [#11095](https://github.com/rerun-io/rerun/pull/11095) +- Add support for filtering numeric (int/float) columns in tables [#11142](https://github.com/rerun-io/rerun/pull/11142) +- Use partition id in the recording panel [#11157](https://github.com/rerun-io/rerun/pull/11157) +- Draw loop selection highlight on the collapsed timeline [#11203](https://github.com/rerun-io/rerun/pull/11203) +- Move copy / save buttons inline with the relevant component [#11181](https://github.com/rerun-io/rerun/pull/11181) +- Set timeline with most events as default timeline [#11217](https://github.com/rerun-io/rerun/pull/11217) +- Add share link button to time panel context menu [#11186](https://github.com/rerun-io/rerun/pull/11186) + +#### 🕸️ Web +- Improve browser navigation for http & catalog server links [#10863](https://github.com/rerun-io/rerun/pull/10863) +- pixi: Use llvm-ar from PATH on macOS, avoid unexpanded ${PIXI_PROJECT… [#10910](https://github.com/rerun-io/rerun/pull/10910) (thanks [@matildasmeds](https://github.com/matildasmeds)!) + +#### 🧑‍💻 Dev-experience +- Fix building Web Viewer on macOS [#10828](https://github.com/rerun-io/rerun/pull/10828) +- Improve `rerun rrd print` [#10881](https://github.com/rerun-io/rerun/pull/10881) + +#### 🗣 Refactors +- Add `ApplicationId` in `StoreId` [#10742](https://github.com/rerun-io/rerun/pull/10742) + +#### 📦 Dependencies +- Use `jiff` date-time crate instead of `time`/`chrono` in more places [#9536](https://github.com/rerun-io/rerun/pull/9536) (thanks [@NiharP31](https://github.com/NiharP31)!) + +#### 🤷‍ Other +- Introduce MCAP layers and `rerun mcap` CLI tools [#10856](https://github.com/rerun-io/rerun/pull/10856) +- Remove `--drop-at-latency` [#11025](https://github.com/rerun-io/rerun/pull/11025) + + +## [0.24.1](https://github.com/rerun-io/rerun/compare/0.24.0...0.24.1) - 2025-08-07 - Bug fixes + +#### 🌊 C++ API +- Fix `rerun_cpp` CMake link errors [#10756](https://github.com/rerun-io/rerun/pull/10756) (thanks [@reinar](https://github.com/reinar)!) +- Fix C++ interface for `VideoStream` [#10745](https://github.com/rerun-io/rerun/pull/10745) +- Fix C++ Arrow build [#10799](https://github.com/rerun-io/rerun/pull/10799) + +#### 🐍 Python API +- Explicitly import `pyarrow.compute` in `url_generation.py` [#10690](https://github.com/rerun-io/rerun/pull/10690) +- Add `rerun-sdk[datafusion]` and `rerun-sdk[all]` [#10696](https://github.com/rerun-io/rerun/pull/10696) + +#### 🦀 Rust API +- Fix unnecessary `rfd` and wayland dependencies in SDK crate [#10802](https://github.com/rerun-io/rerun/pull/10802) + +#### 🪳 Bug fixes +- Make `parking_lot` dependency version stricter to prevent import failure [#10732](https://github.com/rerun-io/rerun/pull/10732) (thanks [@sdd](https://github.com/sdd)!) +- Use `ui.warning_label()` in more places [#10697](https://github.com/rerun-io/rerun/pull/10697) +- Fix colors sometimes being wrong in plot view [#10713](https://github.com/rerun-io/rerun/pull/10713) +- Fix breaking example in `rerun_notebook/example.ipynb` [#10706](https://github.com/rerun-io/rerun/pull/10706) (thanks [@glk0](https://github.com/glk0)!) +- Fix GUI hickup when starting native video player [#10797](https://github.com/rerun-io/rerun/pull/10797) +- Improve command palette in light mode [#10825](https://github.com/rerun-io/rerun/pull/10825) + +#### 🌁 Viewer improvements +- Add time range query params when opening a time_range-based url [#10819](https://github.com/rerun-io/rerun/pull/10819) + +#### 🖼 UI improvements +- Better component UI for Arrow `StructArray` [#10748](https://github.com/rerun-io/rerun/pull/10748) + +#### 🕸️ Web +- Make `@rerun-io/web-viewer-react` compatible with React 19 [#10809](https://github.com/rerun-io/rerun/pull/10809) + +#### 📈 Analytics +- Add some analytics events [#10793](https://github.com/rerun-io/rerun/pull/10793) + + +## [0.24.0](https://github.com/rerun-io/rerun/compare/0.23.4...0.24.0) - 2025-07-16 - Tagged components, Video Stream, light mode and more + +* 📖 [Release blogpost](https://rerun.io/blog/release-0.24) +* 🧳 [Migration guide](https://rerun.io/docs/reference/migration/migration-0-24) + +### ✨ Overview & highlights + +#### 💽 Tagged components + +Starting with 0.22 Rerun began storing additional meta-information for each component, +identifying its field name (e.g. `vertex_colors`) and its archetype (e.g. `Mesh3D`). +We finally concluded this effort and made all parts of the Viewer and API aware of this. + +[](https://static.rerun.io/tags-before-after/2cb9942317249e1bd06eb7a7d16d1b6e8f814466/full.png) + +While this is mostly about under-the-hood changes, this has a lot of surface level benefits: + +* You can now log the same component type multiple times on a single entity path. +For example, logging multiple archetypes which use the `Color` component onto the same entity was possible before, but the colors would have overwritten each other: +```py +rr.log("path", rr.GeoPoints(lat_lon=[some_coordinate], colors=[0xFF0000FF])) +rr.log("path", rr.Points2D(positions=[0.0, 0.0], colors=[0x0000FFFF])) +rr.log("path", rr.Mesh3D(vertex_positions=vertices, vertex_colors=[0x00FF00FF])) +``` +* The UI now groups by archetype everywhere and will show the same field names you use in the logging SDKs +[](https://static.rerun.io/ui-grouping-before-after/08d2e3ab971fe3468f279c3b7bfb0858a821a1c8/full.png) +* Better blueprint defaults: component defaults are now per archetype field and not per type. Making them **a lot** more useful. +[](https://static.rerun.io/visualizer-default-context-menu/9622eae67d9bb17e428fda7242b45b8029639a99/full.png) +* No more indicator components! These showed previously up in the UI and needed special handling for some advanced use cases. + + +#### 🎥 Video streams + +Rerun previously supported video only in the form of MP4 files, +so it was not possible to stream live encoded video to Rerun. +The new [`VideoStream`](https://rerun.io/docs/reference/types/archetypes/video_stream) archetype remedies that! + +[](https://static.rerun.io/camera_video_stream/b2f8f61eb62424aa942bdb5183e49246cf417e60/full.png) + + +If you already have encoded video frames, it is just as easy as logging images now: + +```py +rr.set_time("time", duration=float(packet.pts * packet.time_base)) +rr.log("video_stream", rr.VideoStream(codec=rr.VideoCodec.H264, sample=bytes(packet))) +``` + +For now, we only handle H.264, but support for more codecs is on the roadmap. +Learn more on the updated [video reference page](https://rerun.io/docs/concepts/logging-and-ingestion/video). + +#### 😎 Light mode + +Rerun finally has a light mode. + +[](https://static.rerun.io/theme-before-after/4160c066eab17a6982201687993be60ceb37c33e/full.png) + +The theme defaults to your OS's setting, but can be adjusted in the settings menu. + +#### 🔀 Multi sink + +Previously, the SDK's recording stream could only send to one sink at a time. +We now expose the ability to set multiple sinks at once, so you can simultaneously +stream to both the Viewer and a file. + +Here's what that looks like in Python (but the API is available in C++ & Rust as well!) + +```py +rr.set_sinks( + # Connect to a local viewer using the default URL + rr.GrpcSink(), + # Write data to a `data.rrd` file in the current directory + rr.FileSink("data.rrd"), +) +``` + +#### 🤖 Built-in URDF data loader + +You can now log URDF files directly to Rerun using the `log_file` API. + + + +#### 👀 Other highlights in short + +* New [`Cylinder`](https://rerun.io/docs/reference/types/archetypes/cylinders3d) archetype +* [`AnyValues`](https://github.com/rerun-io/rerun/blob/0.24.0/crates/store/re_types/src/any_values.rs) utility for Rust +* [`rerun rrd stats`](https://github.com/rerun-io/rerun/pull/10593) for retrieving statistics about rrd files +* [`rerun rrd route`](https://github.com/rerun-io/rerun/pull/10607) command to manipulate .rrd files on transport level +* Much faster & better compaction for both `rerun rrd compact` and automatic in-Viewer compaction +* Viewers started with `spawn` use now less memory since it no longer sets up an GRPC server for message forwarding +* View3D's eye control type & speed can now be changed from blueprint (and as such is persisted over session!) more properties will follow in the future. (thanks to @jccampagne) + +### 🔎 Details + +#### 🪵 Log API +- Remove deprecated `Scalar`, `SeriesLine`, `SeriesPoint` archetypes [#9892](https://github.com/rerun-io/rerun/pull/9892) +- Remove untagged `Component::descriptor()` [#10038](https://github.com/rerun-io/rerun/pull/10038) +- Add `Cylinders3D` archetype [#10139](https://github.com/rerun-io/rerun/pull/10139) +- Provide `AnyValues` helpers in Rust SDK [#10074](https://github.com/rerun-io/rerun/pull/10074) +- Rename `ComponentDescriptor` fields and use colons in Sorbet metadata [#10245](https://github.com/rerun-io/rerun/pull/10245) +- Stop logging indicators and drop them during migration [#10521](https://github.com/rerun-io/rerun/pull/10521) +- Make `SeriesPoints::markers` component required [#10572](https://github.com/rerun-io/rerun/pull/10572) +- Remove indicators from codegen, `rerun_py`, and `rerun_cpp` [#10581](https://github.com/rerun-io/rerun/pull/10581) +- Removes remnants of indicators from dataframe queries and viewer [#10584](https://github.com/rerun-io/rerun/pull/10584) +- `rerun rrd stats` [#10593](https://github.com/rerun-io/rerun/pull/10593) +- Source default batcher settings from sink [#10620](https://github.com/rerun-io/rerun/pull/10620) + +#### 🌊 C++ API +- (CMake) download arrow inside the rerun build folder instead of general binary folder [#10141](https://github.com/rerun-io/rerun/pull/10141) (thanks [@jzubizarreta](https://github.com/jzubizarreta)!) +- Fix documentation wording on which arrow-cpp version to use [#10235](https://github.com/rerun-io/rerun/pull/10235) +- Disable gRPC server history for Spawn/CLI [#10314](https://github.com/rerun-io/rerun/pull/10314) +- Add `set_sinks` to C++ `RecordingStream` [#10359](https://github.com/rerun-io/rerun/pull/10359) + +#### 🐍 Python API +- Add `Dataset.register_batch` and wrappers for task ids [#9895](https://github.com/rerun-io/rerun/pull/9895) +- Introduce `ConnectionRegistry` for centralized redap client and token management [#10078](https://github.com/rerun-io/rerun/pull/10078) +- Build in `manylinux_2_28` container [#10148](https://github.com/rerun-io/rerun/pull/10148) +- Add APIs to Dataset to query and update the associated blueprint [#10156](https://github.com/rerun-io/rerun/pull/10156) +- Support for seconds-since-Epoch numpy arrays for constructing `TimeColumn` [#10168](https://github.com/rerun-io/rerun/pull/10168) (thanks [@MichaelGrupp](https://github.com/MichaelGrupp)!) +- Fix initializing two recordings with the same recording id causing SDK hangs [#10201](https://github.com/rerun-io/rerun/pull/10201) (thanks [@AhmedMousa-ag](https://github.com/AhmedMousa-ag)!) +- Improve `rerun_notebook` startup times [#10111](https://github.com/rerun-io/rerun/pull/10111) +- New dataset API for just retrieving `chunk_ids` associated with a query [#10261](https://github.com/rerun-io/rerun/pull/10261) +- Multi-sink / `tee` Python API [#10158](https://github.com/rerun-io/rerun/pull/10158) +- Rename to `tee` to `set_sinks` [#10312](https://github.com/rerun-io/rerun/pull/10312) +- Add support for `index=None` to local and remote dataframe APIs and deprecate `select_static` [#10332](https://github.com/rerun-io/rerun/pull/10332) +- Disable gRPC server history for Spawn/CLI [#10314](https://github.com/rerun-io/rerun/pull/10314) +- Deprecate `serve_web` and improve documentation around how to serve a web viewer [#10360](https://github.com/rerun-io/rerun/pull/10360) +- Add partition ID to `TimeUpdateEvent` [#10403](https://github.com/rerun-io/rerun/pull/10403) +- Fix `set_time_ctrl` not doing anything when called twice [#10547](https://github.com/rerun-io/rerun/pull/10547) +- Notebook auto-sizing [#10554](https://github.com/rerun-io/rerun/pull/10554) +- Add `RegisterTable` rpc, `LanceTable` message, and related proto changes [#10538](https://github.com/rerun-io/rerun/pull/10538) +- Add `open_url`/`close_url` notebook APIs [#10602](https://github.com/rerun-io/rerun/pull/10602) +- AnyValue Torch Performance Improvement [#10647](https://github.com/rerun-io/rerun/pull/10647) +- Make it easier to disable the 3D line grid in Python (blueprint) [#10621](https://github.com/rerun-io/rerun/pull/10621) +- Add `to_arrow_reader()` to `TableEntry` and `DataFusionTable` [#10601](https://github.com/rerun-io/rerun/pull/10601) +- Make it possible to configure batcher explicitly via python APIs [#10657](https://github.com/rerun-io/rerun/pull/10657) + +#### 🦀 Rust API +- Update MSRV to 1.85 [#9798](https://github.com/rerun-io/rerun/pull/9798) +- Improve `rerun` crate forwarding, removing need to depend on other `re_*` crates for viewer customization [#9825](https://github.com/rerun-io/rerun/pull/9825) +- Update glam to 0.30, and replace `re_math` with `macaw` [#10119](https://github.com/rerun-io/rerun/pull/10119) +- Add `RecordingStream::set_timestamp_nanos_since_epoch` [#10200](https://github.com/rerun-io/rerun/pull/10200) +- Add `set_sinks` to Rust `RecordingStream` [#10336](https://github.com/rerun-io/rerun/pull/10336) +- Disable gRPC server history for Spawn/CLI [#10314](https://github.com/rerun-io/rerun/pull/10314) +- Deprecate `serve_web` and improve documentation around how to serve a web viewer [#10360](https://github.com/rerun-io/rerun/pull/10360) +- Experimental connection status inspection for Rust gRPC connections [#10433](https://github.com/rerun-io/rerun/pull/10433) +- Implement `From` for more narrow integers and floats for `Float64` [#10463](https://github.com/rerun-io/rerun/pull/10463) + +#### 🪳 Bug fixes +- Fix non-deterministic mesh rendering order [#10117](https://github.com/rerun-io/rerun/pull/10117) +- LeRobot Dataloader: Mark robot type as optional [#10174](https://github.com/rerun-io/rerun/pull/10174) +- Fix some actions happening on key _up_ instead of key _down_ [#10232](https://github.com/rerun-io/rerun/pull/10232) +- Fix showing too much data for generic blobs of data (arrow `ListArray`s) [#10275](https://github.com/rerun-io/rerun/pull/10275) +- Make it possible to click the barchart view to select it [#10257](https://github.com/rerun-io/rerun/pull/10257) +- Fix integer overflow in `TimeSeriesView` for too large timestamps [#10310](https://github.com/rerun-io/rerun/pull/10310) +- Fix `SIGBUS` startup crash on some Mac systems [#10334](https://github.com/rerun-io/rerun/pull/10334) +- Silence harmeless "Unrecognized present mode" warning [#10379](https://github.com/rerun-io/rerun/pull/10379) +- Fix copy and cut from notebook cells [#10401](https://github.com/rerun-io/rerun/pull/10401) +- Fix videos re-decoding on some ui interactions [#10420](https://github.com/rerun-io/rerun/pull/10420) +- Fix video stuttering on Firefox & Safari when encountering b-frames [#10405](https://github.com/rerun-io/rerun/pull/10405) +- Fix pixel picking ui width changing rapidly by padding values [#10481](https://github.com/rerun-io/rerun/pull/10481) +- Fix: don't always pick `/` as the origin when creating new views [#10514](https://github.com/rerun-io/rerun/pull/10514) +- Fix tooltips sometimes jumping around on screen [#10527](https://github.com/rerun-io/rerun/pull/10527) +- Fix spurious decode errors with H.264 on native Viewer [#10539](https://github.com/rerun-io/rerun/pull/10539) +- Fix H.264 with b-frames not decoding last few frames on native [#10545](https://github.com/rerun-io/rerun/pull/10545) +- Fix visible time range documentation on property inheritance [#10618](https://github.com/rerun-io/rerun/pull/10618) +- Remove redundant ffmpeg install check [#10635](https://github.com/rerun-io/rerun/pull/10635) +- Make rerun menu scrollable if there is not enough space [#10642](https://github.com/rerun-io/rerun/pull/10642) + +#### 🌁 Viewer improvements +- Basic ability to show components that only differ by archetype/field name on same entity [#9877](https://github.com/rerun-io/rerun/pull/9877) +- Visualizers' data queries take component tags into account [#9887](https://github.com/rerun-io/rerun/pull/9887) +- Allow editing existing recording properties, like name [#10003](https://github.com/rerun-io/rerun/pull/10003) +- Fix issues when combining `InstancePoses3D` with transform properties of `Boxes3D`/`Ellipsoids3D`/`Capsules3D` [#10010](https://github.com/rerun-io/rerun/pull/10010) +- Replace `tinystl` with `stl_io` to support more stl files [#9997](https://github.com/rerun-io/rerun/pull/9997) +- Introduce variant UIs in `re_component_ui` [#10034](https://github.com/rerun-io/rerun/pull/10034) +- Simple built-in URDF loader [#10105](https://github.com/rerun-io/rerun/pull/10105) +- New `VideoStream` archetype for loose video samples [#10126](https://github.com/rerun-io/rerun/pull/10126) +- Enable `VideoStream` H264 on the web [#10189](https://github.com/rerun-io/rerun/pull/10189) +- Ensure LeRobot Dataloader logs tagged components [#10213](https://github.com/rerun-io/rerun/pull/10213) +- Support loading ROS paths in URDF loader [#10231](https://github.com/rerun-io/rerun/pull/10231) +- Move the default plot legend to bottom left instead of right [#10233](https://github.com/rerun-io/rerun/pull/10233) +- Add `FillMode` to `Capsules3D` [#10238](https://github.com/rerun-io/rerun/pull/10238) +- Make plot axis thinner [#10234](https://github.com/rerun-io/rerun/pull/10234) +- Add a UI Slider to change speed of eye camera in 3D Views [#10085](https://github.com/rerun-io/rerun/pull/10085) (thanks [@jccampagne](https://github.com/jccampagne)!) +- Delay showing video wait-for-decoder spinner on seeks [#10404](https://github.com/rerun-io/rerun/pull/10404) +- Rename `RecordingProperties` to `RecordingInfo` [#10411](https://github.com/rerun-io/rerun/pull/10411) +- Sharper icons on low-dpi screens (which is most of them) [#10508](https://github.com/rerun-io/rerun/pull/10508) +- Add tab-bar button to hide a view [#10520](https://github.com/rerun-io/rerun/pull/10520) +- Improve error message for FFmpeg not found [#10617](https://github.com/rerun-io/rerun/pull/10617) +- Add Eye Controls 3D (Camera) properties to blueprint for kind and speed [#10445](https://github.com/rerun-io/rerun/pull/10445) (thanks [@jccampagne](https://github.com/jccampagne)!) + +#### 🚀 Performance improvements +- Add detailed view of latency [#10173](https://github.com/rerun-io/rerun/pull/10173) +- Update tower http and tonic dependencies, improving `LogMsg` decode speed [#10209](https://github.com/rerun-io/rerun/pull/10209) +- Free up memory of inactive recordings [#10537](https://github.com/rerun-io/rerun/pull/10537) +- Compaction: performance & quality improvements [#10594](https://github.com/rerun-io/rerun/pull/10594) +- `rrd stats`: add transport-layer only fast path [#10605](https://github.com/rerun-io/rerun/pull/10605) +- `rrd stats`: parallelize decompression [#10606](https://github.com/rerun-io/rerun/pull/10606) +- Add documentation for all things compaction [#10674](https://github.com/rerun-io/rerun/pull/10674) + +#### 🧑‍🏫 Examples +- Fix custom view example not instantiating visualizer by default [#9762](https://github.com/rerun-io/rerun/pull/9762) +- Improve custom visualizer example [#9994](https://github.com/rerun-io/rerun/pull/9994) +- New example: log and animate a URDF file [#10210](https://github.com/rerun-io/rerun/pull/10210) +- Add Python example snippet for `VideoStream` using `av` to encode numpy images [#10279](https://github.com/rerun-io/rerun/pull/10279) +- Standalone example for compressed video streams [#10297](https://github.com/rerun-io/rerun/pull/10297) +- Add snippet demonstrating re-muxing of `VideoStream` data [#10614](https://github.com/rerun-io/rerun/pull/10614) + +#### 📚 Docs +- Fix errors in getting-started/data-in documentation [#10134](https://github.com/rerun-io/rerun/pull/10134) (thanks [@wyfo](https://github.com/wyfo)!) +- Make Rust getting-started example more idiomatic [#10137](https://github.com/rerun-io/rerun/pull/10137) (thanks [@wyfo](https://github.com/wyfo)!) +- Show help clicking the `?` as well as by just hovering it [#10160](https://github.com/rerun-io/rerun/pull/10160) +- Provide descriptor-aware `AnyValues` example in snippets [#10225](https://github.com/rerun-io/rerun/pull/10225) +- Update Video reference manual with information about `VideoStream` [#10423](https://github.com/rerun-io/rerun/pull/10423) +- Publish JS docs [#10410](https://github.com/rerun-io/rerun/pull/10410) +- Document changes to `VisualizerOverride` [#10486](https://github.com/rerun-io/rerun/pull/10486) +- Improve documentation around `AnyValues` and custom data [#10589](https://github.com/rerun-io/rerun/pull/10589) +- Add juxtaposition of `SeriesLines` and `SeriesPoints` to `visualizer-overrides` snippet [#10637](https://github.com/rerun-io/rerun/pull/10637) +- Micro-batching snippets [#10662](https://github.com/rerun-io/rerun/pull/10662) + +#### 🖼 UI improvements +- Introduce a DataFusion-backed table widget [#9764](https://github.com/rerun-io/rerun/pull/9764) +- Use `DataFusionTableWidget` for table entries [#9869](https://github.com/rerun-io/rerun/pull/9869) +- Selection ui now handles different images on the same entity path [#9928](https://github.com/rerun-io/rerun/pull/9928) +- Add a light mode theme [#9953](https://github.com/rerun-io/rerun/pull/9953) +- Save all selected recordings [#9968](https://github.com/rerun-io/rerun/pull/9968) +- Use archetype field name in ui instead of component name [#9983](https://github.com/rerun-io/rerun/pull/9983) +- Add keyboard navigation to the blueprint and streams tree [#9960](https://github.com/rerun-io/rerun/pull/9960) +- Allow selecting multiple recordings [#10004](https://github.com/rerun-io/rerun/pull/10004) +- Remove `data_based_visualizability_filter` from `BarChart` and `EncodedImage` [#10029](https://github.com/rerun-io/rerun/pull/10029) +- Add support for variant UIs in the DataFusion table widget and show a button in the partition table recording links [#10035](https://github.com/rerun-io/rerun/pull/10035) +- Switch icons to .svg [#10055](https://github.com/rerun-io/rerun/pull/10055) +- Improve button tooltip help text [#10103](https://github.com/rerun-io/rerun/pull/10103) +- Group components by archetype in the streams panel [#10124](https://github.com/rerun-io/rerun/pull/10124) +- Group components by archetype in selection panel [#10140](https://github.com/rerun-io/rerun/pull/10140) +- Zoom X/Y axes individually, in time series and bar chart view [#10159](https://github.com/rerun-io/rerun/pull/10159) +- Toggle maximized view with Ctrl+M [#10162](https://github.com/rerun-io/rerun/pull/10162) +- Add option to link the X-axis of multiple time plots [#10146](https://github.com/rerun-io/rerun/pull/10146) +- Animate the maximization of a view [#10163](https://github.com/rerun-io/rerun/pull/10163) +- Group dataframe table by archetype and use new table design [#10149](https://github.com/rerun-io/rerun/pull/10149) +- Add "deep inspection" selection ui for the new `VideoStream` archetype [#10239](https://github.com/rerun-io/rerun/pull/10239) +- Add duration field to the recording UI [#10284](https://github.com/rerun-io/rerun/pull/10284) (thanks [@pweids](https://github.com/pweids)!) +- Add catalog entry table [#10290](https://github.com/rerun-io/rerun/pull/10290) +- Highlight help buttons until the user clicks one of them [#10301](https://github.com/rerun-io/rerun/pull/10301) +- Highlight redap server list item if active [#10340](https://github.com/rerun-io/rerun/pull/10340) +- Allow editing connection settings for an existing redap server [#10300](https://github.com/rerun-io/rerun/pull/10300) +- Improved menu styling [#10357](https://github.com/rerun-io/rerun/pull/10357) +- Disambiguate component entries in selection panel [#10368](https://github.com/rerun-io/rerun/pull/10368) +- Display the partition ID in recording selection panel [#10387](https://github.com/rerun-io/rerun/pull/10387) +- Show average FPS of selected video [#10479](https://github.com/rerun-io/rerun/pull/10479) +- Rename the 'Welcome screen' option to 'Rerun examples' [#10503](https://github.com/rerun-io/rerun/pull/10503) +- Show arrow data in header tooltips and ever more data when alt is down [#10526](https://github.com/rerun-io/rerun/pull/10526) +- Add support for table entries in the redap browser [#10569](https://github.com/rerun-io/rerun/pull/10569) +- Add a 'copy entry url' button next to the name of remote datasets and table [#10571](https://github.com/rerun-io/rerun/pull/10571) +- Show loading screen when starting viewer with a URL [#10587](https://github.com/rerun-io/rerun/pull/10587) + +#### 🕸️ Web +- Support callbacks in React [#10518](https://github.com/rerun-io/rerun/pull/10518) +- Introduce `RecordingOpen` viewer event [#10654](https://github.com/rerun-io/rerun/pull/10654) + +#### 🧑‍💻 Dev-experience +- Show stderr output of external dataloaders [#10087](https://github.com/rerun-io/rerun/pull/10087) +- Dynamically Set Active Partition URL and Select Time Window [#10557](https://github.com/rerun-io/rerun/pull/10557) +- Log a warning when starting the viewer from inside a Docker container [#10306](https://github.com/rerun-io/rerun/pull/10306) + +#### 🗣 Refactors +- Add descriptors to all remaining blueprint components [#9908](https://github.com/rerun-io/rerun/pull/9908) +- Require `ComponentDescriptor` in `ChunkBuilder::with_component_batch*` methods [#10026](https://github.com/rerun-io/rerun/pull/10026) +- Make `archetype_field_name` mandatory in `ComponentDescriptor` [#10082](https://github.com/rerun-io/rerun/pull/10082) + +#### 📦 Dependencies +- Update to wgpu 0.25 [#10009](https://github.com/rerun-io/rerun/pull/10009) (thanks [@ThierryBerger](https://github.com/ThierryBerger)!) +- Update Arrow and DataFusion dedpendencies [#10195](https://github.com/rerun-io/rerun/pull/10195) +- Update egui to 0.32 [#10604](https://github.com/rerun-io/rerun/pull/10604) + +#### 🤷‍ Other +- Add migration tool for legacy .rrd files [#9816](https://github.com/rerun-io/rerun/pull/9816) +- Add support for remote dataset blueprints [#10128](https://github.com/rerun-io/rerun/pull/10128) +- Use new column name in `blueprint::datatypes::ComponentColumnSelector` [#10215](https://github.com/rerun-io/rerun/pull/10215) +- Support u16/u32/u64 wide Rerun `enum` types in data definition [#10252](https://github.com/rerun-io/rerun/pull/10252) +- `rerun rrd route` command to manipulate `.rrd`s on transport level [#10607](https://github.com/rerun-io/rerun/pull/10607) + +## [0.23.4](https://github.com/rerun-io/rerun/compare/0.23.3..0.23.4) - 2025-06-26 +- Fix `rerun rrd migrate` tool [#10350](https://github.com/rerun-io/rerun/pull/10350) + + +## [0.23.3](https://github.com/rerun-io/rerun/compare/0.23.2...0.23.3) - 2025-05-26 + +### 🔎 Details + +#### 🌊 C++ API +- Fix building with arrow 20.0.0 [#9966](https://github.com/rerun-io/rerun/pull/9966) (thanks [@adamreeve](https://github.com/adamreeve)!) +- Fix MSVC C++20 compilation issues [#9951](https://github.com/rerun-io/rerun/pull/9951) + +#### 🪳 Bug fixes +- Add draw order to video (-frame-reference), fix 2d objects sometimes being behind videos [#9946](https://github.com/rerun-io/rerun/pull/9946) +- Fix time series points querying extra points at start and end of time range (causing stuttering on playback in some scenes) [#9963](https://github.com/rerun-io/rerun/pull/9963) +- Increase max size of gRPC messages [#10006](https://github.com/rerun-io/rerun/pull/10006) +- Check TextEdit state before copying selection description [#10063](https://github.com/rerun-io/rerun/pull/10063) + +#### 🌁 Viewer improvements +- Use recording name for file name when saving a file [#9982](https://github.com/rerun-io/rerun/pull/9982) +- Improve error message for `QueryError` and `DataLoaderError` [#9998](https://github.com/rerun-io/rerun/pull/9998) + +#### 🚀 Performance improvements +- Series of build changes for web release to minimize generated wasm [#9870](https://github.com/rerun-io/rerun/pull/9870) + +#### 📚 Docs +- Remove remaining mentions of `rr.connect` [#10016](https://github.com/rerun-io/rerun/pull/10016) +- Update callbacks and custom_callbacks example docs to mention the other [#10062](https://github.com/rerun-io/rerun/pull/10062) +- Fix missing reference to `Spatial3DView` in `Pinhole` docs [#9932](https://github.com/rerun-io/rerun/pull/9932) (thanks [@hu-po](https://github.com/hu-po)!) +- Mention URL scheme in `connect_grpc` docs [#10018](https://github.com/rerun-io/rerun/pull/10018) + +#### 🤷‍ Other +- LeRobot: Add support for List datatype [#9958](https://github.com/rerun-io/rerun/pull/9958) + + +## [0.23.2](https://github.com/rerun-io/rerun/compare/0.23.1...0.23.2) - 2025-05-06 - RRD migration and bugfixes + +### ✨ Overview & highlights + +- New CLI tool to migrate `.rrd` files +- Various bugfixes + +#### `.rrd` migration tool + +With `0.23`, we made several breaking changes that resulted in older `.rrd` files not being able to load at all anymore. +To help smoothen the migration to `0.23`, we're introducing a `migrate` command to the Rerun CLI: + +``` +rerun rrd migrate colmap.rrd arkit.rrd rgbd.rrd +``` + +The command will copy the contents into a `.backup` file, and then migrate the file. + +Due to the incompatibility between `.rrd` files from `0.23` and those from earlier versions, this command likely +won't be able to migrate every recording perfectly. We expect the migration to work on files between `0.20` and `0.22`, +simpler recordings may work as far back as `0.18`. + +We plan to use this command future `.rrd` migrations as a way to fulfill our N+1 compatibility guarantee: +* Viewers after `0.23` will always be able to load recordings from the previous version. +* Recordings from `0.23` and beyond may be migrated to the next version. + +We currently have no plans for compatibility or migrations across multiple versions. + +#### 🪵 Log API +- Improve and mitigate warnings around data loss when flushing [#9846](https://github.com/rerun-io/rerun/pull/9846) + +#### 🐍 Python API +- Add `ViewerClient` to `rerun.experimental` [#9828](https://github.com/rerun-io/rerun/pull/9828) +- Improve `set_time` error handling for large Python integers [#9839](https://github.com/rerun-io/rerun/pull/9839) +- Properly resolve component selectors in dataset index creation and search APIs [#9854](https://github.com/rerun-io/rerun/pull/9854) +- Fix incorrectly advertised minimum supported `pyarrow` version (18.0.0 is required) [#9878](https://github.com/rerun-io/rerun/pull/9878) +- Fix incorrectly advertised numpy 1.x support (numpy2 is required now) [#9880](https://github.com/rerun-io/rerun/pull/9880) + +#### 🪳 Bug fixes +- Fix world grid not scaling correctly when camera is below the grid [#9867](https://github.com/rerun-io/rerun/pull/9867) +- Tensor view improvements [#9831](https://github.com/rerun-io/rerun/pull/9831) +- Fix size check for NV12 & YUY2 formats in C++ and Rust [#9890](https://github.com/rerun-io/rerun/pull/9890) + + +## [0.23.1](https://github.com/rerun-io/rerun/compare/0.23.0...0.23.1) - 2025-04-25 - Fix notebooks + +#### 🪳 Bug fixes +- Use correct URL for `RERUN_NOTEBOOK_ASSET` [#9800](https://github.com/rerun-io/rerun/pull/9800) + +#### 🌊 C++ API +- C++: Emit warnings when using deprecated Rerun types [#9801](https://github.com/rerun-io/rerun/pull/9801) + +#### 🐍 Python API +- Direct API for setting blueprint on a notebook-embedded viewer [#9804](https://github.com/rerun-io/rerun/pull/9804) + +#### 🌁 Viewer improvements +- Fix doclinks to archetypes [#9791](https://github.com/rerun-io/rerun/pull/9791) + +#### 🧑‍🏫 Examples +- Add link to Gradio annotation example [#9790](https://github.com/rerun-io/rerun/pull/9790) (thanks [@pablovela5620](https://github.com/pablovela5620)!) + +#### 🖼 UI improvements +- Show image format (resolution etc) of image blobs [#9792](https://github.com/rerun-io/rerun/pull/9792) + + +## [0.23.0](https://github.com/rerun-io/rerun/compare/0.22.1...0.23.0) - 2025-04-24 - Backwards compatible `.rrd` and multi-scalar logging + +* 📖 [Release blogpost](https://rerun.io/blog/release-0.23) +* 🧳 [Migration guide](https://rerun.io/docs/reference/migration/migration-0-23) + +### ✨ Overview & highlights + +#### Viewer + +* ⏩ [New .rrd format that will be backwards compatible](https://rerun.io/blog/release-0.23) +* 📈 Support for multiple scalars under a single entity +* ↪️ [Callbacks API for notebooks and JavaScript](https://rerun.io/docs/howto/callbacks) +* ⚙️ [New APIs for attaching properties (metadata) to recordings](https://github.com/rerun-io/rerun/blob/0.23.0/docs/snippets/all/concepts/recording_properties.py) +* 🧮 [Experimental support for tables and dataframes](https://rerun.io/docs/howto/logging/send-table) + +#### Multiple scalars under a single entity + +In this release we have added support for logging scalar data with multiple signals, under the same entity. This allow you to log data that inherently belongs together, such as the action values in a LeRobot dataset or gyroscope measurements, under the same entity path. + +As part of this update, we're deprecating the `SeriesLine/SeriesPoint/Scalar` archetypes in favor of the plural versions `SeriesLines/SeriesPoints/Scalars`, for consistent naming with the other archetypes. + +For example, the `x`, `y` and `z` component of a gyroscope measurement, previously would be logged as separate entities: + +```py +rr.log("gyroscope/x", rr.Scalar(measurement[0])) +rr.log("gyroscope/y", rr.Scalar(measurement[1])) +rr.log("gyroscope/z", rr.Scalar(measurement[2])) +``` + +Now can be logged under a single entity: + +```py +rr.log("gyroscope", rr.Scalars(measurement)) +``` + +

+ +
+ See the new IMU signals example for more +

+ +The `SeriesLine` and `SeriesPoints` archetypes now include a `visible_series` component that lets you control which series appear in your visualizations. Unlike the regular entity visibility property, hidden series will still show up in the legend. + +![Image](https://github.com/user-attachments/assets/8a645f6e-787b-4671-8534-40b97cfc77a3) + + +#### Callbacks API for notebooks and JavaScript +We've added a (limited) API with callbacks, useable from JavaScript and from Notebooks (but not yet from out logging SDKs). + +With this you can easily write simple annotations tools. +We've created an example for this using [Gradio](https://www.gradio.app/) at . + +![Annotation example](https://github.com/user-attachments/assets/0ca80087-4589-4bb1-b010-c1991478d25d) + + +#### Recording properties + +For this release, we have improved Rerun's logging capabilities. There is a new _recording properties_ concept in all of our APIs. +Recording properties allow you to attach metadata to a recording. +For example, you can now change the name of your recording via `.send_recording_name("My episode")`, which will show up in the recording panel of the viewer as well. +You can also log arbitrary data via the general `.send_property()` method. +Properties are logged as static data and will therefore show up in the timeline as well. +Also, the side-panel shows an overview of the properties when a recording is selected. + +Image + +Image + +Image + +Our snippets now contain examples for recording properties in all SDKs: + +* [🐍 Python (`recording_properties.py`)](https://github.com/rerun-io/rerun/blob/main/docs/snippets/all/concepts/recording_properties.py) +* [🦀 Rust (`recording_properties.rs`)](https://github.com/rerun-io/rerun/blob/main/docs/snippets/all/concepts/recording_properties.rs) +* [🌊 C++ (`recording_properties.cpp`)](https://github.com/rerun-io/rerun/blob/main/docs/snippets/all/concepts/recording_properties.cpp) + +#### Experimental `send_table` API + +We are also working on better support for tables and dataframes in Rerun, a feature that has been requested several times by our community. With this release, there is now an _experimental_ API `send_table` that can be used to send arbitrary Arrow record batches via the Python SDK and from notebooks. For now, while we evolve this feature, this API is separate from the rest of our logging APIs. [This tutorial](https://rerun.io/docs/howto/logging/send-table) shows how to use this APIs and also provides more details on the current implementation. In future releases, we plan to improve support for the table representation in the viewer to facility more advanced analysis tasks such as filtering, or showing summary statistics. + +Please note that this is distinct from our current `send_dataframe` API and dataframe query view. + +Image + +### ⚠️ Breaking changes + +This release changes how the SDKs interact with the viewer, as Rerun now relies heavily on gRPC. +Additionally, we have changed our file format and data model to be much more flexible in the future. +These changes will improve our backwards-compatibility going forward, but this also means that this release introduces breaking changes to our `.rrd` format and how the SDKs communicate with the viewer. + +- `.rrd` files from previous releases cannot be loaded anymore +- Removed unsupported connection methods from the SDKs +- The connection URLs have changed and now require a `rerun://` (TLS) or `rerun+http://` (unencrypted) prefix +- Several changes to our logging SDKs (timelines, time units, …) + +You can find more information in our 🧳 [migration guide](https://rerun.io/docs/reference/migration/migration-0-23) + +### 🔎 Details + +#### 🪵 Log API +- Migrate file format to protobuf [#8995](https://github.com/rerun-io/rerun/pull/8995) +- Move `rerun.components.blueprint.Visible` to `rerun.components.Visible` [#9067](https://github.com/rerun-io/rerun/pull/9067) +- Infer column partition size from shape in `Scalar.columns()` [#9068](https://github.com/rerun-io/rerun/pull/9068) +- Infer partition size for FixedSizeList-backed components [#9210](https://github.com/rerun-io/rerun/pull/9210) +- Recording properties for naming recordings and adding information [#9249](https://github.com/rerun-io/rerun/pull/9249) +- Provide APIs to log arbitrary data to recording properties [#9316](https://github.com/rerun-io/rerun/pull/9316) +- Deprecate `SeriesLine`/`SeriesPoint`/`Scalar` in favor of `SeriesLines`/`SeriesPoints`/`Scalars` [#9338](https://github.com/rerun-io/rerun/pull/9338) +- Add `serve_grpc` API [#9447](https://github.com/rerun-io/rerun/pull/9447) +- Add experimental `send_recording` python api [#9148](https://github.com/rerun-io/rerun/pull/9148) +- Implement `send_table` in `re_grpc_server` and `re_viewer` [#9510](https://github.com/rerun-io/rerun/pull/9510) +- Example showcasing `send_table` from notebooks [#9522](https://github.com/rerun-io/rerun/pull/9522) +- Add `rr.serve_web_viewer` [#9540](https://github.com/rerun-io/rerun/pull/9540) +- Add experimental `send_table` to Python SDK [#9538](https://github.com/rerun-io/rerun/pull/9538) +- Fix handling of custom indicator components [#9755](https://github.com/rerun-io/rerun/pull/9755) + +#### 🌊 C++ API +- Migrate SDK comms to gRPC [#8838](https://github.com/rerun-io/rerun/pull/8838) +- New C++ API for timestamp/duration indices [#9200](https://github.com/rerun-io/rerun/pull/9200) +- Remove deprecated C++ `connect` APIs [#9212](https://github.com/rerun-io/rerun/pull/9212) +- Add `detach_process` option to `spawn` [#9400](https://github.com/rerun-io/rerun/pull/9400) (thanks [@imstevenpmwork](https://github.com/imstevenpmwork)!) +- Consistent constructor naming of `Asset3D` across C++ and Rust [#9239](https://github.com/rerun-io/rerun/pull/9239) (thanks [@abhishek47kashyap](https://github.com/abhishek47kashyap)!) +- Use consistent time unit names for our API [#9343](https://github.com/rerun-io/rerun/pull/9343) +- CMake: Use `find_dependency` for Arrow [#9548](https://github.com/rerun-io/rerun/pull/9548) (thanks [@BillyONeal](https://github.com/BillyONeal)!) +- Set `RERUN_ARROW_LINK_SHARED_DEFAULT` based on found Arrow build [#9550](https://github.com/rerun-io/rerun/pull/9550) (thanks [@BillyONeal](https://github.com/BillyONeal)!) + +#### 🐍 Python API +- Migrate SDK comms to gRPC [#8838](https://github.com/rerun-io/rerun/pull/8838) +- Update maturin to 1.8.1 and fix `pyproject.toml` [#9104](https://github.com/rerun-io/rerun/pull/9104) +- Add `rr.set_index` to replace `rr.set_time_*` [#9166](https://github.com/rerun-io/rerun/pull/9166) +- Fix support for numpy-2 [#9109](https://github.com/rerun-io/rerun/pull/9109) +- Add `rr.IndexColumn` [#9179](https://github.com/rerun-io/rerun/pull/9179) +- Python SDK spring cleaning: 3.9, no more monkey patching, more lints [#9182](https://github.com/rerun-io/rerun/pull/9182) +- Enable a bunch of `ruff` lints [#9201](https://github.com/rerun-io/rerun/pull/9201) +- Remove deprecated Python APIs: `log_components`, `connect`, `connect_tcp` [#9197](https://github.com/rerun-io/rerun/pull/9197) +- Remove deprecated `rr.serve()` [#9207](https://github.com/rerun-io/rerun/pull/9207) +- Deprecate `rr.new_recording()` in favor of `rr.RecordingStream()` and improve type checking of the Rust bindings [#9206](https://github.com/rerun-io/rerun/pull/9206) +- Archetype based overrides & defaults [#9209](https://github.com/rerun-io/rerun/pull/9209) +- Fix several typing annotations in the SDK and run mypy on snippets [#9260](https://github.com/rerun-io/rerun/pull/9260) +- Correct truncation of AnyValues when using strings or bytes [#9269](https://github.com/rerun-io/rerun/pull/9269) +- New `EntityBehavior` archetype for easy `visible`/`interactive` blueprint overrides [#9281](https://github.com/rerun-io/rerun/pull/9281) +- Fix the string representation of archetypes [#9297](https://github.com/rerun-io/rerun/pull/9297) +- Initial python wrapper for the new catalog API [#9301](https://github.com/rerun-io/rerun/pull/9301) +- Change signature of `set_time_ctrl` to match `set_time` [#9342](https://github.com/rerun-io/rerun/pull/9342) +- Add `detach_process` option to `spawn` [#9400](https://github.com/rerun-io/rerun/pull/9400) (thanks [@imstevenpmwork](https://github.com/imstevenpmwork)!) +- Use consistent time unit names for our API [#9343](https://github.com/rerun-io/rerun/pull/9343) +- Allow passing url to notebook viewer [#9493](https://github.com/rerun-io/rerun/pull/9493) +- Import `rerun.notebook` lazily [#9557](https://github.com/rerun-io/rerun/pull/9557) +- Fix `Mat3x3` shape inference in `.columns` api [#9569](https://github.com/rerun-io/rerun/pull/9569) +- Cleanup `rerun.utilities` and remove unused utilities [#9759](https://github.com/rerun-io/rerun/pull/9759) + +#### 🦀 Rust API +- Migrate SDK comms to gRPC [#8838](https://github.com/rerun-io/rerun/pull/8838) +- Document default-log level change [#8988](https://github.com/rerun-io/rerun/pull/8988) +- Transposed `RecordBatch` formatter and other niceties [#9056](https://github.com/rerun-io/rerun/pull/9056) +- Fix `insta` crate leaking into regular (non-testing) builds [#9092](https://github.com/rerun-io/rerun/pull/9092) +- Update MSRV to 1.84 [#9216](https://github.com/rerun-io/rerun/pull/9216) +- Remove deprecated Rust `connect` APIs [#9219](https://github.com/rerun-io/rerun/pull/9219) +- Introduce `IndexCell` [#9226](https://github.com/rerun-io/rerun/pull/9226) +- Add `RecordingStream::set_index` [#9236](https://github.com/rerun-io/rerun/pull/9236) +- Add Rust Viewer Callbacks example [#9346](https://github.com/rerun-io/rerun/pull/9346) +- Make `BinaryStream::read` produce full RRD files [#9352](https://github.com/rerun-io/rerun/pull/9352) +- Add `detach_process` option to `spawn` [#9400](https://github.com/rerun-io/rerun/pull/9400) (thanks [@imstevenpmwork](https://github.com/imstevenpmwork)!) +- Consistent constructor naming of `Asset3D` across C++ and Rust [#9239](https://github.com/rerun-io/rerun/pull/9239) (thanks [@abhishek47kashyap](https://github.com/abhishek47kashyap)!) +- Use consistent time unit names for our API [#9343](https://github.com/rerun-io/rerun/pull/9343) + +#### 🪳 Bug fixes +- Fix time series marker sizes not being able to vary over time [#9035](https://github.com/rerun-io/rerun/pull/9035) +- Fix shader compilation failure in Chrome 131 [#9152](https://github.com/rerun-io/rerun/pull/9152) (thanks [@yakunouyang](https://github.com/yakunouyang)!) +- Fix setting visible time range from overrides [#9151](https://github.com/rerun-io/rerun/pull/9151) +- Speed up 2d spawn heuristic for many entities & fix heuristic creating overlapping views for `EncodedImage` [#9308](https://github.com/rerun-io/rerun/pull/9308) +- Fix time series display range being affected by invisible plots [#9353](https://github.com/rerun-io/rerun/pull/9353) +- Improve `rerun.notebook.Viewer` constructor [#9495](https://github.com/rerun-io/rerun/pull/9495) + +#### 🌁 Viewer improvements +- Make `SeriesLine` visualizer work with several scalars per time [#9033](https://github.com/rerun-io/rerun/pull/9033) +- Load depth images from Le Robot datasets [#9049](https://github.com/rerun-io/rerun/pull/9049) +- Fix inconsistencies in plot highlights [#9061](https://github.com/rerun-io/rerun/pull/9061) +- Add command palette action for resetting to the default blueprint [#9088](https://github.com/rerun-io/rerun/pull/9088) +- Plot series visibility separarate from entity visibility, handle multi-series visibility [#9079](https://github.com/rerun-io/rerun/pull/9079) +- Support Unitree LeRobot dataset naming format [#9100](https://github.com/rerun-io/rerun/pull/9100) +- Add context menu action to copy entity paths to clipboard [#9137](https://github.com/rerun-io/rerun/pull/9137) +- Copy description of selection (entity path, store id, etc.) via `cmd/ctrl + c` [#9172](https://github.com/rerun-io/rerun/pull/9172) +- Editable time control & time context menus [#9174](https://github.com/rerun-io/rerun/pull/9174) +- Check dataset version when loading LeRobot dataset [#9233](https://github.com/rerun-io/rerun/pull/9233) +- Enable scalar arrays per time point for scatter plots [#9327](https://github.com/rerun-io/rerun/pull/9327) +- Double clicking plots focuses them now in other panels [#9333](https://github.com/rerun-io/rerun/pull/9333) +- Use multi-dimensional scalar values when loading LeRobot dataset [#9402](https://github.com/rerun-io/rerun/pull/9402) +- Infer image/video channel index from LeRobot metadata [#9435](https://github.com/rerun-io/rerun/pull/9435) +- Improve view heuristics for time series plot [#9587](https://github.com/rerun-io/rerun/pull/9587) + +#### 🧑‍🏫 Examples +- Add example for python notebook with partial & columnar updates [#8956](https://github.com/rerun-io/rerun/pull/8956) +- IMU data example [#9102](https://github.com/rerun-io/rerun/pull/9102) +- Add Mast3r_slam Example [#9242](https://github.com/rerun-io/rerun/pull/9242) (thanks [@pablovela5620](https://github.com/pablovela5620)!) + +#### 📚 Docs +- Add link to Snap Store in Getting Started [#8972](https://github.com/rerun-io/rerun/pull/8972) (thanks [@artivis](https://github.com/artivis)!) +- Document testing in Rerun [#8989](https://github.com/rerun-io/rerun/pull/8989) +- Fix rustdocs for `re_video` [#9295](https://github.com/rerun-io/rerun/pull/9295) +- Callbacks: Update APIs, improve docs [#9312](https://github.com/rerun-io/rerun/pull/9312) +- Update `__` as reserved entity path in docs [#9387](https://github.com/rerun-io/rerun/pull/9387) +- Update cpp/eigen_opencv README snippets [#9463](https://github.com/rerun-io/rerun/pull/9463) (thanks [@ExpertOfNil](https://github.com/ExpertOfNil)!) +- Include field names in Archetype docs [#9563](https://github.com/rerun-io/rerun/pull/9563) +- Unify viewer callbacks into a single `Event` interface [#9739](https://github.com/rerun-io/rerun/pull/9739) +- Document `send_table` in the Python SDK [#9589](https://github.com/rerun-io/rerun/pull/9589) + +#### 🖼 UI improvements +- Improve `redap://` connection UX and error messages [#9045](https://github.com/rerun-io/rerun/pull/9045) +- First iteration of a dedicated UI and communication for the Redap server/catalog/collection browser [#9018](https://github.com/rerun-io/rerun/pull/9018) +- Persist servers and allow adding/removing them from the UI [#9086](https://github.com/rerun-io/rerun/pull/9086) +- Show EXIF data for JPEG/TIFF images [#9153](https://github.com/rerun-io/rerun/pull/9153) +- Add entity search to the add/remove entity modal [#9120](https://github.com/rerun-io/rerun/pull/9120) +- Streamline the help view shortcuts with the shortcuts in the menu [#9268](https://github.com/rerun-io/rerun/pull/9268) +- Group open recordings by origin, dataset/appid and examples [#9377](https://github.com/rerun-io/rerun/pull/9377) +- Implement basic UI to display recording properties [#9381](https://github.com/rerun-io/rerun/pull/9381) +- Better distinction and explanation of reserved namespaces in the UI [#9390](https://github.com/rerun-io/rerun/pull/9390) +- Add `TableStore` for table/dataframe entries + basic UI [#9437](https://github.com/rerun-io/rerun/pull/9437) +- Display thumbnail in tables by generating content-based hash for `Blob` components [#9500](https://github.com/rerun-io/rerun/pull/9500) +- Do not hide all entities when the search is active but empty [#9734](https://github.com/rerun-io/rerun/pull/9734) + +#### 🕸️ Web +- Add selection change and time(line) change callbacks to Jupyter Notebook and JS APIs [#9147](https://github.com/rerun-io/rerun/pull/9147) + +#### 🧑‍💻 Dev-experience +- Run `mypy` on the contents of `scripts/` [#9214](https://github.com/rerun-io/rerun/pull/9214) +- Fix Bazel build: shader reloading only on in Rerun workspace [#9414](https://github.com/rerun-io/rerun/pull/9414) + +#### 📦 Dependencies +- Update egui to 0.31.1 [#9186](https://github.com/rerun-io/rerun/pull/9186) +- feat: update arrow to 54 [#9259](https://github.com/rerun-io/rerun/pull/9259) + +#### 🤷‍ Other +- Identify timelines uniquely by name (ignore type) [#9097](https://github.com/rerun-io/rerun/pull/9097) +- Revert log level to `info` for everything except Python sdk [#9231](https://github.com/rerun-io/rerun/pull/9231) +- Split `TimeType::Time`; changing dataloader API [#9292](https://github.com/rerun-io/rerun/pull/9292) +- Remove unreleased attribute [0ec699aef5a08695e337a581ee6a2a1ccd2d01a3](https://github.com/rerun-io/rerun/commit/0ec699aef5a08695e337a581ee6a2a1ccd2d01a3) +- Remove speculative-links [b0ea95e9d09dd14ff70264afb4027d6b33cc14af](https://github.com/rerun-io/rerun/commit/b0ea95e9d09dd14ff70264afb4027d6b33cc14af) +- Fix scalars docs [6b7bf5f98527cb9622759a2dbb64e247d55deeca](https://github.com/rerun-io/rerun/commit/6b7bf5f98527cb9622759a2dbb64e247d55deeca) + + +## [0.22.1](https://github.com/rerun-io/rerun/compare/0.21.0...0.22.0) - Bugfixes - 2025-02-20 + +A small release addressing bugs and polishing rough edges. + +### 🛠️ Note on 0.20.0 release + +An issue with the 0.20.0 release led to incorrect artifacts being published, causing a few minor changes to be missing from those artifacts. The correct version has always been available on crates.io, PyPI, Conda, and other distribution channels, so no action is needed if you installed from these sources. + +### 🤖 Native loading for LeRobot datasets +We're gradually rolling out support for native loading of LeRobot datasets. It’s not fully feature-complete yet, there are tons of variations in these datasets, so it’ll take a bit of time to cover all the edge cases. More improvements and features are planned for the 0.23 release, so expect things to get smoother and more robust soon. + +If you run into any issues, let us know! Your feedback helps us iron out bugs and improve the experience faster. + +https://github.com/user-attachments/assets/4b6d7e8c-02c6-43c9-be66-dcdbcf782cbd + +### 🔎 Details + +#### 🐍 Python API +- Don't use `np.float_` since it was removed in numpy 2.0 [#9037](https://github.com/rerun-io/rerun/pull/9037) + +#### 🪳 Bug fixes +- Never drop blueprint data from the WS server's message buffer [#8977](https://github.com/rerun-io/rerun/pull/8977) (thanks [@DerpDays](https://github.com/DerpDays)!) +- Fix bug leading to swizzled lerobot data in dataloader [#9000](https://github.com/rerun-io/rerun/pull/9000) +- Fix Arrows2D draw order having no effect [#9054](https://github.com/rerun-io/rerun/pull/9054) +- Fix non-final releases creating final-release git tags [#9085](https://github.com/rerun-io/rerun/pull/9085) + +#### 🌁 Viewer improvements +- Infer entity paths from LeRobot dataset feature metadata [#8981](https://github.com/rerun-io/rerun/pull/8981) +- Log task descriptions for each LeRobot dataset episode [#9028](https://github.com/rerun-io/rerun/pull/9028) +- Load lerobot dataset on separate IO thread [#9027](https://github.com/rerun-io/rerun/pull/9027) + +#### 🧑‍🏫 Examples +- Improve `image_column_updates` python example [#9065](https://github.com/rerun-io/rerun/pull/9065) + +#### 🖼 UI improvements +- Fix link in text log view help text [#8963](https://github.com/rerun-io/rerun/pull/8963) + + +## [0.22.0](https://github.com/rerun-io/rerun/compare/0.21.0...0.22.0) - Entity filter & improved partial update API - 2025-02-06 + +The new entity filtering: + +https://github.com/user-attachments/assets/75ae114b-a55c-452e-9003-d8f447854d2a + +The new notification panel: + +![notification-panel](https://github.com/user-attachments/assets/0fb651d7-256a-48d7-a78e-81776ec39ba8) + +Copy any view as screenshot with right-click (now works in web-viewer): + +![image](https://github.com/user-attachments/assets/bf36ee0b-2f64-473e-af48-dfd22c887b9c) + +New help texts for all our views: + +![image](https://github.com/user-attachments/assets/8b2546c7-c54f-4c25-8b82-fd9abdc6c31e) + +📖 Release blogpost: https://rerun.io/blog/graphs + +🧳 Migration guide: https://rerun.io/docs/reference/migration/migration-0-22 + +### ✨ Overview & highlights + +#### Viewer +* 🔎 Added entity filtering/searching +* 🔔 Recent notifications show now in a dedicated panel +* 🖱️ Entity ranges can now be selected with shift + click +* ❓ Improved panel help +* 🖼️ Crisper UI rendering +* 🧊 Faster 3D transforms + +#### APIs +* 🔄 [Much easier partial updates of archetypes](https://rerun.io/docs/howto/logging/send-partial-updates) +* 📊 [Greatly improved ease of use of `send_columns`](https://rerun.io/docs/howto/logging-and-ingestion/send-columns) +* ⏱️ Python notebooks & JS can now control the timeline and panel states (see last section of [this notebook](https://github.com/rerun-io/rerun/blob/0.22.0/examples/python/notebook/cube.ipynb)) +* 📝 Lots of [new snippets](https://github.com/rerun-io/rerun/blob/0.22.0/docs/snippets/INDEX.md) for demonstrating partial updates & custom data logging in Python/C++/Rust + +The API & related under-the-hood changes pave the way for better support for multiple archetypes on the same entity and components with generic types in future releases. +Stay tuned! + +### ⚠️ Breaking changes +Passing raw batches of components is no longer supported. Instead, use the partial update APIs (or in rare cases, explicitly serialize the components). + +Check the [🧳 Migration guide](https://rerun.io/docs/reference/migration/migration-0-22) for before/after snippets for all languages for this and other smaller breaking changes. + +### 🔎 Details + +#### 🪵 Log API +- Tensor shape and dimension names are now separate arrow fields [#8376](https://github.com/rerun-io/rerun/pull/8376) +- Remove deprecated `DisconnectedSpace` archetype & component [#8545](https://github.com/rerun-io/rerun/pull/8545) +- Add `any_values` and `extra_values` snippets for rust [#8718](https://github.com/rerun-io/rerun/pull/8718) +- Implement gRPC log sink [#8709](https://github.com/rerun-io/rerun/pull/8709) +- Implement gRPC log stream [#8730](https://github.com/rerun-io/rerun/pull/8730) + +#### 🌊 C++ API +- Fix compilation for GCC 13.3 (missing `cstdint` include) [#8609](https://github.com/rerun-io/rerun/pull/8609) (thanks [@plumonito](https://github.com/plumonito)!) +- Introduce eager serialization & update/clear APIs in the C++ SDK [#8727](https://github.com/rerun-io/rerun/pull/8727) +- Make all C++ archetypes eager serialized & provide generated update/clear APIs [#8779](https://github.com/rerun-io/rerun/pull/8779) +- C++ `columns` method for convenient `send_columns` call through archetypes [#8828](https://github.com/rerun-io/rerun/pull/8828) +- Add `with_many_` variants for C++ archetype mono fields & port remaining snippets [#8836](https://github.com/rerun-io/rerun/pull/8836) +- Require descriptors to be provided on all log calls in C++ (either explicitly or implicitly via archetype) [#8853](https://github.com/rerun-io/rerun/pull/8853) +- Deprecate C++ `TimeColumn::from_sequence_points` in favor of `TimeColumn::from_sequence` [#8882](https://github.com/rerun-io/rerun/pull/8882) +- `AsComponents::serialize` is now `AsComponents::as_batches` and returns `Collection` [#8884](https://github.com/rerun-io/rerun/pull/8884) +- Make it easy to log custom arrow data in C++ [#8880](https://github.com/rerun-io/rerun/pull/8880) +- Rerun CMake dependency now automatically ensures C++17 or newer [#8898](https://github.com/rerun-io/rerun/pull/8898) + +#### 🐍 Python API +- Autogenerated partial updates APIs for Python [#8671](https://github.com/rerun-io/rerun/pull/8671) +- Remove unused `num_instances()` method [#8702](https://github.com/rerun-io/rerun/pull/8702) +- Tagged columnar updates: Python [#8792](https://github.com/rerun-io/rerun/pull/8792) +- Include a python API for routing time control commands to the notebook instance [#8809](https://github.com/rerun-io/rerun/pull/8809) +- Python: remove legacy `send_columns` and update everything left [#8799](https://github.com/rerun-io/rerun/pull/8799) +- Deprecate Python's `log_components` [#8892](https://github.com/rerun-io/rerun/pull/8892) + +#### 🦀 Rust API +- Update MSRV to 1.81 [#8529](https://github.com/rerun-io/rerun/pull/8529) +- Fix `RecordingStream::log` implicitly requiring `Sized` [#8587](https://github.com/rerun-io/rerun/pull/8587) +- Add example for extending the viewer with custom callbacks [#8284](https://github.com/rerun-io/rerun/pull/8284) +- `EntityPathFilter` variable substitutions are now delegated to (new) `ResolvedEntityPathFilter` [#8543](https://github.com/rerun-io/rerun/pull/8543) +- Specify, test, and fix all broken `AsComponents`<>`ComponentBatch` interactions from blanket impls [#8591](https://github.com/rerun-io/rerun/pull/8591) +- New types and traits for (co-existing!) eager serialization [#8642](https://github.com/rerun-io/rerun/pull/8642) +- Autogenerate tagging-compliant descriptor methods for all archetypes [#8643](https://github.com/rerun-io/rerun/pull/8643) +- Automatically generate partial update APIs for eager archetypes [#8647](https://github.com/rerun-io/rerun/pull/8647) +- Tagged columnar updates: Rust [#8764](https://github.com/rerun-io/rerun/pull/8764) +- Make `Box`/`AssetVideo`/`ViewCoordinates`/`Asset3D` eager serialized in Rust [#8785](https://github.com/rerun-io/rerun/pull/8785) +- Make `Pinhole` archetype in Rust eager serialized [#8789](https://github.com/rerun-io/rerun/pull/8789) +- Make `Image` & `Mesh3D` archetypes in Rust eager serialized [#8793](https://github.com/rerun-io/rerun/pull/8793) +- Make rust `Tensor` archetype eager serialized [#8801](https://github.com/rerun-io/rerun/pull/8801) +- Rust: remove legacy `send_columns` and update everything left [#8804](https://github.com/rerun-io/rerun/pull/8804) +- `ComponentBatch` doesn't implement `AsComponents` anymore [#8820](https://github.com/rerun-io/rerun/pull/8820) +- Set default log level in `re_log` to `warn` [#8918](https://github.com/rerun-io/rerun/pull/8918) + +#### 🪳 Bug fixes +- Fix WSL support, update troubleshooting guide [#8610](https://github.com/rerun-io/rerun/pull/8610) +- Handle empty line strips in the viewer [#8653](https://github.com/rerun-io/rerun/pull/8653) +- Fix clicking of links in markdown [#8794](https://github.com/rerun-io/rerun/pull/8794) +- Fix CPU spike caused by hanging connection after socket closure (#8806) [#8810](https://github.com/rerun-io/rerun/pull/8810) (thanks [@goktug97](https://github.com/goktug97)!) +- Make it possible to change the contents of a view multiple times per frame [#8854](https://github.com/rerun-io/rerun/pull/8854) +- Fix playback issues with some h264 videos on native & Safari [#8850](https://github.com/rerun-io/rerun/pull/8850) +- Fix handling null timestamps in the dataframe [#8897](https://github.com/rerun-io/rerun/pull/8897) + +#### 🌁 Viewer improvements +- Remove all legacy Chunk iteration APIs [#8556](https://github.com/rerun-io/rerun/pull/8556) +- Implement copy-screenshot-to-clipboard on Web [#8607](https://github.com/rerun-io/rerun/pull/8607) +- Improve transform performance (by caching affine transforms resulting from transform components) [#8691](https://github.com/rerun-io/rerun/pull/8691) + +#### 🧑‍🏫 Examples +- add prompt depth anything example [#8888](https://github.com/rerun-io/rerun/pull/8888) (thanks [@pablovela5620](https://github.com/pablovela5620)!) + +#### 📚 Docs +- Add new `Transform3D` partial updates snippet for all languages [#8690](https://github.com/rerun-io/rerun/pull/8690) +- doc: Update `annotation-context.rs` to use correct API [#8708](https://github.com/rerun-io/rerun/pull/8708) (thanks [@OlivierLDff](https://github.com/OlivierLDff)!) + +#### 🖼 UI improvements +- Show the `GraphNode` as a label by default [#8542](https://github.com/rerun-io/rerun/pull/8542) +- Short circuit graph simulation if all nodes are fixed [#8549](https://github.com/rerun-io/rerun/pull/8549) +- Panel with recent notifications [#8465](https://github.com/rerun-io/rerun/pull/8465) +- Fix tooltips being dragged along in graph view [#8573](https://github.com/rerun-io/rerun/pull/8573) +- Restore the time panel help button [#8599](https://github.com/rerun-io/rerun/pull/8599) +- Filter entities in the UI (part 0): Make `CustomContent` more useful [#8645](https://github.com/rerun-io/rerun/pull/8645) +- Filter entities in the UI (part 1): Introduce a filter widget [#8652](https://github.com/rerun-io/rerun/pull/8652) +- Filter entities in the UI (part 2): Introduce entity filtering in the time panel [#8654](https://github.com/rerun-io/rerun/pull/8654) +- Filter entities in the UI (part 3): Move action to a menu in the blueprint panel and keep default blueprint when using heuristics [#8672](https://github.com/rerun-io/rerun/pull/8672) +- Filter entities in the UI (part 4): Add entity filtering in the blueprint tree [#8706](https://github.com/rerun-io/rerun/pull/8706) +- Draw nodes above edges in graph view [#8738](https://github.com/rerun-io/rerun/pull/8738) +- Filter entities in the UI (part 5): Add snapshot tests for the blueprint tree [#8728](https://github.com/rerun-io/rerun/pull/8728) +- Filter entities in the UI (part 6): Refactor `re_blueprint_tree` and add more tests [#8795](https://github.com/rerun-io/rerun/pull/8795) +- Improve performance for Blueprint & Streams Panel for many entities [#8808](https://github.com/rerun-io/rerun/pull/8808) +- The empty/full entity icon now reflects presence of component on the current timeline [#8839](https://github.com/rerun-io/rerun/pull/8839) +- Show start of large arrow values instead of just their size [#8861](https://github.com/rerun-io/rerun/pull/8861) +- Implement range selection with shift-click in the blueprint tree [#8852](https://github.com/rerun-io/rerun/pull/8852) +- Filter entities in the UI (part 7): Refactor and optimize `re_time_panel` and add more tests [#8863](https://github.com/rerun-io/rerun/pull/8863) +- Clickable URLs in named components / `AnyValues` [#8864](https://github.com/rerun-io/rerun/pull/8864) +- Implement range selection with shift-click in the time panel [#8870](https://github.com/rerun-io/rerun/pull/8870) +- Improve look of bar charts slightly [#8875](https://github.com/rerun-io/rerun/pull/8875) +- Improved help view [#8947](https://github.com/rerun-io/rerun/pull/8947) + +#### 🕸️ Web +- Add JS timeline control and callback APIs [#8673](https://github.com/rerun-io/rerun/pull/8673) + +#### ✨ Other enhancement +- Remove `Chunk::iter_component_arrays` [#8548](https://github.com/rerun-io/rerun/pull/8548) +- Introduce new Chunk iteration APIs [#8553](https://github.com/rerun-io/rerun/pull/8553) + +#### 📈 Analytics +- Add analytics for wgpu backend and whether the viewer runs in WSL [#8612](https://github.com/rerun-io/rerun/pull/8612) + +#### 📦 Dependencies +- Update wgpu to 24.0.0 [#8743](https://github.com/rerun-io/rerun/pull/8743) + +#### 🤷‍ Other +- Introduce snapshot unit tests for `re_component_ui` [#8546](https://github.com/rerun-io/rerun/pull/8546) + + +## [0.21.0](https://github.com/rerun-io/rerun/compare/0.20.3...0.21.0) - Graph view, 3D Grid & UI/UX improvements + +📖 Release blogpost: https://rerun.io/blog/graphs + +🧳 Migration guide: https://rerun.io/docs/reference/migration/migration-0-21 + +### ✨ Overview & highlights + +#### Graph view + +We've added two new logging primitives: [`GraphNodes`](https://rerun.io/docs/reference/types/archetypes/graph_nodes) and [`GraphEdges`](https://rerun.io/docs/reference/types/archetypes/graph_edges) that can be used to visualize node-link diagrams. For this, we have implemented a new Graph View that uses force-based layouts to draw graphs. + +This video demonstrates the main features of the new graph view: + +https://github.com/user-attachments/assets/77db75c9-a8d8-401d-b90d-3daf08baf0ba + +You can also have a look at https://github.com/rerun-io/rerun/pull/7500 if you want to learn to more. + +#### UX improvements + +This video demonstrates the main UX improvements that went into this release: + +https://github.com/user-attachments/assets/bef071b5-0681-41b2-9ef0-1c6a557ff138 + +#### 3D grid + +The 3D view now offers an infinite 3D grid, enabled by default. Further controls and settings are available as usual through the blueprint API and/or the selection panel. + +

+ + + +

+ +All the nitty gritty details in https://github.com/rerun-io/rerun/pull/8230 and https://github.com/rerun-io/rerun/pull/8234. + +#### Undo/Redo support & many more UI/UX improvements + +You can now undo/redo blueprint changes in the viewer! +Watch [@emilk](https://github.com/emilk/) putting it to action and explains how it works: + +https://github.com/user-attachments/assets/a29c099d-35a3-4d32-8946-932b5a184943 + + +#### Other UX improvements + +But that's not the only thing that improved in the viewer: +* Breadcrumbs show up in the selection menu now + + ![image](https://github.com/user-attachments/assets/c1d20eb1-f259-4b43-89d4-b9fdc75dc88c) + +* Take screenshots of views from context menus + + ![image](https://github.com/user-attachments/assets/6c50e6f0-330f-43f7-a393-65dd47aa171b) + +* Entities can now be dragged from Blueprint & Streams panel into views + + ![image](https://github.com/user-attachments/assets/493d9711-c4d1-407e-ab41-eef2e4e51ba8) + +#### Index of code snippets + +We now have a new [index for all our code snippets](./docs/snippets/INDEX.md). + +You can use it to quickly find copy-pastable snippets of code for any Rerun feature you're interested in (API, Archetypes, Components, etc). +No special tools required -- all you need is a keyword of interest, and plain old text search. + +It's still the early days so it is far from perfect, but we think it can already be quite helpful; feedback welcome. +Most of it is auto-generated, so it will never get out of sync! + +### ⚠️ Breaking changes + +* Near clip plane for `Spatial2D` views now defaults to `0.1` in 3D scene units. +* Blueprint: types and fields got renamed from `.*space_view.*`/`.*SpaceView.*` to `.*view.*`/`.*View.*`. +* 3D transform arrow visualization show up less often by default. +* `DisconnectedSpace` archetype/component is deprecated in favor of implicit invalid transforms (like zero scale or zero rotation matrix). +* `RotationAxisAngle` with zero rotation axis is no longer treated as identity. + +Read our 🧳 migration guide for more detailed information: https://rerun.io/docs/reference/migration/migration-0-21. + +### 🔎 Details + +#### 🪵 Log API +- End-to-end tagging: Rust [#8304](https://github.com/rerun-io/rerun/pull/8304) +- Encode `LogMsg` using protobuf [#8347](https://github.com/rerun-io/rerun/pull/8347) + +#### 🌊 C++ API +- End-to-end tagging: C++ [#8316](https://github.com/rerun-io/rerun/pull/8316) + +#### 🐍 Python API +- Never direct users towards using `rr.log_components` [#8151](https://github.com/rerun-io/rerun/pull/8151) +- Make it possible to log custom components using `rr.send_columns` [#8163](https://github.com/rerun-io/rerun/pull/8163) +- Lint and fix python SDK `(Py)RecordingStream` upcasting issues [#8184](https://github.com/rerun-io/rerun/pull/8184) +- End-to-end tagging: Python [#8298](https://github.com/rerun-io/rerun/pull/8298) +- Rename space view to view everywhere [#8396](https://github.com/rerun-io/rerun/pull/8396) +- Fix broken notebook loading on firefox by compressing the encoded wasm payload [#8426](https://github.com/rerun-io/rerun/pull/8426) +- Add utility to `rr.components.Color` to generate colors from any string (and use it in the air traffic data example) [#8458](https://github.com/rerun-io/rerun/pull/8458) +- Introduce new API to send a dataframe to Rerun [#8461](https://github.com/rerun-io/rerun/pull/8461) + +#### 🦀 Rust API +- Update MSRV to 1.80 [#8178](https://github.com/rerun-io/rerun/pull/8178) +- Remove `Loggable::NAME` -- Loggables do not have any semantics [#8082](https://github.com/rerun-io/rerun/pull/8082) +- Never direct users towards using `RecordingStream::log_component_batches` [#8149](https://github.com/rerun-io/rerun/pull/8149) +- Rust API: be explicit about when we're using the arrow2 crate [#8194](https://github.com/rerun-io/rerun/pull/8194) +- Add `from_gray16` for `DepthImage` [#8213](https://github.com/rerun-io/rerun/pull/8213) (thanks [@fawdlstty](https://github.com/fawdlstty)!) +- Rust: more `impl` helpers [#8401](https://github.com/rerun-io/rerun/pull/8401) + +#### 🪳 Bug fixes +- Fix outlines for lines having more perceived aliasing since 0.20 [#8317](https://github.com/rerun-io/rerun/pull/8317) +- Fix handling unnormalized axis for (Pose)RotationAxisAngle [#8341](https://github.com/rerun-io/rerun/pull/8341) +- Fix 2D/3D view artifacts on view's border when using fractional zoom [#8369](https://github.com/rerun-io/rerun/pull/8369) + +#### 🌁 Viewer improvements +- World grid part 1/2: add world grid renderer to `re_renderer` [#8230](https://github.com/rerun-io/rerun/pull/8230) +- World grid part 2/2: Integrate into Viewer [#8234](https://github.com/rerun-io/rerun/pull/8234) +- Add Undo/Redo support in the viewer [#7546](https://github.com/rerun-io/rerun/pull/7546) +- Space view screenshotting in native viewer [#8258](https://github.com/rerun-io/rerun/pull/8258) +- Remove selection history [#8296](https://github.com/rerun-io/rerun/pull/8296) +- Make the near clipping plane editable in 2D views [#8348](https://github.com/rerun-io/rerun/pull/8348) +- Don't show transform arrows on all entities without any other visualizer [#8387](https://github.com/rerun-io/rerun/pull/8387) +- Do query for default components only once per view [#8424](https://github.com/rerun-io/rerun/pull/8424) +- Improve hovered order in 2D views [#8405](https://github.com/rerun-io/rerun/pull/8405) +- Remove wait-time when opening settings panel [#8464](https://github.com/rerun-io/rerun/pull/8464) +- Deprecate `DisconnectedSpace` archetype/component in favor of implicit invalid transforms [#8459](https://github.com/rerun-io/rerun/pull/8459) +- Improve graphics device capability detection, warn on old devices, early error on unsupported render targets [#8476](https://github.com/rerun-io/rerun/pull/8476) + +#### 🧑‍🏫 Examples +- Add a new "Air Traffic Data" example [#5449](https://github.com/rerun-io/rerun/pull/5449) +- Use video logging api in `detect_and_track` example [#8261](https://github.com/rerun-io/rerun/pull/8261) (thanks [@oxkitsune](https://github.com/oxkitsune)!) +- Add hloc_glomap example and update manifest [#8352](https://github.com/rerun-io/rerun/pull/8352) (thanks [@pablovela5620](https://github.com/pablovela5620)!) +- Introduce the Snippet Index [#8383](https://github.com/rerun-io/rerun/pull/8383) +- Implement complete Graph View example [#8421](https://github.com/rerun-io/rerun/pull/8421) + +#### 📚 Docs +- Update wheel build instruction [#8235](https://github.com/rerun-io/rerun/pull/8235) +- Fix various doc links in SDKs [#8331](https://github.com/rerun-io/rerun/pull/8331) + +#### 🖼 UI improvements +- Implement graph components and archetypes [#7500](https://github.com/rerun-io/rerun/pull/7500) +- Add support for Bezier-curve multi (self-)edges [#8256](https://github.com/rerun-io/rerun/pull/8256) +- Implement incremental graph layouts [#8308](https://github.com/rerun-io/rerun/pull/8308) +- Revert label background color to that in 0.19 [#8337](https://github.com/rerun-io/rerun/pull/8337) +- Add selection hierarchy breadcrumbs [#8319](https://github.com/rerun-io/rerun/pull/8319) +- More compact selection panel when multiple items selected [#8351](https://github.com/rerun-io/rerun/pull/8351) +- Make Position2D components editable in selection panel [#8357](https://github.com/rerun-io/rerun/pull/8357) +- Dynamic configuration of graph layout forces through blueprints [#8299](https://github.com/rerun-io/rerun/pull/8299) +- Document legend interaction in the timeseries view help text [#8406](https://github.com/rerun-io/rerun/pull/8406) +- Allow drag-and-dropping multiple containers and views in the blueprint tree [#8334](https://github.com/rerun-io/rerun/pull/8334) +- Improve picking in 2D views [#8404](https://github.com/rerun-io/rerun/pull/8404) +- Make our collapsing triangle thinner for more consistency with our icons [#8408](https://github.com/rerun-io/rerun/pull/8408) +- Entities can be dragged from the blueprint tree and streams tree to an existing view in the viewport [#8431](https://github.com/rerun-io/rerun/pull/8431) + +#### 🎨 Renderer improvements +- Update egui to latest, update wgpu to 23.0.0 [#8183](https://github.com/rerun-io/rerun/pull/8183) + +#### ✨ Other enhancement +- Improve `rrd print`'s verbosity modes [#8392](https://github.com/rerun-io/rerun/pull/8392) +- Miscellaneous improvements to archetype reflection [#8432](https://github.com/rerun-io/rerun/pull/8432) +- Migration kernel for the blueprint space-view-related breaking changes [#8439](https://github.com/rerun-io/rerun/pull/8439) + +#### 🗣 Refactors +- Add arrow(1)-interface on top of `Loggable` and `ArrowBuffer` [#8197](https://github.com/rerun-io/rerun/pull/8197) +- `re_types_blueprint` -> `re_types::blueprint` [#8419](https://github.com/rerun-io/rerun/pull/8419) +- `re_viewer::reflection` -> `re_types::reflection` [#8420](https://github.com/rerun-io/rerun/pull/8420) + +#### 📦 Dependencies +- Numpy 2.0 allowed in pyproject.toml [#8306](https://github.com/rerun-io/rerun/pull/8306) (thanks [@Ipuch](https://github.com/Ipuch)!) +- Upgrade to egui 0.30 (+ ecosystem) [#8516](https://github.com/rerun-io/rerun/pull/8516) + +#### 🧑‍💻 Dev-experience +- Add `MainThreadToken` to ensure file-dialogs only run on the main thread [#8467](https://github.com/rerun-io/rerun/pull/8467) + +#### 🤷‍ Other +- Deprecate `--serve`, add `--serve-web` [#8144](https://github.com/rerun-io/rerun/pull/8144) +- Clean up pass over all superfluous hashing happening on the query path [#8207](https://github.com/rerun-io/rerun/pull/8207) +- Improve performance of time panel [#8224](https://github.com/rerun-io/rerun/pull/8224) + + +## [0.20.3](https://github.com/rerun-io/rerun/compare/0.20.2...0.20.3) - Web viewer fix + +### 🔎 Details + +#### 🪳 Bug fixes +- Fix web viewer feature flags [#8295](https://github.com/rerun-io/rerun/pull/8295) + + +## [0.20.2](https://github.com/rerun-io/rerun/compare/0.20.1...0.20.2) - Build fix + +### 🔎 Details + +#### 🪳 Bug fixes +- Fix a drag-and-drop display regression [#8228](https://github.com/rerun-io/rerun/pull/8228) + +#### 📚 Docs +- Add `map_view` to the default features and improve how the `nasm` feature is handled and documented [#8243](https://github.com/rerun-io/rerun/pull/8243) + +#### 🧑‍💻 Dev-experience +- Gracefully handle `cargo-metadata` failures in users' environments [#8239](https://github.com/rerun-io/rerun/pull/8239) + + +## [0.20.1](https://github.com/rerun-io/rerun/compare/0.20.0...0.20.1) - Doc fix + +- Fix doc build - run `cargo metadata` with `--offline` & `--no-deps` [#8168](https://github.com/rerun-io/rerun/pull/8168) + + +## [0.20.0](https://github.com/rerun-io/rerun/compare/0.19.1...0.20.0) - Map view & native H.264 video support + +https://github.com/user-attachments/assets/553b6d88-143d-4cf9-a4bc-6b620534ab95 + +📖 Release blogpost: https://rerun.io/blog/maps +🧳 Migration guide: https://rerun.io/docs/reference/migration/migration-0-20 + +### ✨ Overview & highlights +* 🗺️ There is now an map view! +* 🎬 Native viewer now supports H.264 video if ffmpeg is installed. +* 📽️ Videos now load a lot faster use less RAM. +* 📂 Improvements to the existing `Open` (Viewer) & `log_file` (SDK) workflows, and addition of a new `Import` workflow. + * Blueprints can now easily be [re-used across different applications, recordings and SDKs](https://rerun.io/docs/concepts/visualization/blueprints) + * The new `Import` feature allows you to drag-and-drop any data into an existing recording, directly in the viewer. +* ☰ Dataframe queries are now streamed, reducing memory usage. +* 💊 Add [capsule archetype](https://rerun.io/docs/reference/types/archetypes/capsules3d). +* 📚 Doc improvements + * Arrow schemas are now documented for all types. + * Better structure to the [how to](https://rerun.io/docs/howto) section and a few more pages + +### ⚠️ Breaking changes & deprecations +* 🐍 Python 3.8 is being deprecated +* 🔌 `connect` & `serve` got deprecated in favor of `connect_tcp` & `serve_web` +* 🎨 In Python, lists of numbers without type information are now assumed to be packed integer color representations, unless the length is exactly 3 or 4 +🧳 Migration guide: https://rerun.io/docs/reference/migration/migration-0-20 + +### 🔎 Details + +#### 🎬 Video +- Support H.264 video on native via user installed ffmpeg executable [#7962](https://github.com/rerun-io/rerun/pull/7962) +- Make mp4 parsing **a lot** faster & tremendously lower memory overhead [#7860](https://github.com/rerun-io/rerun/pull/7860) +- Fix playback of HDR AV1 videos in native viewer [#7978](https://github.com/rerun-io/rerun/pull/7978) +- Show all samples/frames in a video in a nice table [#8102](https://github.com/rerun-io/rerun/pull/8102) +- Calculate and show video frame number [#8112](https://github.com/rerun-io/rerun/pull/8112) +- Expose basic information about group of pictures in video data in the selection panel [#8043](https://github.com/rerun-io/rerun/pull/8043) +- Fix some videos having offsetted (incorrect) timestamps [#8029](https://github.com/rerun-io/rerun/pull/8029) +- Fix video backward seeking / stepping back sometimes getting stuck (in the presence of b-frames) [#8053](https://github.com/rerun-io/rerun/pull/8053) +- Make sure videos all end up in different space views [#8085](https://github.com/rerun-io/rerun/pull/8085) +- Fix video on web sometimes not showing last few frames for some videos [#8117](https://github.com/rerun-io/rerun/pull/8117) +- Fix issues with seeking in some H.264 videos on native & web [#8111](https://github.com/rerun-io/rerun/pull/8111) +- Fix view creation heuristics for videos [#7869](https://github.com/rerun-io/rerun/pull/7869) +- Improve video doc page [#8007](https://github.com/rerun-io/rerun/pull/8007) +- Update re_mp4 to fix integer overflow bug [#8096](https://github.com/rerun-io/rerun/pull/8096) + +#### 🪵 Log API +- Add `Capsules3D` archetype [#7574](https://github.com/rerun-io/rerun/pull/7574) (thanks [@kpreid](https://github.com/kpreid)!) +- `rr.log_file_from_path` now defaults to the active app/recording ID [#7864](https://github.com/rerun-io/rerun/pull/7864) +- Allow overriding albedo color on `Asset3D` [#7458](https://github.com/rerun-io/rerun/pull/7458) (thanks [@EtaLoop](https://github.com/EtaLoop)!) +- `rr.serve` -> `rr.serve_web`, `rr.connect` -> `rr.connect_tcp` [#7906](https://github.com/rerun-io/rerun/pull/7906) + +#### 🌊 C++ API +- C++: Improve error message when finding X11 macro `Unsorted` [#7855](https://github.com/rerun-io/rerun/pull/7855) +- Forward `CMAKE_TOOLCHAIN_FILE` to arrow build for sdk cross-compilation [#7866](https://github.com/rerun-io/rerun/pull/7866) (thanks [@SunDoge](https://github.com/SunDoge)!) +- Update the python package to support python 3.13, update C++ arrow to 18.0.0 [#7930](https://github.com/rerun-io/rerun/pull/7930) + +#### 🐍 Python API +- Allow passing seconds/nanoseconds to `VideoFrameReference` archetype [#7833](https://github.com/rerun-io/rerun/pull/7833) +- Officially deprecate support for python 3.8 [#7933](https://github.com/rerun-io/rerun/pull/7933) +- Update the python package to support python 3.13, update C++ arrow to 18.0.0 [#7930](https://github.com/rerun-io/rerun/pull/7930) +- Remove the upper bound constraint on python version [#7949](https://github.com/rerun-io/rerun/pull/7949) +- Enable dataframe streaming across Python FFI [#7935](https://github.com/rerun-io/rerun/pull/7935) +- Fix python SDK's shutdown unsafely dropping cross-FFI resources [#8038](https://github.com/rerun-io/rerun/pull/8038) +- Improve edge-cases and warn on ambiguity for Rgba32 datatype [#8054](https://github.com/rerun-io/rerun/pull/8054) +- Check rerun notebook version on first import [#8030](https://github.com/rerun-io/rerun/pull/8030) + +#### 🦀 Rust API +- Allow logging individual components directly (Impl `AsComponents` for all `ObjectKind::Component`) [#7756](https://github.com/rerun-io/rerun/pull/7756) (thanks [@oxkitsune](https://github.com/oxkitsune)!) +- `re_query::Caches` -> `re_query::QueryCache` [#7915](https://github.com/rerun-io/rerun/pull/7915) + +#### 🪳 Bug fixes +- [bugfix] Make sure blueprint gets sent to the notebook view being created [#7811](https://github.com/rerun-io/rerun/pull/7811) +- Fix too short picking ray in pinhole-only scenarios [#7899](https://github.com/rerun-io/rerun/pull/7899) +- Update zune-jpeg to fix crash on bad JPEGs [#7952](https://github.com/rerun-io/rerun/pull/7952) +- Consistent open/import/log_file behaviors in all common scenarios [#7966](https://github.com/rerun-io/rerun/pull/7966) +- ChunkStore: fix row-id computation when removing dangling static chunks [#8020](https://github.com/rerun-io/rerun/pull/8020) +- `EntityTree`: only check for entity deletions when necessary [#8103](https://github.com/rerun-io/rerun/pull/8103) +- WebSocket server now indefinitely keeps track of non-data RPC commands [#8146](https://github.com/rerun-io/rerun/pull/8146) + +#### 🌁 Viewer improvements +- A Rerun Viewer session now matches 1:1 to a Rerun TCP server [#6951](https://github.com/rerun-io/rerun/pull/6951) (thanks [@petertheprocess](https://github.com/petertheprocess)!) +- Implement support for in-place drag-n-drop [#7880](https://github.com/rerun-io/rerun/pull/7880) +- Implement `Menu > Import` and associated command [#7882](https://github.com/rerun-io/rerun/pull/7882) +- Expose additional information about decoded frames in the viewer [#7932](https://github.com/rerun-io/rerun/pull/7932) +- Update crates, including `rfd` for better file dialogs [#7953](https://github.com/rerun-io/rerun/pull/7953) +- Line strips are no longer a disconnected series of quads [#8065](https://github.com/rerun-io/rerun/pull/8065) +- Show data density graph in collapsed time panel [#8137](https://github.com/rerun-io/rerun/pull/8137) +- Show the root entity "/" in the streams panel [#8142](https://github.com/rerun-io/rerun/pull/8142) + +#### 🚀 Performance improvements +- Don't keep around additional CPU copy of loaded mesh files [#7824](https://github.com/rerun-io/rerun/pull/7824) +- Make mp4 parsing **a lot** faster & tremendously lower memory overhead [#7860](https://github.com/rerun-io/rerun/pull/7860) +- Fix slow receive when using native WebSocket [#7875](https://github.com/rerun-io/rerun/pull/7875) +- Implement support for fully asynchronous `QueryHandle`s [#7964](https://github.com/rerun-io/rerun/pull/7964) + +#### 🧑‍🏫 Examples +- Fix Rust DNA sample writing to a temporary file [#7827](https://github.com/rerun-io/rerun/pull/7827) +- Add `ml_depth_pro` example [#7832](https://github.com/rerun-io/rerun/pull/7832) (thanks [@oxkitsune](https://github.com/oxkitsune)!) +- Add map view to nuscenes python example [#8034](https://github.com/rerun-io/rerun/pull/8034) (thanks [@tfoldi](https://github.com/tfoldi)!) +- Add an example to display OpenStreetMap-sourced data on the map view [#8044](https://github.com/rerun-io/rerun/pull/8044) +- Improve NuScenes example with more geo data & blueprint [#8130](https://github.com/rerun-io/rerun/pull/8130) + +#### 📚 Docs +- Clarify viewport documentation and reference the type list for view classes [#7826](https://github.com/rerun-io/rerun/pull/7826) +- Finish dataframe reference page [#7865](https://github.com/rerun-io/rerun/pull/7865) +- Docs: static data [#7856](https://github.com/rerun-io/rerun/pull/7856) +- Docs: concepts > recordings [#7896](https://github.com/rerun-io/rerun/pull/7896) +- Docs: "How-to: reuse blueprints across languages" [#7886](https://github.com/rerun-io/rerun/pull/7886) +- Docs: application model part 1: native workflows [#7905](https://github.com/rerun-io/rerun/pull/7905) +- Document arrow datatypes [#7986](https://github.com/rerun-io/rerun/pull/7986) + +#### 🖼 UI improvements +- Map View and `GeoPoints` archetype [#6561](https://github.com/rerun-io/rerun/pull/6561) (thanks [@tfoldi](https://github.com/tfoldi)!) +- Replace the "Options" submenu with a settings screen [#8001](https://github.com/rerun-io/rerun/pull/8001) +- Improve error message style slightly [#8092](https://github.com/rerun-io/rerun/pull/8092) +- Much nicer looking error and warning messages [#8127](https://github.com/rerun-io/rerun/pull/8127) + +#### 🧑‍💻 Dev-experience +- Show list of enabled features with `rerun --version` [#7885](https://github.com/rerun-io/rerun/pull/7885) [#8095](https://github.com/rerun-io/rerun/pull/8095) + +#### 📦 Dependencies +- Bump numpy -> 0.23, pyo3 -> 0.22.5, and arrow -> 53.1 [#7834](https://github.com/rerun-io/rerun/pull/7834) + +#### 🤷‍ Other +- Implement safe storage handles [#7934](https://github.com/rerun-io/rerun/pull/7934) + + +## [0.19.1](https://github.com/rerun-io/rerun/compare/0.19.0..0.19.1) - Web viewer fix + +This release fixes an error thrown when the web viewer is closed. + +### 🔎 Details + +#### 🕸️ Web +- Fix wasm-bindgen patch [#7970](https://github.com/rerun-io/rerun/pull/7970) + +#### 📦 Dependencies +- Add wasm-bindgen version check to CI [#7983](https://github.com/rerun-io/rerun/pull/7983) + + + +## [0.19.0](https://github.com/rerun-io/rerun/compare/0.18.2...0.19.0) - Dataframes & Video support + +📖 Release blogpost: https://rerun.io/blog/dataframe + +🧳 Migration guide: https://rerun.io/docs/reference/migration/migration-0-19 + +### ✨ Overview & highlights +This release introduces two powerful features: a dataframe API (and view), as well as video support. + +#### ☰ Dataframe API +We now have an API for querying the contents of an .rrd file. This integrates with popular packages such as [Pandas](https://pandas.pydata.org), [Polars](https://pola.rs), and [DuckDB](https://duckdb.org). + +You can read more in [the Dataframe API how-to guide](https://rerun.io/docs/howto/query-and-transform/get-data-out). + +We have also added a matching dataframe view inside the Rerun Viewer. +Read more [here](https://rerun.io/docs/reference/types/views/dataframe_view). + +#### 🎬 Video +Rerun now supports logging MP4 videos using the new [`AssetVideo`](https://rerun.io/docs/reference/types/archetypes/asset_video) archetype. +This can greatly reduce bandwidth and storage requirements. + +While the web viewer supports a variety of codecs, the native viewer supports only the AV1 codec for the moment, but we plan to support H.264 in the near future as well. +Read more about our video supports (and its limits) [in our video docs](https://rerun.io/docs/concepts/logging-and-ingestion/video). + +### ⚠️ Breaking changes +* 🗾 Blueprint files (.rbl) from previous Rerun versions will no longer load _automatically_ +* 🐧 Linux: Rerun now requires glibc 2.17+ +* 🦀 Rust: The minimum supported Rust version is now 1.79 + +🧳 Migration guide: https://rerun.io/docs/reference/migration/migration-0-19 + +### 🔎 Details + + 📑 Raw changelog: https://github.com/rerun-io/rerun/compare/0.18.2...0.19.0 + +#### 🪵 Log API +- BGR(A) image format support [#7238](https://github.com/rerun-io/rerun/pull/7238) +- Tensor & depth image value ranges can now be configured, from UI & code [#7549](https://github.com/rerun-io/rerun/pull/7549) +- New planar pixel formats: `Y_U_V24`/`Y_U_V16`/`Y_U_V12` - `_LimitedRange`/`FullRange` [#7666](https://github.com/rerun-io/rerun/pull/7666) +- Add `ShowLabels` component, which controls whether instances’ labels are shown [#7249](https://github.com/rerun-io/rerun/pull/7249) (thanks [@kpreid](https://github.com/kpreid)!) +- Refactor `MediaType` guessing [#7326](https://github.com/rerun-io/rerun/pull/7326) + +#### 🌊 C++ API +- Add `nullptr` check when forwarding from component to datatype [#7430](https://github.com/rerun-io/rerun/pull/7430) + +#### 🐍 Python API +- Add missing `show_labels` and `draw_order` arguments in Python API [#7363](https://github.com/rerun-io/rerun/pull/7363) (thanks [@kpreid](https://github.com/kpreid)!) +- Allow logging to a recording without first calling `rr.init()` [#7698](https://github.com/rerun-io/rerun/pull/7698) +- Add support for NumPy arrays to the arrow serializer for string datatypes [#7689](https://github.com/rerun-io/rerun/pull/7689) + +#### 🦀 Rust API +- Update MSRV to Rust 1.79 [#7563](https://github.com/rerun-io/rerun/pull/7563) +- Update ndarray to 0.16 and ndarray-rand to 0.15 [#7358](https://github.com/rerun-io/rerun/pull/7358) (thanks [@benliepert](https://github.com/benliepert)!) +- Replace `host_web_viewer` method with `WebViewerConfig::host_web_viewer` [#7553](https://github.com/rerun-io/rerun/pull/7553) +- Fix Rust's `TimeColumn::new_seconds/new_nanos` creating sequence timelines [#7402](https://github.com/rerun-io/rerun/pull/7402) + +#### 🪳 Bug fixes +- Purge the query cache to prevent GC livelocks [#7370](https://github.com/rerun-io/rerun/pull/7370) +- Bug fix: always show latest data in follow-mode [#7425](https://github.com/rerun-io/rerun/pull/7425) +- Fix encoded image being suggested for non-image blobs (like video) [#7428](https://github.com/rerun-io/rerun/pull/7428) +- Chunk store: support for overlapped range queries [#7586](https://github.com/rerun-io/rerun/pull/7586) +- Fix image & video cache creating new entries when selecting data without explicit media type [#7590](https://github.com/rerun-io/rerun/pull/7590) + +#### 🌁 Viewer improvements +- The viewer will tail an .rrd that's is being written to [#7475](https://github.com/rerun-io/rerun/pull/7475) +- Native video support for AV1 [#7557](https://github.com/rerun-io/rerun/pull/7557) +- Allow splitting entity path expressions with whitespace [#7782](https://github.com/rerun-io/rerun/pull/7782) + +#### 🚀 Performance improvements +- Improve performance for scenes with many entities & transforms [#7456](https://github.com/rerun-io/rerun/pull/7456) +- `Caches` per recording [#7513](https://github.com/rerun-io/rerun/pull/7513) +- Automatic removal of unreachable static chunks [#7518](https://github.com/rerun-io/rerun/pull/7518) +- Invalidate hub-wide caches on deletions and overwrites [#7525](https://github.com/rerun-io/rerun/pull/7525) +- Do not cache static entries in the query-time latest-at cache [#7654](https://github.com/rerun-io/rerun/pull/7654) +- Make sure Arrow `filter` and `take` kernels early out where it makes sense [#7704](https://github.com/rerun-io/rerun/pull/7704) + +#### 🧑‍🏫 Examples +- Add drone LiDAR example [#7336](https://github.com/rerun-io/rerun/pull/7336) +- Add `instant_splat` example [#7751](https://github.com/rerun-io/rerun/pull/7751) (thanks [@pablovela5620](https://github.com/pablovela5620)!) + +#### 📚 Docs +- Add video reference docs [#7533](https://github.com/rerun-io/rerun/pull/7533) +- Document that Rerun does not support left-handed coords [#7690](https://github.com/rerun-io/rerun/pull/7690) +- Add a How-to guide for the dataframe API [#7727](https://github.com/rerun-io/rerun/pull/7727) +- Docs: move "roadmap" down to "development" [#7775](https://github.com/rerun-io/rerun/pull/7775) +- Add a "Getting started" guide for the dataframe API [#7643](https://github.com/rerun-io/rerun/pull/7643) +- Docs: clean up reference menu [#7776](https://github.com/rerun-io/rerun/pull/7776) +- Updating "Navigating the viewer" [#7757](https://github.com/rerun-io/rerun/pull/7757) + +#### 🖼 UI improvements +- Add a hook for views to add additional UI in the tab title bar [#7438](https://github.com/rerun-io/rerun/pull/7438) +- Text fields in the selection panel now span the available width [#7487](https://github.com/rerun-io/rerun/pull/7487) +- Do not deselect on ESC when it was used to close some other UI element [#7548](https://github.com/rerun-io/rerun/pull/7548) +- Add UI for precisely picking an exact sequence time [#7673](https://github.com/rerun-io/rerun/pull/7673) +- Remove the feature flag for plot query clamping [#7664](https://github.com/rerun-io/rerun/pull/7664) + +#### 🎨 Renderer improvements +- Introduce image data conversion pipeline, taking over existing YUV conversions [#7640](https://github.com/rerun-io/rerun/pull/7640) + +#### 🧑‍💻 Dev-experience +- Add a command palette action to reset egui's memory (debug build only) [#7446](https://github.com/rerun-io/rerun/pull/7446) +- Add NOLINT block to `lint.py` [#7720](https://github.com/rerun-io/rerun/pull/7720) + + + +## [0.18.2](https://github.com/rerun-io/rerun/compare/0.18.1...0.18.2) - Even more bug fixes + +- Update `time` crate to 0.3.36, fixing compilation on newer Rust versions [#7308](https://github.com/rerun-io/rerun/pull/7308) + + +## [0.18.1](https://github.com/rerun-io/rerun/compare/0.18.0...0.18.1) - Bug fixes and performance improvements + +#### 🌊 C++ API +- Install `sdk_info.h` even if `RERUN_INSTALL_RERUN_C` option is `OFF` [#7246](https://github.com/rerun-io/rerun/pull/7246) (thanks [@traversaro](https://github.com/traversaro)!) + +#### 🐍 Python API +- Fix `VisualizerOverrides` serializer and improved error handling [#7288](https://github.com/rerun-io/rerun/pull/7288) + +#### 🦀 Rust API +- Add `rerun::external::ndarray` [#7259](https://github.com/rerun-io/rerun/pull/7259) +- Handle proper half-size splatting semantics in `from_mins_and_sizes` [#7291](https://github.com/rerun-io/rerun/pull/7291) + +#### 🪳 Bug fixes +- Fix error when trying to clear non-existent component [#7215](https://github.com/rerun-io/rerun/pull/7215) +- Fix gamma (srgb EOTF) for GLTF via `Asset3D` embedded rgb(a) textures [#7251](https://github.com/rerun-io/rerun/pull/7251) +- Fix `Chunk::component_batch_raw` not checking the bitmap first [#7286](https://github.com/rerun-io/rerun/pull/7286) +- Fix and test all known `HybridResults` issues from 0.18 [#7297](https://github.com/rerun-io/rerun/pull/7297) +- Fix secondary plot components ignoring blueprint defaults [#7302](https://github.com/rerun-io/rerun/pull/7302) +- Fix relayout on tab background click [#7283](https://github.com/rerun-io/rerun/pull/7283) + +#### 🚀 Performance improvements +- Speed up data density graph by rendering them more coarsly [#7229](https://github.com/rerun-io/rerun/pull/7229) +- Default `RERUN_CHUNK_MAX_BYTES` to 384kiB instead of 4MiB [#7263](https://github.com/rerun-io/rerun/pull/7263) +- Speed up handling of large numbers of transform entities [#7300](https://github.com/rerun-io/rerun/pull/7300) +- Fix memory leak by updating to `re_arrow2 0.17.5` [#7262](https://github.com/rerun-io/rerun/pull/7262) + +#### 🖼 UI improvements +- Hide time controls if there is only one time point on a timeline [#7241](https://github.com/rerun-io/rerun/pull/7241) + +#### 📦 Dependencies +- Correct dependency on `puffin` to 0.19.1, preventing a possible build failure [#7221](https://github.com/rerun-io/rerun/pull/7221) (thanks [@kpreid](https://github.com/kpreid)!) +- Update `time` crate to 0.3.36, fixing compilation on newer Rust versions [#7228](https://github.com/rerun-io/rerun/pull/7228) + + +## [0.18.0](https://github.com/rerun-io/rerun/compare/0.17.0...0.18.0) - Ingestion speed and memory footprint + +https://github.com/user-attachments/assets/95380a64-df05-4f85-b40a-0c6b8ec8d5cf + +* 📖 Release blogpost: https://rerun.io/blog/column-chunks +* 🧳 Migration guide: https://rerun.io/docs/reference/migration/migration-0-18 + +### ✨ Overview & highlights + +Rerun 0.18 introduces new column-oriented APIs and internal storage datastructures (`Chunk` & `ChunkStore`) that can both simplify logging code as well as improve ingestion speeds and memory overhead by a couple orders of magnitude in many cases (timeseries-heavy workloads in particular). + +These improvements come in 3 broad categories: +* a new `send` family of APIs, available in all 3 SDKs (Python, C++, Rust), +* a new, configurable background compaction mechanism in the datastore, +* new CLI tools to filter, prune and compact RRD files. + +Furthermore, we started cleaning up our data schema, leading to various changes in the way represent transforms & images. + +#### New `send` APIs + +Unlike the regular row-oriented `log` APIs, the new `send` APIs let you submit data in a columnar form, even if the data extends over multiple timestamps. + +This can both greatly simplify logging code and drastically improve performance for some workloads, in particular timeseries, [although we have already seen it used for other purposes](https://github.com/rerun-io/rerun/pull/7155)! + +API documentation: +* 🐍 [Python `send_columns` docs](https://ref.rerun.io/docs/python/stable/common/columnar_api/#rerun.send_columns) +* 🌊 [C++ `send_columns` docs](https://ref.rerun.io/docs/cpp/stable/classrerun_1_1RecordingStream.html#ad17571d51185ce2fc2fc2f5c3070ad65) +* 🦀 [Rust `send_columns` docs](https://docs.rs/rerun/latest/rerun/struct.RecordingStream.html#method.send_columns) + +API usage examples: +
+ Python timeseries + + Using `log()` (slow, memory inefficient): + ```python + rr.init("rerun_example_scalar", spawn=True) + + for step in range(0, 64): + rr.set_time_sequence("step", step) + rr.log("scalar", rr.Scalars(math.sin(step / 10.0))) + ``` + + Using `send()` (fast, memory efficient): + ```python + rr.init("rerun_example_send_columns", spawn=True) + + rr.send_columns( + "scalars", + indexes=[rr.TimeSequenceColumn("step", np.arange(0, 64))], + components=[rr.components.ScalarBatch(np.sin(times / 10.0))], + ) + ``` +
+
+ C++ timeseries + + Using `log()` (slow, memory inefficient): + ```c++ + const auto rec = rerun::RecordingStream("rerun_example_scalar"); + rec.spawn().exit_on_failure(); + + for (int step = 0; step < 64; ++step) { + rec.set_time_sequence("step", step); + rec.log("scalar", rerun::Scalar(std::sin(static_cast(step) / 10.0))); + } + ``` + + Using `send()` (fast, memory efficient): + ```c++ + const auto rec = rerun::RecordingStream("rerun_example_send_columns"); + rec.spawn().exit_on_failure(); + + std::vector scalar_data(64); + for (size_t i = 0; i < 64; ++i) { + scalar_data[i] = sin(static_cast(i) / 10.0); + } + std::vector times(64); + std::iota(times.begin(), times.end(), 0); + + auto time_column = rerun::TimeColumn::from_sequence_points("step", std::move(times)); + auto scalar_data_collection = + rerun::Collection(std::move(scalar_data)); + + rec.send_columns("scalars", time_column, scalar_data_collection); + ``` +
+
+ Rust timeseries + + Using `log()` (slow, memory inefficient): + ```rust + let rec = rerun::RecordingStreamBuilder::new("rerun_example_scalar").spawn()?; + + for step in 0..64 { + rec.set_time_sequence("step", step); + rec.log("scalar", &rerun::Scalars::new((step as f64 / 10.0).sin()))?; + } + ``` + + Using `send()` (fast, memory efficient): + ```rust + let rec = rerun::RecordingStreamBuilder::new("rerun_example_send_columns").spawn()?; + + let timeline_values = (0..64).collect::>(); + let scalar_data: Vec = timeline_values + .iter() + .map(|step| (*step as f64 / 10.0).sin()) + .collect(); + + let timeline_values = TimeColumn::new_sequence("step", timeline_values); + let scalar_data: Vec = scalar_data.into_iter().map(Into::into).collect(); + + rec.send_columns("scalars", [timeline_values], [&scalar_data as _])?; + ``` +
+ +#### Background compaction + +The Rerun datastore now continuously compacts data as it comes in, in order find a sweet spot between ingestion speed, query performance and memory overhead. + +This is very similar to, and has many parallels with, the [micro-batching mechanism running on the SDK side](https://rerun.io/docs/reference/sdk/micro-batching). + +You can read more about this in the [dedicated documentation entry](https://rerun.io/docs/reference/store-compaction). + +#### Post-processing of RRD files + +To help improve efficiency for completed recordings, Rerun 0.18 introduces some new commands for working with rrd files. + +Multiple files can be merged, whole entity paths can be dropped, and chunks can be compacted. + +You can read more about it [in the new CLI reference manual](https://rerun.io/docs/reference/cli), but to give a sense of how it works the below example merges all recordings in a folder and runs chunk compaction using the `max-rows` and `max-bytes` settings: +```sh +rerun rrd compact --max-rows 4096 --max-bytes=1048576 /my/recordings/*.rrd > output.rrd +``` + +#### Overhauled 3D transforms & instancing +As part of improving our arrow schema and in preparation for reading data back in the SDK, we've split up transforms into several parts. +This makes it much more performant to log large number of transforms as it allows updating only the parts you're interested in, e.g. logging a translation is now as lightweight as logging a single position. + +There are now additionally [`InstancePoses3D`](https://rerun.io/docs/reference/types/archetypes/instance_poses3d) which allow you to do two things: +* all 3D entities: apply a transform to the entity without affecting its children +* [`Mesh3D`](https://rerun.io/docs/reference/types/archetypes/mesh3d)/[`Asset3D`](https://rerun.io/docs/reference/types/archetypes/asset3d)/[`Boxes3D`](https://rerun.io/docs/reference/types/archetypes/boxes3d)/[`Ellipsoids3D`](https://rerun.io/docs/reference/types/archetypes/ellipsoids3d): instantiate objects several times with different poses, known as "instancing" + * Support for instancing of other archetypes is coming in the future! + +![instancing in action](https://static.rerun.io/mesh3d_leaf_transforms3d/c2d0ee033129da53168f5705625a9b033f3a3d61/1200w.png) +_All four tetrahedron meshes on this screen share the same vertices and are instanced using an [`InstancePoses3D`](https://rerun.io/docs/reference/types/archetypes/instance_poses3d) archetype with 4 different translations_ + + +### ⚠️ Breaking changes +* `.rrd` files from older versions won't load correctly in Rerun 0.18 +* `mesh_material: Material` has been renamed to `albedo_factor: AlbedoFactor` [#6841](https://github.com/rerun-io/rerun/pull/6841) +* [`Transform3D`](https://rerun.io/docs/reference/types/archetypes/transform3d) is no longer a single component but split into its constituent parts. From this follow various smaller API changes +* Python: `NV12/YUY2` are now logged with `Image` +* `ImageEncoded` is deprecated and replaced with [`EncodedImage`](https://rerun.io/docs/reference/types/archetypes/encoded_image) (JPEG, PNG, …) and [`Image`](https://rerun.io/docs/reference/types/archetypes/image) (NV12, YUY2, …) +* [`DepthImage`](https://rerun.io/docs/reference/types/archetypes/depth_image) and [`SegmentationImage`](https://rerun.io/docs/reference/types/archetypes/segmentation_image) are no longer encoded as a tensors, and expects its shape in `[width, height]` order + +🧳 Migration guide: https://rerun.io/docs/reference/migration/migration-0-18 + +### 🔎 Details + +#### 🪵 Log API +- Add `Ellipsoids3D` archetype [#6853](https://github.com/rerun-io/rerun/pull/6853) (thanks [@kpreid](https://github.com/kpreid)!) +- Dont forward datatype extensions beyond the FFI barrier [#6777](https://github.com/rerun-io/rerun/pull/6777) +- All components are now consistently implemented by a datatype [#6823](https://github.com/rerun-io/rerun/pull/6823) +- Add new `archetypes.ImageEncoded` with PNG and JPEG support [#6874](https://github.com/rerun-io/rerun/pull/6874) +- New transform components: `Translation3D` & `TransformMat3x3` [#6866](https://github.com/rerun-io/rerun/pull/6866) +- Add Scale3D component [#6892](https://github.com/rerun-io/rerun/pull/6892) +- Angle datatype stores now only radians [#6916](https://github.com/rerun-io/rerun/pull/6916) +- New `DepthImage` archetype [#6915](https://github.com/rerun-io/rerun/pull/6915) +- Port `SegmentationImage` to the new image archetype style [#6928](https://github.com/rerun-io/rerun/pull/6928) +- Add components for `RotationAxisAngle` and `RotationQuat` [#6929](https://github.com/rerun-io/rerun/pull/6929) +- Introduce `TransformRelation` component [#6944](https://github.com/rerun-io/rerun/pull/6944) +- New `LeafTransform3D`, replacing `OutOfTreeTransform3D` [#7015](https://github.com/rerun-io/rerun/pull/7015) +- Remove `Scale3D`/`Transform3D`/`TranslationRotationScale3D` datatypes, remove `Transform3D` component [#7000](https://github.com/rerun-io/rerun/pull/7000) +- Rewrite `Image` archetype [#6942](https://github.com/rerun-io/rerun/pull/6942) +- Use `LeafTranslation` (centers), `LeafRotationQuat` and `LeafRotationAxisAngle` directly on `Boxes3D`/`Ellipsoids3D` [#7029](https://github.com/rerun-io/rerun/pull/7029) +- Removed now unused `Rotation3D` component & datatype [#7030](https://github.com/rerun-io/rerun/pull/7030) +- Introduce new ImageFormat component [#7083](https://github.com/rerun-io/rerun/pull/7083) + +#### 🌊 C++ API +- Fix resetting time destroying recording stream [#6914](https://github.com/rerun-io/rerun/pull/6914) +- Improve usability of `rerun::Collection` by providing free functions for `borrow` & `take_ownership` [#7055](https://github.com/rerun-io/rerun/pull/7055) +- Fix crash on shutdown when using global recording stream variables in C++ [#7063](https://github.com/rerun-io/rerun/pull/7063) +- C++ API for `send_columns` [#7103](https://github.com/rerun-io/rerun/pull/7103) +- Add numeric SDK version macros to C/C++ [#7127](https://github.com/rerun-io/rerun/pull/7127) + +#### 🐍 Python API +- New temporal batch APIs [#6587](https://github.com/rerun-io/rerun/pull/6587) +- Python SDK: Rename `ImageEncoded` to `ImageEncodedHelper` [#6882](https://github.com/rerun-io/rerun/pull/6882) +- Introduce `ImageChromaDownsampled` [#6883](https://github.com/rerun-io/rerun/pull/6883) +- Allow logging batches of quaternions from numpy arrays [#7038](https://github.com/rerun-io/rerun/pull/7038) +- Add `__version__` and `__version_info__` to rerun package [#7104](https://github.com/rerun-io/rerun/pull/7104) +- Restore support for the legacy notebook mechanism from 0.16 [#7122](https://github.com/rerun-io/rerun/pull/7122) + +#### 🦀 Rust API +- Recommend install rerun-cli with `--locked` [#6868](https://github.com/rerun-io/rerun/pull/6868) +- Remove `TensorBuffer::JPEG`, `DecodedTensor`, `TensorDecodeCache` [#6884](https://github.com/rerun-io/rerun/pull/6884) + +#### 🪳 Bug fixes +- Respect 0.0 for start and end boundaries of scalar axis [#6887](https://github.com/rerun-io/rerun/pull/6887) (thanks [@amidabucu](https://github.com/amidabucu)!) +- Fix text log/document view icons [#6855](https://github.com/rerun-io/rerun/pull/6855) +- Fix outdated use of view coordinates in `Spaces and Transforms` doc page [#6955](https://github.com/rerun-io/rerun/pull/6955) +- Fix zero length transform axis having an effect bounding box used for heuristics etc [#6967](https://github.com/rerun-io/rerun/pull/6967) +- Disambiguate plot labels with multiple entities ending with the same part [#7140](https://github.com/rerun-io/rerun/pull/7140) +- `rerun rrd compact`: always put blueprints at the start of the recordings [#6998](https://github.com/rerun-io/rerun/pull/6998) +- Fix 2D objects in 3D affecting bounding box and thus causing flickering of automatic pinhole plane distance [#7176](https://github.com/rerun-io/rerun/pull/7176) +- Fix a UI issue where a visualiser would have both an override and default set for some component [#7206](https://github.com/rerun-io/rerun/pull/7206) + +#### 🌁 Viewer improvements +- Add cyan to yellow colormap [#7001](https://github.com/rerun-io/rerun/pull/7001) (thanks [@rasmusgo](https://github.com/rasmusgo)!) +- Add optional solid/filled (triangle mesh) rendering to `Boxes3D` and `Ellipsoids` [#6953](https://github.com/rerun-io/rerun/pull/6953) (thanks [@kpreid](https://github.com/kpreid)!) +- Improve bounding box based heuristics [#6791](https://github.com/rerun-io/rerun/pull/6791) +- Time panel chunkification [#6934](https://github.com/rerun-io/rerun/pull/6934) +- Integrate new data APIs with EntityDb/UI/Blueprint things [#6994](https://github.com/rerun-io/rerun/pull/6994) +- Chunkified text-log view with multi-timeline display [#7027](https://github.com/rerun-io/rerun/pull/7027) +- Make the recordings panel resizable [#7180](https://github.com/rerun-io/rerun/pull/7180) + +#### 🚀 Performance improvements +- Optimize large point clouds [#6767](https://github.com/rerun-io/rerun/pull/6767) +- Optimize data clamping in spatial view [#6870](https://github.com/rerun-io/rerun/pull/6870) +- Add `--blueprint` to `plot_dashboard_stress` [#6996](https://github.com/rerun-io/rerun/pull/6996) +- Add `Transformables` subscriber for improved `TransformContext` perf [#6997](https://github.com/rerun-io/rerun/pull/6997) +- Optimize gap detector on dense timelines, like `log_tick` [#7082](https://github.com/rerun-io/rerun/pull/7082) +- Re-enable per-series parallelism [#7110](https://github.com/rerun-io/rerun/pull/7110) +- Query: configurable timeline|component eager slicing [#7112](https://github.com/rerun-io/rerun/pull/7112) +- Optimize out unnecessary sorts in line series visualizer [#7129](https://github.com/rerun-io/rerun/pull/7129) +- Implement timeseries query clamping [#7133](https://github.com/rerun-io/rerun/pull/7133) +- Chunks: + - Implement ChunkStore and integrate it everywhere [#6570](https://github.com/rerun-io/rerun/pull/6570) + - `Chunk` concatenation primitives [#6857](https://github.com/rerun-io/rerun/pull/6857) + - Implement on-write `Chunk` compaction [#6858](https://github.com/rerun-io/rerun/pull/6858) + - CLI command for compacting recordings [#6860](https://github.com/rerun-io/rerun/pull/6860) + - CLI command for merging recordings [#6862](https://github.com/rerun-io/rerun/pull/6862) + - `ChunkStore`: implement new component-less indices and APIs [#6879](https://github.com/rerun-io/rerun/pull/6879) + - Compaction-aware store events [#6940](https://github.com/rerun-io/rerun/pull/6940) + - New and improved iteration APIs for `Chunk`s [#6989](https://github.com/rerun-io/rerun/pull/6989) + - New chunkified latest-at APIs and caches [#6992](https://github.com/rerun-io/rerun/pull/6992) + - New chunkified range APIs and caches [#6993](https://github.com/rerun-io/rerun/pull/6993) + - New `Chunk`-based time-series views [#6995](https://github.com/rerun-io/rerun/pull/6995) + - Chunkified, deserialization-free Point Cloud visualizers [#7011](https://github.com/rerun-io/rerun/pull/7011) + - Chunkified, (almost)deserialization-free Mesh/Asset visualizers [#7016](https://github.com/rerun-io/rerun/pull/7016) + - Chunkified, deserialization-free LineStrip visualizers [#7018](https://github.com/rerun-io/rerun/pull/7018) + - Chunkified, deserialization-free visualizers for all standard shapes [#7020](https://github.com/rerun-io/rerun/pull/7020) + - Chunkified image visualizers [#7023](https://github.com/rerun-io/rerun/pull/7023) + - Chunkify everything left [#7032](https://github.com/rerun-io/rerun/pull/7032) + - Higher compaction thresholds by default (x4) [#7113](https://github.com/rerun-io/rerun/pull/7113) + +#### 🧑‍🏫 Examples +- Add LeRobot example link [#6873](https://github.com/rerun-io/rerun/pull/6873) (thanks [@02alexander](https://github.com/02alexander)!) +- Add link to chess robot example [#6982](https://github.com/rerun-io/rerun/pull/6982) (thanks [@02alexander](https://github.com/02alexander)!) +- add depth compare example [#6885](https://github.com/rerun-io/rerun/pull/6885) (thanks [@pablovela5620](https://github.com/pablovela5620)!) +- Add mini NVS solver example [#6888](https://github.com/rerun-io/rerun/pull/6888) (thanks [@pablovela5620](https://github.com/pablovela5620)!) +- Add link to GLOMAP example [#7097](https://github.com/rerun-io/rerun/pull/7097) (thanks [@02alexander](https://github.com/02alexander)!) +- Add `send_columns` examples for images, fix rust `send_columns` handling of listarrays [#7172](https://github.com/rerun-io/rerun/pull/7172) + +#### 📚 Docs +- New code snippet for Transform3D demonstrating an animated hierarchy [#6851](https://github.com/rerun-io/rerun/pull/6851) +- Implement codegen of doclinks [#6850](https://github.com/rerun-io/rerun/pull/6850) +- Add example for different data per timeline on `Events and Timelines` doc page [#6912](https://github.com/rerun-io/rerun/pull/6912) +- Add troubleshooting section to pip install issues with outdated pip version [#6956](https://github.com/rerun-io/rerun/pull/6956) +- Clarify in docs when ViewCoordinate is picked up by a 3D view [#7034](https://github.com/rerun-io/rerun/pull/7034) +- CLI manual [#7149](https://github.com/rerun-io/rerun/pull/7149) + +#### 🖼 UI improvements +- Display compaction information in the recording UI [#6859](https://github.com/rerun-io/rerun/pull/6859) +- Use markdown for the view help widget [#6878](https://github.com/rerun-io/rerun/pull/6878) +- Improve navigation between entity and data results in the selection panel [#6871](https://github.com/rerun-io/rerun/pull/6871) +- Add support for visible time range to the dataframe view [#6869](https://github.com/rerun-io/rerun/pull/6869) +- Make clamped component data distinguishable in the "latest-at" table [#6894](https://github.com/rerun-io/rerun/pull/6894) +- Scroll dataframe view to focused item [#6908](https://github.com/rerun-io/rerun/pull/6908) +- Add an explicit "mode" view property to the dataframe view [#6927](https://github.com/rerun-io/rerun/pull/6927) +- Introduce a "Selectable Toggle" widget and use it for the 3D view's camera kind [#7064](https://github.com/rerun-io/rerun/pull/7064) +- Improve entity stats when hovered [#7074](https://github.com/rerun-io/rerun/pull/7074) +- Update the UI colors to use our (blueish) ramp instead of pure grays [#7075](https://github.com/rerun-io/rerun/pull/7075) +- Query editor for the dataframe view [#7071](https://github.com/rerun-io/rerun/pull/7071) +- Better ui for `Blob`s, especially those representing images [#7128](https://github.com/rerun-io/rerun/pull/7128) +- Add button for copying and saving images [#7156](https://github.com/rerun-io/rerun/pull/7156) + +#### 🕸️ Web +- Add missing props to React package [#6895](https://github.com/rerun-io/rerun/pull/6895) +- Fix multi rrd on `app.rerun.io` [#6972](https://github.com/rerun-io/rerun/pull/6972) + +#### ✨ Other enhancement +- Support decoding multiplexed RRD streams [#7091](https://github.com/rerun-io/rerun/pull/7091) +- Query-time clears (latest-at only) [#6586](https://github.com/rerun-io/rerun/pull/6586) +- Introduce `ChunkStore::drop_entity_path` [#6588](https://github.com/rerun-io/rerun/pull/6588) +- Implement `Chunk::cell` [#6875](https://github.com/rerun-io/rerun/pull/6875) +- Implement `Chunk::iter_indices` [#6877](https://github.com/rerun-io/rerun/pull/6877) +- Drop, rather than clear, removed blueprint entities [#7120](https://github.com/rerun-io/rerun/pull/7120) +- Implement support for `RangeQueryOptions::include_extended_bounds` [#7132](https://github.com/rerun-io/rerun/pull/7132) + +#### 🧑‍💻 Dev-experience +- Introduce `Chunk` component-level helpers and `UnitChunk` [#6990](https://github.com/rerun-io/rerun/pull/6990) +- Vastly improved support for deserialized iteration [#7024](https://github.com/rerun-io/rerun/pull/7024) +- Improved CLI: support wildcard inputs for all relevant `rerun rrd` subcommands [#7060](https://github.com/rerun-io/rerun/pull/7060) +- Improved CLI: explicit CLI flags for compaction settings [#7061](https://github.com/rerun-io/rerun/pull/7061) +- Improved CLI: stdin streaming support [#7092](https://github.com/rerun-io/rerun/pull/7092) +- Improved CLI: stdout streaming support [#7094](https://github.com/rerun-io/rerun/pull/7094) +- Improved CLI: implement `rerun rrd filter` [#7095](https://github.com/rerun-io/rerun/pull/7095) +- Add support for `rerun rrd filter --drop-entity` [#7185](https://github.com/rerun-io/rerun/pull/7185) + +#### 🗣 Refactors +- Forward Rust (de-)serialization of transparent datatypes [#6793](https://github.com/rerun-io/rerun/pull/6793) +- CLI refactor: introduce `rerun rrd ` subscommand [#6861](https://github.com/rerun-io/rerun/pull/6861) +- Remove legacy query engine and promises [#7033](https://github.com/rerun-io/rerun/pull/7033) +- Implement `RangeQueryOptions` directly within `RangeQuery` [#7131](https://github.com/rerun-io/rerun/pull/7131) + +#### 📦 Dependencies +- Update to glam 0.28 & replace `macaw` with fork `re_math` [#6867](https://github.com/rerun-io/rerun/pull/6867) + +#### 🤷‍ Other +- Fix linkchecker: proper allow-list of stackoverflow.com [#6838](https://github.com/rerun-io/rerun/pull/6838) +- Don't lint comments inside `[metadata]` frontmatter [#6903](https://github.com/rerun-io/rerun/pull/6903) +- Add basic checklist to test different 3D transform types & transform hierarchy propagation [#6968](https://github.com/rerun-io/rerun/pull/6968) + + +## [0.17.0](https://github.com/rerun-io/rerun/compare/0.16.1...0.17.0) - More Blueprint features and better notebooks - 2024-07-08 + +https://github.com/rerun-io/rerun/assets/49431240/1c75b816-7e3e-4882-9ee6-ba124c00d73c + +📖 Release blogpost: https://rerun.io/blog/blueprint-overrides + +🧳 Migration guide: https://rerun.io/docs/reference/migration/migration-0-17 + + +### ✨ Overview & highlights + +* 🟦 Blueprint component override & defaults, and visualizer override for all views + * *Component defaults*: Configure default component value for an entire view, used when no values are logged to the data store (using `rr.log()`). + * *Component overrides*: Specify a value to use regardless of the data-store & default values and use specified value instead. Can be set per view per entity. + * *Visualizer overrides*: Specify a visualizer to use for a given entity in a given view. Previously only available for scalar data in timeseries views, now available for all view kinds. + * All three are available from the (fully revamped) UI _and_ the Python blueprint APIs. + * Everything that was editable per entity in a view now uses component overrides (e.g. camera plane distance, transform axis lengths, etc.) + * Tip: Tooltips for each component in the UI include a link to the docs now! +* 🕸️ Improved notebook & website embedding support + * Now you can stream data from the notebook cell to the embedded viewer. + * Much improved support for having multiple viewers on the same web page. + * More configuration options have been added to control the visibility of the Menu bar, time controls, etc. + * Note: Use `pip install "rerun-sdk[notebook]"` to include the better notebook support. This includes the new [`rerun-notebook`](https://pypi.org/project/rerun-notebook/) package, which is used internally by [`rerun-sdk`]. +* 🧑‍🏫 New Examples + * [Paddle OCR](https://rerun.io/examples/video-image/ocr) + * [Vista driving world model](https://rerun.io/examples/generative-vision/vista) + * [Stereo Vision SLAM](https://rerun.io/examples/3d-reconstruction/stereo_vision_slam) + * [Neural field notebook](https://rerun.io/examples/integrations/notebook_neural_field_2d) +* 🛠️ Improved the logging API with many new and updated archetypes and components (see [migration guide](https://rerun.io/docs/reference/migration/migration-0-17)) +* 🖼️ `TensorView` is now fully configurable from blueprint code +* 🎛️ Revamped selection panel UI +* 🚚 Much work is being done under-the-hood to migrate our data-store to "chunks" (aka units of batched data). More on this in the next release! + * SDKs are already using chunks to transport data to the viewer, performance characteristics may have changed but should be largely the same for the moment. + +### ⚠️ Breaking changes +* `HalfSizes2D` has been renamed to [`HalfSize2D`](https://rerun.io/docs/reference/types/components/half_size2d) +* `HalfSizes3D` has been renamed to [`HalfSize3D`](https://rerun.io/docs/reference/types/components/half_size3d) +* `.rrd` files from older versions won't load in Rerun 0.17 + +🧳 Migration guide: https://rerun.io/docs/reference/migration/migration-0-17 + +### 🔎 Details + +#### 🪵 Log API +- Introduce chunks and use them on the client side: + - Part 0: improved arrow chunk formatters [#6437](https://github.com/rerun-io/rerun/pull/6437) + - Part 1: introduce `Chunk` and its suffle/sort routines [#6438](https://github.com/rerun-io/rerun/pull/6438) + - Part 2: introduce `TransportChunk` [#6439](https://github.com/rerun-io/rerun/pull/6439) + - Part 3: micro-batching [#6440](https://github.com/rerun-io/rerun/pull/6440) + - Part 4: integrations [#6441](https://github.com/rerun-io/rerun/pull/6441) +- Remove unused scalar scattering component [#6471](https://github.com/rerun-io/rerun/pull/6471) +- Introduce `ImagePlaneDistance` Component [#6505](https://github.com/rerun-io/rerun/pull/6505) +- Introduce new archetype for `Axes3D` [#6510](https://github.com/rerun-io/rerun/pull/6510) +- Expose `Colormap` component for `DepthImage`, depth image colormap now used outside of reprojection [#6549](https://github.com/rerun-io/rerun/pull/6549) +- `TimeSeriesAggregation` can now be set per `SeriesLine` (and as blueprint default per View) [#6558](https://github.com/rerun-io/rerun/pull/6558) +- Expose `FillRatio` component to configure `DepthImage` back-projection radius scaling [#6566](https://github.com/rerun-io/rerun/pull/6566) +- Expose image opacity component [#6635](https://github.com/rerun-io/rerun/pull/6635) +- Make draw order editable & solve 2D flickering issues, add draw order to arrow2d archetype [#6644](https://github.com/rerun-io/rerun/pull/6644) +- Remove `Axes3D` archetype and add `axis_length` to `Transform3D` [#6676](https://github.com/rerun-io/rerun/pull/6676) +- Expose UI point radii to logging & blueprint, remove old default radius settings in favor of blueprint default components [#6678](https://github.com/rerun-io/rerun/pull/6678) +- Rename `HalfSizes2D/3D` to `HalfSize2D/3D` [#6768](https://github.com/rerun-io/rerun/pull/6768) + +#### 🌊 C++ API +- Add docs on how to install C++ SDK with conda-forge packages [#6381](https://github.com/rerun-io/rerun/pull/6381) (thanks [@traversaro](https://github.com/traversaro)!) + +#### 🐍 Python API +- Make barchart legend settable via blueprint [#6514](https://github.com/rerun-io/rerun/pull/6514) +- Expose tensor slice selection to blueprint [#6590](https://github.com/rerun-io/rerun/pull/6590) +- Use literal unions in Python enum codegen [#6408](https://github.com/rerun-io/rerun/pull/6408) +- Allow hiding top panel via blueprint [#6409](https://github.com/rerun-io/rerun/pull/6409) +- Improve the visibility of Python public APIs to type checkers [#6462](https://github.com/rerun-io/rerun/pull/6462) +- Expose `Interactive` component [#6542](https://github.com/rerun-io/rerun/pull/6542) +- Python components now implement the `ComponentBatchLike` interface [#6543](https://github.com/rerun-io/rerun/pull/6543) +- Allow streaming to the viewer from the cell where it's created [#6640](https://github.com/rerun-io/rerun/pull/6640) +- Introduce new Python API for setting overrides [#6650](https://github.com/rerun-io/rerun/pull/6650) +- Publish `rerun_notebook` in CI [#6641](https://github.com/rerun-io/rerun/pull/6641) + +#### 🦀 Rust API +- All components implement the `Default` trait now in Rust [#6458](https://github.com/rerun-io/rerun/pull/6458) +- Codegen `DerefMut` & `Deref` for all trivial components [#6470](https://github.com/rerun-io/rerun/pull/6470) + +#### 🪳 Bug fixes +- Allow removing blueprint entries even when they are invisible [#6503](https://github.com/rerun-io/rerun/pull/6503) +- Fix wrong depth projection value on picking when depth meter was edited [#6551](https://github.com/rerun-io/rerun/pull/6551) +- Always enable OpenGL fallback backend, fix `--renderer=gl` only working together with `WGPU_BACKEND` env-var [#6582](https://github.com/rerun-io/rerun/pull/6582) +- Improve container selection panel UI [#6711](https://github.com/rerun-io/rerun/pull/6711) +- Fix annotation context labels not showing in views [#6742](https://github.com/rerun-io/rerun/pull/6742) +- Quiet the 'not a mono-batch' log spam when selecting keypoint with a batch class-id [#6359](https://github.com/rerun-io/rerun/pull/6359) +- Fix incorrect label placement for 3D arrows with origins [#6779](https://github.com/rerun-io/rerun/pull/6779) +- Don't pass RRD paths to other data-loaders [#6617](https://github.com/rerun-io/rerun/pull/6617) + +#### 🌁 Viewer improvements +- Introduce a mechanism for blueprint-provided defaults [#6537](https://github.com/rerun-io/rerun/pull/6537) +- Allow resetting view property components from GUI for all generically implemented property UI [#6417](https://github.com/rerun-io/rerun/pull/6417) +- Don't log "SDK client connected" messages until after we have confirmed it's a client [#6456](https://github.com/rerun-io/rerun/pull/6456) +- Background color settings uses new generic UI now [#6480](https://github.com/rerun-io/rerun/pull/6480) +- TimeSeries y-range is now tightly synced with plot view & uses new generic UI [#6485](https://github.com/rerun-io/rerun/pull/6485) +- Remove option to enable/disable depth projection from UI [#6550](https://github.com/rerun-io/rerun/pull/6550) +- Expose tensor colormap/gamma/filter/scaling to blueprint [#6585](https://github.com/rerun-io/rerun/pull/6585) +- Handle static text messages in TextLogView gracefully, handle overrides [#6712](https://github.com/rerun-io/rerun/pull/6712) +- Multiple instances of points/arrows/boxes with single label display label now at the center [#6741](https://github.com/rerun-io/rerun/pull/6741) + +#### 🧑‍🏫 Examples +- Add the OCR example [#6560](https://github.com/rerun-io/rerun/pull/6560) (thanks [@andreasnaoum](https://github.com/andreasnaoum)!) +- Add the Vista example [#6664](https://github.com/rerun-io/rerun/pull/6664) (thanks [@roym899](https://github.com/roym899)!) +- Add the Stereo Vision SLAM example [#6669](https://github.com/rerun-io/rerun/pull/6669) (thanks [@02alexander](https://github.com/02alexander)!) +- Add 2D neural field notebook example [#6775](https://github.com/rerun-io/rerun/pull/6775) (thanks [@roym899](https://github.com/roym899)!) +- Update the nuScenes example to use blueprint overrides and defaults [#6783](https://github.com/rerun-io/rerun/pull/6783) +- Update the plots example to use blueprint overrides [#6781](https://github.com/rerun-io/rerun/pull/6781) + +#### 📚 Docs +- Add links to our docs in component tooltips [#6482](https://github.com/rerun-io/rerun/pull/6482) +- Show the first line of the docs when hovering a component name [#6609](https://github.com/rerun-io/rerun/pull/6609) +- Improve docs for components [#6621](https://github.com/rerun-io/rerun/pull/6621) +- Add a "Visualizers and Overrides" concept page [#6679](https://github.com/rerun-io/rerun/pull/6679) +- Better document limited effect of `DepthMeter` & `FillRatio` in 2D views [#6745](https://github.com/rerun-io/rerun/pull/6745) +- Update troubleshooting guide with graphics driver updating advice [#6756](https://github.com/rerun-io/rerun/pull/6756) +- Update Pixi link to their new website [#6688](https://github.com/rerun-io/rerun/pull/6688) (thanks [@esteve](https://github.com/esteve)!) +- Use "N-dimensional" instead of "rank-N" in docstrings and error messages [#6797](https://github.com/rerun-io/rerun/pull/6797) + +#### 🖼 UI improvements +- Update the UI for time series view properties using list item [#6390](https://github.com/rerun-io/rerun/pull/6390) +- Fix welcome screen header jumping during load [#6389](https://github.com/rerun-io/rerun/pull/6389) +- Add support for exact width to `PropertyContent` [#6325](https://github.com/rerun-io/rerun/pull/6325) +- Migrate to `list_time2`: + - Part 1: ensure background is painted on rounded pixels [#6376](https://github.com/rerun-io/rerun/pull/6376) + - Part 2: convert all use of legacy list time to `list_item2` [#6377](https://github.com/rerun-io/rerun/pull/6377) + - Part 3: rename `list_item2` to `list_item` [#6378](https://github.com/rerun-io/rerun/pull/6378) +- Improve the colormap drop down menu [#6401](https://github.com/rerun-io/rerun/pull/6401) +- Reduce height of top and bottom panels [#6397](https://github.com/rerun-io/rerun/pull/6397) +- Allow hiding all TimePanel/BlueprintPanel/SelectionPanel [#6407](https://github.com/rerun-io/rerun/pull/6407) +- Remove the ability to display multiple tensors in a single space view [#6392](https://github.com/rerun-io/rerun/pull/6392) +- Smooth scrolling in 2D space views [#6422](https://github.com/rerun-io/rerun/pull/6422) +- Improve welcome screen for small screens [#6421](https://github.com/rerun-io/rerun/pull/6421) +- Use egui's `UiStack` to implement full span widgets [#6491](https://github.com/rerun-io/rerun/pull/6491) +- Use `list_item` for the component list in `InstancePath::data_ui` [#6309](https://github.com/rerun-io/rerun/pull/6309) +- Allow editing visual bounds from UI [#6492](https://github.com/rerun-io/rerun/pull/6492) +- Allow manually setting full span scopes [#6509](https://github.com/rerun-io/rerun/pull/6509) +- Make object hover & selection colors brighter and more pronounced [#6596](https://github.com/rerun-io/rerun/pull/6596) +- Show outline around hovered/selected tiles in viewport [#6597](https://github.com/rerun-io/rerun/pull/6597) +- Unified visualizer & override UI, enabled on all entities [#6599](https://github.com/rerun-io/rerun/pull/6599) +- Introduce visualizer blueprint query stack UI [#6605](https://github.com/rerun-io/rerun/pull/6605) +- Reorganize Selection Panel [#6637](https://github.com/rerun-io/rerun/pull/6637) +- Rewrite the `ui.large_collapsing_header` into `re_ui::SectionCollapsingHeader` using `re_ui::ListItem` [#6657](https://github.com/rerun-io/rerun/pull/6657) +- Move entity filter "edit" button to a section header icon [#6662](https://github.com/rerun-io/rerun/pull/6662) +- Add help to several sections in the Selection Panel [#6668](https://github.com/rerun-io/rerun/pull/6668) +- Introduce `ButtonContent` and use it in the selection panel [#6720](https://github.com/rerun-io/rerun/pull/6720) + +#### 🕸️ Web +- Allow overriding app blueprint from web [#6419](https://github.com/rerun-io/rerun/pull/6419) +- Add fullscreen mode to web viewer [#6461](https://github.com/rerun-io/rerun/pull/6461) +- Fix rerun-web canvas size [#6511](https://github.com/rerun-io/rerun/pull/6511) +- JS: Make LogChannel public [#6529](https://github.com/rerun-io/rerun/pull/6529) +- New notebook API [#6573](https://github.com/rerun-io/rerun/pull/6573) +- Add width/height properties to web viewer [#6636](https://github.com/rerun-io/rerun/pull/6636) +- Do not read query in embedded web viewer [#6515](https://github.com/rerun-io/rerun/pull/6515) + + +#### 🗣 Refactors +- Generic view property building, applied to `TimeSeriesView`'s `PlotLegend` [#6400](https://github.com/rerun-io/rerun/pull/6400) +- Extracted several `re_viewer` parts into standalone crates: `re_viewport_blueprint` [#6405](https://github.com/rerun-io/rerun/pull/6405), `re_context_menu` [#6428](https://github.com/rerun-io/rerun/pull/6423), `re_blueprint_tree`[#6427](https://github.com/rerun-io/rerun/pull/6427), and `re_selection_panel` [#6431](https://github.com/rerun-io/rerun/pull/6431) + +#### 📦 Dependencies +- Update to egui 0.28.1 [#6752](https://github.com/rerun-io/rerun/pull/6752), [#6785](https://github.com/rerun-io/rerun/pull/6785) +- Update ewebsock to 0.6.0 [#6394](https://github.com/rerun-io/rerun/pull/6394) +- Update to `wgpu 0.20`, fixing crashes with some Linux setups [#6171](https://github.com/rerun-io/rerun/pull/6171) + + +## [0.16.1](https://github.com/rerun-io/rerun/compare/0.16.0...0.16.1) - Bug fix - 2024-05-29 +- Don't log warnings when unknown clients connect over TCP [#6368](https://github.com/rerun-io/rerun/pull/6368) +- Fix not being able to set time series' Y axis ranges from the UI [#6384](https://github.com/rerun-io/rerun/pull/6384) +- Fix error when logging segmentation image [#6449](https://github.com/rerun-io/rerun/pull/6449) +- Fix broken example source links in Viewer example list [#6451](https://github.com/rerun-io/rerun/pull/6451) + + +## [0.16.0](https://github.com/rerun-io/rerun/compare/0.15.1...0.16.0) - First configurable views - 2024-05-16 + +https://github.com/rerun-io/rerun/assets/3312232/475468bd-e012-4837-b2b4-b47fa9791e2c + +### ✨ Overview & highlights + +* 🟦 Customize views in code: We started exposing some view properties in the blueprint! + * 📋 Included are: + * Visible time ranges + * check [this new how-to guide](https://rerun.io/docs/howto/fixed-window-plot) & example that demonstrates this with plots + * Time Series legend & y-axis configuration + * 2D & 3D View background color + * 2D View bounds + * 📚 learn more on the [new view blueprint doc pages](https://rerun.io/docs/reference/types/views) + * 🚀 …more to come in the future! +* 🕰️ Deprecated `timeless` in favor of new `static` logging + * Except for the name change, they behave similarly in _most_ use cases. Unlike with timeless, static data… + * …can't be mixed with non-static data on the same component. + * …will override previous static data and not keep old data in memory. + * Check out our [migration guide](https://rerun.io/docs/reference/migration/migration-0-16). +* 🖼️ 2D View's pan & zoom got redone, it's now a free canvas without any scroll bar +* 🤖 Added [an example](https://rerun.io/examples/robotics/ros2_bridge) to use Rerun with ROS2. + +As always there's a lot going on under the hood: +* 🚚 We streamlined our development processes & CI and examples. +* 🕸️ Our web page is about to switch from React to Svelte, making it a lot snappier! +* 💿 Instance key removal in 0.15.0 opened the door to major simplifications in our data store, this + will make it easier for us to improve performance and implement data streaming. +* 🤗 We're making it easier to work with [HuggingFace](https://huggingface.co/)'s [Gradio API](https://www.gradio.app/). Stay tuned! Most things for this already landed in this release and we'll soon build more direct support on top. + +### 🔎 Details + +#### 🪵 Log API +- Sunset `MeshProperties`, introduce `TriangleIndices` and friends [#6169](https://github.com/rerun-io/rerun/pull/6169) +- Add a new javascript API for submitting an RRD that is stored directly as bytes [#6189](https://github.com/rerun-io/rerun/pull/6189) +- Keep Rerun viewer from dying on ctrl-c by setting `sid` on unix systems [#6260](https://github.com/rerun-io/rerun/pull/6260) +- Add a new CLI option / spawn options to hide the welcome screen [#6262](https://github.com/rerun-io/rerun/pull/6262) +- Make sure all log messages are sent when using `.serve()` [#6335](https://github.com/rerun-io/rerun/pull/6335) + +#### 🌊 C++ API +- Static-aware C & C++ SDKs [#5537](https://github.com/rerun-io/rerun/pull/5537) +- Support shared library building on Windows [#6053](https://github.com/rerun-io/rerun/pull/6053) (thanks [@traversaro](https://github.com/traversaro)!) + +#### 🐍 Python API +- Static-aware Python SDK [#5536](https://github.com/rerun-io/rerun/pull/5536) +- Make rerun-py use an embedded rerun-cli executable [#5996](https://github.com/rerun-io/rerun/pull/5996) +- Convert Python examples to proper packages [#5966](https://github.com/rerun-io/rerun/pull/5966) +- Configurable background color from Python code (POC for space view properties from code) [#6068](https://github.com/rerun-io/rerun/pull/6068) +- Codegen for space view Python blueprint classes [#6100](https://github.com/rerun-io/rerun/pull/6100) +- Allow setting view visibility from blueprint API [#6108](https://github.com/rerun-io/rerun/pull/6108) +- Expose `PlotLegend` and `ScalarAxis` (axis_y) properties on `TimeSeriesView` blueprint [#6114](https://github.com/rerun-io/rerun/pull/6114) +- Change background of 2D space views from code and/or UI [#6116](https://github.com/rerun-io/rerun/pull/6116) +- Set visual 2D bounds from code [#6127](https://github.com/rerun-io/rerun/pull/6127) +- Make visual time range on views a view property that can be set from Python code [#6164](https://github.com/rerun-io/rerun/pull/6164) +- Introduce new mechanism to incrementally drain from a memory_recording [#6187](https://github.com/rerun-io/rerun/pull/6187) +- Work around some issues where recording streams leaking context when used with generators [#6240](https://github.com/rerun-io/rerun/pull/6240) +- Introduce a new BinaryStreamSink that allows reading a stream of encoded bytes [#6242](https://github.com/rerun-io/rerun/pull/6242) +- Improve new time_ranges property Python API & add snippet for time series view, explaining all its options [#6221](https://github.com/rerun-io/rerun/pull/6221) +- Fix possible hang when using torch.multiprocessing [#6271](https://github.com/rerun-io/rerun/pull/6271) +- Add code examples & screenshots for all blueprint view types [#6304](https://github.com/rerun-io/rerun/pull/6304) +- Set a minimum version of pillow in `rerun_py/pyproject.toml` [#6327](https://github.com/rerun-io/rerun/pull/6327) +- Respect the `RERUN_STRICT` environment variable if not specified in `rr.init` [#6341](https://github.com/rerun-io/rerun/pull/6341) + +#### 🦀 Rust API +- Static-aware Rust SDK [#5540](https://github.com/rerun-io/rerun/pull/5540) +- Remove need for tokio runtime for supporting `serve` [#6043](https://github.com/rerun-io/rerun/pull/6043) +- Add `TextDocument::from_markdown` constructor [#6109](https://github.com/rerun-io/rerun/pull/6109) +- Document all public item in `re_types` [#6146](https://github.com/rerun-io/rerun/pull/6146) +- Fix crash on `i32` overflow during arrow serialization [#6285](https://github.com/rerun-io/rerun/pull/6285) +- Revamped `TimeInt` [#5534](https://github.com/rerun-io/rerun/pull/5534) + +#### 🪳 Bug fixes +- Fix silently interpreting zero time range as latest-at query [#6172](https://github.com/rerun-io/rerun/pull/6172) +- Fix not being able to click suggestions in space origin selection dropdown [#6200](https://github.com/rerun-io/rerun/pull/6200) +- Fix bug in origin selection UI [#6199](https://github.com/rerun-io/rerun/pull/6199) +- Fix out-of-bounds crash in origin selection popup [#6202](https://github.com/rerun-io/rerun/pull/6202) +- Fix rare crash [#6251](https://github.com/rerun-io/rerun/pull/6251) +- Fix visual glitch when extending the time panel [#6255](https://github.com/rerun-io/rerun/pull/6255) +- Don't automatically fall back to automatic port if web socket port is already in use, only recommend using 0 instead [#6296](https://github.com/rerun-io/rerun/pull/6296) + +#### 🌁 Viewer improvements +- Request attention when Rerun Viewer is sent new recording in background [#5780](https://github.com/rerun-io/rerun/pull/5780) +- New data APIs 11: port all range-only views (plots, logs…) [#5992](https://github.com/rerun-io/rerun/pull/5992) +- New data APIs 12: port all spatial views [#5993](https://github.com/rerun-io/rerun/pull/5993) +- New data APIs 14: port everything that used to be uncached [#6035](https://github.com/rerun-io/rerun/pull/6035) +- Make visible time range UI aware of latest-at & `QueryRange` [#6176](https://github.com/rerun-io/rerun/pull/6176) +- Visible time ranges are now specified per timeline, not per timeline type [#6204](https://github.com/rerun-io/rerun/pull/6204) +- Send TCP protocol header to ignore non-rerun clients [#6253](https://github.com/rerun-io/rerun/pull/6253) (thanks [@gurry](https://github.com/gurry)!) + +#### 🚀 Performance improvements +- New data APIs 4: cached latest-at mono helpers everywhere [#5606](https://github.com/rerun-io/rerun/pull/5606) +- New data APIs 5: port data UIs to new APIs [#5633](https://github.com/rerun-io/rerun/pull/5633) +- New data APIs 9: cached range queries [#5755](https://github.com/rerun-io/rerun/pull/5755) +- New data APIs 16: introduce non-cacheable components [#6037](https://github.com/rerun-io/rerun/pull/6037) +- Remove instance keys and explicit splatting everywhere [#6104](https://github.com/rerun-io/rerun/pull/6104) + +#### 🧑‍🏫 Examples +- Update depth-guided stable diffusion example to diffusers 0.27.2 [#5985](https://github.com/rerun-io/rerun/pull/5985) (thanks [@roym899](https://github.com/roym899)!) +- Add ROS 2 bridge example [#6163](https://github.com/rerun-io/rerun/pull/6163) (thanks [@roym899](https://github.com/roym899)!) +- Add DROID dataset example [#6149](https://github.com/rerun-io/rerun/pull/6149) (thanks [@02alexander](https://github.com/02alexander)!) +- New example and tutorial showing how to create a live scrolling plot [#6314](https://github.com/rerun-io/rerun/pull/6314) +- Update the example in configure-viewer-through-code.md to use subclasses of `SpaceView` [#6092](https://github.com/rerun-io/rerun/pull/6092) (thanks [@m-decoster](https://github.com/m-decoster)!) + +#### 📚 Docs +- Update Python readme and add `py-wheel` command [#5912](https://github.com/rerun-io/rerun/pull/5912) +- Update Python API links to getting-started and tutorial [#5923](https://github.com/rerun-io/rerun/pull/5923) (thanks [@Mxbonn](https://github.com/Mxbonn)!) +- Fix various links in Rust, Python and toml files [#5986](https://github.com/rerun-io/rerun/pull/5986) +- Improve type index pages, codegen now knows about doc categories [#5978](https://github.com/rerun-io/rerun/pull/5978) +- Generate doc pages for blueprint views [#6121](https://github.com/rerun-io/rerun/pull/6121) +- Clarify docs on GH release install & C++ source build, remove redundant rerun_cpp_sdk artifact [#6144](https://github.com/rerun-io/rerun/pull/6144) +- Documentation for archetype and views references each other [#6319](https://github.com/rerun-io/rerun/pull/6319) + +#### 🖼 UI improvements +- Update `egui_commonmark` [#5864](https://github.com/rerun-io/rerun/pull/5864) +- Update UI for static components [#6101](https://github.com/rerun-io/rerun/pull/6101) +- Allow any pan/zoom in 2D spatial views [#6089](https://github.com/rerun-io/rerun/pull/6089) +- `ListItem`2.0 (part 1): introduce content-generic `ListItem` and `LabelContent` legacy back-port [#6161](https://github.com/rerun-io/rerun/pull/6161) +- `ListItem` 2.0 (part 2): introduce `PropertyContent` for two-column, property-like list items [#6174](https://github.com/rerun-io/rerun/pull/6174) +- `ListItem` 2.0 (part 3): `PropertyContent` column auto-sizing [#6182](https://github.com/rerun-io/rerun/pull/6182) +- `ListItem` 2.0 (part 4): only allocate space for property action buttons when needed [#6183](https://github.com/rerun-io/rerun/pull/6183) +- `ListItem` 2.0 (part 5): deploy to the Visualizers and Overrides UIs [#6184](https://github.com/rerun-io/rerun/pull/6184) +- `ListItem` 2.0 (part 6): split full-span range management to a dedicated module [#6211](https://github.com/rerun-io/rerun/pull/6211) +- Add button to equalize the size of the children of a container [#6194](https://github.com/rerun-io/rerun/pull/6194) +- Use thousands separators when formatting seconds [#6212](https://github.com/rerun-io/rerun/pull/6212) +- Add space view icons to various context menus [#6235](https://github.com/rerun-io/rerun/pull/6235) +- Migrate all full-span widgets to `re_ui::full_span` [#6248](https://github.com/rerun-io/rerun/pull/6248) +- Improve error message when using an under-powered GPU [#6252](https://github.com/rerun-io/rerun/pull/6252) +- Improve the default UI when the welcome screen is hidden [#6287](https://github.com/rerun-io/rerun/pull/6287) +- Improve UI of various components in the selection panel [#6297](https://github.com/rerun-io/rerun/pull/6297) + +#### 🕸️ Web +- Rewrite `re_ws_comms` to work without `async` & `tokio` runtime [#6005](https://github.com/rerun-io/rerun/pull/6005) +- Fix: Preserve history state [#6302](https://github.com/rerun-io/rerun/pull/6302) +- Make it possible to open http-streamed RRDs in follow mode via JS API [#6326](https://github.com/rerun-io/rerun/pull/6326) + +#### 📈 Analytics +- Transmit url analytics correctly for rerun.io domains [#6322](https://github.com/rerun-io/rerun/pull/6322) +- Keep track of the RRD protocol version and display it where relevant [#6324](https://github.com/rerun-io/rerun/pull/6324) + +#### 🧑‍💻 Dev-experience +- New data APIs 6: cached archetype queries [#5673](https://github.com/rerun-io/rerun/pull/5673) +- Remove justfile & fully replace remaining commands with Pixi [#5892](https://github.com/rerun-io/rerun/pull/5892) +- Replace requirements-docs.txt with a Python doc Pixi environment [#5909](https://github.com/rerun-io/rerun/pull/5909) +- Update to Rust 1.76 [#5908](https://github.com/rerun-io/rerun/pull/5908) +- Remove all dev/ci requirements.txt and fully replace with Pixi [#5939](https://github.com/rerun-io/rerun/pull/5939) +- Markdown linter [#6181](https://github.com/rerun-io/rerun/pull/6181) + +#### 🗣 Refactors +- `re_web_viewer_server` no longer needs tokio, split out sync code path [#6030](https://github.com/rerun-io/rerun/pull/6030) +- Replace hyper with tiny_http to serve http files for `serve` functionality [#6042](https://github.com/rerun-io/rerun/pull/6042) +- New data APIs 13: sunset legacy cache crate [#5994](https://github.com/rerun-io/rerun/pull/5994) +- New data APIs 15: one query crate to rule them all [#6036](https://github.com/rerun-io/rerun/pull/6036) +- `ListItem` 2.0 (part 0): `re_ui_example` refactor [#6148](https://github.com/rerun-io/rerun/pull/6148) +- Fix: `re_sdk` no longer depends on `rustls` [#6210](https://github.com/rerun-io/rerun/pull/6210) +- Reduce number of unwrap calls and make clippy warning for it opt-out per crate [#6311](https://github.com/rerun-io/rerun/pull/6311) (thanks [@Artxiom](https://github.com/Artxiom)!) + +#### 📦 Dependencies +- Wgpu update (0.19.3 -> 0.19.4) [#6044](https://github.com/rerun-io/rerun/pull/6044) + +#### 🤷‍ Other +- Static data 1: static-aware datastore, caches and queries [#5535](https://github.com/rerun-io/rerun/pull/5535) +- New data APIs 0: `ClampedZip` iterator machinery [#5573](https://github.com/rerun-io/rerun/pull/5573) +- New data APIs 1: uncached latest-at queries [#5574](https://github.com/rerun-io/rerun/pull/5574) +- New data APIs 2: cached latest-at queries [#5581](https://github.com/rerun-io/rerun/pull/5581) +- New data APIs 3: Send/Sync/'static `Component`, once and for all [#5605](https://github.com/rerun-io/rerun/pull/5605) +- New data APIs 7: `RangeZip` iterator machinery [#5679](https://github.com/rerun-io/rerun/pull/5679) +- New data APIs 8: uncached range queries [#5687](https://github.com/rerun-io/rerun/pull/5687) +- New data APIs 10: stats and debug tools for new caches [#5990](https://github.com/rerun-io/rerun/pull/5990) +- Validate the blueprint schema when we try to activate a blueprint sent from SDK [#6283](https://github.com/rerun-io/rerun/pull/6283) + + +## [0.15.1](https://github.com/rerun-io/rerun/compare/0.15.0...0.15.1) - Bug fix for notebooks - 2024-04-11 +- Fix timeout in notebooks by making the `app_url` correctly point to `app.rerun.io` [#5877](https://github.com/rerun-io/rerun/pull/5877) +- CMake: Allow to call `find_package(rerun_sdk)` two or more times [#5886](https://github.com/rerun-io/rerun/pull/5886) (thanks [@traversaro](https://github.com/traversaro)!) + + +## [0.15.0](https://github.com/rerun-io/rerun/compare/0.14.1...0.15.0) - Blueprints from Python - 2024-04-09 +The biggest news is the ability to create a _blueprint_ via the Python logging API. Check out our [associated blog post](https://rerun.io/blog/blueprint-part-one) for more information. + +```py +import rerun.blueprint as rrb + +blueprint = rrb.Blueprint( + rrb.Vertical( + rrb.Spatial3DView(name="3D", origin="/"), + rrb.Horizontal( + rrb.TextDocumentView(name="README", origin="/description"), + rrb.Spatial2DView(name="Camera", origin="/camera/image"), + rrb.TimeSeriesView(origin="/plot"), + ), + row_shares=[3, 2], + ) + rrb.BlueprintPanel(expanded=True), + rrb.SelectionPanel(expanded=False), + rrb.TimePanel(expanded=False), +) +``` + +The blueprint can then be sent to the Viewer with +```py +rr.send_blueprint(blueprint) +``` + +Or stored to a file, and then later opened in the viewer: +```py +blueprint.save("my_nice_dashboard.rbl") +``` + +In this case, the results looks something like this: + + + + + + + + + +Blueprints are currently only supported in the Python API, with C++ and Rust support coming later. + + +### ✨ Overview & highlights +- 🟦 Configure the layout and content of space views from Python [(docs)](https://rerun.io/docs/howto/configure-viewer-through-code) +- 🖧 More powerful and flexible data loaders [(docs)](https://rerun.io/docs/reference/data-loaders) +- 🖵 Improved UI for managing recordings and applications +- 💾 Save and load blueprint files in the viewer +- 🎨 Configurable background color for 3D Space Views [#5443](https://github.com/rerun-io/rerun/pull/5443) +- 💪 Linux ARM64 support [#5489](https://github.com/rerun-io/rerun/pull/5489) [#5503](https://github.com/rerun-io/rerun/pull/5503) [#5511](https://github.com/rerun-io/rerun/pull/5511) +- 🖼️ Show examples in the welcome page +- 🖱️ Improve context-menu when right-clicking items in the blueprint panel and streams tree +- ❌ Remove `InstanceKey` from our logging APIs [#5395](https://github.com/rerun-io/rerun/pull/5395) ([migration guide](https://rerun.io/docs/reference/migration/migration-0-15)) +- ❌ Remove groups from blueprints panel [#5326](https://github.com/rerun-io/rerun/pull/5326) + +### 🔎 Details + +#### 🪵 Log API +- Replace `MarkerShape` with code-generated `enum` type [#5336](https://github.com/rerun-io/rerun/pull/5336) +- Key-less data model 1: scrap `InstanceKey` from public logging APIs [#5395](https://github.com/rerun-io/rerun/pull/5395) +- Remove the check for `WrongNumberOfInstances` [#5399](https://github.com/rerun-io/rerun/pull/5399) +- Control panel expanded state via blueprint APIs [#5484](https://github.com/rerun-io/rerun/pull/5484) +- Remove deprecated `TimeSeriesScalar` [#5604](https://github.com/rerun-io/rerun/pull/5604) +- Customizable data loaders [#5327](https://github.com/rerun-io/rerun/pull/5327) [#5328](https://github.com/rerun-io/rerun/pull/5328) [#5330](https://github.com/rerun-io/rerun/pull/5330) [#5337](https://github.com/rerun-io/rerun/pull/5337) [#5351](https://github.com/rerun-io/rerun/pull/5351) [#5355](https://github.com/rerun-io/rerun/pull/5355) [#5379](https://github.com/rerun-io/rerun/pull/5379) [#5361](https://github.com/rerun-io/rerun/pull/5361) [#5388](https://github.com/rerun-io/rerun/pull/5388) + +#### 🌊 C++ API +- Fix Arrow libraries from download & build not being found in some cases [#5366](https://github.com/rerun-io/rerun/pull/5366) +- CMake: Add `RERUN_INSTALL_RERUN_C` option to disable installation of `rerun_c` library [#5374](https://github.com/rerun-io/rerun/pull/5374) (thanks [@traversaro](https://github.com/traversaro)!) +- CMake: Fix `install` not finding external `arrow` for dynamic linking [#5375](https://github.com/rerun-io/rerun/pull/5375) (thanks [@traversaro](https://github.com/traversaro)!) +- Make `pinhole.hpp` robust against `min/max` preprocessor macros (typically from `windows.h`) [#5432](https://github.com/rerun-io/rerun/pull/5432) +- Build C++ SDK for Linux ARM64 [#5489](https://github.com/rerun-io/rerun/pull/5489) +- Generate fewer `.cpp` files: Inline forward serialization of transparent components to their respective datatypes [#5544](https://github.com/rerun-io/rerun/pull/5544) +- Fix `RERUN_C_BUILD_ARTIFACT` path value if `CARGO_BUILD_TARGET` env variable is set [#5547](https://github.com/rerun-io/rerun/pull/5547) (thanks [@traversaro](https://github.com/traversaro)!) + +#### 🐍 Python API +- All Python components that wrap a `bool` now implement `__bool__` [#5400](https://github.com/rerun-io/rerun/pull/5400) +- Add the remaining space views and name them consistently [#5498](https://github.com/rerun-io/rerun/pull/5498) +- Add option to include blueprint in an `.rrd` when calling `.save(…)` [#5572](https://github.com/rerun-io/rerun/pull/5572) +- Allow naming space view containers [#5626](https://github.com/rerun-io/rerun/pull/5626) + +#### 🦀 Rust API + +#### 🪳 Bug fixes +- Sort text log space view on currently selected timeline [#5348](https://github.com/rerun-io/rerun/pull/5348) +- Fix parents of queried paths getting visualized, fix 2D objects not showing at all in 3D if their camera parent is not included [#5424](https://github.com/rerun-io/rerun/pull/5424) +- Fix: allow creating 3D space views for pinhole-only 3D scenes [#5563](https://github.com/rerun-io/rerun/pull/5563) +- Fix depth cloud bounding boxes for depth cloud visualizations with transforms [#5578](https://github.com/rerun-io/rerun/pull/5578) +- Fix image view not handling images with extra leading dimensions of size `1` [#5579](https://github.com/rerun-io/rerun/pull/5579) +- Fix web viewer crash on invalid url parameter [#5631](https://github.com/rerun-io/rerun/pull/5631) +- Be consistent in how items are removed from selection [#5643](https://github.com/rerun-io/rerun/pull/5643) +- Fix layout issue on welcome screen for narrow window, triggering debug assertion [#5650](https://github.com/rerun-io/rerun/pull/5650) +- Fix broken 2D space view heuristics in Python Notebooks [#5674](https://github.com/rerun-io/rerun/pull/5674) +- Avoid a hang on Linux by always create the renderer, even when we have no store_view [#5724](https://github.com/rerun-io/rerun/pull/5724) +- Fix crash/freeze when zooming out too far in a plot [#5737](https://github.com/rerun-io/rerun/pull/5737) +- Fix `draw_order` not working [#5794](https://github.com/rerun-io/rerun/pull/5794) + +#### 🌁 Viewer improvements +- Remove groups from blueprints panel [#5326](https://github.com/rerun-io/rerun/pull/5326) +- Improved tracking of which space views were generated by a heuristic [#5419](https://github.com/rerun-io/rerun/pull/5419) +- Configurable background color for 3D Space Views [#5443](https://github.com/rerun-io/rerun/pull/5443) +- Save recordings from web viewer [#5488](https://github.com/rerun-io/rerun/pull/5488) +- Support loading `.rbl` blueprint files [#5513](https://github.com/rerun-io/rerun/pull/5513) +- Tensor space view can now show images [#5567](https://github.com/rerun-io/rerun/pull/5567) +- Entity path query now shows simple statistics and warns if nothing is displayed [#5693](https://github.com/rerun-io/rerun/pull/5693) +- Go back to example page with browser Back-button [#5750](https://github.com/rerun-io/rerun/pull/5750) +- On Web, implement navigating back/forward with mouse buttons [#5792](https://github.com/rerun-io/rerun/pull/5792) +- Support displaying 1D tensors [#5837](https://github.com/rerun-io/rerun/pull/5837) + +#### 🧑‍🏫 Examples +- New `incremental_logging` example [#5462](https://github.com/rerun-io/rerun/pull/5462) +- New standalone example showing blueprint configuration of some stock [#5603](https://github.com/rerun-io/rerun/pull/5603) +- New example visualizing KISS-ICP [#5546](https://github.com/rerun-io/rerun/pull/5546) (thanks [@02alexander](https://github.com/02alexander)!) +- Remove car example [#5576](https://github.com/rerun-io/rerun/pull/5576) +- Add blueprint to `arkit_scenes` example, leveraging the viewer's ability to re-project 3D->2D [#5510](https://github.com/rerun-io/rerun/pull/5510) +- Add blueprint to `nuscenes` example [#5556](https://github.com/rerun-io/rerun/pull/5556) +- Add blueprint to Face Tracking example [#5616](https://github.com/rerun-io/rerun/pull/5616) +- Add blueprint to Gesture Detection example [#5619](https://github.com/rerun-io/rerun/pull/5619) +- Add blueprint to Human Pose Tracking example [#5612](https://github.com/rerun-io/rerun/pull/5612) +- Add blueprint to Live Camera Edge Detection example [#5613](https://github.com/rerun-io/rerun/pull/5613) +- Add blueprint to LLM Embedding Ner example [#5614](https://github.com/rerun-io/rerun/pull/5614) +- Add blueprint to Objectron example [#5617](https://github.com/rerun-io/rerun/pull/5617) +- Add blueprint to Signed Distance Fields example [#5635](https://github.com/rerun-io/rerun/pull/5635) +- Add blueprint to the RGBD example [#5623](https://github.com/rerun-io/rerun/pull/5623) +- ARFlow Example Page [#5320](https://github.com/rerun-io/rerun/pull/5320) (thanks [@YiqinZhao](https://github.com/YiqinZhao)!) +- Fix controlnet example for current `controlnet` package version and add blueprint [#5634](https://github.com/rerun-io/rerun/pull/5634) +- Fix RRT-Star example not showing up on website or rerun.io/viewer [#5628](https://github.com/rerun-io/rerun/pull/5628) +- Fix not logging 3D gesture z component correctly in Gesture Detection example [#5630](https://github.com/rerun-io/rerun/pull/5630) (thanks [@andreasnaoum](https://github.com/andreasnaoum)!) +- Updated READMEs for examples: LLM Embedding-Based Named Entity Recognition, nuScenes, Objectron, Open Photogrammetry Format, Raw Mesh [#5653](https://github.com/rerun-io/rerun/pull/5653) (thanks [@andreasnaoum](https://github.com/andreasnaoum)!) +- Updated READMEs for the examples - Batch 1 [#5620](https://github.com/rerun-io/rerun/pull/5620) (thanks [@andreasnaoum](https://github.com/andreasnaoum)!) + +#### 📚 Docs +- Docs: improve discoverability of image compression [#5675](https://github.com/rerun-io/rerun/pull/5675) +- Improve getting started doc section [#5689](https://github.com/rerun-io/rerun/pull/5689) +- Update web viewer links [#5738](https://github.com/rerun-io/rerun/pull/5738) +- Update docs with guides and tutorials for blueprint [#5641](https://github.com/rerun-io/rerun/pull/5641) +- Update README and description of `arkit_scenes` example [#5711](https://github.com/rerun-io/rerun/pull/5711) (thanks [@BirgerMoell](https://github.com/BirgerMoell)!) +- Improve readme of `depth_guided_stable_diffusion` example [#5593](https://github.com/rerun-io/rerun/pull/5593) (thanks [@BirgerMoell](https://github.com/BirgerMoell)!) + +#### 🖼 UI improvements +- New timezone option: seconds since unix epoch [#5450](https://github.com/rerun-io/rerun/pull/5450) (thanks [@murgeljm](https://github.com/murgeljm)!) +- Always enable entity path filter editor [#5331](https://github.com/rerun-io/rerun/pull/5331) +- Add icons for entities and components, and use them everywhere [#5318](https://github.com/rerun-io/rerun/pull/5318) +- Add support for context menu for viewport tab title and selected container's children list [#5321](https://github.com/rerun-io/rerun/pull/5321) +- Fix `ListItem` indentation so icons are properly aligned [#5340](https://github.com/rerun-io/rerun/pull/5340) +- Blueprint tree always starts at the origin now, "projected" paths are called out explicitly [#5342](https://github.com/rerun-io/rerun/pull/5342) +- Merge example page into welcome screen [#5329](https://github.com/rerun-io/rerun/pull/5329) +- `ListItem`'s collapsing triangle is now styled consistently with the rest of the item [#5354](https://github.com/rerun-io/rerun/pull/5354) +- Add helpers to enable stable and controllable collapsed state in hierarchical lists [#5362](https://github.com/rerun-io/rerun/pull/5362) +- Different icon for empty entity paths [#5338](https://github.com/rerun-io/rerun/pull/5338) +- Merge quick start guides [#5378](https://github.com/rerun-io/rerun/pull/5378) +- Update welcome screen panel illustrations [#5394](https://github.com/rerun-io/rerun/pull/5394) +- More context menu in blueprint and streams tree: + - Refactor [#5392](https://github.com/rerun-io/rerun/pull/5392) + - Add support to show/hide `DataResult`s [#5397](https://github.com/rerun-io/rerun/pull/5397) + - Add support for removing `DataResult` from a space view [#5407](https://github.com/rerun-io/rerun/pull/5407) + - Create a new space view with selected entities [#5411](https://github.com/rerun-io/rerun/pull/5411) + - Add context menu to streams tree [#5422](https://github.com/rerun-io/rerun/pull/5422) + - Add "Expand/Collapse all" actions [#5433](https://github.com/rerun-io/rerun/pull/5433) + - Cleanup [#5456](https://github.com/rerun-io/rerun/pull/5456) +- Automatically expand and scroll the blueprint tree when focusing on an item [#5482](https://github.com/rerun-io/rerun/pull/5482) +- Save blueprint to file [#5491](https://github.com/rerun-io/rerun/pull/5491) +- Add new design guidelines for title casing etc [#5501](https://github.com/rerun-io/rerun/pull/5501) +- Automatically expand and scroll the streams tree when focusing on an item [#5494](https://github.com/rerun-io/rerun/pull/5494) +- Reduce the height of the tab bars and side panel titles [#5609](https://github.com/rerun-io/rerun/pull/5609) +- Support toggling item visibility on touch screens [#5624](https://github.com/rerun-io/rerun/pull/5624) +- Select active recording if nothing else is selected [#5627](https://github.com/rerun-io/rerun/pull/5627) +- Enable selecting data sources and blueprints and recordings in them [#5646](https://github.com/rerun-io/rerun/pull/5646) +- Warn user when a software rasterizer is used [#5655](https://github.com/rerun-io/rerun/pull/5655) +- Improve spacing and alignment of menus [#5680](https://github.com/rerun-io/rerun/pull/5680) +- Simplify Welcome Screen and use card-based layout for examples [#5699](https://github.com/rerun-io/rerun/pull/5699) +- Make selection history global instead of per recordings [#5739](https://github.com/rerun-io/rerun/pull/5739) +- Improve formatting of numbers on plot Y axis [#5753](https://github.com/rerun-io/rerun/pull/5753) +- Show all loaded applications in recordings panel [#5766](https://github.com/rerun-io/rerun/pull/5766) +- Wider selection panel by default [#5777](https://github.com/rerun-io/rerun/pull/5777) +- Tighter UI for tensor, annotation-context, view coordinates, recording [#5782](https://github.com/rerun-io/rerun/pull/5782) +- Always show welcome screen, but sometimes fade it in [#5787](https://github.com/rerun-io/rerun/pull/5787) + +#### 🕸️ Web +- Support loading multiple recordings and/or blueprints in web-viewer [#5548](https://github.com/rerun-io/rerun/pull/5548) +- Build release `.wasm` with debug symbols [#5708](https://github.com/rerun-io/rerun/pull/5708) + +#### 🧑‍💻 Dev-experience +- Build wheels for Linux ARM64 [#5511](https://github.com/rerun-io/rerun/pull/5511) + + +#### 📦 Dependencies +- Update wgpu to 0.19.3 [#5409](https://github.com/rerun-io/rerun/pull/5409) +- Update h2 to 0.3.26 to address RUSTSEC-2024-0332 [#5775](https://github.com/rerun-io/rerun/pull/5775) + +#### 🤷‍ Other +- Build CLI for Linux ARM64 [#5503](https://github.com/rerun-io/rerun/pull/5503) +- Allow hiding/showing entity subtrees under shown/hidden parent tree [#5508](https://github.com/rerun-io/rerun/pull/5508) +- Introduce basic support for `$origin` substitution in `EntityPathFilter` [#5517](https://github.com/rerun-io/rerun/pull/5517) +- Introduce `rr.notebook_show()` to simplify notebook experience [#5715](https://github.com/rerun-io/rerun/pull/5715) +- Also remove nested inclusions when removing a subtree [#5720](https://github.com/rerun-io/rerun/pull/5720) +- Prevent gratuitous blueprint saves by not garbage collecting when the blueprint hasn't changed [#5793](https://github.com/rerun-io/rerun/pull/5793) +- Refactor `Selection` using `IndexMap` and make it more encapsulated [#5569](https://github.com/rerun-io/rerun/pull/5569) + + +## [0.14.1](https://github.com/rerun-io/rerun/compare/0.14.0...0.14.1) - C++ build artifact fix - 2024-02-29 + +This release is identical to 0.14.0 and merely fixes an issue in the build artifacts for C++: +0.14.0 only contained binaries for Linux x64, this release has the full set for Linux x64, Windows x64, Mac x64 & Mac Arm64. + + +## [0.14.0](https://github.com/rerun-io/rerun/compare/0.13.0...0.14.0) - "Unlimited" point clouds & lines, quality of life improvements, bugfixes - 2024-02-28 + +https://github.com/rerun-io/rerun/assets/1220815/beb50081-2dff-4535-b133-4dc4a5a24be0 + +### ✨ Overview & highlights + +Originally, we planned to do only a bugfix release, but we got an unexpected amount of goodies amassed already. +We're still ramping up for programmable blueprints (soon!), but meanwhile enjoy these improvements in 0.14! + +- 📈 Limits for number of points & lines per space view lifted. +- 🖱️ Added context menu (right-click) actions for items on the Blueprint panel. (Only getting started on this, more actions in future releases!) +- 🚀 Speed improvements for scenes with many transforms and large point clouds. +- 🔺 Built-in STL mesh support. +- 🎥 First-person camera. +- 🐛 Fixes regressions in Space View spawn heuristics from 0.13, and many more bugfixes. +- 🧑‍🏫 Two new examples: [Gesture Recognition](https://github.com/rerun-io/rerun/tree/0.14.0/examples/python/gesture_detection) & [RRT* Pathfinding](https://github.com/rerun-io/rerun/tree/0.14.0/examples/python/rrt-star) + +### 🔎 Details + +#### 🪵 Log API +- Add helpers for perspective cameras [#5238](https://github.com/rerun-io/rerun/pull/5238) +- Fix `spawn` starting the Viewer even if logging is disabled [#5284](https://github.com/rerun-io/rerun/pull/5284) + +#### 🐍 Python API +- Add missing Python docs for `disable_timeline` & `reset_time` [#5269](https://github.com/rerun-io/rerun/pull/5269) +- Fix missing error message when passing `from_parent` + Rerun transform type to `rerun.Transform3D` [#5270](https://github.com/rerun-io/rerun/pull/5270) + +#### 🦀 Rust API +- Fix using `rerun` crate as a dependency on CI [#5170](https://github.com/rerun-io/rerun/pull/5170) + +#### 🪳 Bug fixes +- Enforce the rule: heuristics should never add a new view that would be completely covered by an existing view [#5164](https://github.com/rerun-io/rerun/pull/5164) +- Remove log spam when quickly resizing the Viewer [#5189](https://github.com/rerun-io/rerun/pull/5189) +- Fix incorrect minimum supported Rust version mentioned in docs and examples [#5195](https://github.com/rerun-io/rerun/pull/5195) +- Less restrictive visualizability constraints of 2D entities, improved space view generation heuristics [#5188](https://github.com/rerun-io/rerun/pull/5188) +- Fix ugly UI for some Arrow data [#5235](https://github.com/rerun-io/rerun/pull/5235) +- Fix missing redraw upon resetting blueprint [#5262](https://github.com/rerun-io/rerun/pull/5262) +- Fix non-deterministic redundancy check for space view spawning heuristic [#5266](https://github.com/rerun-io/rerun/pull/5266) +- Fix resetting vertical axis when using non-uniform zoom on Time Series [#5287](https://github.com/rerun-io/rerun/pull/5287) + +#### 🌁 Viewer improvements +- Clear all blueprints in RAM and on disk when clicking "Reset Viewer" [#5199](https://github.com/rerun-io/rerun/pull/5199) +- Improve the orbit eye to always maintain an up-axis [#5193](https://github.com/rerun-io/rerun/pull/5193) +- Focus on current bounding-box when resetting camera-eye on a 3D space view (double click it) [#5209](https://github.com/rerun-io/rerun/pull/5209) +- Add STL mesh support [#5244](https://github.com/rerun-io/rerun/pull/5244) +- Add first person 3D eye-camera [#5249](https://github.com/rerun-io/rerun/pull/5249) + +#### 🚀 Performance improvements +- More robust handling of maximum texture size for non-color data, slight perf improvements for large point clouds [#5229](https://github.com/rerun-io/rerun/pull/5229) +- Cached transforms & disconnected spaces for faster scenes with many transforms [#5221](https://github.com/rerun-io/rerun/pull/5221) +- Optimized cpu time for 3D point clouds (once again!) [#5273](https://github.com/rerun-io/rerun/pull/5273) +- Only compute store/caching stats when the memory panel is opened [#5274](https://github.com/rerun-io/rerun/pull/5274) +- Increase the max WebSocket frame limit for the native client [#5282](https://github.com/rerun-io/rerun/pull/5282) + +#### 🧑‍🏫 Examples +- Add Gesture Recognition example [#5241](https://github.com/rerun-io/rerun/pull/5241) (thanks [@andreasnaoum](https://github.com/andreasnaoum)!) +- Add example visualizing RRT* [#5214](https://github.com/rerun-io/rerun/pull/5214) (thanks [@02alexander](https://github.com/02alexander)!) + +#### 📚 Docs +- Fix broken link in the installing-viewer documentation [#5236](https://github.com/rerun-io/rerun/pull/5236) (thanks [@BirgerMoell](https://github.com/BirgerMoell)!) + +#### 🖼 UI improvements +- Context Menu 1: Basic scaffolding and simple actions [#5163](https://github.com/rerun-io/rerun/pull/5163) +- Context menu 2: add support for multiple selection [#5205](https://github.com/rerun-io/rerun/pull/5205) +- Context menu 3: add "Move to new container" context menu action [#5210](https://github.com/rerun-io/rerun/pull/5210) +- Context menu 4: add "Clone space view" action [#5265](https://github.com/rerun-io/rerun/pull/5265) +- Context menu 5: refactor into multiple files [#5289](https://github.com/rerun-io/rerun/pull/5289) +- Clickable path parts in selection-panel [#5220](https://github.com/rerun-io/rerun/pull/5220) +- Don't show the blueprint section when selecting recordings [#5245](https://github.com/rerun-io/rerun/pull/5245) +- Use the same icon for recordings everywhere [#5246](https://github.com/rerun-io/rerun/pull/5246) + +#### 🎨 Renderer improvements +- Lift point cloud size limitations [#5192](https://github.com/rerun-io/rerun/pull/5192) +- Lift line vertex/strip count limitations [#5207](https://github.com/rerun-io/rerun/pull/5207) +- Fix banding artifacts of 3D space view's skybox [#5279](https://github.com/rerun-io/rerun/pull/5279) + +#### 📦 Dependencies +- Bump maturin to 1.14.0 [#5197](https://github.com/rerun-io/rerun/pull/5197) +- Update `tungstenite` to remove RUSTSEC warning [#5200](https://github.com/rerun-io/rerun/pull/5200) +- Lock the web-sys version to 0.3.67 [#5211](https://github.com/rerun-io/rerun/pull/5211) + + +## [0.13.0](https://github.com/rerun-io/rerun/compare/0.12.1...0.13.0) - Fast time series, improved layout editing & UI overrides - 2024-02-12 + +

+ +

+ +### ✨ Overview & highlights + +This release focuses on scalar time series -- both from a performance and UI perspectives. +Check out our [associated blog post](https://rerun.io/blog/fast-plots) for more information. + +- 📈 Rerun can now visualize many time series in the kHz range in real-time: + - The new query cache optimizes data access, improving query performance by 20-50x + - Sub-pixel aggregation prevents unnecessary overdraw when rendering plots, improving rendering time by 30-120x + - [Points](https://rerun.io/docs/reference/types/archetypes/points3d), [lines](https://rerun.io/docs/reference/types/archetypes/line_strips3d), [arrows](https://rerun.io/docs/reference/types/archetypes/arrows3d) and [boxes](https://rerun.io/docs/reference/types/archetypes/boxes3d) all benefit from query caching too to a lesser extent, yielding 2-5x performance improvements + +- 🖼 UI overrides: + - The new `Scalar`, `SeriesLine` & `SeriesPoint` archetypes allow for customizing plots both at logging and visualization time + - Customize marker shapes, marker sizes, etc from code or directly through the UI + - Specify axis labels, lock axes, etc from code or directly through the UI + +- 🌁 Viewer: + - The number of compute threads can now be controlled using the `--threads`/`-j` flag + - Added support YUY2-encoded images (thanks [@oxkitsune](https://github.com/oxkitsune)!) + - Space views can now be drag-and-dropped directly from the blueprint tree + - Scenes with 100+ entities are now up to 5x faster. + +- 🚚 New Space View and Container creation workflow: + - When selected, containers have a children list in the Selection Panel, where new Space Views and Containers may be added. + - New modal dialog to add Space Views and Containers. + - The same dialog is also available from the `+` button of the Blueprint tree UI. + - The Space View's origin can now be edited in the Selection Panel. + - The container hierarchy can now be cleaned up with the new `Simplify Hierarchy` button in the Selection Panel for containers. + +- 🦀 The Rust SDK now exposes an optional integration with the `mint` crate +- 🕸️ The web UI SDK now supports loading multiple `.rrd` URLs +- 🔺 The web viewer now renders using WebGPU by default (when available), leading to lower memory usage on Chrome. + You can override this behavior using `?renderer=webgl`/`?renderer=webgpu` url parameter, or restart with WebGL/WebGPU respectively from the options menu. + +As well as a lot of miscellaneous bug fixes and usability improvements: see details below. + +Check out our [migration guide](https://rerun.io/docs/reference/migration/migration-0-13). + +### 🔎 Details + +#### 🪵 Log API +- Mark TimeSeriesScalar as deprecated in all SDKs and documentation [#5102](https://github.com/rerun-io/rerun/pull/5102) + +#### 🌊 C++ API +- Document that in C++ PinholeProjection::from_mat3x3 is column major [#4843](https://github.com/rerun-io/rerun/pull/4843) +- Include LICENSE files into C++ SDK Assets [#4870](https://github.com/rerun-io/rerun/pull/4870) (thanks [@rgolovanov](https://github.com/rgolovanov)!) +- Fix C++ Arrow build flag forwarding [#4921](https://github.com/rerun-io/rerun/pull/4921) (thanks [@rgolovanov](https://github.com/rgolovanov)!) + +#### 🦀 Rust API +- Add integration with the `mint` crate [#4753](https://github.com/rerun-io/rerun/pull/4753) + +#### 🐍 Python API +- Fix support for compressing mono images by respecting mode to determine depth [#4847](https://github.com/rerun-io/rerun/pull/4847) + +#### 🪳 Bug fixes +- External loader: don't do process IO on compute thread-pool [#4942](https://github.com/rerun-io/rerun/pull/4942) +- Fix a Visible Time Range UI issue where the summary string would display the wrong data range [#5034](https://github.com/rerun-io/rerun/pull/5034) +- Clear empty containers after tile drag-and-drop [#5044](https://github.com/rerun-io/rerun/pull/5044) +- Allow for very large meshes & plots by always picking the largest available GPU buffer size [#5053](https://github.com/rerun-io/rerun/pull/5053) +- Fix forever repaint of big scenes [#5071](https://github.com/rerun-io/rerun/pull/5071) +- Fix `RERUN_FLUSH_NUM_BYTES` and data size estimations [#5086](https://github.com/rerun-io/rerun/pull/5086) +- Make `rectangle_fs.wgsl` compile on chrome despite angle/mesa bug (#3931) [#5074](https://github.com/rerun-io/rerun/pull/5074) + +#### 🌁 Viewer improvements +- Introduce Scalar, SeriesLine, and SeriesPoint archetypes with their own visualizers [#4875](https://github.com/rerun-io/rerun/pull/4875) +- Support modifying the plot style by introducing a generic framework for overriding components [#4914](https://github.com/rerun-io/rerun/pull/4914) +- Introduce a new blueprint archetype for AxisY configuration in a plot [#5028](https://github.com/rerun-io/rerun/pull/5028) +- Improve the selection/hover behavior for plots [#5096](https://github.com/rerun-io/rerun/pull/5096) +- Click a spatial space view background to select the space view itself [#4796](https://github.com/rerun-io/rerun/pull/4796) +- Double-clicking an entity in the blueprint & time panels focuses the 3D camera on it [#4799](https://github.com/rerun-io/rerun/pull/4799) +- When loading a .ply file, warn about ignored properties [#4934](https://github.com/rerun-io/rerun/pull/4934) +- Make it easier to position 3D eye-camera center [#4943](https://github.com/rerun-io/rerun/pull/4943) +- Include tessellation and rendering in CPU time shown in top bar [#4951](https://github.com/rerun-io/rerun/pull/4951) +- Allow selection of entities directly in the plot space view [#4959](https://github.com/rerun-io/rerun/pull/4959) +- Texture support for raw `Mesh3D` logging [#4894](https://github.com/rerun-io/rerun/pull/4894) + +#### 🚀 Performance improvements +- Add `--threads` / `-j` to control number of compute threads [#5021](https://github.com/rerun-io/rerun/pull/5021) +- Introduce the query cache: + - Primary caching 3: bare-bone latest-at caching [#4659](https://github.com/rerun-io/rerun/pull/4659) + - Primary caching 4: runtime toggle support [#4680](https://github.com/rerun-io/rerun/pull/4680) + - Primary caching 5: 2D & 3D point clouds [#4681](https://github.com/rerun-io/rerun/pull/4681) + - Primary caching 6: TextLogs & TimeSeries [#4698](https://github.com/rerun-io/rerun/pull/4698) + - Primary caching 7: Always expose the data time in query responses [#4711](https://github.com/rerun-io/rerun/pull/4711) + - Primary caching 8: implement latest-at data-time cache entry deduplication [#4712](https://github.com/rerun-io/rerun/pull/4712) + - Primary caching 9: timeless latest-at support [#4721](https://github.com/rerun-io/rerun/pull/4721) + - Primary caching 10: latest-at cache invalidation [#4726](https://github.com/rerun-io/rerun/pull/4726) + - Primary caching 11: cache stats and integration with memory panel [#4773](https://github.com/rerun-io/rerun/pull/4773) + - Primary caching 12: bare-bone range support [#4784](https://github.com/rerun-io/rerun/pull/4784) + - Primary caching 13: stats & memory panel integration for range queries [#4785](https://github.com/rerun-io/rerun/pull/4785) + - Primary caching 14: don't bake `LatestAt(T-1)` results into low-level range queries [#4793](https://github.com/rerun-io/rerun/pull/4793) + - Primary caching 15: range read performance optimization [#4800](https://github.com/rerun-io/rerun/pull/4800) + - Primary caching 16: context-free range semantics [#4851](https://github.com/rerun-io/rerun/pull/4851) + - Primary caching 17: timeless range [#4852](https://github.com/rerun-io/rerun/pull/4852) + - Primary caching 18: range invalidation (ENABLED BY DEFAULT :confetti_ball:) [#4853](https://github.com/rerun-io/rerun/pull/4853) + - Primary caching 19 (final): make cache globals non-static [#4856](https://github.com/rerun-io/rerun/pull/4856) +- Integrate query caching with more primitives: + - Cached 2D & 3D box clouds [#5000](https://github.com/rerun-io/rerun/pull/5000) + - Cached 2D & 3D line clouds [#5083](https://github.com/rerun-io/rerun/pull/5083) + - Cached 2D & 3D arrow clouds [#5088](https://github.com/rerun-io/rerun/pull/5088) +- Configurable dynamic plot aggregation based on zoom-level [#4865](https://github.com/rerun-io/rerun/pull/4865) +- Improved automatic view creation heuristic, major speedup for scenes with many entities [#4874](https://github.com/rerun-io/rerun/pull/4874) +- Optimize point clouds [#4932](https://github.com/rerun-io/rerun/pull/4932) + +#### 🧑‍🏫 Examples +- Update all examples that use `TimeSeriesScalar` to use `Scalar` instead [#5042](https://github.com/rerun-io/rerun/pull/5042) + +#### 📚 Docs +- Improve documentation of the `Clear` archetype [#4760](https://github.com/rerun-io/rerun/pull/4760) +- `DisconnectedSpace` now only applies to spatial space views [#4935](https://github.com/rerun-io/rerun/pull/4935) +- Fill gaps in image encoding documentation, fix how Python documents union variants [#4988](https://github.com/rerun-io/rerun/pull/4988) + +#### 🖼 UI improvements +- Improve timeseries Space Views: + - Introduce a new component for MarkerShape and use it in SeriesPoint [#5004](https://github.com/rerun-io/rerun/pull/5004) + - Introduce a new StrokeWidth component and use it for SeriesLine [#5025](https://github.com/rerun-io/rerun/pull/5025) + - Break up plot charts when there's a `Clear` [#4957](https://github.com/rerun-io/rerun/pull/4957) + - Only show the LegacyVisualizer if a user logs with TimeSeriesScalar archetype [#5023](https://github.com/rerun-io/rerun/pull/5023) + - Fix lagging time cursor when panning a time series plot [#4972](https://github.com/rerun-io/rerun/pull/4972) +- New Space View and Container creation workflow: + - Use the "Add space view/container" modal for the `+` button of the blueprint tree [#5012](https://github.com/rerun-io/rerun/pull/5012) + - Add support for removing container children from the selection panel [#4930](https://github.com/rerun-io/rerun/pull/4930) + - Add support for full span highlighting to modal and use it in the "Add space view or container" modal [#4822](https://github.com/rerun-io/rerun/pull/4822) + - Remove the "+" icon from the "Add SV/Container" modal and close on click [#4927](https://github.com/rerun-io/rerun/pull/4927) + - New empty space view defaults to uncollapsed in blueprint tree [#4982](https://github.com/rerun-io/rerun/pull/4982) + - Do not allow adding Horizontal/Vertical containers inside of containers with the same type [#5091](https://github.com/rerun-io/rerun/pull/5091) +- Selection improvements: + - Click a recording to select it [#4761](https://github.com/rerun-io/rerun/pull/4761) + - Press the escape key to clear the current selection [#5103](https://github.com/rerun-io/rerun/pull/5103) + - Clear selection when clicking blank space in the Blueprint View [#4831](https://github.com/rerun-io/rerun/pull/4831) + - Selecting/hovering components now highlights their parent entity [#4748](https://github.com/rerun-io/rerun/pull/4748) +- Add support for drag-and-drop in blueprint tree [#4910](https://github.com/rerun-io/rerun/pull/4910) +- Add support for editing a space view's space origin [#4848](https://github.com/rerun-io/rerun/pull/4848) +- Add Help and Discord to command palette [#4752](https://github.com/rerun-io/rerun/pull/4752) +- Syntax highlighting of entity paths and instance paths [#4803](https://github.com/rerun-io/rerun/pull/4803) +- Update container (and a couple other) icons [#4814](https://github.com/rerun-io/rerun/pull/4814) +- Make space view names optional and subdue placeholder view label in the UI [#4682](https://github.com/rerun-io/rerun/pull/4682) +- Show download sizes of in the example page [#4841](https://github.com/rerun-io/rerun/pull/4841) +- Style container's label as unnamed [#4975](https://github.com/rerun-io/rerun/pull/4975) +- Fix space view cloning to also copy entity properties (visible time range, etc.) [#4978](https://github.com/rerun-io/rerun/pull/4978) +- Improve how the root container is displayed and handled in the blueprint tree [#4989](https://github.com/rerun-io/rerun/pull/4989) +- Improve the UI for the entity query [#5022](https://github.com/rerun-io/rerun/pull/5022) +- Don't show the Blueprint header when on the welcome screen [#5046](https://github.com/rerun-io/rerun/pull/5046) +- Move Visible Time Range higher in the Selection Panel [#5036](https://github.com/rerun-io/rerun/pull/5036) +- Clean up time range UI [#5089](https://github.com/rerun-io/rerun/pull/5089) +- Improve preview UI for Component data [#5093](https://github.com/rerun-io/rerun/pull/5093) +- Paint closest labels on top of labels further away [#5124](https://github.com/rerun-io/rerun/pull/5124) + +#### 🕸️ Web +- Web: Support multiple `.rrd` URLs [#4740](https://github.com/rerun-io/rerun/pull/4740) +- Unify `web_viewer/index.html` and `index_bundled.html` [#4720](https://github.com/rerun-io/rerun/pull/4720) +- Allow forcing WebGPU/WebGL on the web player, new command line argument to force graphics backend [#4981](https://github.com/rerun-io/rerun/pull/4981) + +#### 🎨 Renderer improvements +- Update to wgpu 0.19 and latest `egui` trunk [#4885](https://github.com/rerun-io/rerun/pull/4885) +- Support YUY2-encoded images [#4877](https://github.com/rerun-io/rerun/pull/4877) (thanks [@oxkitsune](https://github.com/oxkitsune)!) + +#### 🧑‍💻 Dev-experience +- Default to DEBUG log level in debug builds [#4749](https://github.com/rerun-io/rerun/pull/4749) +- New debug option to show an actual timeline for the Blueprint [#4609](https://github.com/rerun-io/rerun/pull/4609) +- Primary cache: basic debug tools via command palette [#4948](https://github.com/rerun-io/rerun/pull/4948) + +#### 🗣 Refactors +- Migrate from `egui_Tile::TileId` to proper blueprint IDs in `ViewportBlueprint` API [#4900](https://github.com/rerun-io/rerun/pull/4900) + +#### 📦 Dependencies +- Remove `egui_plot` as dependency from `re_sdk` [#5099](https://github.com/rerun-io/rerun/pull/5099) +- Update to egui 0.25 and winit 0.29 [#4732](https://github.com/rerun-io/rerun/pull/4732) +- Prune dependencies from `rerun` and `re_sdk` [#4824](https://github.com/rerun-io/rerun/pull/4824) +- Relax pyarrow dependency to `>=14.0.2` [#5054](https://github.com/rerun-io/rerun/pull/5054) +- Update egui_tiles to 0.7.2 [#5107](https://github.com/rerun-io/rerun/pull/5107) + +#### 🤷 Other +#### 🤷 Other +- Add `rerun --serve` and improve `--help` [#4834](https://github.com/rerun-io/rerun/pull/4834) +- `rerun print`: print just summary, unless given `--verbose` [#5079](https://github.com/rerun-io/rerun/pull/5079) + + +## [0.12.1](https://github.com/rerun-io/rerun/compare/0.12.0...0.12.1) - Data loader bug fixes - 2024-01-17 + +#### 🌊 C++ API +- Fix CMake trying to pick up test folders outside of the Rerun project/zip [#4770](https://github.com/rerun-io/rerun/pull/4770) (thanks [@KevinGliewe](https://github.com/KevinGliewe)!) +- Document that `Mat3x3` and `Mat4x4` constructors are column major [#4842](https://github.com/rerun-io/rerun/pull/4842) + +#### 🦀 Rust API +- Fix `entity_path_vec!` and `entity_path!` depending on `ToString` being in scope [#4766](https://github.com/rerun-io/rerun/pull/4766) (thanks [@kpreid](https://github.com/kpreid)!) + +#### 🪳 Bug fixes +- Fix external data loader plugins on Windows [#4840](https://github.com/rerun-io/rerun/pull/4840) +- Reduce latency when loading data from external loaders [#4797](https://github.com/rerun-io/rerun/pull/4797) +- Always point to versioned manifest when building a versioned binary [#4781](https://github.com/rerun-io/rerun/pull/4781) + +#### 🧑‍💻 Dev-experience +- External loaders: remove warnings on duplicated binary on `$PATH` [#4833](https://github.com/rerun-io/rerun/pull/4833) + +#### 🤷 Other +#### 🤷 Other +- Include `Cargo.lock` in `rerun-cli` crate [#4750](https://github.com/rerun-io/rerun/pull/4750) +- Replace `atty` dependency with `std::io::IsTerminal` [#4790](https://github.com/rerun-io/rerun/pull/4790) (thanks [@kpreid](https://github.com/kpreid)!) + + +## [0.12.0](https://github.com/rerun-io/rerun/compare/0.11.0...0.12.0) - Data Loaders, Container-editing, Python-3.12 - 2024-01-09 + +

+ + +### ✨ Overview & highlights +- 🌁 The Rerun Viewer now supports a plugin system for creating [arbitrary external data loaders](https://rerun.io/docs/concepts/logging-and-ingestion/data-loaders/overview). +- 🕸️ More built-in examples are now available in the viewer. +- 🐍 The Python SDK now works with Python-3.12. +- 📘 Blueprint containers can now be selected and modified. +- 🚀 In the native viewer, space views are now evaluated in parallel for improved performance. +- 🧑‍🏫 Support and guide for [sharing a recording across multiple processes](https://rerun.io/docs/howto/shared-recordings). +- 📁 Entity-paths allowed characters and escaping are now more file-like [#4476](https://github.com/rerun-io/rerun/pull/4476): + - There is no need for " quotes around path parts, instead we now use \ to escape special characters. + - You need to escape any character that isn't alphabetical, numeric, ., -, or _. + +### 🔎 Details + +#### 🌊 C++ API +- Exposing `recording_id` in C and C++ SDKs [#4384](https://github.com/rerun-io/rerun/pull/4384) +- All C++ preprocessor macros start now with RR_ (instead of a mix of RR_ and RERUN_) [#4371](https://github.com/rerun-io/rerun/pull/4371) +- C++ & Python API: add helpers for constructing an entity path [#4595](https://github.com/rerun-io/rerun/pull/4595) + +#### 🐍 Python API +- Add `--stdout`/`-o` to our CLI helper library [#4544](https://github.com/rerun-io/rerun/pull/4544) +- C++ & Python API: add helpers for constructing an entity path [#4595](https://github.com/rerun-io/rerun/pull/4595) +- Python SDK: introduce deferred garbage collection queue [#4583](https://github.com/rerun-io/rerun/pull/4583) +- Add support for Python 3.12 [#4146](https://github.com/rerun-io/rerun/pull/4146) + +#### 🦀 Rust API +- Exposing `recording_id` in Rust SDK [#4383](https://github.com/rerun-io/rerun/pull/4383) +- Add `--stdout`/`-o` to our CLI helper library [#4544](https://github.com/rerun-io/rerun/pull/4544) +- Document how to construct an entity path for the Rust logging API [#4584](https://github.com/rerun-io/rerun/pull/4584) + +#### 🪳 Bug fixes +- Bugfix: show labels on segmentation images with trivial dimensions [#4368](https://github.com/rerun-io/rerun/pull/4368) +- Datastore: don't eagerly sort in bucket split routine on ingestion path [#4417](https://github.com/rerun-io/rerun/pull/4417) +- Resolve spurious blueprint panel group collapsing [#4548](https://github.com/rerun-io/rerun/pull/4548) +- Fix rectangle that indicates the zoomed pixel area on hover being one pixel to small [#4590](https://github.com/rerun-io/rerun/pull/4590) +- Fix wrong RowId order of logged data [#4658](https://github.com/rerun-io/rerun/pull/4658) +- Make scroll-to-zoom a lot more responsive in 3D views [#4668](https://github.com/rerun-io/rerun/pull/4668) +- Fix heuristic object properties being broken in some cases / fix DepthMeter being ignored sometimes [#4679](https://github.com/rerun-io/rerun/pull/4679) + +#### 🌁 Viewer improvements +- Make Viewer contexts's render context reference non-mutable [#4430](https://github.com/rerun-io/rerun/pull/4430) +- The Rerun Viewer can now consume from stdin: + - Standard input/output support 1: stream RRD data from stdin [#4511](https://github.com/rerun-io/rerun/pull/4511) + - Standard input/output support 2: Rust SDK stdout impl/examples/docs [#4512](https://github.com/rerun-io/rerun/pull/4512) + - Standard input/output support 3: Python SDK stdout impl/examples/docs [#4513](https://github.com/rerun-io/rerun/pull/4513) + - Standard input/output support 4: C++ SDK stdout impl/examples/docs [#4514](https://github.com/rerun-io/rerun/pull/4514) +- Support for custom DataLoaders: + - `DataLoader`s 0: utility for hierarchical `EntityPath` from file path [#4516](https://github.com/rerun-io/rerun/pull/4516) + - `DataLoader`s 1: introduce, and migrate to, `DataLoader`s [#4517](https://github.com/rerun-io/rerun/pull/4517) + - `DataLoader`s 2: add text-based `DataLoader` (`.txt`, `.md`) [#4518](https://github.com/rerun-io/rerun/pull/4518) + - `DataLoader`s 3: add 3D point cloud `DataLoader` (`.ply`) [#4519](https://github.com/rerun-io/rerun/pull/4519) + - `DataLoader`s 4: add generic folder `DataLoader` [#4520](https://github.com/rerun-io/rerun/pull/4520) + - `DataLoader`s 5: add support for external binary `DataLoader`s (PATH) [#4521](https://github.com/rerun-io/rerun/pull/4521) + - `DataLoader`s 6: first-class support for `Incompatible` [#4565](https://github.com/rerun-io/rerun/pull/4565) + - `DataLoader`s 7: support for custom `DataLoader`s [#4566](https://github.com/rerun-io/rerun/pull/4566) +- 3D->2D & 2D->3D selection visualizations stick now around on selection [#4587](https://github.com/rerun-io/rerun/pull/4587) +- The Viewer now supports segmentation images logged natively as floats [#4585](https://github.com/rerun-io/rerun/pull/4585) +- Fix incorrect bounding box calculation for camera view parts [#4640](https://github.com/rerun-io/rerun/pull/4640) + +#### 🚀 Performance improvements +- Parallelize Space View system evaluation [#4460](https://github.com/rerun-io/rerun/pull/4460) +- Limit server memory [#4636](https://github.com/rerun-io/rerun/pull/4636) + +#### 🧑‍🏫 Examples +- Add nuScenes-based lidar examples [#4407](https://github.com/rerun-io/rerun/pull/4407) (thanks [@roym899](https://github.com/roym899)!) +- Nightly builds [#4505](https://github.com/rerun-io/rerun/pull/4505) +- Add LLM token classification example [#4541](https://github.com/rerun-io/rerun/pull/4541) (thanks [@roym899](https://github.com/roym899)!) + +#### 📚 Docs +- Shared recordings 3: add how-to guide [#4385](https://github.com/rerun-io/rerun/pull/4385) +- Document our crate organization in ARCHITECTURE.md [#4458](https://github.com/rerun-io/rerun/pull/4458) + +#### 🖼 UI improvements +- Plot legend visibility and position control (part 1): route `EntityProperties` to `SpaceViewClass` methods [#4363](https://github.com/rerun-io/rerun/pull/4363) +- Plot legend visibility and position control (part 2): minor UI spacing improvement [#4364](https://github.com/rerun-io/rerun/pull/4364) +- Reset accumulated bounding box when resetting camera [#4369](https://github.com/rerun-io/rerun/pull/4369) +- Plot legend visibility and position control (part 3): legend UI added for both timeseries and bar charts space views [#4365](https://github.com/rerun-io/rerun/pull/4365) +- Improve component data table UI in the selection panel [#4370](https://github.com/rerun-io/rerun/pull/4370) +- Add optional color component to BarChart archetype [#4372](https://github.com/rerun-io/rerun/pull/4372) +- Resolve unexpected view-partitioning by only bucket images when creating a new 2D view [#4361](https://github.com/rerun-io/rerun/pull/4361) +- Restore `egui_plot` auto-bounds state after dragging the time cursor in timeseries space views [#4270](https://github.com/rerun-io/rerun/pull/4270) +- Make Space View containers selectable and editable [#4403](https://github.com/rerun-io/rerun/pull/4403) +- Improve selection and hover behavior of viewport's tabs [#4424](https://github.com/rerun-io/rerun/pull/4424) +- Improve the Selection Panel UI for components when a single item is selected [#4416](https://github.com/rerun-io/rerun/pull/4416) +- Show connection status in top bar [#4443](https://github.com/rerun-io/rerun/pull/4443) +- Add the possibility to add empty space views of all registered types [#4467](https://github.com/rerun-io/rerun/pull/4467) +- Add experimental Dataframe Space View [#4468](https://github.com/rerun-io/rerun/pull/4468) +- Show e2e latency in metric UI in top panel [#4502](https://github.com/rerun-io/rerun/pull/4502) +- Show leading slash when formatting entity paths [#4537](https://github.com/rerun-io/rerun/pull/4537) +- Improve entity size stats: include whole subtree [#4542](https://github.com/rerun-io/rerun/pull/4542) +- Add support for modal Windows to `re_ui` and use it for the Space View entity picker [#4577](https://github.com/rerun-io/rerun/pull/4577) +- Show entity path parts (entity "folder" names) unescaped in UI [#4603](https://github.com/rerun-io/rerun/pull/4603) +- Improve Rerun Menu with link to Rerun Discord [#4661](https://github.com/rerun-io/rerun/pull/4661) +- Introduce container icons and update space views and UI icons [#4663](https://github.com/rerun-io/rerun/pull/4663) +- Initial support for manually adding container and space view in the hierarchy [#4616](https://github.com/rerun-io/rerun/pull/4616) +- Change modal position to a fixed vertical distance from the top of the window [#4700](https://github.com/rerun-io/rerun/pull/4700) + +#### 🕸️ Web +- Load examples manifest via HTTP [#4391](https://github.com/rerun-io/rerun/pull/4391) +- Remove builds and usage of `demo.rerun.io` [#4418](https://github.com/rerun-io/rerun/pull/4418) +- Open all links in a new tab [#4582](https://github.com/rerun-io/rerun/pull/4582) + +#### 🎨 Renderer improvements +- Log wgpu adapter on web [#4414](https://github.com/rerun-io/rerun/pull/4414) +- Interior mutability for re_renderer's static resource pools (RenderPipeline/Shader/Layouts/etc.) [#4421](https://github.com/rerun-io/rerun/pull/4421) +- Make draw data creation no longer require a mutable re_renderer context [#4422](https://github.com/rerun-io/rerun/pull/4422) +- Move re_renderer examples to its own crate in order to make workspace level examples less confusing [#4472](https://github.com/rerun-io/rerun/pull/4472) +- Improved wgpu error handling, no more crashes through wgpu validation errors [#4509](https://github.com/rerun-io/rerun/pull/4509) +- Expose `wgpu` profiling scopes to puffin [#4581](https://github.com/rerun-io/rerun/pull/4581) +- Improve shading with two lights instead of one [#4648](https://github.com/rerun-io/rerun/pull/4648) + +#### 🧑‍💻 Dev-experience +- Fix not tracking wgsl file changes for web build [#4374](https://github.com/rerun-io/rerun/pull/4374) +- Auto format all the things [#4373](https://github.com/rerun-io/rerun/pull/4373) +- Refactor naming of `SpaceViewClass` and changed `TextSpaceView` name to "Text Log" [#4386](https://github.com/rerun-io/rerun/pull/4386) +- Local-first wheel publishing [#4454](https://github.com/rerun-io/rerun/pull/4454) +- Remove backtraces on error when running `rerun` binary [#4746](https://github.com/rerun-io/rerun/pull/4746) + +#### 🗣 Refactors +- Selection state is now fully double buffered and has interior mutability [#4387](https://github.com/rerun-io/rerun/pull/4387) +- Time control is now behind a RwLock, making recording config access non-mutable everywhere [#4389](https://github.com/rerun-io/rerun/pull/4389) +- Enable (selected) new cargo clippy lints [#4404](https://github.com/rerun-io/rerun/pull/4404) +- Add lint for builder pattern functions and deref impls to be marked `#[inline]` [#4435](https://github.com/rerun-io/rerun/pull/4435) +- Pass viewer context always non-mutable [#4438](https://github.com/rerun-io/rerun/pull/4438) +- RenderContext usage cleanup [#4446](https://github.com/rerun-io/rerun/pull/4446) +- Integrate re_tensor_ops crate into re_space_view_tensor [#4450](https://github.com/rerun-io/rerun/pull/4450) +- Use TOML for example readme front-matter [#4553](https://github.com/rerun-io/rerun/pull/4553) +- Rename `StoreDb` to `EntityDb`, `re_data_store` -> `re_entity_db` [#4670](https://github.com/rerun-io/rerun/pull/4670) +- Rename `re_arrow_store` to `re_data_store` [#4672](https://github.com/rerun-io/rerun/pull/4672) + +#### 📦 Dependencies +- Update egui and wgpu [#4111](https://github.com/rerun-io/rerun/pull/4111) +- Update Rust to 1.76.0 [#4390](https://github.com/rerun-io/rerun/pull/4390) + +#### 🤷 Other +#### 🤷 Other +- Use `:` instead of `.` as the entity:component separator in paths [#4471](https://github.com/rerun-io/rerun/pull/4471) +- File-like entity paths [#4476](https://github.com/rerun-io/rerun/pull/4476) +- Make the new container blueprints the default behavior [#4642](https://github.com/rerun-io/rerun/pull/4642) + + +## [0.11.0](https://github.com/rerun-io/rerun/compare/0.10.1...0.11.0) - C++ improvements & better Visible History - 2023-11-28 + +https://github.com/rerun-io/rerun/assets/1220815/9099b81d-626f-4974-87d7-0e974361a9f0 + +### ✨ Overview & highlights + +- 🌊 C++ SDK improvements + - [Reference docs are live!](https://ref.rerun.io/docs/cpp/) + - 2x-5x faster logging + - CMake install support and other CMake setup improvements + - Support for custom components & archetypes + - Zero copy logging for images, various API improvements +- 📈 Visual History -> Visual Time Range + - Time series plots can now limit its query to a range + - Much more powerful UI, allowing query ranges relative to time cursor +- 🕸️ The Viewer can now be easily embedded in your web apps via our [npm package](https://www.npmjs.com/package/@rerun-io/web-viewer) +- 🐍 ⚠️ Legacy Python API now removed, check the [migration guide](https://github.com/rerun-io/rerun/issues/723) if you're not using `rr.log` yet +- 🦀 The new `StoreSubscriber` trait allows to be notified of all changes in the datastore. This can be used to build custom indices and trigger systems, and serves as a foundation for upcoming performance improvements. Check out [our example](examples/rust/custom_store_subscriber/README.md) for more information. + +⚠️ Known issues on Visual Time Range: +- Time cursor [sometimes stops scrolling correctly](https://github.com/rerun-io/rerun/issues/4246) on plot window +- Still [doesn't work with transforms](https://github.com/rerun-io/rerun/issues/723) + +Special thanks to @dvad & @dangush for contributing! + +### 🔎 Details + +#### 🌊 C++ SDK +- Support std::chrono types for `set_time` on `rerun::RecordingStream` [#4134](https://github.com/rerun-io/rerun/pull/4134) +- Improve rerun_cpp readme & CMakeLists.txt [#4126](https://github.com/rerun-io/rerun/pull/4126) +- Replace the many parameters of `rerun::spawn` / `rerun::RecordingStream::spawn` with a `struct` [#4149](https://github.com/rerun-io/rerun/pull/4149) +- Make on TextLogLevel PascalCase (instead of SCREAMING CASE) to avoid clashes with preprocessor defines [#4152](https://github.com/rerun-io/rerun/pull/4152) +- Reduce rerun_c library size (by depending on fewer unnecessary crates) [#4147](https://github.com/rerun-io/rerun/pull/4147) +- Fix unnecessary includes in code generated headers [#4132](https://github.com/rerun-io/rerun/pull/4132) +- Doxygen documentation & many doc improvements [#4191](https://github.com/rerun-io/rerun/pull/4191) +- Rename `rerun::ComponentBatch` to `rerun::Collection` (and related constructs) [#4236](https://github.com/rerun-io/rerun/pull/4236) +- Use `rerun::Collection` almost everywhere we'd use `std::vector` before [#4247](https://github.com/rerun-io/rerun/pull/4247) +- Significantly improve C++ logging performance by using C FFI instead of Arrow IPC [#4273](https://github.com/rerun-io/rerun/pull/4273) +- Further improve C++ logging for many individual log calls by introducing a component type registry [#4296](https://github.com/rerun-io/rerun/pull/4296) +- All C++ datatypes & components now implement a new Loggable trait [#4305](https://github.com/rerun-io/rerun/pull/4305) +- Add C++ Custom Component example [#4309](https://github.com/rerun-io/rerun/pull/4309) +- Expose Rerun source/include dir in CMakeLists.txt (`RERUN_CPP_SOURCE_DIR`) [#4313](https://github.com/rerun-io/rerun/pull/4313) +- Support cmake install [#4326](https://github.com/rerun-io/rerun/pull/4326) +- Export TensorBuffer & TensorDimension to Rerun namespace [#4331](https://github.com/rerun-io/rerun/pull/4331) +- C++ SDK sanity checks now header/source version against rerun_c binary version [#4330](https://github.com/rerun-io/rerun/pull/4330) +- Allow creating Image/Tensor/DepthImage/SegmentationImage directly from shape & pointer [#4345](https://github.com/rerun-io/rerun/pull/4345) + +#### 🐍 Python SDK +- Python: remove legacy APIs [#4037](https://github.com/rerun-io/rerun/pull/4037) +- Remove deprecated `rerun_demo` package [#4293](https://github.com/rerun-io/rerun/pull/4293) +- Python: don't catch `KeyboardInterrupt` and `SystemExit` [#4333](https://github.com/rerun-io/rerun/pull/4333) (thanks [@Dvad](https://github.com/Dvad)!) + +#### 🪳 Bug fixes +- Fix line & points (& depth clouds points) radii being unaffected by scale & projection via Pinhole [#4199](https://github.com/rerun-io/rerun/pull/4199) +- Fix inaccessible entities being incorrectly added to space view [#4226](https://github.com/rerun-io/rerun/pull/4226) +- Silence spammy blueprint warnings and validate blueprint on load [#4303](https://github.com/rerun-io/rerun/pull/4303) +- Fix markdown heading size [#4178](https://github.com/rerun-io/rerun/pull/4178) + +#### 🌁 Viewer improvements +- Add command to copy direct link to fully qualified URL [#4165](https://github.com/rerun-io/rerun/pull/4165) +- Implement recording/last-modified-at aware garbage collection [#4183](https://github.com/rerun-io/rerun/pull/4183) + +#### 🖼 UI improvements +- Improve Visible History to support more general time queries [#4123](https://github.com/rerun-io/rerun/pull/4123) +- Add support for Visible History to time series space views [#4179](https://github.com/rerun-io/rerun/pull/4179) +- Make Visible History UI more ergonomic and show inherited values [#4222](https://github.com/rerun-io/rerun/pull/4222) +- Display Visible History on timeline when the mouse hovers the UI [#4259](https://github.com/rerun-io/rerun/pull/4259) +- Improve the Selection Panel with better title, context, and Space View key properties [#4324](https://github.com/rerun-io/rerun/pull/4324) + +#### 🕸️ Web +- Put web viewer on `npm` [#4003](https://github.com/rerun-io/rerun/pull/4003) +- Auto-switch port when getting AddrInUse error [#4314](https://github.com/rerun-io/rerun/pull/4314) (thanks [@dangush](https://github.com/dangush)!) +- Generate per-PR web apps [#4341](https://github.com/rerun-io/rerun/pull/4341) + +#### 🧑‍💻 Dev-experience +- Simple logging benchmarks for C++ & Rust [#4181](https://github.com/rerun-io/rerun/pull/4181) +- New debug option to show the blueprint in the streams view [#4189](https://github.com/rerun-io/rerun/pull/4189) +- Use Pixi over setup scripts on CI + local dev [#4302](https://github.com/rerun-io/rerun/pull/4302) +- Run deploy docs jobs serially [#4232](https://github.com/rerun-io/rerun/pull/4232) +- fix Windows test config on main [#4242](https://github.com/rerun-io/rerun/pull/4242) + +#### 🗣 Refactors +- `StoreView` -> `StoreSubscriber` [#4234](https://github.com/rerun-io/rerun/pull/4234) +- `DataStore` introduce `StoreEvent`s [#4203](https://github.com/rerun-io/rerun/pull/4203) +- `DataStore` introduce `StoreView`s [#4205](https://github.com/rerun-io/rerun/pull/4205) + + +## [0.10.1](https://github.com/rerun-io/rerun/compare/0.10.0...0.10.1) - 2023-11-02 + +### ✨ Overview & highlights +This is a small release primarily to tie up some loose ends for our C++ SDK. + +#### 🌊 C++ SDK +- Avoid possible link/symbol errors but defaulting all OSes to static linking of Arrow [#4101](https://github.com/rerun-io/rerun/pull/4101) +- Fix compilation errors with C++20 [#4098](https://github.com/rerun-io/rerun/pull/4098) +- Improve C++ SDK perf 5x by respecting CMAKE_BUILD_TYPE and enabling mimalloc [#4094](https://github.com/rerun-io/rerun/pull/4094) +- Reduce amount of cmake log from building & downloading libArrow [#4103](https://github.com/rerun-io/rerun/pull/4103) + +#### 🧑‍💻 Dev-experience +- C++ Windows CI [#4110](https://github.com/rerun-io/rerun/pull/4110) +- Add macOS C++ CI, add Linux C++20 CI [#4120](https://github.com/rerun-io/rerun/pull/4120) + + +## [0.10.0](https://github.com/rerun-io/rerun/compare/0.9.1...0.10.0) - C++ SDK - 2023-10-30 + +[Rerun](https://rerun.io/) is an easy-to-use visualization toolbox for computer vision and robotics. + +* Python: `pip install rerun-sdk` +* Rust: `cargo add rerun` and `cargo install rerun-cli --locked` +* Online demo: + +Release blog post: + +### ✨ Overview & highlights +* The C++ SDK is finally here! + ```cpp + #include + + int main() { + const auto rec = rerun::RecordingStream("rerun_example_points3d_simple"); + rec.spawn().exit_on_failure(); + + rec.log("points", rerun::Points3D({{0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}})); + } + ``` + +* Add an integrated getting-started guide into the Viewer splash screen +* Add a new and improved `spawn` method in the Rust SDK +* Add support for NV12-encoded images [#3541](https://github.com/rerun-io/rerun/pull/3541) (thanks [@zrezke](https://github.com/zrezke)!) +* We now publish pre-built binaries for each release at + +### 🔎 Details +#### 🌊 C++ SDK +- Has all the features of the Python and C++ SDK:s + +#### 🐍 Python SDK +- Add `RERUN_STRICT` environment variable [#3861](https://github.com/rerun-io/rerun/pull/3861) +- Fix potential deadlock when saving to file after logging at the end of a Python program [#3920](https://github.com/rerun-io/rerun/pull/3920) +- Warn if no resolution provided to Pinhole [#3923](https://github.com/rerun-io/rerun/pull/3923) +- Python: remove unconditional sleep on `spawn` [#4010](https://github.com/rerun-io/rerun/pull/4010) +- Support `pathlib.Path` for `rr.save` [#4036](https://github.com/rerun-io/rerun/pull/4036) +- Add `disable_timeline` function [#4068](https://github.com/rerun-io/rerun/pull/4068) +- Support fast install of the Rerun Viewer with `cargo binstall rerun-cli` thanks to [`cargo binstall`](https://github.com/cargo-bins/cargo-binstall) + +#### 🦀 Rust SDK +- Introduce `re_types_core` [#3878](https://github.com/rerun-io/rerun/pull/3878) +- Fix crash when using `RecordingStream::set_thread_local` on macOS [#3929](https://github.com/rerun-io/rerun/pull/3929) +- Add improved `spawn` function [#3996](https://github.com/rerun-io/rerun/pull/3996) [#4031](https://github.com/rerun-io/rerun/pull/4031) +- Redesign `clap` integration [#3997](https://github.com/rerun-io/rerun/pull/3997) [#4040](https://github.com/rerun-io/rerun/pull/4040) +- `RecordingStream`: introduce `connect_opts` [#4042](https://github.com/rerun-io/rerun/pull/4042) +- Add `disable_timeline` function [#4068](https://github.com/rerun-io/rerun/pull/4068) + +#### 🪳 Bug fixes +- Fix grayscale images being too dark [#3999](https://github.com/rerun-io/rerun/pull/3999) +- Prevent badly sized tensors from crashing the Viewer [#4005](https://github.com/rerun-io/rerun/pull/4005) +- Fix selection history right-click menu not working [#3819](https://github.com/rerun-io/rerun/pull/3819) + +#### 🌁 Viewer improvements +- Replace `--strict` flag with `RERUN_PANIC_ON_WARN` env-var [#3872](https://github.com/rerun-io/rerun/pull/3872) +- Support NV12-encoded images [#3541](https://github.com/rerun-io/rerun/pull/3541) (thanks [@zrezke](https://github.com/zrezke)!) + +#### 🧑‍🏫 Examples +- `--max-frame` support for tracking examples [#3835](https://github.com/rerun-io/rerun/pull/3835) + +#### 📚 Docs +- Synchronize code examples and their screenshots [#3954](https://github.com/rerun-io/rerun/pull/3954) +- Improve docs for `TextDocument` example [#4008](https://github.com/rerun-io/rerun/pull/4008) +- Fix typos in documentation and code comments [#4061](https://github.com/rerun-io/rerun/pull/4061) (thanks [@omahs](https://github.com/omahs)!) + +#### 🖼 UI improvements +- Add basic support for in-app "Quick Start" guides [#3813](https://github.com/rerun-io/rerun/pull/3813) [#3912](https://github.com/rerun-io/rerun/pull/3912) +- Add copy-button to markdown code blocks [#3882](https://github.com/rerun-io/rerun/pull/3882) +- Add warning in the Quick Start guides about Safari breaking Copy to Clipboard [#3898](https://github.com/rerun-io/rerun/pull/3898) + +#### 🎨 Renderer improvements +- Add easy way to dump out final wgsl shader [#3947](https://github.com/rerun-io/rerun/pull/3947) + +#### 🧑‍💻 Dev-experience +- Approve all workflow runs for a specific contributor PR [#3876](https://github.com/rerun-io/rerun/pull/3876) +- Make codegen I/O-free and agnostic to output location [#3888](https://github.com/rerun-io/rerun/pull/3888) +- Configure pytest to fail on warnings [#3903](https://github.com/rerun-io/rerun/pull/3903) +- Improve `taplo` output on failure [#3909](https://github.com/rerun-io/rerun/pull/3909) +- Automatically synchronize build.rerun.io & release assets [#3945](https://github.com/rerun-io/rerun/pull/3945) +- New helper script to run fast lints and pre-push hook that runs it [#3949](https://github.com/rerun-io/rerun/pull/3949) +- CI: Rerun CLI as a release asset [#3959](https://github.com/rerun-io/rerun/pull/3959) +- Add script to generate RRD vs. screenshots comparisons [#3946](https://github.com/rerun-io/rerun/pull/3946) +- Add a new build Environment option for CondaBuild to improve conda-built artifacts [#4015](https://github.com/rerun-io/rerun/pull/4015) +- Lock Python in CI to 3.11 [#4033](https://github.com/rerun-io/rerun/pull/4033) +- Changed `spawn()` and the `rerun` script to call into `rerun_bindings` (12x startup time improvement) [#4053](https://github.com/rerun-io/rerun/pull/4053) + + +## [0.9.1](https://github.com/rerun-io/rerun/compare/0.9.0...0.9.1) - Bug fixes and performance improvements - 2023-10-12 + +[Rerun](https://rerun.io/) is an easy-to-use visualization toolbox for computer vision and robotics. + +* Python: `pip install rerun-sdk` +* Rust: `cargo add rerun` and `cargo install rerun-cli` +* Online demo: + +### ✨ Overview & highlights +- A bunch of bug fixes +- Fix big performance regression when hovering images +- The Rerun Viewer should now be visible to the system accessibility system + +#### 🐍 Python SDK +- Added support for PyTorch array to `Boxes2D`'s `array` convenience argument [#3719](https://github.com/rerun-io/rerun/pull/3719) +- Fix default stroke width handling in `log_line_strip_Xd` and `log_obbs` [#3720](https://github.com/rerun-io/rerun/pull/3720) +- Warn/raise when passing incompatible objects to `log` [#3727](https://github.com/rerun-io/rerun/pull/3727) +- Refactor `rerun.AnyValues` to handle `None` input more gracefully [#3725](https://github.com/rerun-io/rerun/pull/3725) +- Default `DisconnectedSpaces` boolean to `true` in Python [#3760](https://github.com/rerun-io/rerun/pull/3760) + +#### 🦀 Rust SDK +- Fix return type of `entity_path!()` and `entity_path_vec!()` on empty input [#3734](https://github.com/rerun-io/rerun/pull/3734) (thanks [@kpreid](https://github.com/kpreid)!) +- Export `RecordingStreamError` [#3777](https://github.com/rerun-io/rerun/pull/3777) + +#### 🪳 Bug fixes +- Fix bug when joining cleared optional components [#3726](https://github.com/rerun-io/rerun/pull/3726) +- Update `winit` to 0.28.7 to fix UI glitch on macOS Sonoma [#3763](https://github.com/rerun-io/rerun/pull/3763) +- Show 1D-tensors as bar charts [#3769](https://github.com/rerun-io/rerun/pull/3769) +- Fix loading of `.obj` mesh files [#3772](https://github.com/rerun-io/rerun/pull/3772) +- Fix crash when loading huge image [#3775](https://github.com/rerun-io/rerun/pull/3775) +- Fix performance regression when viewing images and tensors [#3767](https://github.com/rerun-io/rerun/pull/3767) + +#### 🌁 Viewer improvements +- Turn on `AccessKit` accessibility integration [#3732](https://github.com/rerun-io/rerun/pull/3732) +- Display space views using `ViewCoordinates` from closest ancestor [#3748](https://github.com/rerun-io/rerun/pull/3748) +- Improve 3D view bounds handling of camera frustums [#3749](https://github.com/rerun-io/rerun/pull/3749) [#3815](https://github.com/rerun-io/rerun/pull/3815) [#3811](https://github.com/rerun-io/rerun/pull/3811) +- Improve heuristics around 2D vs 3D space-view creation [#3822](https://github.com/rerun-io/rerun/pull/3822) + +#### 🚀 Performance improvements +- Optimize gathering of point cloud colors [#3730](https://github.com/rerun-io/rerun/pull/3730) + +#### 🧑‍🏫 Examples +- Fix open photogrammetry example not working on Windows [#3705](https://github.com/rerun-io/rerun/pull/3705) + +#### 📚 Docs +- Document that entity-path `rerun/` is reserved [#3747](https://github.com/rerun-io/rerun/pull/3747) + +#### 🖼 UI improvements +- Show all entities/components in the Streams UI, even if empty for the selected timeline [#3779](https://github.com/rerun-io/rerun/pull/3779) + +#### 🧑‍💻 Dev-experience +- Less automatic `build.rs` shenanigans [#3814](https://github.com/rerun-io/rerun/pull/3814) + +#### 🗣 Refactors +- Refactor our `build.rs` files [#3789](https://github.com/rerun-io/rerun/pull/3789) + +#### 📦 Dependencies +- Update `ewebsock` to 0.4.0 [#3729](https://github.com/rerun-io/rerun/pull/3729) +- Update `winit` to 0.28.7 [#3763](https://github.com/rerun-io/rerun/pull/3763) + + +## [0.9.0](https://github.com/rerun-io/rerun/compare/0.8.2...0.9.0) - New logging API - 2023-10-05 + +[Rerun](https://rerun.io/) is an easy-to-use visualization toolbox for computer vision and robotics. + +* Python: `pip install rerun-sdk` +* Rust: `cargo add rerun` and `cargo install rerun-cli` +* Online demo: + + +### ✨ Overview & highlights +Rerun 0.9.0 is a big release, that introduces a brand new logging API. +This API is code-generated from a common definition, meaning the Python and Rust SDKs are very similar now. +This will let us more easily extend and improve the API going forward. +It is also the basis for our C++ API, which is coming in Rerun 0.10.0. + +Read [the migration guide](https://rerun.io/docs/reference/migration-0-9) for details! + + + 0.9.0 Welcome Screen + + + + + + +Other highlights: +* 🏃‍♀️ Large point clouds are up to 3x faster now +* 📚 Markdown view support + * 🔗 with easy to use in-viewer entity & component links +* 📺 New startup screen +* 🐛 Lots and lots of bugfixes + * 👷‍♀️ Internally we have now way more automated testing for the new API surfaces +* ✨ drag & drop for images & meshes (even on web!), time display in local time (thanks @jparismorgan!), + .obj mesh support, default enabled memory limit, new how-to guide for custom data… and many more smaller features! + +### Some select details +#### 🐍 Python SDK +- Handle older Numpy versions / py 3.8 in `VecND` extensions [#2896](https://github.com/rerun-io/rerun/pull/2896) +- Add default value for `info` argument of `ClassDescription` [#3017](https://github.com/rerun-io/rerun/pull/3017) +- Run all Python doc examples in CI [#3172](https://github.com/rerun-io/rerun/pull/3172) +- Create objects for delegating components [#3303](https://github.com/rerun-io/rerun/pull/3303) +- Allow any string as an entity path [#3443](https://github.com/rerun-io/rerun/pull/3443) +- Check if another process is already listening on the port before trying to spawn [#3501](https://github.com/rerun-io/rerun/pull/3501) +- Force kw-args on more Python functions [#3515](https://github.com/rerun-io/rerun/pull/3515) +- Deprecate all of the legacy `log_` prefixed APIs. [#3564](https://github.com/rerun-io/rerun/pull/3564) +- Introduce AnyValues as an alternative to extension_components [#3561](https://github.com/rerun-io/rerun/pull/3561) + +#### 🦀 Rust SDK +- Introduce versioned `EntityPath` & refactor mesh/tensor caching [#3230](https://github.com/rerun-io/rerun/pull/3230) +- Make `FileSink` actually flush its data when asked to [#3525](https://github.com/rerun-io/rerun/pull/3525) +- `TextLog` integrations with native loggers [#3522](https://github.com/rerun-io/rerun/pull/3522) + +#### 🪳 Bug fixes +- Fix bug in size estimation of array buffers [#2991](https://github.com/rerun-io/rerun/pull/2991) +- Fix the Streams UI when the recording is empty [#3027](https://github.com/rerun-io/rerun/pull/3027) +- Clamp time panel height to avoid visual glitches [#3169](https://github.com/rerun-io/rerun/pull/3169) +- Allow user to edit colormap for depth images [#3241](https://github.com/rerun-io/rerun/pull/3241) +- Fix lurking bug in datastore bucket sorting routines [#3281](https://github.com/rerun-io/rerun/pull/3281) +- Fix row ordering flakiness when using clear APIs [#3288](https://github.com/rerun-io/rerun/pull/3288) +- Fix incorrect propagation of field's nullability into its inner list [#3352](https://github.com/rerun-io/rerun/pull/3352) +- Fix post-GC purging of streams view time histogram [#3364](https://github.com/rerun-io/rerun/pull/3364) +- Fix color grayscale colormap not being even [#3391](https://github.com/rerun-io/rerun/pull/3391) +- Fix depth point cloud not taking transformation at its path into account [#3514](https://github.com/rerun-io/rerun/pull/3514) +- Fix infinite recursion when putting a container inside a Viewer tab [#3534](https://github.com/rerun-io/rerun/pull/3534) +- Fix failing to preview small images [#3520](https://github.com/rerun-io/rerun/pull/3520) + +#### 🌁 Viewer improvements +- Open image and mesh files with drag-drop and File->Open [#3116](https://github.com/rerun-io/rerun/pull/3116) +- Support loading images and meshes on web [#3131](https://github.com/rerun-io/rerun/pull/3131) +- Add `rerun reset` command [#3145](https://github.com/rerun-io/rerun/pull/3145) +- Show picking position when hovering something in the spatial view [#3227](https://github.com/rerun-io/rerun/pull/3227) +- Rethink view selection & filtering + make all views opt-in [#3323](https://github.com/rerun-io/rerun/pull/3323) +- Markdown support in `TextDocument` [#3343](https://github.com/rerun-io/rerun/pull/3343) +- Click `recording://entity/path` links in markdown [#3442](https://github.com/rerun-io/rerun/pull/3442) +- Allow showing image shaped tensors in the tensor view [#3583](https://github.com/rerun-io/rerun/pull/3583) +- Add option to display timestamps in the local system timezone [#3530](https://github.com/rerun-io/rerun/pull/3530) (thanks [@jparismorgan](https://github.com/jparismorgan)!) +- Add obj mesh support to Viewer [#3670](https://github.com/rerun-io/rerun/pull/3670) + +#### 🚀 Performance improvements +- Pass through strings using arrow2::Buffers [#2931](https://github.com/rerun-io/rerun/pull/2931) +- Introduce codegen optimizations for primitives and fixed-sized-arrays [#2970](https://github.com/rerun-io/rerun/pull/2970) +- Optimize big point clouds by ~20% [#3108](https://github.com/rerun-io/rerun/pull/3108) +- A nice speed up of 3D points clouds by ~69% [#3114](https://github.com/rerun-io/rerun/pull/3114) +- Improve performance for many entities [#3078](https://github.com/rerun-io/rerun/pull/3078) +- Turn on garbage-collection (`--memory-limit`) by default [#3161](https://github.com/rerun-io/rerun/pull/3161) +- Optimize out unnecessary joins when querying archetypes [#3377](https://github.com/rerun-io/rerun/pull/3377) + +#### 🧑‍🏫 Examples +- Add "rerun_example_" prefix to all our user-visible app-ids [#3112](https://github.com/rerun-io/rerun/pull/3112) +- Add paper visualizations to examples [#3020](https://github.com/rerun-io/rerun/pull/3020) (thanks [@roym899](https://github.com/roym899)!) +- API examples overhaul & roundtrip tests [#3204](https://github.com/rerun-io/rerun/pull/3204) +- Generate manifest for examples page in Viewer [#3332](https://github.com/rerun-io/rerun/pull/3332) +- Fix `transform3d_simple` and reenable roundtrip test [#3401](https://github.com/rerun-io/rerun/pull/3401) +- Update import path for HuggingFace's `randn_tensor` [#3506](https://github.com/rerun-io/rerun/pull/3506) (thanks [@hu-po](https://github.com/hu-po)!) +- Add ControlNet example [#3568](https://github.com/rerun-io/rerun/pull/3568) (thanks [@roym899](https://github.com/roym899)!) + +#### 📚 Docs +- Fix outdated links in docs [#2854](https://github.com/rerun-io/rerun/pull/2854) +- Add how-to guide for clearing entities [#3211](https://github.com/rerun-io/rerun/pull/3211) +- Support `\example` in codegen [#3378](https://github.com/rerun-io/rerun/pull/3378) +- Docs codegen [#3445](https://github.com/rerun-io/rerun/pull/3445) +- Generate component/datatype docs [#3535](https://github.com/rerun-io/rerun/pull/3535) +- Update the Python API docs site for the new APIs [#3565](https://github.com/rerun-io/rerun/pull/3565) +- Add a how-to guide for using Rerun with custom data [#3634](https://github.com/rerun-io/rerun/pull/3634) + +#### 🖼 UI improvements +- Migrate to custom checkbox/radio_value UI [#2851](https://github.com/rerun-io/rerun/pull/2851) +- Remove expansion effect from time panel toolbar [#2863](https://github.com/rerun-io/rerun/pull/2863) +- Remove expansion effect from the large collapsing headers [#2864](https://github.com/rerun-io/rerun/pull/2864) +- Change the styling and behavior of hyperlinks [#2872](https://github.com/rerun-io/rerun/pull/2872) +- Improve space view tab design [#2879](https://github.com/rerun-io/rerun/pull/2879) +- Improve drag tab UI [#2893](https://github.com/rerun-io/rerun/pull/2893) +- Normalize various text string in UI [#2902](https://github.com/rerun-io/rerun/pull/2902) +- Add (debug-only) style panel [#2914](https://github.com/rerun-io/rerun/pull/2914) +- Add clip rect in panels and use them for large collapsing headers [#2936](https://github.com/rerun-io/rerun/pull/2936) +- Add Recordings section to the left panel [#2938](https://github.com/rerun-io/rerun/pull/2938) +- New triangle collapse arrow for large collapsible header [#2920](https://github.com/rerun-io/rerun/pull/2920) +- Add support for tree to `ListItem` [#2968](https://github.com/rerun-io/rerun/pull/2968) +- Add hierarchical display in recordings panel [#2971](https://github.com/rerun-io/rerun/pull/2971) +- Add support to close a recording [#2972](https://github.com/rerun-io/rerun/pull/2972) +- Show RAM use and data rate when hovering an entity in stream view [#2997](https://github.com/rerun-io/rerun/pull/2997) +- Don't select the spaceview when maximizing it [#2988](https://github.com/rerun-io/rerun/pull/2988) +- Add delete buttons in the Recordings UI [#2976](https://github.com/rerun-io/rerun/pull/2976) +- Introduce a welcome screen when no recording is loaded [#2982](https://github.com/rerun-io/rerun/pull/2982) +- Remove the limitation to a single dropped file [#3030](https://github.com/rerun-io/rerun/pull/3030) +- Uniform icon, pointer, and tooltip for external links [#3026](https://github.com/rerun-io/rerun/pull/3026) +- Improve styling of demo header [#3022](https://github.com/rerun-io/rerun/pull/3022) +- Implement "Open file" dialog on Web [#3068](https://github.com/rerun-io/rerun/pull/3068) +- Show Welcome Screen after closing recording even with `--skip-welcome-screen` [#3035](https://github.com/rerun-io/rerun/pull/3035) +- Fix the 3D space view's tooltip help text [#3132](https://github.com/rerun-io/rerun/pull/3132) +- Use `ListItem` in blueprint tree UI [#3118](https://github.com/rerun-io/rerun/pull/3118) +- Use `ListItem` in Stream Tree UI [#3153](https://github.com/rerun-io/rerun/pull/3153) +- Limit the size of component tooltips with `UiVerbosity::Reduced` [#3171](https://github.com/rerun-io/rerun/pull/3171) +- Smaller AnnotationContext tooltip [#3217](https://github.com/rerun-io/rerun/pull/3217) +- Add Examples page to the Welcome Screen [#3191](https://github.com/rerun-io/rerun/pull/3191) +- `Welcome Page` refresh [#3219](https://github.com/rerun-io/rerun/pull/3219) +- Show currently loading recordings in Recordings menu [#3307](https://github.com/rerun-io/rerun/pull/3307) +- Update to latest egui + use new Image API [#3311](https://github.com/rerun-io/rerun/pull/3311) +- Hide stream view and selection view in welcome app [#3333](https://github.com/rerun-io/rerun/pull/3333) +- Tighter UI for Pinhole and when hovering images [#3579](https://github.com/rerun-io/rerun/pull/3579) +- Improve viewport tile behavior [#3295](https://github.com/rerun-io/rerun/pull/3295) +- Show color map preview for depth point clouds as well [#3373](https://github.com/rerun-io/rerun/pull/3373) + +#### 🕸️ Web +- Move example description to README frontmatter [#3201](https://github.com/rerun-io/rerun/pull/3201) +- Fix instantiateStreaming usage on web [#3209](https://github.com/rerun-io/rerun/pull/3209) +- Web-Viewer: Don't auto-connect to `wss://hostname` when an `?url=` is missing [#3345](https://github.com/rerun-io/rerun/pull/3345) + +#### 📈 Analytics +- Recreate the analytics state directory if necessary before creating pipeline [#2878](https://github.com/rerun-io/rerun/pull/2878) +- Update resolved analytics URL [#3101](https://github.com/rerun-io/rerun/pull/3101) +- Use `ehttp` in `re_analytics` [#3155](https://github.com/rerun-io/rerun/pull/3155) +- Web analytics [#3166](https://github.com/rerun-io/rerun/pull/3166) +- Keep track of how files are sourced for analytics and UI [#3371](https://github.com/rerun-io/rerun/pull/3371) + +#### 🧑‍💻 Dev-experience +- Make `cargo codegen` work irrelevant of CWD [#2913](https://github.com/rerun-io/rerun/pull/2913) +- `scripts/highlight_issues.py`: print issues with no comments [#2939](https://github.com/rerun-io/rerun/pull/2939) +- Use `prettyplease` to improve formatting of generated Rust code [#2949](https://github.com/rerun-io/rerun/pull/2949) +- Enable debug symbols in build scripts (`build.rs`) in dev mode [#2962](https://github.com/rerun-io/rerun/pull/2962) +- Update egui via a `[patch]` [#2969](https://github.com/rerun-io/rerun/pull/2969) +- Track file sizes [#3037](https://github.com/rerun-io/rerun/pull/3037) +- Fix docs previews [#3066](https://github.com/rerun-io/rerun/pull/3066) +- Name the rayon threads [#3060](https://github.com/rerun-io/rerun/pull/3060) +- Improve size tracking table [#3117](https://github.com/rerun-io/rerun/pull/3117) +- Remove `setup-rust` from toml lint job [#3143](https://github.com/rerun-io/rerun/pull/3143) +- Render demo manifest [#3151](https://github.com/rerun-io/rerun/pull/3151) +- Fix update PR body script [#3181](https://github.com/rerun-io/rerun/pull/3181) +- Update CI `actions/checkout@v4` [#3208](https://github.com/rerun-io/rerun/pull/3208) +- Update all uses of `actions/checkout` to use explicit `ref` [#3322](https://github.com/rerun-io/rerun/pull/3322) +- Make 'Print datastore' viable with real world data [#3452](https://github.com/rerun-io/rerun/pull/3452) +- Update workflows to support fork PRs [#3544](https://github.com/rerun-io/rerun/pull/3544) + +#### 🗣 Refactors +- Remove legacy `re_components` [#3440](https://github.com/rerun-io/rerun/pull/3440) + +#### 📦 Dependencies +- Update clang-format [#2942](https://github.com/rerun-io/rerun/pull/2942) +- Rust 1.72 + format `let-else` (!) [#3102](https://github.com/rerun-io/rerun/pull/3102) +- Update to egui 0.23 [#3523](https://github.com/rerun-io/rerun/pull/3523) +- Update to wgpu 0.17 [#2980](https://github.com/rerun-io/rerun/pull/2980) + +#### 🤷 Other +#### 🤷 Other +- Always protect at least one value on the timeline when running GC [#3357](https://github.com/rerun-io/rerun/pull/3357) + + +## [0.8.2](https://github.com/rerun-io/rerun/compare/0.8.1...0.8.2) - Bug fixes - 2023-09-05 + +#### 🪳 Bug fixes +- Fix quadratic slowdown when ingesting data with uniform time [#3088](https://github.com/rerun-io/rerun/pull/3088) +- Normalize quaternions [#3094](https://github.com/rerun-io/rerun/pull/3094) +- Improve error message in common `re_renderer` crash [#3070](https://github.com/rerun-io/rerun/pull/3070) +- Fix crash when trying to render too many line segments [#3093](https://github.com/rerun-io/rerun/pull/3093) +- Handle serde-field that fails to deserialize [#3130](https://github.com/rerun-io/rerun/pull/3130) +- GC the blueprints before saving while preserving the current state [#3148](https://github.com/rerun-io/rerun/pull/3148) + +#### 🧑‍🏫 Examples +- Make `custom_space_view` example more verbose [#3123](https://github.com/rerun-io/rerun/pull/3123) + +#### 🖼 UI improvements +- Change the "slow-down-camera" modifier to Alt on non-Mac [#3051](https://github.com/rerun-io/rerun/pull/3051) (thanks [@h3mosphere](https://github.com/h3mosphere)!) + +#### 🎨 Renderer improvements +- Warn if using software rasterizer (lavapipe or llvmpipe) [#3134](https://github.com/rerun-io/rerun/pull/3134) + +#### 📦 Dependencies +- Update webpki: https://rustsec.org/advisories/RUSTSEC-2023-0052 [#3176](https://github.com/rerun-io/rerun/pull/3176) + + +## [0.8.1](https://github.com/rerun-io/rerun/compare/0.8.0...0.8.1) - Bug fixes - 2023-08-17 + +#### 🐍 Python SDK +- Add a warning category and stacklevel to Rerun warnings.warn calls [#2985](https://github.com/rerun-io/rerun/pull/2985) + +#### 🪳 Bug fixes +- Fix always redrawing in the presence of a 3D space view [#2900](https://github.com/rerun-io/rerun/pull/2900) +- Fix unable to set camera spinning until camera has moved [#2990](https://github.com/rerun-io/rerun/pull/2990) + +#### 🌁 Viewer improvements +- Allow changing plot aspect ratio with scroll + cmd/ctrl + alt [#2742](https://github.com/rerun-io/rerun/pull/2742) +- Automatically select user timeline if no timeline was explicitly selected yet [#2986](https://github.com/rerun-io/rerun/pull/2986) + +#### 🧑‍🏫 Examples +- Add `Helix` to `demo.rerun.io` [#2930](https://github.com/rerun-io/rerun/pull/2930) + +#### 📈 Analytics +- Make sure `re_analytics` never log higher than at `debug` level [#3014](https://github.com/rerun-io/rerun/pull/3014) + + +## [0.8.0](https://github.com/rerun-io/rerun/compare/0.7.0...0.8.0) - Infrastructure investments and more transform improvements - 2023-07-27 + +[Rerun](https://rerun.io/) is an easy-to-use visualization toolbox for computer vision and robotics. + +* Python: `pip install rerun-sdk` +* Rust: `cargo add rerun` and `cargo install rerun-cli` +* Online demo: + + +### ✨ Overview & highlights + - `log_pinhole` is now easier to use in simple cases and supports non-RDF camera coordinates. [#2614](https://github.com/rerun-io/rerun/pull/2614) + - You only need to set focal length and optional principal point instead of setting the full 3x3 matrix. + - There is also a new argument: `camera_xyz` for setting the coordinate system. The default is RDF (the old + default). This affects the visible camera frustum, how rays are projected when hovering a 2D image, and how depth + clouds are projected. + - The visualizer can now show coordinate arrows for all affine transforms within the view. [#2577](https://github.com/rerun-io/rerun/pull/2577) + - Linestrips and oriented bounding boxes can now be logged via batch APIs in python. + - See: `log_linestrips_2d`, `log_linestrips_3d`, [#2822](https://github.com/rerun-io/rerun/pull/2822) and `log_obbs` [#2823](https://github.com/rerun-io/rerun/pull/2823) + - Rust users that build their own Viewer applications can now add fully custom Space Views. Find more information [here](https://rerun.io/docs/howto/extend/extend-ui#custom-space-views-classes). + - New optional `flush_timeout` specifies how long Rerun will wait if a TCP stream is disconnected during a flush. [#2821](https://github.com/rerun-io/rerun/pull/2821) + - In Rust, `RecordingStream::connect` now requires `flush_timeout` specified as an `Option`. + - To keep default behavior, this can be specified using the `rerun::default_flush_time()` helper. + - In Python `flush_init_sec` is now an optional argument to `rr.connect()` + - In Rust, the `RecordingStream` now offers a stateful time API, similar to the Python APIs. [#2506](https://github.com/rerun-io/rerun/pull/2506) + - You can now call `set_time_sequence`, `set_time_seconds`, and `set_time_nanos` directly on the `RecordingStream`, + which will set the time for all subsequent logs using that stream. + - This can be used as an alternative to the previous `MsgSender::with_time` APIs. + - The Rerun SDK now defaults to 8ms long microbatches instead of 50ms. This makes the default behavior more suitable +for use-cases like real-time video feeds. [#2220](https://github.com/rerun-io/rerun/pull/2220) + - Check out [the microbatching docs](https://rerun.io/docs/reference/sdk/micro-batching) for more information + on fine-tuning the micro-batching behavior. + - The web viewer now incremental loads `.rrd` files when streaming over HTTP. [#2412](https://github.com/rerun-io/rerun/pull/2412) + +![Open Photogrammetry Preview](https://static.rerun.io/9fa26e73a197690e0403cd35f29e31c2941dea36_release_080_photogrammetry_full.png) + +### Ongoing refactors + - There have been a number of significant internal changes going on during this release with little visible impact. + This work will land across future releases, but is highlighted here since much of it is visible through the + changelog. + - The layout of the Viewer is now controlled by a Blueprint datastore. In the future this will allow for direct API + control of the layout and configuration of the Viewer. A very early prototype of this functionality is available + via the `rerun.experimental` module in Python. + - An entirely new code-generation framework has been brought online for Rust, Python and C++. This will eventually enable + new object-centric APIs with a more scalable, consistent, and ergonomic experience. + - Bringup of C++ support is now underway and will eventually become our third officially supported SDK language. + +### Known regressions +- Due to the Blueprint storage migration, blueprint persistence on web is currently broken. Will be resolved in: + [#2579](https://github.com/rerun-io/rerun/issues/2579) + +### 🔎 Details +#### 🐍 Python SDK +- Clean up warnings printed when `rr.init` hasn't been called [#2209](https://github.com/rerun-io/rerun/pull/2209) +- Normalize Python typing syntax to 3.8+ [#2361](https://github.com/rerun-io/rerun/pull/2361) +- Simpler, sturdier stateful time tracking in both SDKs [#2506](https://github.com/rerun-io/rerun/pull/2506) +- Fix not taking np.array for single colors [#2569](https://github.com/rerun-io/rerun/pull/2569) +- Add a basic pyright config [#2610](https://github.com/rerun-io/rerun/pull/2610) +- Improve `log_pinhole` and support non-RDF pinholes [#2614](https://github.com/rerun-io/rerun/pull/2614) +- Expose batch APIs for linestrips [#2822](https://github.com/rerun-io/rerun/pull/2822) +- Expose batch APIs for oriented bounding boxes [#2823](https://github.com/rerun-io/rerun/pull/2823) + +#### 🦀 Rust SDK +- Add example for adding custom Space Views [#2328](https://github.com/rerun-io/rerun/pull/2328) +- Simpler, sturdier stateful time tracking in both SDKs [#2506](https://github.com/rerun-io/rerun/pull/2506) +- Automagic flush when `take()`ing a `MemorySinkStorage` [#2632](https://github.com/rerun-io/rerun/pull/2632) +- Logging SDK: Log warnings if user data is dropped [#2630](https://github.com/rerun-io/rerun/pull/2630) +- Add support for `RecordingStream::serve` [#2815](https://github.com/rerun-io/rerun/pull/2815) + +#### 🌁 Viewer improvements +- Better handle scroll-to-zoom in 3D views [#1764](https://github.com/rerun-io/rerun/pull/1764) +- Add command to screenshot the application [#2293](https://github.com/rerun-io/rerun/pull/2293) +- Show layout in blueprint tree view [#2465](https://github.com/rerun-io/rerun/pull/2465) +- Double-click to select entity [#2504](https://github.com/rerun-io/rerun/pull/2504) +- Add Rerun.io link/text in top bar [#2540](https://github.com/rerun-io/rerun/pull/2540) +- New auto-layout of space views [#2558](https://github.com/rerun-io/rerun/pull/2558) +- Add 'Dump datastore' command to palette [#2564](https://github.com/rerun-io/rerun/pull/2564) +- Support any `dtype` for depth images [#2602](https://github.com/rerun-io/rerun/pull/2602) +- Change "Save Selection" command to Cmd+Alt+S [#2631](https://github.com/rerun-io/rerun/pull/2631) +- Consistent transform visualization for all entities with transforms [#2577](https://github.com/rerun-io/rerun/pull/2577) +- Improve `log_pinhole` and support non-RDF pinholes [#2614](https://github.com/rerun-io/rerun/pull/2614) + +#### 🚀 Performance improvements +- Flush the batches every 8ms instead of 50 ms [#2220](https://github.com/rerun-io/rerun/pull/2220) +- Replace `image` crate jpeg decoder with zune-jpeg [#2376](https://github.com/rerun-io/rerun/pull/2376) +- Stream `.rrd` files when loading via http [#2412](https://github.com/rerun-io/rerun/pull/2412) + +#### 🪳 Bug fixes +- Fix deadlock when misusing the Caches [#2318](https://github.com/rerun-io/rerun/pull/2318) +- Fix unstable order/flickering of "shown in" space view list on selection [#2327](https://github.com/rerun-io/rerun/pull/2327) +- Fix transforms not applied to connections from transform context [#2407](https://github.com/rerun-io/rerun/pull/2407) +- Fix texture clamping and color gradient selection being displayed incorrectly [#2394](https://github.com/rerun-io/rerun/pull/2394) +- Fix projected ray length [#2482](https://github.com/rerun-io/rerun/pull/2482) +- Tweak the depth bias multiplier for WebGL [#2491](https://github.com/rerun-io/rerun/pull/2491) +- Clip image zoom rectangle [#2505](https://github.com/rerun-io/rerun/pull/2505) +- Fix missing feature flags for benchmarks [#2515](https://github.com/rerun-io/rerun/pull/2515) +- `run_all.py` script fixes [#2519](https://github.com/rerun-io/rerun/pull/2519) +- Update egui_tiles with fix for drag-and-drop-panic [#2555](https://github.com/rerun-io/rerun/pull/2555) +- Convert objectron proto.py back to using typing.List [#2559](https://github.com/rerun-io/rerun/pull/2559) +- Exclude from `objectron/proto/objectron/proto.py` from `just py-format` [#2562](https://github.com/rerun-io/rerun/pull/2562) +- Fix pinhole visualization not working with camera extrinsics & intrinsics on the same path [#2568](https://github.com/rerun-io/rerun/pull/2568) +- Fix: always auto-layout spaceviews until the user intervenes [#2583](https://github.com/rerun-io/rerun/pull/2583) +- Fix freeze/crash when logging large times [#2588](https://github.com/rerun-io/rerun/pull/2588) +- Update egui_tiles to fix crash [#2598](https://github.com/rerun-io/rerun/pull/2598) +- Fix clicking object with single instance (of every component) selecting instance instead of entity [#2573](https://github.com/rerun-io/rerun/pull/2573) +- Cleanup internal data-structures when process has been forked [#2676](https://github.com/rerun-io/rerun/pull/2676) +- Fix shutdown race-condition by introducing a flush_timeout before dropping data [#2821](https://github.com/rerun-io/rerun/pull/2821) +- Fix ui-scale based point/line sizes incorrectly scaled when zooming based on horizontal dimension [#2805](https://github.com/rerun-io/rerun/pull/2805) +- Fix visibility toggle for maximized Space Views [#2806](https://github.com/rerun-io/rerun/pull/2806) +- Fix loading file via CLI [#2807](https://github.com/rerun-io/rerun/pull/2807) +- Fix disconnected space APIs in Python SDK [#2832](https://github.com/rerun-io/rerun/pull/2832) +- Avoid unwrap when generating authkey [#2804](https://github.com/rerun-io/rerun/pull/2804) + +#### 🧑‍🏫 Examples +- Add example template [#2392](https://github.com/rerun-io/rerun/pull/2392) +- Show hidden url search param in `app.rerun.io` [#2455](https://github.com/rerun-io/rerun/pull/2455) +- Minimal example of running an intel realsense depth sensor live [#2541](https://github.com/rerun-io/rerun/pull/2541) +- Add a simple example to display Open Photogrammetry Format datasets [#2512](https://github.com/rerun-io/rerun/pull/2512) +- Move `examples/api_demo` -> `tests/test_api` [#2585](https://github.com/rerun-io/rerun/pull/2585) + +#### 📚 Docs +- Docs: link to `rr.save` and suggest `rerun` instead of `python -m rerun` [#2586](https://github.com/rerun-io/rerun/pull/2586) +- Update docs about transforms [#2496](https://github.com/rerun-io/rerun/pull/2496) +- Fixup remaining usages of log_rigid3 in docs [#2831](https://github.com/rerun-io/rerun/pull/2831) + +#### 🎨 Renderer improvements +- Expose type erased draw data that can be consumed directly [#2300](https://github.com/rerun-io/rerun/pull/2300) +- Use less `mut` when using `RenderContext` [#2312](https://github.com/rerun-io/rerun/pull/2312) + +#### 🧑‍💻 Dev-experience +- Better error messages in build.rs [#2173](https://github.com/rerun-io/rerun/pull/2173) +- Recommend sccache in CONTRIBUTING.md [#2245](https://github.com/rerun-io/rerun/pull/2245) +- introduce `re_tracing` [#2283](https://github.com/rerun-io/rerun/pull/2283) +- lint: standardize formatting of let-else-return statements [#2297](https://github.com/rerun-io/rerun/pull/2297) +- Centralized build tools in `re_build_tools` [#2331](https://github.com/rerun-io/rerun/pull/2331) +- Lint for explicit quotes [#2332](https://github.com/rerun-io/rerun/pull/2332) +- Added example screenshot instructions in `just upload --help` [#2454](https://github.com/rerun-io/rerun/pull/2454) +- Added support for puling image from an URL to `upload_image.py` [#2462](https://github.com/rerun-io/rerun/pull/2462) +- `setup_dev.sh` now installs pngcrush [#2470](https://github.com/rerun-io/rerun/pull/2470) +- Added docs/code-examples to the directories checked by py-lint and py-format [#2476](https://github.com/rerun-io/rerun/pull/2476) +- Link to demo in PR + check checkboxes [#2543](https://github.com/rerun-io/rerun/pull/2543) +- Add script to find external issues we haven't commented on [#2532](https://github.com/rerun-io/rerun/pull/2532) +- Move CI-related scripts to its own folder [#2561](https://github.com/rerun-io/rerun/pull/2561) +- Render PR description as template [#2563](https://github.com/rerun-io/rerun/pull/2563) +- Add basic testing automation against all version of Python using nox [#2536](https://github.com/rerun-io/rerun/pull/2536) +- Run clippy on public API too [#2596](https://github.com/rerun-io/rerun/pull/2596) +- Bump all `py-lint`-related package versions [#2600](https://github.com/rerun-io/rerun/pull/2600) +- Crates publishing script [#2604](https://github.com/rerun-io/rerun/pull/2604) +- Fix Rust docs deploy [#2615](https://github.com/rerun-io/rerun/pull/2615) +- Add support for .gitignore to scripts/lint.py [#2666](https://github.com/rerun-io/rerun/pull/2666) + +#### 🗣 Refactors +- Refactor space-view dependencies: + - Move spatial space view to its own crate [#2286](https://github.com/rerun-io/rerun/pull/2286) + - Separate crate for bar chart space view [#2322](https://github.com/rerun-io/rerun/pull/2322) + - Separate crate for time series space view [#2324](https://github.com/rerun-io/rerun/pull/2324) + - Separate crate for tensor space view [#2334](https://github.com/rerun-io/rerun/pull/2334) + - Separate viewport related files out to a new re_viewport crate [#2251](https://github.com/rerun-io/rerun/pull/2251) + - Remove timepanel dependency from viewport [#2256](https://github.com/rerun-io/rerun/pull/2256) +- New trait system for SpaceViews: + - Initial Space View trait & port of text space views to the new Space View trait system [#2281](https://github.com/rerun-io/rerun/pull/2281) + - Extend/iterate on SpaceViewClass framework with SceneContext & port SpatialSpaceView scene parts [#2304](https://github.com/rerun-io/rerun/pull/2304) + - Finalize move of SpatialSpaceView to SpaceViewClass trait framework [#2311](https://github.com/rerun-io/rerun/pull/2311) + - Typename cleanup in SpaceViewClass framework [#2321](https://github.com/rerun-io/rerun/pull/2321) + - Automatic fallback for unrecognized Space View Class, start removing old ViewCategory [#2357](https://github.com/rerun-io/rerun/pull/2357) + - Rename ScenePart -> ViewPartSystem + related renamings [#2674](https://github.com/rerun-io/rerun/pull/2674) + - Dynamically registered space view (part/context) systems [#2688](https://github.com/rerun-io/rerun/pull/2688) +- Viewer's command queue is now a channel, allowing to queue commands without mutable access [#2339](https://github.com/rerun-io/rerun/pull/2339) +- Break up app.rs into parts [#2303](https://github.com/rerun-io/rerun/pull/2303) +- Break out `re_log_types::component_types` as `re_components` [#2258](https://github.com/rerun-io/rerun/pull/2258) +- Introduce StoreHub and rename Recording->Store [#2301](https://github.com/rerun-io/rerun/pull/2301) +- Move StoreHub out of the Viewer during Update [#2330](https://github.com/rerun-io/rerun/pull/2330) +- Expand CommandSender to support SystemCommand [#2344](https://github.com/rerun-io/rerun/pull/2344) +- Use `camino` crate for UTF8 paths in `re_types_builder` [#2637](https://github.com/rerun-io/rerun/pull/2637) +- Separate 2D & 3D spaceview classes, removal of `ViewCategory`, `SpaceViewClass` driven spawn heuristics [#2716](https://github.com/rerun-io/rerun/pull/2716) +- Move object property heuristics to heuristics.rs [#2764](https://github.com/rerun-io/rerun/pull/2764) + +#### 📦 Dependencies +- Version `rand` & friends at workspace level [#2508](https://github.com/rerun-io/rerun/pull/2508) +- Update to PyO3 0.19 [#2350](https://github.com/rerun-io/rerun/pull/2350) +- Pin `half` to `2.2.1` [#2587](https://github.com/rerun-io/rerun/pull/2587) + +#### 📘 Blueprint changes +- Drive blueprints off of a DataStore [#2010](https://github.com/rerun-io/rerun/pull/2010) +- Split SpaceView -> SpaceViewState + SpaceViewBlueprint [#2188](https://github.com/rerun-io/rerun/pull/2188) +- Split the Blueprint into AppBlueprint and ViewportBlueprint [#2358](https://github.com/rerun-io/rerun/pull/2358) +- Swap the naming of Viewport and ViewportBlueprint [#2595](https://github.com/rerun-io/rerun/pull/2595) +- Basic persistence for blueprints [#2578](https://github.com/rerun-io/rerun/pull/2578) + +#### 🏭 New codegen framework +- Codegen/IDL 1: add more build tools [#2362](https://github.com/rerun-io/rerun/pull/2362) +- Codegen/IDL 2: introduce `re_types_builder` [#2363](https://github.com/rerun-io/rerun/pull/2363) +- Codegen/IDL 3: introduce `re_types` [#2369](https://github.com/rerun-io/rerun/pull/2369) +- Codegen/IDL 4: definitions for a `Points2D` archetype [#2370](https://github.com/rerun-io/rerun/pull/2370) +- Codegen/IDL 5: auto-generated Python code for `Points2D` [#2374](https://github.com/rerun-io/rerun/pull/2374) +- Codegen/IDL 7: handwritten Python tests and extensions for `Points2D` [#2410](https://github.com/rerun-io/rerun/pull/2410) +- Codegen/IDL 6: auto-generated Rust code for `Points2D` [#2375](https://github.com/rerun-io/rerun/pull/2375) +- Codegen/IDL 8: handwritten Rust tests and extensions for `Points2D` [#2432](https://github.com/rerun-io/rerun/pull/2432) +- Codegen'd Rust/Arrow 1: upgrading to actual `TokenStream`s [#2484](https://github.com/rerun-io/rerun/pull/2484) +- Codegen'd Rust/Arrow 2: matching legacy definitions [#2485](https://github.com/rerun-io/rerun/pull/2485) +- Codegen'd Rust/Arrow 3: misc fixes & improvements [#2487](https://github.com/rerun-io/rerun/pull/2487) +- Codegen'd Rust/Arrow 4: out-of-sync definitions CI detection [#2545](https://github.com/rerun-io/rerun/pull/2545) +- Codegen'd Rust/Arrow 5: doc, definitions and regression tests for combinatorial affixes [#2546](https://github.com/rerun-io/rerun/pull/2546) +- Codegen'd Rust/Arrow 6: serialization [#2549](https://github.com/rerun-io/rerun/pull/2549) +- Codegen'd Rust/Arrow 7: deserialization [#2554](https://github.com/rerun-io/rerun/pull/2554) +- Codegen'd Rust/Arrow 8: carry extension metadata across transparency layers [#2570](https://github.com/rerun-io/rerun/pull/2570) +- Codegen'd Rust/Arrow 9: Rust backport! [#2571](https://github.com/rerun-io/rerun/pull/2571) +- End-to-end cross-language roundtrip tests for our archetypes [#2601](https://github.com/rerun-io/rerun/pull/2601) +- Automatically derive `Debug` and `Clone` in Rust backend [#2613](https://github.com/rerun-io/rerun/pull/2613) +- Generating (de)serialization code for dense unions in Rust backend [#2626](https://github.com/rerun-io/rerun/pull/2626) +- Fix `FixedSizeList` deserialization edge-case + trivial optimizations [#2673](https://github.com/rerun-io/rerun/pull/2673) +- Make `Datatype` & `Component` both inherit from `Loggable` [#2677](https://github.com/rerun-io/rerun/pull/2677) +- Roundtrip-able `Transform3D`s [#2669](https://github.com/rerun-io/rerun/pull/2669) +- Don't inline recursive datatypes in Rust backend [#2760](https://github.com/rerun-io/rerun/pull/2760) +- Automatically derive `tuple_struct` attr and trivial `From` impls where possible [#2772](https://github.com/rerun-io/rerun/pull/2772) +- Introduce roundtrip-able `Points3D` archetype (py + rs) [#2774](https://github.com/rerun-io/rerun/pull/2774) +- Add `fmt::Debug` implementations to various types. [#2784](https://github.com/rerun-io/rerun/pull/2784) (thanks [@kpreid](https://github.com/kpreid)!) +- Isolate testing types in Rust backend [#2810](https://github.com/rerun-io/rerun/pull/2810) +- Fix out-of-sync codegen hash [#2567](https://github.com/rerun-io/rerun/pull/2567) +- Python backport: add `log_any()` [#2581](https://github.com/rerun-io/rerun/pull/2581) +- Integrate unit examples into codegen stack [#2590](https://github.com/rerun-io/rerun/pull/2590) +- Disable codegen on Windows [#2592](https://github.com/rerun-io/rerun/pull/2592) +- Python codegen: big cleaning and paving the way towards transforms [#2603](https://github.com/rerun-io/rerun/pull/2603) +- Automatically assume Arrow transparency for components [#2608](https://github.com/rerun-io/rerun/pull/2608) +- Fix wrong path being `rerun_if_changed()` in `compute_dir_hash` [#2612](https://github.com/rerun-io/rerun/pull/2612) +- Support transparency at the semantic layer [#2611](https://github.com/rerun-io/rerun/pull/2611) +- Don't use builtin `required` anymore, introduce `nullable` instead [#2619](https://github.com/rerun-io/rerun/pull/2619) +- Rust codegen: generate proper docstrings [#2668](https://github.com/rerun-io/rerun/pull/2668) +- Support nullable Arrow unions using virtual union arms [#2708](https://github.com/rerun-io/rerun/pull/2708) +- Introduce support for querying Archetypes [#2743](https://github.com/rerun-io/rerun/pull/2743) +- Introduce legacy shims and migrate DataCell to re_types::Component [#2752](https://github.com/rerun-io/rerun/pull/2752) + +#### 🌊 Starting work on C++ +- Seed of C and C++ SDKs [#2594](https://github.com/rerun-io/rerun/pull/2594) +- Move C++ SDK to own folder [#2624](https://github.com/rerun-io/rerun/pull/2624) +- C++ codegen [#2678](https://github.com/rerun-io/rerun/pull/2678) +- C++ codegen for reporting Arrow data type for structs [#2756](https://github.com/rerun-io/rerun/pull/2756) +- Don't inline recursive datatypes in C++ backend [#2765](https://github.com/rerun-io/rerun/pull/2765) +- C++ codegen to_arrow_data_type for unions [#2766](https://github.com/rerun-io/rerun/pull/2766) +- C++ codegen Arrow serialize non-union components/datatypes without nested Rerun types [#2820](https://github.com/rerun-io/rerun/pull/2820) +- C++ codegen of structs and unions [#2707](https://github.com/rerun-io/rerun/pull/2707) +- Fix cpp formatter differences [#2773](https://github.com/rerun-io/rerun/pull/2773) + +#### 🤷 Other +#### 🤷 Other +- test_api: set different app_id based on what test is run [#2599](https://github.com/rerun-io/rerun/pull/2599) +- Introduce `rerun compare` to check whether 2 rrd files are functionally equivalent [#2597](https://github.com/rerun-io/rerun/pull/2597) +- Remove `files.exclude` in vscode settings [#2621](https://github.com/rerun-io/rerun/pull/2621) +- Support feature-gated Rust attributes [#2813](https://github.com/rerun-io/rerun/pull/2813) + + + +## [0.7.0](https://github.com/rerun-io/rerun/compare/0.6.0...0.7.0) - improved transforms, better color mapping, bug & doc fixes - 2023-06-16 + +### ✨ Overview & highlights + +While we're working on significant updates around interfaces and customizability, +here's a smaller release packed with useful improvements 🎉 + +* Much more powerful transformation logging + * any affine transforms works now! + * supports many more formats and shows them in the Viewer as-is +* Better color mapping range detection for images and tensors +* Many small improvements to samples & documentation + +### 🔎 Details + +#### 🐍 Python SDK +- Improved 3D transform ingestion & affine transform support [#2102](https://github.com/rerun-io/rerun/pull/2102) +- Normalize Python typing syntax to 3.8+ [#2361](https://github.com/rerun-io/rerun/pull/2361) +- Enforce `from __future__ import annotations` in Python files [#2377](https://github.com/rerun-io/rerun/pull/2377) +- Add `jpeg_quality` parameter to `log_image` [#2418](https://github.com/rerun-io/rerun/pull/2418) + +#### 🦀 Rust SDK +- Improved 3D transform ingestion & affine transform support [#2102](https://github.com/rerun-io/rerun/pull/2102) +- `impl Copy for Arrow3D`. [#2239](https://github.com/rerun-io/rerun/pull/2239) (thanks [@kpreid](https://github.com/kpreid)!) + +#### 🪳 Bug fixes +- Stable image order, fixing flickering [#2191](https://github.com/rerun-io/rerun/pull/2191) +- Fix double clicking objects no longer focusing the camera on them [#2227](https://github.com/rerun-io/rerun/pull/2227) +- Fix off-by-half pixel error in textured rectangle shader [#2294](https://github.com/rerun-io/rerun/pull/2294) +- Update wgpu-hal to 0.16.1 to fix mobile Safari [#2296](https://github.com/rerun-io/rerun/pull/2296) +- Fix some browsers failing due to 8k texture requirement, pick always highest available now [#2409](https://github.com/rerun-io/rerun/pull/2409) +- Fix visibility toggles for time series not working [#2444](https://github.com/rerun-io/rerun/pull/2444) + +#### 🌁 Viewer improvements +- Time panel now always talks about "events" instead of "messages" [#2247](https://github.com/rerun-io/rerun/pull/2247) +- Automatically determine image/tensor color mapping & need for sRGB decoding [#2342](https://github.com/rerun-io/rerun/pull/2342) + +#### 🚀 Performance improvements +- Optimization: avoid a memory allocation when padding RGB u8 to RGBA [#2345](https://github.com/rerun-io/rerun/pull/2345) + +#### 🧑‍🏫 Examples +- Example of how to embed the Rerun Viewer inside your own GUI (+ ergonomic improvements) [#2250](https://github.com/rerun-io/rerun/pull/2250) +- Objectron Rust example: install `protoc` for the user [#2280](https://github.com/rerun-io/rerun/pull/2280) +- Remove weird-looking argument parsing in examples [#2398](https://github.com/rerun-io/rerun/pull/2398) +- Fix `tracking_hf example`: put scaled thing under its own root entity [#2419](https://github.com/rerun-io/rerun/pull/2419) +- Clean up our examples [#2424](https://github.com/rerun-io/rerun/pull/2424) +- New face detection example based on MediaPipe [#2360](https://github.com/rerun-io/rerun/pull/2360) +- Update web examples [#2420](https://github.com/rerun-io/rerun/pull/2420) +- Update titles and tags for examples with real data [#2416](https://github.com/rerun-io/rerun/pull/2416) + +#### 📚 Docs +- Merge `rerun-docs` repository into this monorepo [#2284](https://github.com/rerun-io/rerun/pull/2284) +- Add manifest + readmes to examples [#2309](https://github.com/rerun-io/rerun/pull/2309) +- Fix and clean up BUILD.md [#2319](https://github.com/rerun-io/rerun/pull/2319) +- Link to `/examples` in PR description [#2320](https://github.com/rerun-io/rerun/pull/2320) +- Make examples setup a separate page [#2323](https://github.com/rerun-io/rerun/pull/2323) +- Add `site_url` to `mkdocs.yml` [#2326](https://github.com/rerun-io/rerun/pull/2326) +- Add `log_cleared` to the common index [#2400](https://github.com/rerun-io/rerun/pull/2400) +- Use forked `mkdocs-redirects` [#2404](https://github.com/rerun-io/rerun/pull/2404) +- Add support for classes to generated Python common API index [#2401](https://github.com/rerun-io/rerun/pull/2401) +- Added support for creating multi-resolution stacks with upload_image.py [#2411](https://github.com/rerun-io/rerun/pull/2411) +- Document annotation context in manual [#2453](https://github.com/rerun-io/rerun/pull/2453) + +#### 🕸️ Web +- Update `wasm-bindgen` to 0.2.87 [#2406](https://github.com/rerun-io/rerun/pull/2406) +- When loading on web, match style and show a progress indicator while Wasm is loading [#2421](https://github.com/rerun-io/rerun/pull/2421) + +#### 📈 Analytics +- Add crash retriever script [#2168](https://github.com/rerun-io/rerun/pull/2168) + +#### 🧑‍💻 Dev-experience +- Image uploader script [#2164](https://github.com/rerun-io/rerun/pull/2164) +- Replace `wasm-bindgen-cli` with library `wasm-bindgen-cli-support` [#2257](https://github.com/rerun-io/rerun/pull/2257) +- Fix manual release/dispatch workflows [#2230](https://github.com/rerun-io/rerun/pull/2230) +- Add instructions on how to fix weird `gsutil` crash [#2278](https://github.com/rerun-io/rerun/pull/2278) +- Link to preview of latest commit in PR body [#2287](https://github.com/rerun-io/rerun/pull/2287) +- CI: Retry `linkinator` [#2299](https://github.com/rerun-io/rerun/pull/2299) +- Remove long dead code Python unit test [#2356](https://github.com/rerun-io/rerun/pull/2356) +- Added gcloud project name to `upload_image.py` [#2381](https://github.com/rerun-io/rerun/pull/2381) +- Fix typo in `run_all.py` [#2441](https://github.com/rerun-io/rerun/pull/2441) +- Small changelog improvements [#2442](https://github.com/rerun-io/rerun/pull/2442) +- Minor fixes/improvements of `upload_image.py` [#2449](https://github.com/rerun-io/rerun/pull/2449) +- Improve changelog generator [#2447](https://github.com/rerun-io/rerun/pull/2447) + +#### 🗣 Refactors +- Centralize freestanding store helpers [#2153](https://github.com/rerun-io/rerun/pull/2153) + +#### 📦 Dependencies +- Update `xml-rs` v0.8.13 -> v0.8.14 [#2425](https://github.com/rerun-io/rerun/pull/2425) +- Update pip package `requests` to 2.31 with bug fix [#2426](https://github.com/rerun-io/rerun/pull/2426) + + +## [0.6.0](https://github.com/rerun-io/rerun/compare/v0.5.1...0.6.0) - 3D in 2D and SDK batching - 2023-05-26 + +### ✨ Overview & highlights + +- You can now show 3D objects in 2D views connected by Pinhole transforms [#2008](https://github.com/rerun-io/rerun/pull/2008) +- You can quickly view images and meshes with `rerun mesh.obj image.png` [#2060](https://github.com/rerun-io/rerun/pull/2060) +- The correct to install the `rerun` binary is now with `cargo install rerun-cli` [#2183](https://github.com/rerun-io/rerun/pull/2183) +- `native_viewer` is now an opt-in feature of the `rerun` library, leading to faster compilation times [#2064](https://github.com/rerun-io/rerun/pull/2064) +- Experimental WebGPU support [#1965](https://github.com/rerun-io/rerun/pull/1965) +- SDK log calls are now batched on the wire, saving CPU time and bandwidth + +### 🔎 Details + +#### 🐍 Python SDK +- ⚠️ BREAKING: You must now call `rr.init` if you want logging to work. +- ⚠️ BREAKING: `set_enabled` has been removed. + In order to disable logging at runtime, call `set_global_data_recording(None)`. + See also [the doc section on this topic](https://rerun.io/docs/reference/sdk/logging-controls#dynamically-turn-logging-onoff). +- `log_mesh_file`: accept either path or bytes [#2098](https://github.com/rerun-io/rerun/pull/2098) +- Add `draw_order` to 2D primitives [#2138](https://github.com/rerun-io/rerun/pull/2138) +- Add `rr.version()` [#2084](https://github.com/rerun-io/rerun/pull/2084) +- Add an experimental text-box component and logtype [#2011](https://github.com/rerun-io/rerun/pull/2011) +- Fix a race condition for notebooks [#2073](https://github.com/rerun-io/rerun/pull/2073) +- Redesign multi-recording & multi-threading [#2061](https://github.com/rerun-io/rerun/pull/2061) +- More robust wait for exit condition during `.serve()` [#1939](https://github.com/rerun-io/rerun/pull/1939) +- SDK batching/revamp 3: sunset `PythonSession` [#1985](https://github.com/rerun-io/rerun/pull/1985) + +#### 🦀 Rust SDK +- ⚠️ BREAKING: `set_enabled` has been removed. + In order to disable logging at runtime, create a no-op recording via `RecordingStream::disabled()`. + See also [the doc section on this topic](https://rerun.io/docs/reference/sdk/logging-controls#dynamically-turn-logging-onoff). +- ⚠️ BREAKING: `Session` has been replaced by `RecordingStream` [#1983](https://github.com/rerun-io/rerun/pull/1983) +- ⚠️ BREAKING: `native_viewer` is now an opt-in feature of the `rerun` library [#2064](https://github.com/rerun-io/rerun/pull/2064) +- Rust SDK: bring back support for implicit splats [#2059](https://github.com/rerun-io/rerun/pull/2059) +- Introduce a 2D `DrawOrder` component [#2056](https://github.com/rerun-io/rerun/pull/2056) +- Add `Tensor::from_image_file` and `Tensor::from_image_bytes` [#2097](https://github.com/rerun-io/rerun/pull/2097) +- Redesign multi-recording & multi-threading [#2061](https://github.com/rerun-io/rerun/pull/2061) + +#### 🌁 Viewer improvements +- Support projecting 3D entities in 2D views [#2008](https://github.com/rerun-io/rerun/pull/2008) +- Set Rerun Viewer native app icon using eframe [#1976](https://github.com/rerun-io/rerun/pull/1976) +- Use `alt` key again for rolling camera in 3D views [#2066](https://github.com/rerun-io/rerun/pull/2066) +- Show tensors shaped [H, W, 1, 1] as images (and more!) [#2075](https://github.com/rerun-io/rerun/pull/2075) +- Show meshes and images with `rerun foo.obj bar.png` [#2060](https://github.com/rerun-io/rerun/pull/2060) +- Don't persist blueprints for unknown apps [#2165](https://github.com/rerun-io/rerun/pull/2165) + +#### 🪳 Bug fixes +- Fix hover/select highlights when picking single points in a scene with multiple point clouds [#1942](https://github.com/rerun-io/rerun/pull/1942) +- Fix crash for missing class ids causing zero sized texture [#1947](https://github.com/rerun-io/rerun/pull/1947) +- Handle leaking of prerelease into alpha version [#1953](https://github.com/rerun-io/rerun/pull/1953) +- Fix incorrect memory usage stats for destroyed on-creation-mapped buffers [#1963](https://github.com/rerun-io/rerun/pull/1963) +- Fix: don't starve web-socket decoding task [#1977](https://github.com/rerun-io/rerun/pull/1977) +- When hovering a 3D view in the presence of images, fix previously incorrect depth shown in 2D view [#2009](https://github.com/rerun-io/rerun/pull/2009) +- Fix: use the Mac icon on Mac [#2023](https://github.com/rerun-io/rerun/pull/2023) +- SDK batching/revamp 2.2: homegrown Arrow size estimation routines [#2002](https://github.com/rerun-io/rerun/pull/2002) +- Fix twice as wide alpha-to-coverage edge on circles, leading to artifacts [#2053](https://github.com/rerun-io/rerun/pull/2053) +- Bugfix: allow hovered items to be clicked to set selection [#2057](https://github.com/rerun-io/rerun/pull/2057) +- Detect, warn and gracefully handle corrupt cells in `lookup_arrow` [#2055](https://github.com/rerun-io/rerun/pull/2055) +- Fix failing dependency install of mesh_to_sdf [#2081](https://github.com/rerun-io/rerun/pull/2081) +- Stop playback when we reach the end of the data [#2085](https://github.com/rerun-io/rerun/pull/2085) +- `tornado` >6.1 doesn't work with recent `jupyter` [#2092](https://github.com/rerun-io/rerun/pull/2092) +- Premultiply alpha of RGBA u8 images [#2095](https://github.com/rerun-io/rerun/pull/2095) +- Fix premature pausing when reaching end of still-streaming stream [#2106](https://github.com/rerun-io/rerun/pull/2106) +- 2D layering fixes [#2080](https://github.com/rerun-io/rerun/pull/2080) +- Fix depth precision issues on WebGL due to different NDC space [#2123](https://github.com/rerun-io/rerun/pull/2123) +- Fix flushing race in new multi-recording SDK [#2125](https://github.com/rerun-io/rerun/pull/2125) +- Web viewer: catch and show panic messages that happens at startup [#2157](https://github.com/rerun-io/rerun/pull/2157) +- Don't early-exit on non-pinhole transforms when looking up cameras [#2194](https://github.com/rerun-io/rerun/pull/2194) +- Mitigate depth offset precision issues on web [#2187](https://github.com/rerun-io/rerun/pull/2187) +- Fix colormaps [#2204](https://github.com/rerun-io/rerun/pull/2204) +- Fix annotation images sometimes drawn in the background [#1933](https://github.com/rerun-io/rerun/pull/1933) +- Fix hovering depth clouds [#1943](https://github.com/rerun-io/rerun/pull/1943) +- Fix incorrect 2D camera for scenes with negative 2D coordinates [#2051](https://github.com/rerun-io/rerun/pull/2051) +- Fix web depth/projection regression, causing incorrect rendering on all 3D scenes [#2170](https://github.com/rerun-io/rerun/pull/2170) + +#### 🚀 Performance improvements +- SDK batching/revamp 1: impl `DataTableBatcher` [#1980](https://github.com/rerun-io/rerun/pull/1980) +- Upgrade arrow2/convert and use native buffers for the tensor u8 types [#1375](https://github.com/rerun-io/rerun/pull/1375) +- Use the same RRD encoding for the SDK comms as for everything else [#2065](https://github.com/rerun-io/rerun/pull/2065) +- Optimize GLTF/GLB texture loading in debug builds [#2096](https://github.com/rerun-io/rerun/pull/2096) +- Premultiply the alpha on the GPU [#2190](https://github.com/rerun-io/rerun/pull/2190) +- Switch compression algorithm from zstd to lz4 [#2112](https://github.com/rerun-io/rerun/pull/2112) +- Support RRD streams with and without compression. Turn off for SDK comms [#2219](https://github.com/rerun-io/rerun/pull/2219) + +#### 🧑‍🏫 Examples +- Join threads at end of multi-threading example [#1934](https://github.com/rerun-io/rerun/pull/1934) +- Add argument parsing to the rerun_demo [#1925](https://github.com/rerun-io/rerun/pull/1925) +- Use zipfile Python library instead of `unzip` command in arkitscene [#1936](https://github.com/rerun-io/rerun/pull/1936) +- Fix backslashes in arkitscene rigid transformation path [#1938](https://github.com/rerun-io/rerun/pull/1938) +- Fix mp_pose example 2D points having incorrectly interpreted depth [#2034](https://github.com/rerun-io/rerun/pull/2034) +- SDK batching/revamp 2.1: `clock` example for Rust [#2000](https://github.com/rerun-io/rerun/pull/2000) +- Add `scripts/run_all.py` [#2046](https://github.com/rerun-io/rerun/pull/2046) +- Check `examples/python/requirements.txt` in CI [#2063](https://github.com/rerun-io/rerun/pull/2063) +- Fix glb mesh data set downloads [#2100](https://github.com/rerun-io/rerun/pull/2100) +- Add more examples to https://app.rerun.io/ [#2062](https://github.com/rerun-io/rerun/pull/2062) + +#### 🖼 UI improvements +- Update egui to latest and wgpu to 0.16 [#1958](https://github.com/rerun-io/rerun/pull/1958) +- Add keyboard shortcut for "Follow", and stop following on "Restart" [#1986](https://github.com/rerun-io/rerun/pull/1986) (thanks [@h3mosphere](https://github.com/h3mosphere)!) +- Improve UI for keypoint and class-ids of annotations contexts [#2071](https://github.com/rerun-io/rerun/pull/2071) +- improvements to memory measurements and reporting [#2069](https://github.com/rerun-io/rerun/pull/2069) +- Switch from `egui_dock` to `egui_tiles` [#2082](https://github.com/rerun-io/rerun/pull/2082) +- Allow horizontal scrolling in blueprint panel [#2114](https://github.com/rerun-io/rerun/pull/2114) +- Nicer (& fixed up) help texts for space views [#2070](https://github.com/rerun-io/rerun/pull/2070) +- Allow dragging time cursor in plots [#2115](https://github.com/rerun-io/rerun/pull/2115) + +#### 🕸️ Web +- Set the GC limit to 2.5GB on web [#1944](https://github.com/rerun-io/rerun/pull/1944) +- Better crash reports on Web, plus WebGPU support detection [#1975](https://github.com/rerun-io/rerun/pull/1975) +- Work around https://github.com/sebcrozet/instant/issues/49 [#2094](https://github.com/rerun-io/rerun/pull/2094) +- Update `wasm-bindgen` to 0.2.86 [#2161](https://github.com/rerun-io/rerun/pull/2161) + +#### 🎨 Renderer improvements +- Full (experimental) WebGPU support [#1965](https://github.com/rerun-io/rerun/pull/1965) +- Depth offset for lines & points [#2052](https://github.com/rerun-io/rerun/pull/2052) +- Update to wgpu 0.16.1 [#2205](https://github.com/rerun-io/rerun/pull/2205) + +#### 🚜 Refactors +- Replace complex uses of `query_entity_with_primary` with `query_latest_single` [#2137](https://github.com/rerun-io/rerun/pull/2137) +- Make selection state independent of blueprint [#2035](https://github.com/rerun-io/rerun/pull/2035) +- Remove unused MeshSourceData [#2036](https://github.com/rerun-io/rerun/pull/2036) +- Move selection state into an independent crate, re_viewer_context [#2037](https://github.com/rerun-io/rerun/pull/2037) +- Move item-ui to separate module, move AppOptions to re_viewer_context [#2040](https://github.com/rerun-io/rerun/pull/2040) +- Move `Caches` to `re_viewer_ctx` and make it generic [#2043](https://github.com/rerun-io/rerun/pull/2043) +- Move time control to re_viewer_context [#2045](https://github.com/rerun-io/rerun/pull/2045) +- Move `ViewerContext` & `ComponentUiRegistry` to `viewer_context` [#2047](https://github.com/rerun-io/rerun/pull/2047) +- Move data UI to new `re_data_ui` crate [#2048](https://github.com/rerun-io/rerun/pull/2048) +- Use instant for `Time::now()` [#2090](https://github.com/rerun-io/rerun/pull/2090) +- Move from `instant` -> `web_time` [#2093](https://github.com/rerun-io/rerun/pull/2093) +- "namespace" flag parameters for linestrip & point cloud shader flags [#2033](https://github.com/rerun-io/rerun/pull/2033) + +#### ✨ Other enhancement +- Update minimum supported Rust version to `1.69.0` [#1935](https://github.com/rerun-io/rerun/pull/1935) +- Allow users to select the bind address (ip) to use with `--bind` [#2159](https://github.com/rerun-io/rerun/pull/2159) + +#### 🧑‍💻 Dev-experience +- Suggest users open an issue on crash, and other fixes [#1993](https://github.com/rerun-io/rerun/pull/1993) +- Lint error names in `map_err` [#1948](https://github.com/rerun-io/rerun/pull/1948) +- New dispatch-only workflow for running the lint-job [#1950](https://github.com/rerun-io/rerun/pull/1950) +- Move clippy_wasm/clippy.toml to under scripts [#1949](https://github.com/rerun-io/rerun/pull/1949) +- Fix run-wasm crash on trying to wait for server [#1959](https://github.com/rerun-io/rerun/pull/1959) +- Introduce new reusable workflow jobs and cleanup manual trigger [#1954](https://github.com/rerun-io/rerun/pull/1954) +- Use new CI workflows on pull-request [#1955](https://github.com/rerun-io/rerun/pull/1955) +- Try making pull-request workflows non-concurrent [#1970](https://github.com/rerun-io/rerun/pull/1970) +- Another attempt to make jobs non-concurrent on a per-PR basis [#1974](https://github.com/rerun-io/rerun/pull/1974) +- If there's a `{{ pr-build-summary }}` in the PR description, update it. [#1971](https://github.com/rerun-io/rerun/pull/1971) +- Run the cube notebook on PR [#1972](https://github.com/rerun-io/rerun/pull/1972) +- Add ability to manually run a web build to upload to an adhoc name [#1966](https://github.com/rerun-io/rerun/pull/1966) +- Limit ipython to 8.12 in the Jupyter example [#2001](https://github.com/rerun-io/rerun/pull/2001) +- New manual job to publish a release based on pre-built wheels [#2025](https://github.com/rerun-io/rerun/pull/2025) +- Use the correct Rust analyzer settings [#2028](https://github.com/rerun-io/rerun/pull/2028) +- New helper for sticking Serde-encodable data into Arrow [#2004](https://github.com/rerun-io/rerun/pull/2004) +- Fix `taplo-cli` failing to install [#2068](https://github.com/rerun-io/rerun/pull/2068) +- `run_all.py`: add `--fast`, `--separate`, and `--close` [#2054](https://github.com/rerun-io/rerun/pull/2054) +- Remove `Clipboard::set_text` [#2078](https://github.com/rerun-io/rerun/pull/2078) +- run_all.py: print output on sequential run failure [#2079](https://github.com/rerun-io/rerun/pull/2079) +- Use the american spelling of "gray" [#2099](https://github.com/rerun-io/rerun/pull/2099) +- Make sure `rerun/rerun_py/re_viewer` build info is updated on each build [#2087](https://github.com/rerun-io/rerun/pull/2087) +- Fix setup scripts for Mac M1/MacPort configuration [#2169](https://github.com/rerun-io/rerun/pull/2169) (thanks [@abey79](https://github.com/abey79)!) +- Better error messages in `build.rs` [#2173](https://github.com/rerun-io/rerun/pull/2173) +- `cargo install rerun-cli` [#2183](https://github.com/rerun-io/rerun/pull/2183) +- Fix `cargo test` [#2199](https://github.com/rerun-io/rerun/pull/2199) +- Fix run all for new rust-cli target & add rerun-web alias for quick running of the web player [#2203](https://github.com/rerun-io/rerun/pull/2203) + +#### 🤷 Other +#### 🤷 Other +- Fix secret in dispatch_lint.yml [4848f98f2605a3caf9b7695273e0871efa2d44c8](https://github.com/rerun-io/rerun/commit/4848f98f2605a3caf9b7695273e0871efa2d44c8) +- Only maintain a single manual-dispatch job for testing workflows [98f7de3b52b0fea6abe364f9d0ce0bd4c459caf1](https://github.com/rerun-io/rerun/commit/98f7de3b52b0fea6abe364f9d0ce0bd4c459caf1) +- Add other build parametrizations to manual_dispatch.yml [dbdf275eaf17220d14811dc34b69b6a76e948e73](https://github.com/rerun-io/rerun/commit/dbdf275eaf17220d14811dc34b69b6a76e948e73) +- Use proper if gates on the manual_dispatch.yml jobs [9ad62011678caaed04260ba160763e24e64a7402](https://github.com/rerun-io/rerun/commit/9ad62011678caaed04260ba160763e24e64a7402) +- Add ability to save cache to manual_dispatch.yml [5c61b37a1bc40f1a223c370b3b69b08654aada47](https://github.com/rerun-io/rerun/commit/5c61b37a1bc40f1a223c370b3b69b08654aada47) +- Standard case of inputs [2729c71f1ba9f7cdbe64adc3c610caf9464324e4](https://github.com/rerun-io/rerun/commit/2729c71f1ba9f7cdbe64adc3c610caf9464324e4) +- Add manual step for packaging to 'manual_dispatch.yml' [a3178e6143c068175b477cb236f2ba2477e083ea](https://github.com/rerun-io/rerun/commit/a3178e6143c068175b477cb236f2ba2477e083ea) +- New workflow_dispatch for building wheels for a PR [3bc2cb73ece98f914254221ce0ea129015834f59](https://github.com/rerun-io/rerun/commit/3bc2cb73ece98f914254221ce0ea129015834f59) +- Rename build_wheels_for_pr.yml -> manual_build_wheels_for_pr.yml [778c4d363b3814aeb777d07bfa63f081bc1dac32](https://github.com/rerun-io/rerun/commit/778c4d363b3814aeb777d07bfa63f081bc1dac32) +- New manual workflow for running benches [840a127e3a74c3520a27c0b19eb1d3d9a7255b07](https://github.com/rerun-io/rerun/commit/840a127e3a74c3520a27c0b19eb1d3d9a7255b07) +- New manual workflow for adhoc web builds [01080d6509e94fd2e2d3c4ff05beb0970ebe0b6e](https://github.com/rerun-io/rerun/commit/01080d6509e94fd2e2d3c4ff05beb0970ebe0b6e) +- Fix name of on_push_main.yml [bf5f63344663b3ebfc74f847db696a749b3e716c](https://github.com/rerun-io/rerun/commit/bf5f63344663b3ebfc74f847db696a749b3e716c) +- Fix usage of long commit in generate_prerelease_pip_index.py [579ce91556d6dd3cb9e6bd46971a7b6db6e42cdd](https://github.com/rerun-io/rerun/commit/579ce91556d6dd3cb9e6bd46971a7b6db6e42cdd) +- Jobs with duplicated instances still need separate concurrency keys based on platform [0ad19980be99cb2f669d38c2f1410a38206cbe74](https://github.com/rerun-io/rerun/commit/0ad19980be99cb2f669d38c2f1410a38206cbe74) +- New manual CI job for creating a release [fb2d41af5ec089f6c7583629eda3fb332e420488](https://github.com/rerun-io/rerun/commit/fb2d41af5ec089f6c7583629eda3fb332e420488) +- Version check needs to run in bash [6feca463d21ea03538889df08064b6974edb1fd2](https://github.com/rerun-io/rerun/commit/6feca463d21ea03538889df08064b6974edb1fd2) +- Update changelog with 0.5.1 release notes [40fc2fd7d61689100dc40bfe59e4ddfbcc819c7d](https://github.com/rerun-io/rerun/commit/40fc2fd7d61689100dc40bfe59e4ddfbcc819c7d) +- `RecordingStream`: automatic `log_tick` timeline [#2072](https://github.com/rerun-io/rerun/pull/2072) +- Add support for `f16` tensors [#1449](https://github.com/rerun-io/rerun/pull/1449) +- Make `RecordingId` a string [#2088](https://github.com/rerun-io/rerun/pull/2088) +- Update to latest `egui_tiles` [#2091](https://github.com/rerun-io/rerun/pull/2091) +- Make every `RecordingId` typed and preclude the existence of 'Defaults' [#2110](https://github.com/rerun-io/rerun/pull/2110) +- Add unit test of `re_smart_channel` `is_connected` [#2119](https://github.com/rerun-io/rerun/pull/2119) +- `BeingRecordingMsg` -> `SetRecordingInfo` [#2149](https://github.com/rerun-io/rerun/pull/2149) +- Update egui and eframe [#2184](https://github.com/rerun-io/rerun/pull/2184) +- Update to egui 0.22 [#2195](https://github.com/rerun-io/rerun/pull/2195) +- Simpler SIGINT handling [#2198](https://github.com/rerun-io/rerun/pull/2198) +- `cargo update` [#2196](https://github.com/rerun-io/rerun/pull/2196) +- Replace `ctrlc` crate with `tokio` [#2207](https://github.com/rerun-io/rerun/pull/2207) +- Comment indicating blueprints aren't available in 0.6 [b6c05776ab48e759370d6fed645ffd0ea68ec8c0](https://github.com/rerun-io/rerun/commit/b6c05776ab48e759370d6fed645ffd0ea68ec8c0) + + +## [0.5.1](https://github.com/rerun-io/rerun/compare/v0.5.1...v0.5.0) - Patch Release - 2023-05-01 + +### ✨ Overview & highlights +This Release fixes a few small bugs on top of the v0.5.0 release. + +### 🔎 Details +* Bump hyper version due to RUSTSEC-2023-0034 [#1951](https://github.com/rerun-io/rerun/pull/1951) +* Round to nearest color_index when doing color mapping [#1969](https://github.com/rerun-io/rerun/pull/1969) +* Use an sRGB-correct gray gradient when displaying grayscale images [#2014](https://github.com/rerun-io/rerun/pull/2014) +* Don't use console.error [#1984](https://github.com/rerun-io/rerun/pull/1984) +* Fix failure to save files when split table contains no data [#2007](https://github.com/rerun-io/rerun/pull/2007) + + +## [0.5.0](https://github.com/rerun-io/rerun/compare/v0.4.0...v0.5.0) - Jupyter MVP, GPU-based picking & colormapping, new datastore! - 2023-04-20 + +https://user-images.githubusercontent.com/2910679/233411525-1ceb2790-7f18-400a-ba48-f7e5b3400922.mp4 + +### ✨ Overview & highlights + +This new release adds MVP support for embedding Rerun in Jupyter notebooks, and brings significant performance improvements across all layers of the stack. + +* Rerun can now be embedded in Jupyter notebooks + * Tested with Jupyter Notebook Classic, Jupyter Lab, VSCode & Google Colab; checkout our [How-to guide](https://rerun.io/docs/howto/notebook) + * Try it out live on [Google Colab](https://colab.research.google.com/drive/1R9I7s4o6wydQC_zkybqaSRFTtlEaked_?usp=sharing) +* All colormapping tasks are now done directly on the GPU + * This yields _very significant_ performance improvements for colormapping heavy workload (e.g. segmentation) + * Try it out in our new [`segment_anything` example](https://rerun.io/examples/video-image/segment_anything_model) that shows off the latest models from Meta AI +* GPU picking & hovering now works with all of our primitives, including meshes & depth clouds + * This fixes all the shortcomings of the previous CPU-based system + * Rerun's automatic backprojection of depth textures ("depth clouds") is now feature complete + * Try it out in our updated [`nyud` example](https://rerun.io/examples/robotics/rgbd) +* Our datastore has been completely revamped to more closely match our latest data model + * This yields _very significant_ performance improvements for workloads with many events + * Checkout [this post](https://github.com/rerun-io/rerun/issues/1619#issuecomment-1511046649) for a detailed walkthrough of the changes + +### 🔎 Details + +#### 🐍 Python SDK +- Document that we also accept colors in 0-1 floats [#1740](https://github.com/rerun-io/rerun/pull/1740) +- Don't initialize an SDK session if we are only going to be launching the app [#1768](https://github.com/rerun-io/rerun/pull/1768) +- Allow torch tensors for `log_rigid3` [#1769](https://github.com/rerun-io/rerun/pull/1769) +- Always send `recording_id` as part of `LogMsg` [#1778](https://github.com/rerun-io/rerun/pull/1778) +- New `reset_time` API [#1826](https://github.com/rerun-io/rerun/pull/1826) [#1854](https://github.com/rerun-io/rerun/pull/1854) +- Always flush when we remove a sink [#1830](https://github.com/rerun-io/rerun/pull/1830) +- More robust wait for exit condition during .serve() [#1939](https://github.com/rerun-io/rerun/pull/1939) + +#### 🪳 Bug fixes +- Fix broken outlines (hover/select effect) for lines [#1724](https://github.com/rerun-io/rerun/pull/1724) +- Fix logged obb being displayed with half of the requested size [#1749](https://github.com/rerun-io/rerun/pull/1749) (thanks [@BenjaminDev](https://github.com/BenjaminDev)!) +- Fix `log_obb` usage [#1761](https://github.com/rerun-io/rerun/pull/1761) +- Always create the `log_time` timeline [#1763](https://github.com/rerun-io/rerun/pull/1763) +- Fix undo/redo selection shortcut/action changing selection history without changing selection [#1765](https://github.com/rerun-io/rerun/pull/1765) +- Fix various crashes [#1780](https://github.com/rerun-io/rerun/pull/1780) +- Fix crash when trying to do picking on depth clouds [d94ca3dd35e73e1984ccb969d0c7abd0d3e0faa9](https://github.com/rerun-io/rerun/commit/d94ca3dd35e73e1984ccb969d0c7abd0d3e0faa9) +- CI: fix benchmarks [#1799](https://github.com/rerun-io/rerun/pull/1799) +- CI: fix `cargo deny` [#1806](https://github.com/rerun-io/rerun/pull/1806) +- Fix "too many points" crash [#1822](https://github.com/rerun-io/rerun/pull/1822) +- Allow re-use of `RowId`s if no conflict is possible [#1832](https://github.com/rerun-io/rerun/pull/1832) +- Reduce memory used by staging belts on Web [#1836](https://github.com/rerun-io/rerun/pull/1836) +- Test and handle all tensor dtypes as images [#1840](https://github.com/rerun-io/rerun/pull/1840) +- Fix the Python build when running without `web_viewer` enabled [#1856](https://github.com/rerun-io/rerun/pull/1856) +- Error instead of `expect` inside `msg_encode` [#1857](https://github.com/rerun-io/rerun/pull/1857) +- Fix shutdown race condition in `re_sdk_comms` client [#1861](https://github.com/rerun-io/rerun/pull/1861) +- Fix broken instance picking in presence of images [#1876](https://github.com/rerun-io/rerun/pull/1876) +- Make sure JPEGs are always decoded [#1884](https://github.com/rerun-io/rerun/pull/1884) +- Fix crash when saving store to file [#1909](https://github.com/rerun-io/rerun/pull/1909) +- Don't clean up `LogDb`s that only contain a `BeginRecordingMsg` [#1914](https://github.com/rerun-io/rerun/pull/1914) +- Fix picking entities with image + another object (or label) twice [#1908](https://github.com/rerun-io/rerun/pull/1908) +- Fix double clicking camera no longer focusing on said camera [#1911](https://github.com/rerun-io/rerun/pull/1911) +- Fix annotation images sometimes drawn in the background [#1933](https://github.com/rerun-io/rerun/pull/1933) +- Use `zipfile` Python library instead of `unzip` command in `arkitscene` demo [#1936](https://github.com/rerun-io/rerun/pull/1936) +- Fix backslashes in `arkitscene` rigid transformation path [#1938](https://github.com/rerun-io/rerun/pull/1938) +- Fix hover/select highlights when picking single points in a scene with multiple point clouds [#1942](https://github.com/rerun-io/rerun/pull/1942) +- Fix hovering depth clouds [#1943](https://github.com/rerun-io/rerun/pull/1943) + +#### 🚀 Performance improvements +- batching 4: retire `MsgBundle` + batching support in transport layer [#1679](https://github.com/rerun-io/rerun/pull/1679) +- Optimize the depth-cloud shader when `depth=0` [#1729](https://github.com/rerun-io/rerun/pull/1729) +- `arrow2_convert` primitive (de)serialization benchmarks [#1742](https://github.com/rerun-io/rerun/pull/1742) +- `arrow2` `estimated_bytes_size` benchmarks [#1743](https://github.com/rerun-io/rerun/pull/1743) +- `arrow2` erased refcounted clones benchmarks [#1745](https://github.com/rerun-io/rerun/pull/1745) +- benchmarks for common vector ops across `smallvec`/`tinyvec`/std [#1747](https://github.com/rerun-io/rerun/pull/1747) +- Columnar `TimePoint`s in data tables and during transport [#1767](https://github.com/rerun-io/rerun/pull/1767) +- Compile with `panic = "abort"` [#1813](https://github.com/rerun-io/rerun/pull/1813) +- Process 2D points per entities like 3D points [#1820](https://github.com/rerun-io/rerun/pull/1820) +- re_query: use latest data types (`DataRow`/`DataCell`) [#1828](https://github.com/rerun-io/rerun/pull/1828) +- Depth cloud textures are now cached frame-to-frame [#1913](https://github.com/rerun-io/rerun/pull/1913) + +#### 🧑‍🏫 Examples +- Add new `ARKitScenes` example [#1538](https://github.com/rerun-io/rerun/pull/1538) (thanks [@pablovela5620](https://github.com/pablovela5620)!) +- New example code for Facebook research's `segment-anything` [#1788](https://github.com/rerun-io/rerun/pull/1788) +- Add `minimal_options` example for Rust SDK [#1773](https://github.com/rerun-io/rerun/pull/1773) (thanks [@h3mosphere](https://github.com/h3mosphere)!) +- Remove manual depth projection from `car` and `nyud` examples [#1869](https://github.com/rerun-io/rerun/pull/1869) +- Always spawn instead of fork in multiprocessing example [#1922](https://github.com/rerun-io/rerun/pull/1922) +- Add `--num-frames` arg to canny (webcam) example [#1923](https://github.com/rerun-io/rerun/pull/1923) +- Add argument parsing to `rerun_demo` [#1925](https://github.com/rerun-io/rerun/pull/1925) +- Join threads at end of `multithreading` example [#1934](https://github.com/rerun-io/rerun/pull/1934) + +#### 📚 Docs +- Add `typing_extensions` to `requirements-doc.txt` [#1786](https://github.com/rerun-io/rerun/pull/1786) +- Fix typos in notebook readme [#1852](https://github.com/rerun-io/rerun/pull/1852) +- Update docs related to notebook [#1915](https://github.com/rerun-io/rerun/pull/1915) + +#### 🖼 UI improvements +- Hover rays for tracked 3D cameras [#1751](https://github.com/rerun-io/rerun/pull/1751) +- Collapse space-view by default if there is only one child [#1762](https://github.com/rerun-io/rerun/pull/1762) +- Option to show scene bounding box [#1770](https://github.com/rerun-io/rerun/pull/1770) +- Assign default colors to class-ids when annotation context is missing [#1783](https://github.com/rerun-io/rerun/pull/1783) +- Add Restart command and keyboard shortcut for moving time to start of timeline [#1802](https://github.com/rerun-io/rerun/pull/1802) (thanks [@h3mosphere](https://github.com/h3mosphere)!) +- New option to disable persistent storage [#1825](https://github.com/rerun-io/rerun/pull/1825) +- Show previews of colormaps when selecting them [#1846](https://github.com/rerun-io/rerun/pull/1846) +- Smooth out scroll wheel input for camera zooming [#1920](https://github.com/rerun-io/rerun/pull/1920) + +#### 🤷 Other Viewer improvements +- Change `EntityPathHash` to be 64 bit [#1723](https://github.com/rerun-io/rerun/pull/1723) +- Central `GpuReadback` handling for re_viewer, experimental space view screenshots [#1717](https://github.com/rerun-io/rerun/pull/1717) +- Readback depth from GPU picking [#1752](https://github.com/rerun-io/rerun/pull/1752) +- Use GPU picking for points, streamline/share picking code some more [#1814](https://github.com/rerun-io/rerun/pull/1814) +- Use GPU picking for line(like) primitives, fix `interactive` flags [#1829](https://github.com/rerun-io/rerun/pull/1829) +- Use GPU colormapping when showing images in the GUI [#1865](https://github.com/rerun-io/rerun/pull/1865) + +#### 🕸️ Web +- Make CI publish `latest` tagged web-viewer to `app.rerun.io` [#1725](https://github.com/rerun-io/rerun/pull/1725) +- Implement `re_tuid::Tuid::random()` on web [#1796](https://github.com/rerun-io/rerun/pull/1796) +- Refactor the relationship between the assorted web / websocket servers [#1844](https://github.com/rerun-io/rerun/pull/1844) +- Notebooks: make `presentation_id` consistent and use data-attribute for rrd [#1881](https://github.com/rerun-io/rerun/pull/1881) +- 2.5GB before GC kick in on web [#1944](https://github.com/rerun-io/rerun/pull/1944) + +#### 🎨 Renderer improvements +- GPU based picking with points [#1721](https://github.com/rerun-io/rerun/pull/1721) +- improved renderer label handling [#1731](https://github.com/rerun-io/rerun/pull/1731) +- Improved readback data handling [#1734](https://github.com/rerun-io/rerun/pull/1734) +- GPU based mesh picking [#1737](https://github.com/rerun-io/rerun/pull/1737) +- Improve dealing with raw buffers for texture read/write [#1744](https://github.com/rerun-io/rerun/pull/1744) +- GPU colormapping, first step [#1835](https://github.com/rerun-io/rerun/pull/1835) +- GPU tensor colormapping [#1841](https://github.com/rerun-io/rerun/pull/1841) +- GPU picking for depth clouds [#1849](https://github.com/rerun-io/rerun/pull/1849) +- Implement bilinear filtering of textures [#1850](https://github.com/rerun-io/rerun/pull/1850) [#1859](https://github.com/rerun-io/rerun/pull/1859) [#1860](https://github.com/rerun-io/rerun/pull/1860) +- Refactor: remove `GpuTexture2DHandle::invalid` [#1866](https://github.com/rerun-io/rerun/pull/1866) +- Fix filtering artifact for non-color images [#1886](https://github.com/rerun-io/rerun/pull/1886) +- Refactor: Add helper functions to `GpuTexture2DHandle` [#1900](https://github.com/rerun-io/rerun/pull/1900) + +#### 🛢 Datastore improvements +- Datastore: revamp bench suite [#1733](https://github.com/rerun-io/rerun/pull/1733) +- Datastore revamp 1: new indexing model & core datastructures [#1727](https://github.com/rerun-io/rerun/pull/1727) +- Datastore revamp 2: serialization & formatting [#1735](https://github.com/rerun-io/rerun/pull/1735) +- Datastore revamp 3: efficient incremental stats [#1739](https://github.com/rerun-io/rerun/pull/1739) +- Datastore revamp 4: sunset `MsgId` [#1785](https://github.com/rerun-io/rerun/pull/1785) +- Datastore revamp 5: `DataStore::to_data_tables()` [#1791](https://github.com/rerun-io/rerun/pull/1791) +- Datastore revamp 6: sunset `LogMsg` storage + save store to disk [#1795](https://github.com/rerun-io/rerun/pull/1795) +- Datastore revamp 7: garbage collection [#1801](https://github.com/rerun-io/rerun/pull/1801) +- Incremental metadata registry stats [#1833](https://github.com/rerun-io/rerun/pull/1833) + +#### 🗣 Merged RFCs +- RFC: datastore state of the union & end-to-end batching [#1610](https://github.com/rerun-io/rerun/pull/1610) + +#### 🧑‍💻 Dev-experience +- Post-release cleanup [#1726](https://github.com/rerun-io/rerun/pull/1726) +- Remove unnecessary dependencies [#1711](https://github.com/rerun-io/rerun/pull/1711) (thanks [@vsuryamurthy](https://github.com/vsuryamurthy)!) +- Use copilot markers in PR template [#1784](https://github.com/rerun-io/rerun/pull/1784) +- re_format: barebone support for custom formatting [#1776](https://github.com/rerun-io/rerun/pull/1776) +- Refactor: Add new helper crate `re_log_encoding` [#1772](https://github.com/rerun-io/rerun/pull/1772) +- `setup_web.sh` supports pacman package manager [#1797](https://github.com/rerun-io/rerun/pull/1797) (thanks [@urholaukkarinen](https://github.com/urholaukkarinen)!) +- Add `rerun --strict`: crash if any warning or error is logged [#1812](https://github.com/rerun-io/rerun/pull/1812) +- End-to-end testing of Python logging -> store ingestion [#1817](https://github.com/rerun-io/rerun/pull/1817) +- Fix e2e test on CI: Don't try to re-build `rerun-sdk` [#1821](https://github.com/rerun-io/rerun/pull/1821) +- Install the rerun-sdk in CI using `--no-index` and split out Linux wheel build to run first [#1838](https://github.com/rerun-io/rerun/pull/1838) +- Remove more unused dependencies [#1863](https://github.com/rerun-io/rerun/pull/1863) +- Improve end-to-end testing slightly [#1862](https://github.com/rerun-io/rerun/pull/1862) +- Turn off benchmarks comment in each PR [#1872](https://github.com/rerun-io/rerun/pull/1872) +- Fix double-negation in `scripts/run_python_e2e_test.py` [#1896](https://github.com/rerun-io/rerun/pull/1896) +- Improve PR template with better comment, and no copilot by default [#1901](https://github.com/rerun-io/rerun/pull/1901) +- Optimize `generate_changelog.py` [#1912](https://github.com/rerun-io/rerun/pull/1912) + +#### 🤷 Other +- Fix videos for GitHub in `CHANGELOG.md` [af7d3b192157f942e35f64d3561a9a8dbcc18bfa](https://github.com/rerun-io/rerun/commit/af7d3b192157f942e35f64d3561a9a8dbcc18bfa) +- Don't run 3rd party bench suites on CI [#1787](https://github.com/rerun-io/rerun/pull/1787) +- Remove `TensorTrait` [#1819](https://github.com/rerun-io/rerun/pull/1819) +- Disable wheel tests for `x86_64-apple-darwin` [#1853](https://github.com/rerun-io/rerun/pull/1853) +- Update `enumflags2` to non-yanked version [#1874](https://github.com/rerun-io/rerun/pull/1874) +- Collect extra egui features into the main `Cargo.toml` [#1926](https://github.com/rerun-io/rerun/pull/1926) +- `just rs-run-all` [b14087b40bd805c95f030a4c7d3fb7a0482e13f4](https://github.com/rerun-io/rerun/commit/b14087b40bd805c95f030a4c7d3fb7a0482e13f4) +- `just py-run-all-{native|web|rrd}` [#1927](https://github.com/rerun-io/rerun/pull/1927) + + +## [0.4.0](https://github.com/rerun-io/rerun/compare/v0.3.1...v0.4.0) - Outlines, web viewer and performance improvements - 2023-03-28 + +https://user-images.githubusercontent.com/1220815/228241887-03b311e2-80e9-4541-9281-6d334a15ab04.mp4 + +### ✨ Overview & highlights +* Add support for mesh vertex colors [#1671](https://github.com/rerun-io/rerun/pull/1671) +* Lower memory use [#1535](https://github.com/rerun-io/rerun/pull/1535) +* Improve garbage collection [#1560](https://github.com/rerun-io/rerun/pull/1560) +* Improve the web viewer [#1596](https://github.com/rerun-io/rerun/pull/1596) [#1594](https://github.com/rerun-io/rerun/pull/1594) [#1682](https://github.com/rerun-io/rerun/pull/1682) [#1716](https://github.com/rerun-io/rerun/pull/1716) … +* Nice outlines when hovering/selecting +* Add an example of forever-streaming a web-camera image to Rerun [#1502](https://github.com/rerun-io/rerun/pull/1502) +* Fix crash-on-save on some versions of Linux [#1402](https://github.com/rerun-io/rerun/pull/1402) +* And a lot of other bug fixes +* Many performance improvements + +We now host an experimental and unpolished web-viewer at for anyone to try out! + +### 🔎 Details + +#### 🐍 Python SDK +- Expose all Rerun enums and types to main module scope [#1598](https://github.com/rerun-io/rerun/pull/1598) +- Make `log_point` more forgiving and update docstring [#1663](https://github.com/rerun-io/rerun/pull/1663) +- Add support for mesh vertex colors [#1671](https://github.com/rerun-io/rerun/pull/1671) + +#### 🦀 Rust SDK +- ⚠️ `Session::new` has been replaced with `SessionBuilder` [#1528](https://github.com/rerun-io/rerun/pull/1528) +- ⚠️ `session.spawn(…)` -> `rerun::native_viewer::spawn(session, …)` [#1507](https://github.com/rerun-io/rerun/pull/1507) +- ⚠️ `session.show()` -> `rerun::native_viewer::show(session)` [#1507](https://github.com/rerun-io/rerun/pull/1507) +- ⚠️ `session.serve(…)` -> `rerun::serve_web_viewer(session, …);` [#1507](https://github.com/rerun-io/rerun/pull/1507) +- ⚠️ `rerun::global_session` is now hidden behind the `global_session` feature flag [#1507](https://github.com/rerun-io/rerun/pull/1507) +- Add support for mesh vertex colors [#1671](https://github.com/rerun-io/rerun/pull/1671) + +#### 🪳 Bug fixes +- datastore: disable compaction (fixes 2x memory issue) [#1535](https://github.com/rerun-io/rerun/pull/1535) +- Fix garbage collection [#1560](https://github.com/rerun-io/rerun/pull/1560) +- Avoid using undefined extern "C" on Windows [#1577](https://github.com/rerun-io/rerun/pull/1577) +- Fix crash on decoding old .rrd files [#1579](https://github.com/rerun-io/rerun/pull/1579) +- datastore: stabilize dataframe sorts [#1549](https://github.com/rerun-io/rerun/pull/1549) +- Stop using infinities in wgsl shaders [#1594](https://github.com/rerun-io/rerun/pull/1594) +- Workaround for alpha to coverage state leaking on (Web)GL renderer [#1596](https://github.com/rerun-io/rerun/pull/1596) +- Use a patched `wasm-bindgen-cli` with fix for 2GiB bug [#1605](https://github.com/rerun-io/rerun/pull/1605) +- Misc: make example in `log_pinhole` runnable [#1609](https://github.com/rerun-io/rerun/pull/1609) (thanks [@Sjouks](https://github.com/Sjouks)!) +- Early-out on zero-sized space-views to prevent crashes [#1623](https://github.com/rerun-io/rerun/pull/1623) +- Print our own callstack on panics [#1622](https://github.com/rerun-io/rerun/pull/1622) +- Handle ctrl+c to gracefully shutdown the server(s) [#1613](https://github.com/rerun-io/rerun/pull/1613) +- Fix crash on serve exit, second attempt [#1633](https://github.com/rerun-io/rerun/pull/1633) +- Fix wrong remove-tooltip for entities and groups [#1637](https://github.com/rerun-io/rerun/pull/1637) +- Fix requiring focus for shutdown via ctrl+c when starting Viewer from command line [#1646](https://github.com/rerun-io/rerun/pull/1646) +- Fix eye spin after eye reset [#1652](https://github.com/rerun-io/rerun/pull/1652) +- Fix crash on negative radii by instead warning [#1654](https://github.com/rerun-io/rerun/pull/1654) +- Fix crash when trying to listen on a taken TCP port [#1650](https://github.com/rerun-io/rerun/pull/1650) +- Don't show 2D labels in 3D space views. [#1641](https://github.com/rerun-io/rerun/pull/1641) +- Fix Z fighting with improved depth offset math [#1661](https://github.com/rerun-io/rerun/pull/1661) +- Whether a spatial view is 2D or 3D is now reevaluated over time unless picked explicitly [#1660](https://github.com/rerun-io/rerun/pull/1660) +- Update wgpu to v0.15.3, fixing meshes on Windows Chrome [#1682](https://github.com/rerun-io/rerun/pull/1682) +- Fix a bug in the image hover code, causing the wrong RGBA values to be printed [#1690](https://github.com/rerun-io/rerun/pull/1690) +- Fix a bug that caused points to be render too large [#1690](https://github.com/rerun-io/rerun/pull/1690) +- Fix web crash on missing uniform buffer padding [#1699](https://github.com/rerun-io/rerun/pull/1699) +- Fix `memory_usage` example relying on implicit recursive features [#1709](https://github.com/rerun-io/rerun/pull/1709) +- Track changed state in nav mode combo box [#1703](https://github.com/rerun-io/rerun/pull/1703) +- Fix crash-on-save by switching file-picker dialog to `xdg-portal` [#1402](https://github.com/rerun-io/rerun/pull/1402) +- Change roll-shortcut from ALT to SHIFT [#1715](https://github.com/rerun-io/rerun/pull/1715) +- Fix CpuWriteGpuReadBelt producing unaligned gpu buffer offsets [#1716](https://github.com/rerun-io/rerun/pull/1716) +- Fix arrows requiring a radius to be visible [#1720](https://github.com/rerun-io/rerun/pull/1720) + +#### 🚀 Performance improvements +- Add re_arrow_store profile scopes [#1546](https://github.com/rerun-io/rerun/pull/1546) +- datastore: early exit missing components at table level [#1554](https://github.com/rerun-io/rerun/pull/1554) +- datastore: track bucket count in store stats & mem panel [#1555](https://github.com/rerun-io/rerun/pull/1555) +- LogDb: don't split on index bucket size [#1558](https://github.com/rerun-io/rerun/pull/1558) +- Introduce a simpler cache dedicated to just decode JPEGs [#1550](https://github.com/rerun-io/rerun/pull/1550) +- Implement outlines for points 2D/3D/depth & use them for select & hover in Viewer [#1568](https://github.com/rerun-io/rerun/pull/1568) +- Simplify ImageCache [#1551](https://github.com/rerun-io/rerun/pull/1551) +- New time panel density graph [#1557](https://github.com/rerun-io/rerun/pull/1557) +- Refactor the Arrow Mesh3D type to use zero-copy Buffers [#1691](https://github.com/rerun-io/rerun/pull/1691) +- Remove the redundant costly transform check during categorization [#1695](https://github.com/rerun-io/rerun/pull/1695) +- batching 3: `DataRow` & `DataTable` + no bundles outside of transport [#1673](https://github.com/rerun-io/rerun/pull/1673) + +#### 🧑‍🏫 Examples +- Very simple example streaming from an opencv camera [#1502](https://github.com/rerun-io/rerun/pull/1502) +- Initial TurtleBot subscriber demo [#1523](https://github.com/rerun-io/rerun/pull/1523) + +#### 📚 Docs +- Link to the Python SDK build instructions in `rerun_py/README.md` [#1565](https://github.com/rerun-io/rerun/pull/1565) + +#### 🖼 UI improvements +- Fix combining outline mask for selection & hover [#1552](https://github.com/rerun-io/rerun/pull/1552) +- Implement outlines for rectangles & use them for select & hover of image primitives in Viewer [#1559](https://github.com/rerun-io/rerun/pull/1559) +- Show log messages in egui toast notifications [#1603](https://github.com/rerun-io/rerun/pull/1603) +- Adapt UI for smaller screens [#1608](https://github.com/rerun-io/rerun/pull/1608) +- Nicer toast notifications [#1621](https://github.com/rerun-io/rerun/pull/1621) +- Don't hover things in 2D/3D views if we are dragging something [#1643](https://github.com/rerun-io/rerun/pull/1643) +- Allow rolling 3D camera with primary mouse button + alt modifier [#1659](https://github.com/rerun-io/rerun/pull/1659) +- Name space views after the space and indicate duplicate names [#1653](https://github.com/rerun-io/rerun/pull/1653) +- Add banner about mobile browsers being unsupported [#1674](https://github.com/rerun-io/rerun/pull/1674) +- Improve UI for tensors and color map selection [#1683](https://github.com/rerun-io/rerun/pull/1683) +- Only show the mobile OS warning banner on web [#1685](https://github.com/rerun-io/rerun/pull/1685) +- Improve the depth backprojection feature [#1690](https://github.com/rerun-io/rerun/pull/1690) +- Swap overlay order of selection & hover outlines [#1705](https://github.com/rerun-io/rerun/pull/1705) +- Turn on depth cloud backprojection by default [#1710](https://github.com/rerun-io/rerun/pull/1710) +- Add radius boost for depth clouds on outline [#1713](https://github.com/rerun-io/rerun/pull/1713) + +#### 🤷 Other Viewer improvements +- Fix web feature name in error messages [#1521](https://github.com/rerun-io/rerun/pull/1521) +- Use outlines for mesh selections instead of highlight colors [#1540](https://github.com/rerun-io/rerun/pull/1540) +- Implement outlines for line renderer & use them for select & hover of "line-like" primitives in Viewer [#1553](https://github.com/rerun-io/rerun/pull/1553) +- Load .rrd file over HTTP [#1600](https://github.com/rerun-io/rerun/pull/1600) +- Revert "Handle ctrl+c to gracefully shutdown the server(s)" [#1632](https://github.com/rerun-io/rerun/pull/1632) +- More eager GC, and remove `--fast-math` optimization for Wasm [#1656](https://github.com/rerun-io/rerun/pull/1656) +- Detect failure to install GUI log callback [#1655](https://github.com/rerun-io/rerun/pull/1655) +- Warn when most of the RAM has been used up by Rerun [#1651](https://github.com/rerun-io/rerun/pull/1651) +- Apply color maps to all types of depth tensors [#1686](https://github.com/rerun-io/rerun/pull/1686) +- Size boosted outlines for points & lines, color & size tweaking [#1667](https://github.com/rerun-io/rerun/pull/1667) +- Default point radius to 1.5 UI points [#1706](https://github.com/rerun-io/rerun/pull/1706) +- When streaming an rrd from http: play it, don't follow it [#1707](https://github.com/rerun-io/rerun/pull/1707) + +#### 🕸️ Web +- Use `log` as our log backend instead of `tracing` [#1590](https://github.com/rerun-io/rerun/pull/1590) +- Turn on allocation tracker at run-time and for web [#1591](https://github.com/rerun-io/rerun/pull/1591) +- Set correct MIME types in re_web_viewer_server [#1602](https://github.com/rerun-io/rerun/pull/1602) +- Upload web viewer to a bucket [#1606](https://github.com/rerun-io/rerun/pull/1606) +- Use hostname for default websocket address [#1664](https://github.com/rerun-io/rerun/pull/1664) +- Upload the colmap rrd file to gcloud [#1666](https://github.com/rerun-io/rerun/pull/1666) +- Show a warning by default on mobile browsers [#1670](https://github.com/rerun-io/rerun/pull/1670) +- Add analytics to the hosted index.html [#1675](https://github.com/rerun-io/rerun/pull/1675) +- Always upload latest prerelease to a dedicated prefix [#1676](https://github.com/rerun-io/rerun/pull/1676) +- Allow url param override on app.rerun.io [#1678](https://github.com/rerun-io/rerun/pull/1678) +- Show the git commit in the about section in pre-release builds [#1677](https://github.com/rerun-io/rerun/pull/1677) +- Update the web icon [#1688](https://github.com/rerun-io/rerun/pull/1688) + +#### 🎨 Renderer improvements +- Outlines via masking & postprocessing in `re_renderer` [#1532](https://github.com/rerun-io/rerun/pull/1532) +- Add missing profiling scopes in `re_renderer` [#1567](https://github.com/rerun-io/rerun/pull/1567) +- Don't call `wgpu::Device::poll` on the web [#1626](https://github.com/rerun-io/rerun/pull/1626) +- Merge final outline render into composite step in order to fix blending [#1629](https://github.com/rerun-io/rerun/pull/1629) +- renderer: fix the groupby logic in mesh instancing [#1657](https://github.com/rerun-io/rerun/pull/1657) +- Fix outlines being offset diagonally by about half a pixel [#1668](https://github.com/rerun-io/rerun/pull/1668) +- Gpu readback belt for fast & easy data readback from gpu [#1687](https://github.com/rerun-io/rerun/pull/1687) +- Make CpuWriteGpuReadBelt texture copies easier/less error prone [#1689](https://github.com/rerun-io/rerun/pull/1689) + +#### ✨ Other enhancement +- datastore: split out formatting & sanity checks in their own modules [#1625](https://github.com/rerun-io/rerun/pull/1625) +- Add `rerun --save`: stream incoming log stream to an rrd file [#1662](https://github.com/rerun-io/rerun/pull/1662) +- batching 1: introduce `DataCell` & retire `ComponentBundle` [#1634](https://github.com/rerun-io/rerun/pull/1634) +- Data store batching 2: split out component traits [#1636](https://github.com/rerun-io/rerun/pull/1636) + +#### 📈 Analytics +- Analytics: don't spam warning when there is an HTTP connection problem [#1564](https://github.com/rerun-io/rerun/pull/1564) +- Analytics: Rename "location" to "file_line" in the "crash-panic" event [#1575](https://github.com/rerun-io/rerun/pull/1575) + +#### 🗣 Merged RFCs +- RFC: component-datatype conversions [#1595](https://github.com/rerun-io/rerun/pull/1595) +- RFC: pre-proposal for blueprint store [#1582](https://github.com/rerun-io/rerun/pull/1582) + +#### 🧑‍💻 Dev-experience +- Update `rayon` [#1541](https://github.com/rerun-io/rerun/pull/1541) +- Fix some `1.68` clippy lints [#1569](https://github.com/rerun-io/rerun/pull/1569) +- Remove duplicated 'nix' crate [#1479](https://github.com/rerun-io/rerun/pull/1479) +- Better MsgId format [#1566](https://github.com/rerun-io/rerun/pull/1566) +- Lint vertical spacing in Rust code [#1572](https://github.com/rerun-io/rerun/pull/1572) +- CI: Replace wasm_bindgen_check.sh with actually building the web-viewer [#1604](https://github.com/rerun-io/rerun/pull/1604) +- Add --all-features to Rust Analyzer flags [#1624](https://github.com/rerun-io/rerun/pull/1624) +- Run clippy for Wasm, with own clippy.toml config file [#1628](https://github.com/rerun-io/rerun/pull/1628) +- Update tokio v1.24.1 -> v1.26.0 [#1635](https://github.com/rerun-io/rerun/pull/1635) +- Add a workflow input for running benchmarks manually [#1698](https://github.com/rerun-io/rerun/pull/1698) +- Add missing } to fix Rust workflow [#1700](https://github.com/rerun-io/rerun/pull/1700) +- Fix `lint.py` [#1719](https://github.com/rerun-io/rerun/pull/1719) +- Add a script that generates a changelog from recent PRs and their labels [#1718](https://github.com/rerun-io/rerun/pull/1718) + +#### 🤷 Other +#### 🤷 Other +- Clean up opencv_canny example slightly [b487e550dcb87225858dc6f76b791a25e938e75e](https://github.com/rerun-io/rerun/commit/b487e550dcb87225858dc6f76b791a25e938e75e) +- Lint fixes [9901e7c6735356b1970ddabc926bc5378d82e057](https://github.com/rerun-io/rerun/commit/9901e7c6735356b1970ddabc926bc5378d82e057) + + +## [0.3.1](https://github.com/rerun-io/rerun/compare/v0.3.0...v0.3.1) - Remove potentially sensitive analytics - 2023-03-13 + +Remove potentially sensitive analytics, including path to Rerun source code on panics, and Rerun branch name when building from source [#1563](https://github.com/rerun-io/rerun/pull/1563) + + +## [0.3.0](https://github.com/rerun-io/rerun/compare/v0.2.0...v0.3.0) - 2023-03-07 +### ✨ Overview & highlights + +After a successful launch a couple of weeks ago, we're back with our second release! +With a few exceptions this release focuses on internal refactors & improving our processes. +However, we think you'll enjoy these goodies that made it in nonetheless! + +https://user-images.githubusercontent.com/2910679/222510504-23871b8c-0bef-49c2-bbd2-37baab4247e8.mp4 + + +You can now generate point clouds directly from depth textures and choose a wide variety of color maps. +Check out this [video](https://user-images.githubusercontent.com/1220815/223365363-da13585f-3a91-4cb8-a6ef-8a6fadbeb4eb.webm) on how to use it. +This is **a lot** faster and more convenient than doing so manually in your own code +Some caveats: Picking is not yet working and visible history may behave differently (related to [#723](https://github.com/rerun-io/rerun/issues/723)) + +Other highlights: + +* Viewer + * Improved formatting of date-times in plots [#1356](https://github.com/rerun-io/rerun/pull/1356) + * Labels for 3D objects have now a color can now be selected & hovered [#1438](https://github.com/rerun-io/rerun/pull/1438) + * Scale factor is saved across sessions and more persistent between screens [#1448](https://github.com/rerun-io/rerun/pull/1448) + * Showing tensors in the Viewer is now faster +* SDK + * Python packages now work with Ubuntu-20.04 [#1334](https://github.com/rerun-io/rerun/pull/1334) + * u8 segmentation stay u8 now (they converted to u16 before) [#1376](https://github.com/rerun-io/rerun/pull/1376) + * 2D Line strips can now be logged directly [#1430](https://github.com/rerun-io/rerun/pull/1430) + * Add a `strict` mode to the Python SDK where misuses of the API result in exceptions being raised.[#1477](https://github.com/rerun-io/rerun/pull/1477) + * Fix disabling Python API through `init` not working [#1517](https://github.com/rerun-io/rerun/pull/1517) +* General + * We build now with fewer build dependencies (there is however [still more work to do!](https://github.com/rerun-io/rerun/issues/1316)). + Notably, we previously used a version of the `time` crate which had a security issue (CVE-2020-26235), thanks @mpizenberg for helping out! + * Print more information & troubleshooting info on crash + +Meanwhile, we did a bunch of improvements to our manual. If you had trouble running Rerun so far, check our updated [troubleshooting](https://rerun.io/docs/overview/installing-rerun/troubleshooting) page (and as always, please [open an issue](https://github.com/rerun-io/rerun/issues/new/choose) if something doesn't work). + +⚠️ BREAKING: old `.rrd` files no longer load ⚠️ + +### 🔎 Details +#### New features +* Generate point clouds directly from depth textures + * re_renderer: implement depth cloud renderer [#1415](https://github.com/rerun-io/rerun/pull/1415) + * Integrate depth clouds into Rerun [#1421](https://github.com/rerun-io/rerun/pull/1421) + * CPU & GPU color maps [#1484](https://github.com/rerun-io/rerun/pull/1484) + * Integrate GPU color maps into depth clouds [#1486](https://github.com/rerun-io/rerun/pull/1486) +* Python SDK: Add strict mode [#1477](https://github.com/rerun-io/rerun/pull/1477) +* OS independent Zoom factor & serialization thereof [#1448](https://github.com/rerun-io/rerun/pull/1448) +* Labels for 3D objects have now a color can now be selected & hovered [#1438](https://github.com/rerun-io/rerun/pull/1438) +* Add 2D support for linestrips [#1430](https://github.com/rerun-io/rerun/pull/1430) +* Add signal handler on *nix with troubleshooting and stacktrace [#1340](https://github.com/rerun-io/rerun/pull/1340) + * Point users to our troubleshooting page on panic [#1338](https://github.com/rerun-io/rerun/pull/1338) + +#### Performance +* Speed up conversions for color arrays in Python [#1454](https://github.com/rerun-io/rerun/pull/1454) +* Speed up fixed-sized array iteration [#1050](https://github.com/rerun-io/rerun/pull/1050) +* Speed up tensor handling by padding data through more directly + * Direct conversion to dynamic image from Tensors [#1455](https://github.com/rerun-io/rerun/pull/1455) + * Convert view_tensor to use the new native Tensors [#1439](https://github.com/rerun-io/rerun/pull/1439) +* Add option to show performance metrics in the UI in release builds too [#1444](https://github.com/rerun-io/rerun/pull/1444) +* Faster stable diffusion sample [#1364](https://github.com/rerun-io/rerun/pull/1364) +* SDK: stream to disk with `save` feature [#1405](https://github.com/rerun-io/rerun/pull/1405) +* `re_renderer` has now a direct CPU->GPU copy mechanism + * `CpuWriteGpuReadBelt` for fast frame by frame memory transfers [#1382](https://github.com/rerun-io/rerun/pull/1382) + * Uniform buffer utility using `CpuWriteGpuReadBelt` [#1400](https://github.com/rerun-io/rerun/pull/1400) + * Use `CpuWriteGpuReadBelt` for mesh data gpu upload [#1416](https://github.com/rerun-io/rerun/pull/1416) + +#### Small improvements & bugfixes +* UI + * Add scroll-bars the "Add/Remove entities" window [#1445](https://github.com/rerun-io/rerun/pull/1445) + * Unify the time formatting between the time panel and the plot [#1369](https://github.com/rerun-io/rerun/pull/1369) + * Timeline + * Fix precision issue when zooming in on the timeline [#1370](https://github.com/rerun-io/rerun/pull/1370) + * Improve the gap-detector [#1363](https://github.com/rerun-io/rerun/pull/1363) + * Better time axis on plot view [#1356](https://github.com/rerun-io/rerun/pull/1356) + * Prevent wrap on 'Streams' text [#1308](https://github.com/rerun-io/rerun/pull/1308) + * Update to eframe 0.21.3 with fix for web text input [#1311](https://github.com/rerun-io/rerun/pull/1311) +* `re_renderer` + * Fix crash due to always expecting Rgba8Unorm backbuffer on Web & Bgra8Unorm on native [#1413](https://github.com/rerun-io/rerun/pull/1413) + * Allow controlling the graphics backend & power preference through standard wgpu env vars [#1332](https://github.com/rerun-io/rerun/pull/1332) +* Heuristic for camera frustum length is now based on scene size [#1433](https://github.com/rerun-io/rerun/pull/1433) +* Fix Python type signature for tensor names [#1443](https://github.com/rerun-io/rerun/pull/1443) +* Don't convert u8 segmentation images to u16 [#1376](https://github.com/rerun-io/rerun/pull/1376) +* Docs (excluding the manual) + * Improve the docs of `connect` and `serve` [#1450](https://github.com/rerun-io/rerun/pull/1450) + * Update log_mesh and log_meshes docs. [#1286](https://github.com/rerun-io/rerun/pull/1286) + * Add guidelines for adding dependencies in a PR [#1431](https://github.com/rerun-io/rerun/pull/1431) + * Add a few more sections to `CODE_STYLE.md` [#1365](https://github.com/rerun-io/rerun/pull/1365) + * Fixup for some doc links [#1314](https://github.com/rerun-io/rerun/pull/1314) + * Document undocumented environment variables on help page. [#1335](https://github.com/rerun-io/rerun/pull/1335) + * Link to SDK operating modes doc in both SDK [#1330](https://github.com/rerun-io/rerun/pull/1330) +* More information in `--version` [#1388](https://github.com/rerun-io/rerun/pull/1388) +* Remove already broken `show` method from Python SDK [#1429](https://github.com/rerun-io/rerun/pull/1429) +* Analytics + * Send analytics events with callstacks on panics and signals [#1409](https://github.com/rerun-io/rerun/pull/1409) + * Put all analytics to one bucket [#1390](https://github.com/rerun-io/rerun/pull/1390) + * add event for when we serve the web-viewer .wasm [#1379](https://github.com/rerun-io/rerun/pull/1379) + * register SDK language and data source [#1371](https://github.com/rerun-io/rerun/pull/1371) + * Refactor analytics [#1368](https://github.com/rerun-io/rerun/pull/1368) +* Versioned log streams [#1420](https://github.com/rerun-io/rerun/pull/1420) +* Fix path issues when running debug Viewer within workspace [#1341](https://github.com/rerun-io/rerun/pull/1341) +* Detailed errors for re_renderer `include_file!` [#1339](https://github.com/rerun-io/rerun/pull/1339) +* Limit logging in web-viewer to `warn` in order to workaround a crash issue (and reduce log spam) [1514](https://github.com/rerun-io/rerun/pull/1514) +* Fix disabling API through `init` not working [#1517](https://github.com/rerun-io/rerun/pull/1517) + +#### CI, testing & build improvements +* Reduce build dependencies + * Get rid of time 0.1.* dependency [#1408](https://github.com/rerun-io/rerun/pull/1408) + * Remove unnecessary ordered-float [#1461](https://github.com/rerun-io/rerun/pull/1461) + * Remove extraneous `image` features and dependencies [#1425](https://github.com/rerun-io/rerun/pull/1425) + * Replace `reqwest` with `ureq` [#1407](https://github.com/rerun-io/rerun/pull/1407) + * Remove derive_more dependency [#1406](https://github.com/rerun-io/rerun/pull/1406) +* Use different artifact names for wasm/js in debug builds [#1428](https://github.com/rerun-io/rerun/pull/1428) +* Separate Mac wheels & trigger wheel build from UI [#1499](https://github.com/rerun-io/rerun/pull/1499) +* Add spell checking to CI [#1492](https://github.com/rerun-io/rerun/pull/1492) +* Repo size + * Always create new orphaned branch for gh-pages [#1490](https://github.com/rerun-io/rerun/pull/1490) + * GitHub Action to prevent large files [#1478](https://github.com/rerun-io/rerun/pull/1478) +* Python + * Remove the Python job path filters [#1452](https://github.com/rerun-io/rerun/pull/1452) + * Use ruff for our Python lints [#1378](https://github.com/rerun-io/rerun/pull/1378) + * Use python3 in the jobs that weren't tested in PR [#1348](https://github.com/rerun-io/rerun/pull/1348) +* Testing + * Add a test of memory use when logging a lot of big images [#1372](https://github.com/rerun-io/rerun/pull/1372) +* Switch ci_docker to a container based on ubuntu 20.04 [#1334](https://github.com/rerun-io/rerun/pull/1334) +* Release handling + * Switch release action to ncipollo [#1489](https://github.com/rerun-io/rerun/pull/1489) + * Fix our continuous pre-releases [#1458](https://github.com/rerun-io/rerun/pull/1458) + * Delete the prerelease before creating the new one [#1485](https://github.com/rerun-io/rerun/pull/1485) + * Set prerelease to true even for version-tagged CI job [#1504](https://github.com/rerun-io/rerun/pull/1504) + * Let the release job take care of creating the tag [#1501](https://github.com/rerun-io/rerun/pull/1501) + * Use `cargo update -w` instead of `cargo check` when prepping prerelease [#1500](https://github.com/rerun-io/rerun/pull/1500) + * Use prerelease tag instead of latest and update pointer on prerelease [#1481](https://github.com/rerun-io/rerun/pull/1481) + * Include date in pre-release version [#1472](https://github.com/rerun-io/rerun/pull/1472) + * Switch pre-release action to ncipollo/release-action [#1466](https://github.com/rerun-io/rerun/pull/1466) +* Disallow some methods and types via Clippy[#1411](https://github.com/rerun-io/rerun/pull/1411) + +#### Other non-user-facing refactors +* Fix: don't create a dummy LogDb when opening the Rerun Menu [#1440](https://github.com/rerun-io/rerun/pull/1440) +* `re_renderer` + * `Draw Phases` in preparation of executing `Renderer` several times on different targets [#1419](https://github.com/rerun-io/rerun/pull/1419) + * Fix mesh creation failing to copy index data. [#1473](https://github.com/rerun-io/rerun/pull/1473) + * do not silently drop draw phases [#1471](https://github.com/rerun-io/rerun/pull/1471) + * Simplify bind group allocation call by passing pool collection object. [#1459](https://github.com/rerun-io/rerun/pull/1459) + * Interior mutable buffer/texture/bindgroup pools [#1374](https://github.com/rerun-io/rerun/pull/1374) + * Rename all instances of `frame_maintenance` to `begin_frame` [#1360](https://github.com/rerun-io/rerun/pull/1360) + * Texture & buffer call now wgpu's `destroy` on removal from pool [#1359](https://github.com/rerun-io/rerun/pull/1359) + * Arrow buffers as (optional) first-class citizen [#1482](https://github.com/rerun-io/rerun/pull/1482) + * Log static re_renderer resource generation [#1464](https://github.com/rerun-io/rerun/pull/1464) +* Internal log_text_entry_internal to break circular deps [#1488](https://github.com/rerun-io/rerun/pull/1488) +* Delete ClassicTensor and cleanup [#1456](https://github.com/rerun-io/rerun/pull/1456) +* Fix re_renderer file watcher watching the same file several times [#1463](https://github.com/rerun-io/rerun/pull/1463) +* Analytics + * More ergonomic API [#1410](https://github.com/rerun-io/rerun/pull/1410) + * Streamlining host vs. recorder python/rust versions [#1380](https://github.com/rerun-io/rerun/pull/1380) + * Fix workspace detection [#1437](https://github.com/rerun-io/rerun/pull/1437) +* Introduce `DeserializableComponent` trait and high-level `query_latest` [#1417](https://github.com/rerun-io/rerun/pull/1417) + + +[Full Changelog](https://github.com/rerun-io/rerun/compare/v0.2.0...v0.3.0) + +## 0.2.0 - 2023-02-14 +First public release! diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..86722a9 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,194 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) and other LLMs when working with code in this repository. + +## Project overview + +Rerun is a time-aware multimodal data stack and visualizations tool used in robotics, spatial AI, computer vision, and similar domains. It provides SDKs (Python, Rust, C++) for logging rich data (images, point clouds, tensors, etc.) and a Viewer for visualization. + +## Build system + +We use `pixi` for task management and dependency installation. Check `pixi.toml` for a full list of tasks. + +### Essential commands + +**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 the viewer +- `pixi run uvpy script.py` - Run Python scripts with rerun SDK +- `cargo run -p ` - 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 all Rust files. Always run this after making changes. +- `pixi run py-fmt` - Format Python files +- `pixi run cpp-fmt` - Format C++ files +- `pixi run toml-fmt` - Format TOML files + +**Testing:** +- Use `cargo clippy -p ` to run general rust checks before building things +- `cargo nextest run --all-features --no-fail-fast -p ` - Run tests for a specific crate + - Example: `cargo nextest run --all-features --no-fail-fast -p re_view_spatial` +- Use `cargo nextest` (not `cargo test`) for better output and parallelism +- Always use `--all-features` unless you have a specific reason not to +- Use `--no-fail-fast` to gather all test failures in a single run + +## Code generation system + +**Critical: Never edit generated files directly.** All generated files are marked "DO NOT EDIT" at the top. + +### Type definition flow + +``` +.fbs files (definitions/) → pixi run codegen → Generated code (Rust/Python/C++) + docs (docs/content/reference/types/) +``` + +- Type definitions live 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 is in `crates/build/re_types_builder/` +- After modifying .fbs files, run `pixi run codegen` to regenerate code + +### Extension pattern + +To add custom functionality to generated types, create `_ext` files: +- Rust: `filename_ext.rs` (automatically imported by codegen) +- Python: `filename_ext.py` (mixed in with generated class) +- C++: `filename_ext.cpp` (compiled and included automatically, parts of it may be marked for copy into the header by codegen) + +## Code conventions + +### General + +- use `…` instead of `...` +- validate various custom conventions via `pixi run lint-rerun ` (not passing any file will check everything) +- Use `format!("{x}")` over `format!("{}, x)` (same in log calls etc) +- Don't write trivial comments that add nothing new +- 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. +- Prose style (em vs en dash, sentence endings, casing) — see [`DESIGN.md`](DESIGN.md). In short: spaced em dash ` — `, never unspaced `word—word`, and don't use `–` as a sentence dash (it's for numeric ranges only) +- 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. + +## Architecture overview + +### Crate organization + +``` +crates/ +├── build/ # Code generation (re_types_builder) +├── store/ # Data types, storage, querying +├── top/ # User-facing SDKs and CLI +└── viewer/ # Viewer UI and rendering +``` + +For more details about the architecture see `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. + +### Type system hierarchy + +The type system has three levels (generated from .fbs files): + +1. **Datatypes** (`rerun.datatypes.*`) - Basic types like Vec3D, Color +2. **Components** (`rerun.components.*`) - Named semantic wrappers (Position3D, Radius) +3. **Archetypes** (`rerun.archetypes.*`) - Collections of components (Points3D, Image) + +Each archetype specifies: +- Required components (must be provided) +- Recommended components (have good defaults) +- Optional components (purely optional) + +Example: `Points3D` archetype requires `positions`, recommends `colors` and `radii`, allows optional `labels`. + +### Data flow + +``` +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) +``` + +### Blueprint system + +The blueprint is the viewer's configuration layer: +- Stored as a separate store (`re_entity_db`) with "blueprint" timeline +- Defines: view layout, visibility, per-entity overrides, view properties +- Uses the same type system as logged data +- Basic blueprint path hierarchy: `/viewport/`, `/view/{uuid}/`, `/container/{uuid}/` + +### Visualizers + +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 + +The viewer uses **immediate mode**: every frame, query the store and re-render from scratch. + +## Python development workflow + +Python uses a separate uv-managed .venv (not pixi's conda env): + +```bash +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 run +``` + +The `uv` wrapper script unsets `CONDA_PREFIX` to ensure isolation from pixi's environment. + +## Important notes + +- **PyO3 Configuration**: If you see PyO3 config errors, run `pixi run ensure-pyo3-build-cfg` +- **git-lfs**: Required for test snapshots. Install with your package manager and run `git lfs install` +- **Immediate Mode**: The entire viewer is rendered from scratch each frame (no state management callbacks) +- **Arrow Native**: Data is stored, transmitted, and queried as Apache Arrow arrays +- **Multi-language**: Changes to .fbs files affect Rust, Python, and C++ simultaneously + +## Python docstring formatting + +Python API docs are built with **MkDocs + mkdocstrings** (NOT Sphinx). Never use reStructuredText (rST) syntax in Python docstrings or documentation. Use markdown instead: + +- **Cross-references:** Use `[`ClassName`][]` (mkdocstrings syntax), NOT `:class:`ClassName`` / `:func:` / `:meth:` (rST roles) +- **Warnings/notes:** Use MkDocs admonitions (`!!! warning` with indented body), NOT `.. warning::` (rST directives) +- **Deprecation notices:** Use the `@deprecated` decorator (mkdocstrings renders it automatically). Do NOT duplicate in the docstring with `.. deprecated::` or `**Deprecated:**` +- **Code blocks:** Use markdown fenced blocks (`` ``` ``), NOT `.. code-block::` +- **Parameter docs:** Use numpy-style sections (`Parameters`, `Returns` with `----------`), which is what the codebase already uses + +## Documentation system + +See [`docs/README.md`](docs/README.md) for the full documentation architecture. + +The docs span multiple sites: the main docs at `rerun.io/docs` (built from `docs/content/`), plus API reference sites for Python (MkDocs), C++ (Doxygen), and JS (TypeDoc) at `ref.rerun.io/docs/{python,cpp,js}/`. + +Key things to know: +- **`docs/content/reference/types/`** is auto-generated by `pixi run codegen` from `.fbs` files - do not edit directly +- **`docs/content/reference/cli.md`** is auto-generated by `pixi run man` - do not edit directly +- **Code snippets** live in `docs/snippets/all/` with implementations in Python, Rust, and C++ +- `pixi run py-docs-serve` previews Python API docs locally +- `pixi run -e cpp cpp-docs` builds C++ docs + +## Development references + +- [`ARCHITECTURE.md`](ARCHITECTURE.md) - Detailed architecture documentation +- [`BUILD.md`](BUILD.md) - Full build instructions +- [`CODE_STYLE.md`](CODE_STYLE.md) - Code style guidelines +- [`CONTRIBUTING.md`](CONTRIBUTING.md) - Contribution guidelines +- [`DESIGN.md`](DESIGN.md) - Guidelines for UI design, covering GUI, CLI, documentation, log messages, etc +- [`docs/README.md`](docs/README.md) - Documentation system (sites, builds, deployment) +- [`rerun_py/README.md`](rerun_py/README.md) - Python SDK specific instructions diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..c3965a3 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,207 @@ +cmake_minimum_required(VERSION 3.16...3.27) + +project(rerun_cpp_proj LANGUAGES CXX) + +# ------------------------------------------------------------------------------ + +# Environment driven hooks so we can configure CMake configure even if its buried deep inside a pixi task. +if(DEFINED ENV{RERUN_WERROR}) + message(STATUS "Compiling with warnings as errors since RERUN_WERROR is set.") + set(CMAKE_COMPILE_WARNING_AS_ERROR ON) +endif() + +if(DEFINED ENV{RERUN_USE_ASAN}) + message(STATUS "Compiling with address sanitizer ('asan') since RERUN_USE_ASAN is set.") + set(RERUN_USE_ASAN ON) +endif() + +if(DEFINED ENV{RERUN_SET_CXX_VERSION}) + message(STATUS "Overwriting CMAKE_CXX_STANDARD to $ENV{RERUN_SET_CXX_VERSION} since RERUN_SET_CXX_VERSION is set accordingly.") + set(CMAKE_CXX_STANDARD $ENV{RERUN_SET_CXX_VERSION}) +endif() + +# ------------------------------------------------------------------------------ +function(rerun_strict_warning_settings target) + if(MSVC) + # TODO(andreas): Try to enable /Wall + target_compile_options(${target} PRIVATE /W4) + + target_compile_options(${target} PRIVATE /we4996) # Using deprecated functions is an error + + if(BUILD_SHARED_LIBS) + # If we are building as shared libs, we are going to have to disable the C4251 + # warning, as it would trigger for any datatype derived from a STL class + # See also https://github.com/protocolbuffers/protobuf/blob/v26.1/cmake/README.md#notes-on-compiler-warnings + # We need also to make it public, otherwise downstream code will be flooded by c4251 warnings + target_compile_options(${target} PUBLIC /wd4251) + endif() + + # CMAKE_COMPILE_WARNING_AS_ERROR is only directly supported starting in CMake `3.24` + # https://cmake.org/cmake/help/latest/prop_tgt/COMPILE_WARNING_AS_ERROR.html + if(CMAKE_COMPILE_WARNING_AS_ERROR) + target_compile_options(${target} PRIVATE /WX + /w15038 # Initialization order. https://learn.microsoft.com/en-us/cpp/error-messages/compiler-warnings/c5038 + ) + endif() + + if(RERUN_USE_ASAN) + message(WARNING "Rerun C++ build does not support address sanitizer ('asan') on Windows. Ignoring RERUN_USE_ASAN.") + endif() + else() + # Enabled warnings. + target_compile_options(${target} PRIVATE + -Wall + -Wcast-align + -Wcast-qual + -Werror=deprecated-declarations + -Wextra + -Wformat=2 + -Wmissing-include-dirs + -Wnull-dereference + -Wold-style-cast + -Wpedantic + -Wpointer-arith + -Wshadow + -Wswitch-enum + -Wunreachable-code + -Wvla + ) + + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") # match both "Clang" and "AppleClang" + # TODO(emilk): enable some hardening flags from https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.html + target_compile_options(${target} PRIVATE + -Wc++17-compat-pedantic + -Wc++20-compat-pedantic + -Wc99-extensions + -Weverything + -Wgnu + -Wnon-gcc + -Wpre-c2x-compat-pedantic + -Wshadow-all + + # Turn off some warning that -Weverything turns on: + -Wno-c++98-compat + -Wno-c++98-compat-pedantic + -Wno-covered-switch-default # We often add a `default:` case out of paranoia + -Wno-ctad-maybe-unsupported + -Wno-disabled-macro-expansion + -Wno-documentation + -Wno-documentation-unknown-command + -Wno-double-promotion # float->double is nothing to whine about + -Wno-exit-time-destructors + -Wno-float-equal # comparing floats is fine + -Wno-global-constructors + -Wno-missing-prototypes + -Wno-padded + -Wno-reserved-id-macro + -Wno-reserved-identifier + -Wno-unreachable-code-break # TODO(emilk): remove this exception - we only need this because of codegen + -Wno-unreachable-code-return # TODO(emilk): remove this exception - we only need this because of codegen + -Wno-unused-macros + -Wno-unsafe-buffer-usage # There's a few helper ctors that run into this. + -Wno-unknown-warning-option # Otherwise older clang will complain about `-Wno-unsafe-buffer-usage` + ) + endif() + + # CMAKE_COMPILE_WARNING_AS_ERROR is only directly supported starting in CMake `3.24` + # https://cmake.org/cmake/help/latest/prop_tgt/COMPILE_WARNING_AS_ERROR.html + if(CMAKE_COMPILE_WARNING_AS_ERROR) + target_compile_options(${target} PRIVATE -Werror) + endif() + + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + # Improve stack traces: + target_compile_options(${target} PRIVATE -g -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -fno-optimize-sibling-calls) + endif() + + if(RERUN_USE_ASAN) + # Turn on the address sanitizer ("asan"): + target_compile_options(${target} PRIVATE -fsanitize=address) + target_link_options(${target} PRIVATE -fsanitize=address) + endif() + endif() +endfunction() + +# Use makefiles on linux, otherwise it might use Ninja which isn't installed by default. +if(NOT DEFINED CMAKE_GENERATOR AND UNIX) + set(CMAKE_GENERATOR "Unix Makefiles") +endif() + +# If using MSVC, always enable multi-process compiling for all targets. +# Note that this setting is repeated for rerun_sdk's CMakeLists.txt since it should also work stand-alone. +if(MSVC) + add_compile_options("/MP") +endif() + +# Signal to all our build scripts that we're inside the Rerun repository. +set(RERUN_REPOSITORY YES) + +# ------------------------------------------------------------------------------ +# Loguru logging library (https://github.com/emilk/loguru): +set(CMAKE_DL_LIBS "dl") # Required by Loguru for backtraces + +# Loguru, see https://github.com/emilk/loguru/blob/4adaa185883e3c04da25913579c451d3c32cfac1/loguru_cmake_example/CMakeLists.txt +include(FetchContent) +FetchContent_Declare(LoguruGitRepo + GIT_REPOSITORY "https://github.com/emilk/loguru" # can be a filesystem path + GIT_TAG "master" +) + +# Loguru does not support being build with BUILD_SHARED_LIBS=ON on Windows +# so we always compile it with BUILD_SHARED_LIBS=OFF on Windows +if(MSVC AND BUILD_SHARED_LIBS) + set(BUILD_SHARED_LIBS_RERUN_SDK ${BUILD_SHARED_LIBS}) + set(BUILD_SHARED_LIBS OFF) +endif() + +FetchContent_MakeAvailable(LoguruGitRepo) # defines target 'loguru::loguru' + +if(MSVC AND BUILD_SHARED_LIBS_RERUN_SDK) + set(BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS_RERUN_SDK}) +endif() + +# Set any loguru compile-time flags before calling MakeAvailable() +# Stacktraces are not yet supported on Windows. +if(NOT WIN32) + set(LOGURU_STACKTRACES 1) +endif() + +# ------------------------------------------------------------------------------ +add_subdirectory(crates/top/rerun_c) # The Rerun C SDK library, must be included before the C++ SDK. +add_subdirectory(rerun_cpp) # The Rerun C++ SDK library. +add_subdirectory(examples/cpp) +add_subdirectory(tests/cpp) +add_subdirectory(docs/snippets) + +# ------------------------------------------------------------------------------ +# Setup an 'all_targets' target that depends on all targets in the project. +# +# CMake already has an `all` (lowercase!) target as the default, +# but it does NOT work with Visual Studio and XCode. +# See https://cmake.org/cmake/help/latest/guide/user-interaction/index.html#selecting-a-target + +# Collect all currently added targets in all subdirectories +# +# Via: https://stackoverflow.com/a/60232044 +# +# Parameters: +# - _result the list containing all found targets +# - _dir root directory to start looking from +function(get_all_targets _result _dir) + get_property(_subdirs DIRECTORY "${_dir}" PROPERTY SUBDIRECTORIES) + + foreach(_subdir IN LISTS _subdirs) + get_all_targets(${_result} "${_subdir}") + endforeach() + + get_directory_property(_sub_targets DIRECTORY "${_dir}" BUILDSYSTEM_TARGETS) + set(${_result} ${${_result}} ${_sub_targets} PARENT_SCOPE) +endfunction() + +get_all_targets(all_targets ${CMAKE_CURRENT_SOURCE_DIR}) + +add_custom_target(ALL DEPENDS ${all_targets}) + +foreach(target IN LISTS all_targets_list) + add_dependencies(ALL ${target}) +endforeach() diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..1fbf07c --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,132 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of + any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email address, + without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +opensource@rerun.io. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at +[https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/CODE_STYLE.md b/CODE_STYLE.md new file mode 100644 index 0000000..d867a4f --- /dev/null +++ b/CODE_STYLE.md @@ -0,0 +1,364 @@ +# Rerun code style + +## See also +* [`ARCHITECTURE.md`](ARCHITECTURE.md) +* [`BUILD.md`](BUILD.md) +* [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md) +* [`CONTRIBUTING.md`](CONTRIBUTING.md) +* [`RELEASES.md`](RELEASES.md) + + +## Languages +We prefer Rust. + +We have a bunch of Bash and Python scripts that [we want to replace with Rust](https://github.com/rerun-io/rerun/issues/3349). + +For configs we like JSON and TOML, and [dislike YAML](https://ruudvanasseldonk.com/2023/01/11/the-yaml-document-from-hell). + + +## Rust code + +### Avoid `unsafe` +`unsafe` code should be only used when necessary, and should be carefully scrutinized during PR reviews. + +### Avoid `unwrap`, `expect` etc. +The code should never panic or crash, which means that any instance of `unwrap` or `expect` is a potential time-bomb. Even if you structured your code to make them impossible, any reader will have to read the code very carefully to prove to themselves that an `unwrap` won't panic. Often you can instead rewrite your code so as to avoid it. The same goes for indexing into a slice (which will panic on out-of-bounds) - it is often preferable to use `.get()`. + +For instance: + +``` rust +let first = if vec.is_empty() { + return; +} else { + vec[0] +}; +``` +can be better written as: + +``` rust +let Some(first) = vec.get(0) else { + return; +}; +``` + +### Iterators +Be careful when iterating over `HashSet`s and `HashMap`s, as the order is non-deterministic. +Whenever you return a list or an iterator, sort it first. +If you don't want to sort it for performance reasons, you MUST put `unsorted` in the name as a warning. + +### Error handling and logging +We log problems using our own `re_log` crate (which is currently a wrapper around [`tracing`](https://crates.io/crates/tracing/)). + +* An error should never happen in silence. +* Validate code invariants using `assert!` or `debug_assert!`. +* Validate user data and return errors using [`thiserror`](https://crates.io/crates/thiserror). +* Attach context to errors as they bubble up the stack using [`anyhow`](https://crates.io/crates/anyhow). +* Log errors using `re_log::error!` or `re_log::error_once!`. +* If a problem is recoverable, use `re_log::warn!` or `re_log::warn_once!`. +* If an event is of interest to the user, log it using `re_log::info!` or `re_log::info_once!`. +* The code should only panic if there is a bug in the code. +* Never ignore an error: either pass it on, or log it. +* Handle each error exactly once. If you log it, don't pass it on. If you pass it on, don't log it. +* Put any sensitive data (like URLs, file paths etc) LAST in the error message, so that users can send us the first half and omit the sensitive half. + +Strive to encode code invariants and contracts in the type system as much as possible. So if a vector cannot be empty, consider using [`vec1`](https://crates.io/crates/vec1). [Parse, don’t validate](https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/). + +Some contracts cannot be enforced using the type system. In those cases you should explicitly enforce them using `assert` (self-documenting code) and in documentation (if it is part of a public API). + +### Log levels + +The log is for several distinct users: +* The application user +* The application programmer +* The library user +* The library programmer + +We are all sharing the same log stream, so we must cooperate carefully. + +The Rerun viewer will show log messages at `INFO`, `WARNING` and `ERROR` to the user as a toast notifications. + +#### `ERROR` +This is for _unrecoverable_ problems. The application or library couldn't complete an operation. + +Libraries should ideally not log `ERROR`, but instead return `Err` in a `Result`, but there are rare cases where returning a `Result` isn't possible (e.g. then doing an operation in a background task). + +Application can "handle" `Err`ors by logging them as `ERROR` (perhaps in addition to showing a popup, if this is a GUI app). + +Use this log level whenever some data is lost, even if you continue processing other data. + +Examples: failing to write a file, failing to read parts of a file. + +#### `WARNING` +This is for _recoverable_ problems. The operation completed, but couldn't do exactly what it was instructed to do. + +Sometimes an `Err` is handled by logging it as `WARNING` and then running some fallback code. + +Warnings are also used for thing that _may_ be an error, but it could be intended (e.g. dropping a sink before flushing it). + +Examples: usage of deprecated functions, slow paths, misuse of our APIs, lossy data conversion. + +If data is lost, it is an error and NOT a warning. + +#### `INFO` +This is the default verbosity level. This should mostly be used _only by application code_ to write interesting and rare things to the application user. For instance, you may perhaps log that a file was saved to specific path, or where the default configuration was read from. These things lets application users understand what the application is doing, and debug their use of the application. + +#### `DEBUG` +This is a level you opt-in to to debug either an application or a library. These are logged when high-level operations are performed (e.g. texture creation). If it is likely going to be logged each frame, move it to `TRACE` instead. + +#### `TRACE` +This is the last-resort log level, and mostly for debugging libraries or the use of libraries. Here any and all spam goes, logging low-level operations. + +The distinction between `DEBUG` and `TRACE` is the least clear. Here we use a rule of thumb: if it generates a lot of continuous logging (e.g. each frame), it should go to `TRACE`. + + +### Warning reporter pattern +For reporting warnings (or partial-failures) up the call-stack, we like the _reporter pattern_: + +```rs +struct WarningReporter { + reports: Mutex>, +} + +pub fn thing_that_can_produce_warnings(reporter: &WarningReporter, other_paramets: …) -> Result<…> {} +``` + +The important parts of this pattern is: +* Accumulate warnings and then continue +* Interior mutability, so we can share the reporter with child threads +* Structured warnings (more than just a String!) + +We use this for _partial failures_, when something went wrong but we don't want to abort, but instead continue with best-effort. + +We prefer this pattern complex return types (`(Vec, Object)`), because the reporter pattern is often a lot less syntactically noisy in Rust. +It is also easy to ignore part of a return-type, but it is harder to ignore an extra parameter. Thus we force ourselves to handle warnings. + +This allows code like this: + +```rs +fn some_panel_ui(ctx: &ViewerContext, ui: &mut Ui) { + let reporter = WarningReporter::default(); + let object = do_some_query(&reporter, …)?; + object.ui(ui); + if reporter.is_missing_chunks() { + ui.loading_indicator("Doing query"); + } + if !reporter.warnings().is_empty() { + warnings_ui(reporter.warnings()); + } +} +```` + +### Libraries +We use [`thiserror`](https://crates.io/crates/thiserror) for errors in our libraries, and [`anyhow`](https://crates.io/crates/anyhow) for type-erased errors in applications. + +For faster hashing, we use [`ahash`](https://crates.io/crates/ahash) (`ahash::HashMap`, …). + +When the hashmap key is high-entropy we use [`nohash-hasher`](https://crates.io/crates/nohash-hasher) (`nohash_hasher::IntMap`). + +### Style +We follow the [Rust API Guidelines](https://rust-lang.github.io/api-guidelines/about.html). + +We use `rust fmt` with default settings. + +We have blank lines before functions, types, `impl` blocks, and docstrings. + +We format comments `// Like this`, and `//not like this`. + +When importing a `trait` to use its trait methods, do this: `use Trait as _;`. That lets the reader know why you imported it, even though it seems unused. + +When intentionally ignoring a `Result`, prefer `foo().ok();` over `let _ = foo();`. The former shows what is happening, and will fail to compile if `foo`:s return type ever changes. + +We group and order imports (`use` statements) by `std`, other crates, and lastly own `crate` and `super`. This corresponds to [`StdExternalCrate`](https://rust-lang.github.io/rustfmt/?version=v1.8.0&search=group#StdExternalCrate%5C%3A). + +We group our `use` statements by module, e.g. `crate_name::module::{a, b, c}`. This is a compromise, being rather terse while still avoiding excessive merge conflicts. See [the cargofmt docs](https://rust-lang.github.io/rustfmt/?version=v1.8.0&search=group#Module%5C%3A) for details. + +Use the destructor syntax (`let Self { a, b, c} = self;`) whenever you're accessing most of (or all) of the fields of a struct. + +### `TODO`:s +When you must remember to do something before merging a PR, write `TODO` or `FIXME` in any file. The CI will not be green until you either remove them or rewrite them as `TODO(yourname)`. + +You can also use the `todo()!` macro during development, but again it won't pass CI until you rewrite it as `todo!("more details")`. Of course, we should try to avoid `todo!` macros in our code. + + +### Misc +Use debug-formatting (`{:?}`) when logging strings in logs and error messages. This will surround the string with quotes and escape newlines, tabs, etc. For instance: `re_log::warn!("Unknown key: {key:?}");`. + +Use `{:#}` or `re_error::format(err)` when displaying an error - NOT `Debug`/`{:?}`. + +We make extensive use of snapshot testing. To work around non-deterministic values, such as TUIDs (time-prefixed unique IDs), many types (should) offer `std::fmt::Display` implementations with redactions that can be access via an overloaded `-` formatting option: + +```rs +println!("{:-}, value"); // The `-` option stands for redaction. +``` + +Look for `f.sign_minus()` in the code for where we handle this. + +## Python +Prefer kw-args (key-word arguments) for non-obvious parameters, especially when there are many of them. + +* Bad: `def serve(ip: str, port: int = 80, token: str | None = None, timeout_sec: int = 8)` +* Better: `def serve(ip: str, *, port: int = 80, token: str | None = None, timeout_sec: int = 8)` +* Best: `def serve(*, ip: str, port: int = 80, token: str | None = None, timeout_sec: int = 8)` + +This forces the use of kw-args for everything following the `*`. + +kw-args have two big benefits: + +First, they make future API changes a lot easier. We can add or remove arguments without breaking the API (just log deprecation notices). + +Secondly, named arguments makes the caller code a lot more readable. + +Usually, we do NOT use kw-args for single-parameter functions, nor for functions where the first (or all) parameters are obvious from the caller. For instance, `def load_file(path: str) -> bytes` + +## C++ +We use `clang-format` to enforce most style choices (see [`.clang-format`](.clang-format)). + +### Initialization +Always use `const` unless you plan on mutating it, with the exception of function parameters (because that is just too much noise). + +We use `const auto x = …` for declaration because that gives symmetric code for normal constructors and static constructors: + +```C++ +const auto foo = SomeClass{…}; +const auto bar = SomeClass::new_xyzw(…); +``` + +We prefer `{}` for constructors (`Foo{…}` instead of `Foo(…)`), though there are exceptions (`std::vector{2, 3}` is different from `std::vector(2, 3)`). + +Prefer `using Type = …;` over `typedef … Type;`. + +### Members +We prefix _private_ member variables with a `_`: + +```C++ +class Thing { + public: + … + + void set_value(uint32_t value) { + _value = value; + } + + private: + uint32_t _value; +} +``` + +Public member variables has no prefix. +When necessary use a `_` suffix on parameter names to avoid name conflicts: + +```C++ +struct Thing { + uint32_t value; + + void set_value(uint32_t value_) { + value = value_; + } +} +``` + +### Constructors and builder pattern +We use C++ constructors when it is unambiguous, but prefer _named static constructors_ otherwise. +Like Rust, we use the `from_` prefix for static constructors, and the `with_` prefix for builder methods. + +```C++ +class Rect { + // We can't just overload normal constructors for these: + static Rect from_min_max(Vec2 min, Vec2 max) { … } + static Rect from_center_size(Vec2 center, Vec2 size) { … } + + Rect with_color(Color color) && { + _color = color; + return std::move(*this); // `*this` is always an lvalue, so we have to move it to avoid a copy. + } +} +``` + +### Constants & Enums + +Constants & enum values have PascalCase names. + +When possible, use `constexpr` for (global & struct/class scoped) constants. + +### String handling +Whenever possible we use `std::string_view` to pass strings. + +To accommodate for this and other languages, strings on the C interface are almost never expected to be null-terminated and are always passed along with a byte length using `rr_string`. + + +### Misc +We don't add `inline` before class/struct member functions if they are inlined in the class/struct definition. + +Preprocessor directives/macros are usually prefixed with `RR_` + +Include what you use: if you use `std::vector`, then include `` - don't depend on a transitive include. + +We prefer the "data, length" parameter order, e.g. `void foo(const void* data, size_t len)` or `void image(const f32* data, Resolution resolution)`. + + +## Naming +We prefer `snake_case` to `kebab-case` for most things (e.g. crate names, crate features, …). `snake_case` is a valid identifier in almost any programming language, while `kebab-case` is not. This means one can use the same `snake_case` identifier everywhere, and not think about whether it needs to be written as `snake_case` in some circumstances. + +When in doubt, be explicit. BAD: `id`. GOOD: `msg_id`. + +Be terse when it doesn't hurt readability. BAD: `message_identifier`. GOOD: `msg_id`. + +Avoid negations in names. A lot of people struggle with double negations, so things like `non_blocking = false` and `if !non_blocking { … }` can become a source of confusion and will slow down most readers. So prefer `connected` over `disconnected`, `initialized` over `uninitialized` etc. + +For UI functions (functions taking an `&mut egui::Ui` argument), we use the name `ui` or `_ui` suffix, e.g. `blueprint_ui(…)` or `blueprint.ui(…)`. + +### Be over-explicit in stringly typed situations +In weak/stringly typed situations, be extra careful. This includes Python, Bash, and CLI args. + +Avoid vague names like "address". Prefer one of: + +* `ip` +* `ip_port` +* `url` +* `email` +* … + + +### Units +* When in doubt, be explicit (`duration_secs: f32` is better than `duration: f32`) +* All things being equal, prefer SI base units (seconds over milliseconds, Hz over RPM, etc) +* When precision matters, prefer `nanos: i64` over `secs: f64` +* Store angles in radians (but you may print/display them as degrees) + +Follow the conventions set by Rust stdlib: +* `secs` instead of `seconds` +* `millis` instead of `ms` or `milliseconds` +* `micros` instead of `us` or `microseconds` +* `nanos` instead of `ns` or `nanoseconds` + + +### Spaces +Points, vectors, rays etc all live in different _spaces_. Whenever there is room for ambiguity, we explicitly state which space something is in, e.g. with `ray_in_world`. + +Here are some of our standard spaces: + +* `ui`: coordinate system used by `egui`, measured in logical pixels ("points"), with origin in the top left +* `image`: image pixel coordinates, possibly with an added `z=depth` +* `space`: a user-defined space where they log stuff into +* `world`: the common coordinate system of a 3D scene, usually same as `space` +* `view`: X=right, Y=down, Z=back, origin = center of screen + +### Matrices +We use column vectors, which means matrix multiplication is done as `M * v`, i.e. we read all matrix/vector operations right-to-left. We therefore name all transform matrices as `foo_from_bar`, for instance: + +```rust +let point_in_world = world_from_view * point_in_view; +``` + +This means the name of the space matches up nicely, e.g.: + +```rust +let projection_from_object = projection_from_view * view_from_world * world_from_object; +``` + +See for motivation. + +For consistency, we use the same naming convention for other non-matrix transforms too. For instance, functions: `let screen = screen_from_world(world);`. + +### Vectors vs points +Vectors are directions with magnitudes. Points are positions. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..5dfee1e --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,265 @@ +# Contributing to Rerun +This guide is for anyone who wants to contribute to the Rerun repository. + + +## See also +* [`ARCHITECTURE.md`](ARCHITECTURE.md) +* [`BUILD.md`](BUILD.md) +* [`rerun_py/README.md`](rerun_py/README.md) - build instructions for Python SDK +* [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md) +* [`CODE_STYLE.md`](CODE_STYLE.md) +* [`RELEASES.md`](RELEASES.md) + +## What to contribute +* **Examples**: We welcome any examples you would like to add. Follow the pattern of existing examples in the [`examples/`](examples) folder. +* Report bugs and feature requests at . +* Look at our [`good first issue` tag](https://github.com/rerun-io/rerun/labels/good%20first%20issue). +* We track things we would like implemented in 3rd party crates [here](https://github.com/rerun-io/opensource/issues/1). + +Note that maintainers do not have infinite time, and reviews take a lot of it. +When choosing what to work on, please ensure that it is either: + +* A small change (+100-100 at most), or +* A larger change that has been discussed with one or more maintainers. + +You can discuss these changes by: + +* Commenting on an existing issue, +* Creating a new issue, or +* Pinging one of the Rerun maintainers on our [Discord](https://discord.gg/PXtCgFBSmH) + +> [!NOTE] +> PRs containing large undiscussed changes may be closed without comment. + +## Pull requests +We use [Trunk Based Development](https://trunkbaseddevelopment.com/), which means we encourage small, short-lived branches. + +* Open draft PRs early to get feedback before a full review. +* Don't PR from your own `main` branch — it makes it hard for reviewers to add fixes. +* Add improvements as new commits rather than rebasing, so reviewers can follow progress (add images if possible!). +* All PRs are merged with [`Squash and Merge`](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/about-pull-request-merges#squash-and-merge-your-commits), so you don't need a clean commit history on feature branches. Prefer new commits over rebasing — force-pushing discourages collaboration. + +Our CI will [record binary sizes](https://build.rerun.io/graphs/sizes.html) and run [benchmarks](https://build.rerun.io/graphs/crates.html) on each merged PR. + +Pull requests from external contributors require approval for CI runs. Click the `Approve and run` button: + +![Image showing the approve and run button](https://github.com/rerun-io/rerun/assets/1665677/ead5c04f-df02-4f20-9093-37cfce097b44) + +Members of the `rerun-io` organization can enable auto-approval for a single PR by commenting with `@rerun-bot approve`: + +![PR comment with the text `@rerun-bot approve`](https://github.com/rerun-io/rerun/assets/1665677/b5f07f3f-ea95-44a4-8eb7-f07c905f96c3) + + +### Labeling of PRs & changelog generation + +Org members _must_ label their PRs — labels are how we generate [changelogs](https://github.com/rerun-io/rerun/blob/main/CHANGELOG.md). + +* `include in changelog`: The PR **title** will be used as a changelog entry. Keep it informative and concise. +* `exclude from changelog`: Required if the PR shouldn't appear in the changelog. +* At least one category label is required. See the [CI job](./.github/workflows/labels.yml) for the current list. +* When in doubt, add more labels rather than fewer — they help with search. + +#### What should go to the changelog? + +Err on the side of including entries — if it adds value for a user browsing the changelog, add it. +Be generous with external contributions — credit where credit is due! + +We typically don't include: pure refactors, testing, CI fixes, fixes for bugs introduced since last release, minor doc changes (typos, etc.). + +#### Other special labels + +* `deploy docs`: + Cherry-picked to `docs-latest`, triggering a rebuild of the [doc page](https://www.rerun.io/docs). + Use this for doc fixes relevant to the latest release. +* `do-not-merge`: + Fails CI unconditionally. Useful for PRs targeting non-`main` branches or awaiting test results. + Alternatively, unticked checkboxes in the PR description will also fail CI ✨ + +## Contributing to CI + +Every CI job should ideally be a single `pixi` (or similar) script invocation that works locally as-is. + +Benefits: +- Scripts in a real programming language instead of Bash embedded in YAML +- Much lower iteration times when working on CI +- Ability to manually re-run a job when CI fails + +Always output artifacts to GCS instead of GHA artifact storage. This lets anyone download the output of a script and continue from where it failed. + +### CI script guidelines + +Scripts should be local-first and easy for contributors to run. + +Each script should document: +- Dependencies +- Files and directories +- Environment variables +- Usage examples + +Pass inputs explicitly via arguments with sane defaults. Validate inputs as early as possible: auth credentials, numeric ranges, string formats, file path existence, etc. + +Support GCS paths (`gs://bucket/blob/path`) and stdin/stdout (`-`) for file I/O where it makes sense. + +Write descriptive error messages — they may be the only info someone has when debugging a CI failure. Print frequently to show progress. + +Use environment variables only for auth and output config (e.g. disabling color). Prefer SDK default auth where possible (e.g. GCP [Application Default Credentials](https://cloud.google.com/docs/authentication/client-libraries)). + +Support `--dry-run` for destructive or irreversible actions. + +### Adding dependencies +Be thoughtful when adding dependencies. Each one adds compile time, binary size, potential breakage, and attack surface. Sometimes 100 lines of code is better than a new dependency. + +When adding a dependency in a PR, motivate it: +* Why use this dependency instead of rolling our own? +* Why this one over alternatives? + +For Rust, use `default-features = false` where it makes sense to minimize new code pulled in. + +When reviewing a PR, always check the `Cargo.lock` diff (collapsed by default in GitHub 😤). + +Guide for picking good dependencies: . + +A full `cargo update` should be its own stand-alone PR. Include the output in the commit message. + + +## Structure +Main crates are in [`crates/`](crates), examples in [`examples/`](examples). + +To get an overview of the crates, read their documentation with: + +``` +cargo doc --no-deps --open +``` + +To learn about the viewer, run: + +``` +cargo run -p rerun -- --help +``` + +## Tests + +There are various kinds of automated tests throughout the repository. +Unless noted otherwise, all tests run on CI, though their frequency (per PR, on `main`, nightly) and platform coverage may vary. + +### Rust tests + +```sh +cargo test --all-targets --all-features +``` +or with [cargo nextest](https://nexte.st/): +```sh +cargo nextest run --all-targets --all-features +cargo test --all-features --doc +``` + +Runs unit & integration tests for all Rust crates, including the viewer. +Tests use the standard `#[test]` attribute. + +#### `insta` snapshot tests + +Some tests use [`insta`](https://docs.rs/insta/latest/insta/) snapshot tests, which compare textual output against checked-in references. They run as part of the regular test suite. + +If output changes, they will fail. Review results with `cargo insta review` (install: `cargo install cargo-insta`). + +#### Image comparison tests + +Some tests render an image and compare it against a checked-in reference image. They run as part of the regular test suite. + +These are driven by [egui_kittest](https://github.com/emilk/egui/tree/master/crates/egui_kittest)'s `Harness::snapshot` method. +We typically use [TestContext](./crates/viewer/re_test_context/src/lib.rs) to mock relevant parts of the viewer. + +##### Comparing results & updating images + +Each test run produces new images (typically at `/snapshots`). +On failure, a `diff.png` is added highlighting all differences. +To update references, run with `UPDATE_SNAPSHOTS=1`. + +Use `pixi run snapshots` to compare results of all failed tests visually in Rerun. +You can also update from a failed CI run using `./scripts/update_snapshots_from_ci.sh`. +Inspect PR diffs (including failed comparisons) via https://rerun-io.github.io/kitdiff/?url=. + +For best practices and unexpected sources of image differences, see the [egui_kittest README](https://github.com/emilk/egui/tree/master/crates/egui_kittest#snapshot-testing). + +##### Rendering backend + +Image comparison tests require a `wgpu`-compatible driver. Currently they run on Vulkan & Metal. +For CI / headless environments, we use lavapipe (`llvmpipe`) for software rendering on all platforms. +On macOS, we use a custom static build from [`rerun-io/lavapipe-build`](https://github.com/rerun-io/lavapipe-build). + +For setup details, see the [CI workflow](./.github/workflows/reusable_checks_rust.yml). + + +### Python tests + +```sh +pixi run py-test +``` + +Uses [`pytest`](https://docs.pytest.org/). Tests are in [./rerun_py/tests/](./rerun_py/tests/). + +### C++ tests + +```sh +pixi run cpp-test +``` + +Uses [`catch2`](https://github.com/catchorg/Catch2). Tests are in [./rerun_cpp/tests/](./rerun_cpp/tests/). + + +### Snippet comparison tests + +```sh +pixi run uvpy docs/snippets/compare_snippet_output.py +``` + +Verifies that all [snippets](./docs/snippets/) produce the same output across languages, unless configured otherwise in [snippets.toml](./docs/snippets/snippets.toml). More details in [README.md](./docs/snippets/README.md). + +### Release checklists + +```sh +pixi run uv run tests/python/release_checklist/main.py +``` + +A set of **manual** checklist-style tests run prior to each release. Avoid adding new ones — they add friction and failures are easy to miss. More details in [README.md](./tests/python/release_checklist/README.md). + +### Other ad-hoc manual tests + +Additional test scenes in [./tests/cpp/](./tests/cpp/), [./tests/python/](./tests/python/), and [./tests/rust/](./tests/rust/). +These are built on CI but run only irregularly. See respective READMEs for details. + +## Tools + +We use [`pixi`](https://pixi.sh/) for dev-tool versioning, downloads, and task running. See available tasks with `pixi task list`. + +We use [cargo deny](https://github.com/EmbarkStudios/cargo-deny) to check our dependency tree for copyleft licenses, duplicate dependencies, and [rustsec advisories](https://rustsec.org/advisories). Configure in `deny.toml`, run with `cargo deny check`. + +Configure your editor to run `cargo fmt` on save, strip trailing whitespace, and end each file with a newline. VSCode settings in `.vscode/` should apply automatically. If you use a different editor, consider adding good settings to this repository! + +Run relevant tests locally depending on your changes: `cargo test --all-targets --all-features`, `pixi run py-test`, `pixi run -e cpp cpp-test`. See [Tests](#tests) for details. + +We recommend [`cargo nextest`](https://nexte.st/) for running Rust tests — it's faster than `cargo test` with better output. Note that it doesn't support doc tests yet; run those with `cargo test`. + +### Linting +Before pushing, always run `pixi run fast-lint`. It takes seconds on repeated runs and catches trivial issues before wasting CI time. + +### Hooks +We recommend installing the Rerun pre-push hook, which runs `pixi run fast-lint` for you. + +Copy it into your local `.git/hooks`: +``` +cp hooks/pre-push .git/hooks/pre-push +chmod +x .git/hooks/pre-push +``` +or configure git to use the hooks directory directly: +``` +git config core.hooksPath hooks +``` + +### Optional +* [bacon](https://github.com/Canop/bacon) — automatically re-runs `cargo clippy` on save. See [`bacon.toml`](bacon.toml). +* [`sccache`](https://github.com/mozilla/sccache) — speeds up recompilation (e.g. when switching branches). Set cache size: `export SCCACHE_CACHE_SIZE="256G"`. + +### Other +View higher log levels with `export RUST_LOG=trace`. +Debug logging is automatically enabled for the viewer when running inside the `rerun` checkout. diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..1c89d1e --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,15310 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "RustyXML" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b5ace29ee3216de37c0546865ad08edef58b0f9e76838ed8959a84a990e58c5" + +[[package]] +name = "abi_stable" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69d6512d3eb05ffe5004c59c206de7f99c34951504056ce23fc953842f12c445" +dependencies = [ + "abi_stable_derive", + "abi_stable_shared", + "const_panic", + "core_extensions", + "crossbeam-channel", + "generational-arena", + "libloading 0.7.4", + "lock_api", + "parking_lot", + "paste", + "repr_offset", + "rustc_version", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "abi_stable_derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7178468b407a4ee10e881bc7a328a65e739f0863615cca4429d43916b05e898" +dependencies = [ + "abi_stable_shared", + "as_derive_utils", + "core_extensions", + "proc-macro2", + "quote", + "rustc_version", + "syn 1.0.109", + "typed-arena", +] + +[[package]] +name = "abi_stable_shared" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b5df7688c123e63f4d4d649cba63f2967ba7f7861b1664fca3f77d3dad2b63" +dependencies = [ + "core_extensions", +] + +[[package]] +name = "accesskit" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3b7f7f85a7e5f68090000ed7622545829afd484d210358702ae4cb97dd0c320" +dependencies = [ + "enumn", + "serde", + "uuid", +] + +[[package]] +name = "accesskit_atspi_common" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "842fd8203e6dfcf531d24f5bac792088edfba7d6b35844fead191603fb32a260" +dependencies = [ + "accesskit", + "accesskit_consumer 0.35.0", + "atspi-common", + "phf 0.13.1", + "serde", + "zvariant", +] + +[[package]] +name = "accesskit_consumer" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53cf47daed85312e763fbf85ceca136e0d7abc68e0a7e12abe11f48172bc3b10" +dependencies = [ + "accesskit", + "hashbrown 0.16.1", +] + +[[package]] +name = "accesskit_consumer" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950720ce064757a1b629caad3a408e8d2c63bb01f29b8a3ff8daa331053ffeb" +dependencies = [ + "accesskit", + "hashbrown 0.16.1", +] + +[[package]] +name = "accesskit_macos" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534bc3fdc89a64a1db3c46b33c198fde2b7c3c7d094e5809c8c8bf2970c18243" +dependencies = [ + "accesskit", + "accesskit_consumer 0.35.0", + "hashbrown 0.16.1", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "accesskit_unix" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90e549dd7c6562b6a2ea807b44726e6241707db054a817dc4c7e2b8d3b39bfac" +dependencies = [ + "accesskit", + "accesskit_atspi_common", + "async-channel", + "async-executor", + "async-task", + "atspi", + "futures-lite", + "futures-util", + "serde", + "zbus", +] + +[[package]] +name = "accesskit_windows" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff7009f1a532e917d66970a1e80c965140c6cfbbabbdde3d64e5431e6c78e21" +dependencies = [ + "accesskit", + "accesskit_consumer 0.35.0", + "hashbrown 0.16.1", + "static_assertions", + "windows", + "windows-core", +] + +[[package]] +name = "accesskit_winit" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fe9a94394896352cc4660ca2288bd4ef883d83238853c038b44070c8f134313" +dependencies = [ + "accesskit", + "accesskit_macos", + "accesskit_unix", + "accesskit_windows", + "raw-window-handle", + "winit", +] + +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "const-random", + "getrandom 0.3.4", + "once_cell", + "serde", + "version_check", + "zerocopy 0.8.27", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "alloca" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7d05ea6aea7e9e64d25b9156ba2fee3fdd659e34e41063cd2fc7cd020d7f4" +dependencies = [ + "cc", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android-activity" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" +dependencies = [ + "android-properties", + "bitflags 2.13.0", + "cc", + "cesu8", + "jni 0.21.1", + "jni-sys 0.3.0", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "num_enum", + "thiserror 1.0.69", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "animated_urdf" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "clap", + "emath", + "rerun", +] + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +dependencies = [ + "windows-sys 0.60.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.60.2", +] + +[[package]] +name = "anyhow" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "arboard" +version = "3.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf" +dependencies = [ + "clipboard-win", + "image", + "log", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.2", + "parking_lot", + "percent-encoding", + "windows-sys 0.60.2", + "x11rb", +] + +[[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" + +[[package]] +name = "argh" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "211818e820cda9ca6f167a64a5c808837366a6dfd807157c64c1304c486cd033" +dependencies = [ + "argh_derive", + "argh_shared", +] + +[[package]] +name = "argh_derive" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c442a9d18cef5dde467405d27d461d080d68972d6d0dfd0408265b6749ec427d" +dependencies = [ + "argh_shared", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "argh_shared" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ade012bac4db278517a0132c8c10c6427025868dca16c801087c28d5a411f1" +dependencies = [ + "serde", +] + +[[package]] +name = "array-init" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc" + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "arrow" +version = "58.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "378530e55cd479eda3c14eb345310799717e6f76d0c332041e8487022166b471" +dependencies = [ + "arrow-arith", + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-csv", + "arrow-data", + "arrow-ipc", + "arrow-json", + "arrow-ord", + "arrow-pyarrow", + "arrow-row", + "arrow-schema", + "arrow-select", + "arrow-string", +] + +[[package]] +name = "arrow-arith" +version = "58.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0ab212d2c1886e802f51c5212d78ebbcbb0bec980fff9dadc1eb8d45cd0b738" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "chrono", + "num-traits", +] + +[[package]] +name = "arrow-array" +version = "58.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfd33d3e92f207444098c75b42de99d329562be0cf686b307b097cc52b4e999e" +dependencies = [ + "ahash", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "chrono", + "chrono-tz", + "half", + "hashbrown 0.17.1", + "num-complex", + "num-integer", + "num-traits", +] + +[[package]] +name = "arrow-buffer" +version = "58.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6cd424c2693bcdbc150d843dc9d4d137dd2de4782ce6df491ad11a3a0416c0" +dependencies = [ + "bytes", + "half", + "num-bigint", + "num-traits", +] + +[[package]] +name = "arrow-cast" +version = "58.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c5aefb56a2c02e9e2b30746241058b85f8983f0fcff2ba0c6d09006e1cded7f" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-ord", + "arrow-schema", + "arrow-select", + "atoi", + "base64 0.22.1", + "chrono", + "comfy-table", + "half", + "lexical-core", + "num-traits", + "ryu", +] + +[[package]] +name = "arrow-csv" +version = "58.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94e8cf7e517657a52b91ea1263acf38c4ca62a84655d72458a3359b12ab97de" +dependencies = [ + "arrow-array", + "arrow-cast", + "arrow-schema", + "chrono", + "csv", + "csv-core", + "regex", +] + +[[package]] +name = "arrow-data" +version = "58.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c88210023a2bfee1896af366309a3028fc3bcbd6515fa29a7990ee1baa08ee0" +dependencies = [ + "arrow-buffer", + "arrow-schema", + "half", + "num-integer", + "num-traits", +] + +[[package]] +name = "arrow-ipc" +version = "58.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "238438f0834483703d88896db6fe5a7138b2230debc31b34c0336c2996e3c64f" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", + "flatbuffers", + "lz4_flex", + "zstd", +] + +[[package]] +name = "arrow-json" +version = "58.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "205ca2119e6d679d5c133c6f30e68f027738d95ed948cf77677ea69c7800036b" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-ord", + "arrow-schema", + "arrow-select", + "chrono", + "half", + "indexmap 2.14.0", + "itoa", + "lexical-core", + "memchr", + "num-traits", + "ryu", + "serde_core", + "serde_json", + "simdutf8", +] + +[[package]] +name = "arrow-ord" +version = "58.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bffd8fd2579286a5d63bac898159873e5094a79009940bcb42bbfce4f19f1d0" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", +] + +[[package]] +name = "arrow-pyarrow" +version = "58.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29abdf672a81c1aeb57fd2661457f9918964d49aed0e9f18932535f2a9e49ce" +dependencies = [ + "arrow-array", + "arrow-data", + "arrow-schema", + "pyo3", +] + +[[package]] +name = "arrow-row" +version = "58.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab5994731204603c73ba69267616c50f80780774c6bb0476f1f830625115e0c" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "half", +] + +[[package]] +name = "arrow-schema" +version = "58.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f633dbfdf39c039ada1bf9e34c694816eb71fbb7dc78f613993b7245e078a1ed" +dependencies = [ + "bitflags 2.13.0", + "serde_core", + "serde_json", +] + +[[package]] +name = "arrow-select" +version = "58.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cd065c54172ac787cf3f2f8d4107e0d3fdc26edba76fdf4f4cc170258942222" +dependencies = [ + "ahash", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "num-traits", +] + +[[package]] +name = "arrow-string" +version = "58.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29dd7cda3ab9692f43a2e4acc444d760cc17b12bb6d8232ddf64e9bab7c06b42" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", + "memchr", + "num-traits", + "regex", + "regex-syntax", +] + +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[package]] +name = "as_derive_utils" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff3c96645900a44cf11941c111bd08a6573b0e2f9f69bc9264b179d8fae753c4" +dependencies = [ + "core_extensions", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ascii" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" + +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading 0.8.9", +] + +[[package]] +name = "assert_matches" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-compression" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06575e6a9673580f52661c92107baabffbf41e2141373441cbcdc47cb733003c" +dependencies = [ + "flate2", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "async-executor" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-ffi" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4de21c0feef7e5a556e51af767c953f0501f7f300ba785cc99c47bdc8081a50" +dependencies = [ + "abi_stable", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix 1.1.4", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix 1.1.4", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "async-signal" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 1.1.4", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "async_cell" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "447ab28afbb345f5408b120702a44e5529ebf90b1796ec76e9528df8e288e6c2" +dependencies = [ + "loom", +] + +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "atomig" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0f41f4bb89f5c6450325e283fb78c4a3d042181b54f3855ee2f872919f9863" +dependencies = [ + "atomig-macro", +] + +[[package]] +name = "atomig-macro" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49c98dba06b920588de7d63f6acc23f1e6a9fade5fd6198e564506334fb5a4f5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "atspi" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77886257be21c9cd89a4ae7e64860c6f0eefca799bb79127913052bd0eefb3d" +dependencies = [ + "atspi-common", + "atspi-proxies", +] + +[[package]] +name = "atspi-common" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20c5617155740c98003016429ad13fe43ce7a77b007479350a9f8bf95a29f63d" +dependencies = [ + "enumflags2", + "serde", + "static_assertions", + "zbus", + "zbus-lockstep", + "zbus-lockstep-macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "atspi-proxies" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2230e48787ed3eb4088996eab66a32ca20c0b67bbd4fd6cdfe79f04f1f04c9fc" +dependencies = [ + "atspi-common", + "serde", + "zbus", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "av-data" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fca67ba5d317924c02180c576157afd54babe48a76ebc66ce6d34bb8ba08308e" +dependencies = [ + "byte-slice-cast", + "bytes", + "num-derive", + "num-rational", + "num-traits", +] + +[[package]] +name = "axum" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" +dependencies = [ + "axum-core", + "bytes", + "form_urlencoded", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "serde_core", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "az" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be5eb007b7cacc6c660343e96f650fedf4b5a77512399eb952ca6642cf8d13f7" + +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link", +] + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bigdecimal" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a22f228ab7a1b23027ccc6c350b72868017af7ea8356fbdf19f8d991c690013" +dependencies = [ + "autocfg", + "libm", + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "bimap" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "binrw" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53195f985e88ab94d1cc87e80049dd2929fd39e4a772c5ae96a7e5c4aad3642" +dependencies = [ + "array-init", + "binrw_derive", + "bytemuck", +] + +[[package]] +name = "binrw_derive" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5910da05ee556b789032c8ff5a61fb99239580aa3fd0bfaa8f4d094b2aee00ad" +dependencies = [ + "either", + "owo-colors", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "bit-set" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ddef2995421ab6a5c779542c81ee77c115206f4ad9d5a8e05f4ff49716a3dd" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71798fca2c1fe1086445a7258a4bc81e6e49dcd24c8d0dd9a1e57395b603f51" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" +dependencies = [ + "bytemuck", + "serde_core", +] + +[[package]] +name = "bitpacking" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c1d3e2bfd8d06048a179f7b17afc3188effa10385e7b00dc65af6aae732ea92" +dependencies = [ + "crunchy", +] + +[[package]] +name = "bitstream-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + +[[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2 0.5.2", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2 0.6.4", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "blueprint" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "clap", + "rerun", +] + +[[package]] +name = "blueprint_stocks" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "chrono", + "clap", + "rerun", + "serde", + "serde_json", + "strum", +] + +[[package]] +name = "brotli" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bstr" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" +dependencies = [ + "memchr", + "regex-automata", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "bytes" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593" + +[[package]] +name = "bytestring" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "113b4343b5f6617e7ad401ced8de3cc8b012e73a594347c307b90db3e9271289" +dependencies = [ + "bytes", +] + +[[package]] +name = "cacache" +version = "13.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5063741c7b2e260bbede781cf4679632dd90e2718e99f7715e46824b65670b" +dependencies = [ + "digest", + "either", + "futures", + "hex", + "libc", + "memmap2 0.5.10", + "miette", + "reflink-copy", + "serde", + "serde_derive", + "serde_json", + "sha1", + "sha2", + "ssri", + "tempfile", + "thiserror 1.0.69", + "tokio", + "tokio-stream", + "walkdir", +] + +[[package]] +name = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.13.0", + "log", + "polling", + "rustix 0.38.44", + "slab", + "thiserror 1.0.69", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" +dependencies = [ + "calloop", + "rustix 0.38.44", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "camino" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ce8d3bd5823c7504d3f579f13e7b2f3da252fcb938c594d5680ee508bf846f" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "122ec45a44b270afd1402f351b782c676b173e3c3fb28d86ff7ebfb4d86a4ee4" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-run-wasm" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa9c33bbfab116bda01ec67729b988895b34167a1e9cf034343099092421ed43" +dependencies = [ + "devserver_lib", + "pico-args", + "serde_json", + "wasm-bindgen-cli-support", +] + +[[package]] +name = "cargo_metadata" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef987d17b0a113becdd19d3d0022d04d7ef41f9efe4f3fb63ac44ba61df3ade9" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cc" +version = "1.2.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d05d92f4b1fd76aad469d46cdd858ca761576082cd37df81416691e50199fb" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "chrono-tz" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3" +dependencies = [ + "chrono", + "phf 0.12.1", +] + +[[package]] +name = "chunked_transfer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4de3bc4ea267985becf712dc6d9eed8b04c953b3fcfb339ebc87acd9804901" + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clang-format" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "696283b40e1a39d208ee614b92e5f6521d16962edeb47c48372585ec92419943" +dependencies = [ + "thiserror 1.0.69", +] + +[[package]] +name = "clap" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "clap_lex" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" + +[[package]] +name = "clean-path" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaa6b4b263a5d737e9bf6b7c09b72c41a5480aec4d7219af827f6564e950b6a5" + +[[package]] +name = "clipboard-win" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" +dependencies = [ + "error-code", +] + +[[package]] +name = "clock" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "clap", + "rerun", +] + +[[package]] +name = "codespan-reporting" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" +dependencies = [ + "serde", + "termcolor", + "unicode-width 0.2.2", +] + +[[package]] +name = "color" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ec7c5eb7a16992b1904d76c517d170ab353b0e0b3d5a0c81a8a0cd1037893cf" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "color-hex" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecdffb913a326b6c642290a0d0ec8e8d6597291acdc07cc4c9cb4b3635d44cf9" + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "colored" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" +dependencies = [ + "lazy_static", + "windows-sys 0.59.0", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "comfy-table" +version = "7.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958c5d6ecf1f214b4c2bbbbf6ab9523a864bd136dcf71a7e8904799acfe1ad47" +dependencies = [ + "crossterm", + "unicode-segmentation", + "unicode-width 0.2.2", +] + +[[package]] +name = "concat-idents" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f76990911f2267d837d9d0ad060aa63aaad170af40904b29461734c339030d4d" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "windows-sys 0.59.0", +] + +[[package]] +name = "console" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b430743a6eb14e9764d4260d4c0d8123087d504eeb9c48f2b2a5e810dd369df4" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "unicode-width 0.2.2", + "windows-sys 0.61.2", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.17", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "const_format" +version = "0.2.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" +dependencies = [ + "const_format_proc_macros", + "konst", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "const_panic" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2459fc9262a1aa204eb4b5764ad4f189caec88aea9634389c0a25f8be7f6265e" + +[[package]] +name = "const_soft_float" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ca1caa64ef4ed453e68bb3db612e51cf1b2f5b871337f0fcab1c8f87cc3dff" + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "constgebra" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1aaf9b65849a68662ac6c0810c8893a765c960b907dd7cfab9c4a50bf764fbc" +dependencies = [ + "const_soft_float", +] + +[[package]] +name = "convert_case" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "affbf0190ed2caf063e3def54ff444b449371d55c58e513a95ab98eca50adb49" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "cookie_store" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fc4bff745c9b4c7fb1e97b25d13153da2bc7796260141df62378998d070207f" +dependencies = [ + "cookie", + "document-features", + "idna", + "indexmap 2.14.0", + "log", + "serde", + "serde_derive", + "serde_json", + "time", + "url", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "libc", +] + +[[package]] +name = "core_extensions" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92c71dc07c9721607e7a16108336048ee978c3a8b129294534272e8bac96c0ee" +dependencies = [ + "core_extensions_proc_macros", +] + +[[package]] +name = "core_extensions_proc_macros" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f3b219d28b6e3b4ac87bc1fc522e0803ab22e055da177bff0068c4150c61a6" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "criterion" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "950046b2aa2492f9a536f5f4f9a3de7b9e2476e575e05bd6c333371add4d98f3" +dependencies = [ + "alloca", + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "itertools 0.13.0", + "num-traits", + "oorandom", + "page_size", + "plotters", + "rayon", + "regex", + "serde", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8d80a2f4f5b554395e47b5d8305bc3d27813bacb73493eb1001e8f76dae29ea" +dependencies = [ + "cast", + "itertools 0.13.0", +] + +[[package]] +name = "cros-codecs" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80f7441b4f31c17b6b6b7f57f6c202944aad11d0ab23739a9ff88d8d34dec621" +dependencies = [ + "log", +] + +[[package]] +name = "crossbeam" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-skiplist" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df29de440c58ca2cc6e587ec3d22347551a32435fbde9d2bff64e78a9ffa151b" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crossterm" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" +dependencies = [ + "bitflags 2.13.0", + "crossterm_winapi", + "document-features", + "parking_lot", + "rustix 1.1.4", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "csv" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d02f3b0da4c6504f86e9cd789d8dbafab48c2321be74e9987593de5a894d93d" +dependencies = [ + "memchr", +] + +[[package]] +name = "cursor-icon" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" + +[[package]] +name = "custom_callback" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "bincode", + "mimalloc", + "parking_lot", + "rerun", + "serde", + "tokio", +] + +[[package]] +name = "custom_importer" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "crossbeam", + "re_build_tools", + "re_quota_channel", + "rerun", +] + +[[package]] +name = "custom_store_subscriber" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "re_build_tools", + "rerun", +] + +[[package]] +name = "custom_view" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "mimalloc", + "rerun", +] + +[[package]] +name = "custom_visualizer" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "bytemuck", + "mimalloc", + "rerun", +] + +[[package]] +name = "dae-parser" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eee4253e35714fabaf4bd442b81ba903b3be71833e3fd885adf114127b81c89c" +dependencies = [ + "chrono", + "minidom-14", + "percent-encoding", + "ref-cast", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core 0.21.3", + "darling_macro 0.21.3", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core 0.23.0", + "darling_macro 0.23.0", +] + +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core 0.21.3", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core 0.23.0", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-url" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a" + +[[package]] +name = "dataframe_query" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "itertools 0.14.0", + "rerun", + "unindent", +] + +[[package]] +name = "datafusion" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93db0e623840612f7f2cd757f7e8a8922064192363732c88692e0870016e141b" +dependencies = [ + "arrow", + "arrow-schema", + "async-trait", + "bytes", + "chrono", + "datafusion-catalog", + "datafusion-catalog-listing", + "datafusion-common", + "datafusion-common-runtime", + "datafusion-datasource", + "datafusion-datasource-arrow", + "datafusion-datasource-csv", + "datafusion-datasource-json", + "datafusion-execution", + "datafusion-expr", + "datafusion-expr-common", + "datafusion-functions", + "datafusion-functions-aggregate", + "datafusion-functions-nested", + "datafusion-functions-table", + "datafusion-functions-window", + "datafusion-optimizer", + "datafusion-physical-expr", + "datafusion-physical-expr-adapter", + "datafusion-physical-expr-common", + "datafusion-physical-optimizer", + "datafusion-physical-plan", + "datafusion-session", + "datafusion-sql", + "futures", + "itertools 0.14.0", + "log", + "object_store", + "parking_lot", + "rand 0.9.4", + "regex", + "sqlparser", + "tempfile", + "tokio", + "url", + "uuid", +] + +[[package]] +name = "datafusion-catalog" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37cefde60b26a7f4ff61e9d2ff2833322f91df2b568d7238afe67bde5bdffb66" +dependencies = [ + "arrow", + "async-trait", + "dashmap", + "datafusion-common", + "datafusion-common-runtime", + "datafusion-datasource", + "datafusion-execution", + "datafusion-expr", + "datafusion-physical-expr", + "datafusion-physical-plan", + "datafusion-session", + "futures", + "itertools 0.14.0", + "log", + "object_store", + "parking_lot", + "tokio", +] + +[[package]] +name = "datafusion-catalog-listing" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17e112307715d6a7a331111a4c2330ff54bc237183511c319e3708a4cff431fb" +dependencies = [ + "arrow", + "async-trait", + "datafusion-catalog", + "datafusion-common", + "datafusion-datasource", + "datafusion-execution", + "datafusion-expr", + "datafusion-physical-expr", + "datafusion-physical-expr-adapter", + "datafusion-physical-expr-common", + "datafusion-physical-plan", + "futures", + "itertools 0.14.0", + "log", + "object_store", +] + +[[package]] +name = "datafusion-common" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d72a11ca44a95e1081870d3abb80c717496e8a7acb467a1d3e932bb636af5cc2" +dependencies = [ + "ahash", + "arrow", + "arrow-ipc", + "chrono", + "half", + "hashbrown 0.16.1", + "indexmap 2.14.0", + "itertools 0.14.0", + "libc", + "log", + "object_store", + "parquet", + "paste", + "sqlparser", + "tokio", + "web-time", +] + +[[package]] +name = "datafusion-common-runtime" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89f4afaed29670ec4fd6053643adc749fe3f4bc9d1ce1b8c5679b22c67d12def" +dependencies = [ + "futures", + "log", + "tokio", +] + +[[package]] +name = "datafusion-datasource" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9fb386e1691355355a96419978a0022b7947b44d4a24a6ea99f00b6b485cbb6" +dependencies = [ + "arrow", + "async-trait", + "bytes", + "chrono", + "datafusion-common", + "datafusion-common-runtime", + "datafusion-execution", + "datafusion-expr", + "datafusion-physical-expr", + "datafusion-physical-expr-adapter", + "datafusion-physical-expr-common", + "datafusion-physical-plan", + "datafusion-session", + "futures", + "glob", + "itertools 0.14.0", + "log", + "object_store", + "rand 0.9.4", + "tokio", + "url", +] + +[[package]] +name = "datafusion-datasource-arrow" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffa6c52cfed0734c5f93754d1c0175f558175248bf686c944fb05c373e5fc096" +dependencies = [ + "arrow", + "arrow-ipc", + "async-trait", + "bytes", + "datafusion-common", + "datafusion-common-runtime", + "datafusion-datasource", + "datafusion-execution", + "datafusion-expr", + "datafusion-physical-expr-common", + "datafusion-physical-plan", + "datafusion-session", + "futures", + "itertools 0.14.0", + "object_store", + "tokio", +] + +[[package]] +name = "datafusion-datasource-csv" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503f29e0582c1fc189578d665ff57d9300da1f80c282777d7eb67bb79fb8cdca" +dependencies = [ + "arrow", + "async-trait", + "bytes", + "datafusion-common", + "datafusion-common-runtime", + "datafusion-datasource", + "datafusion-execution", + "datafusion-expr", + "datafusion-physical-expr-common", + "datafusion-physical-plan", + "datafusion-session", + "futures", + "object_store", + "regex", + "tokio", +] + +[[package]] +name = "datafusion-datasource-json" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33804749abc8d0c8cb7473228483cb8070e524c6f6086ee1b85a64debe2b3d2" +dependencies = [ + "arrow", + "async-trait", + "bytes", + "datafusion-common", + "datafusion-common-runtime", + "datafusion-datasource", + "datafusion-execution", + "datafusion-expr", + "datafusion-physical-expr-common", + "datafusion-physical-plan", + "datafusion-session", + "futures", + "object_store", + "serde_json", + "tokio", + "tokio-stream", +] + +[[package]] +name = "datafusion-datasource-parquet" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a8e0365e0e08e8ff94d912f0ababcf9065a1a304018ba90b1fc83c855b4997" +dependencies = [ + "arrow", + "async-trait", + "bytes", + "datafusion-common", + "datafusion-common-runtime", + "datafusion-datasource", + "datafusion-execution", + "datafusion-expr", + "datafusion-functions-aggregate-common", + "datafusion-physical-expr", + "datafusion-physical-expr-adapter", + "datafusion-physical-expr-common", + "datafusion-physical-plan", + "datafusion-pruning", + "datafusion-session", + "futures", + "itertools 0.14.0", + "log", + "object_store", + "parking_lot", + "parquet", + "tokio", +] + +[[package]] +name = "datafusion-doc" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de6ac0df1662b9148ad3c987978b32cbec7c772f199b1d53520c8fa764a87ee" + +[[package]] +name = "datafusion-execution" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c03c7fbdaefcca4ef6ffe425a5fc2325763bfb426599bb0bf4536466efabe709" +dependencies = [ + "arrow", + "arrow-buffer", + "async-trait", + "chrono", + "dashmap", + "datafusion-common", + "datafusion-expr", + "datafusion-physical-expr-common", + "futures", + "log", + "object_store", + "parking_lot", + "rand 0.9.4", + "tempfile", + "url", +] + +[[package]] +name = "datafusion-expr" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "574b9b6977fedbd2a611cbff12e5caf90f31640ad9dc5870f152836d94bad0dd" +dependencies = [ + "arrow", + "async-trait", + "chrono", + "datafusion-common", + "datafusion-doc", + "datafusion-expr-common", + "datafusion-functions-aggregate-common", + "datafusion-functions-window-common", + "datafusion-physical-expr-common", + "indexmap 2.14.0", + "itertools 0.14.0", + "paste", + "serde_json", + "sqlparser", +] + +[[package]] +name = "datafusion-expr-common" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d7c3adf3db8bf61e92eb90cb659c8e8b734593a8f7c8e12a843c7ddba24b87e" +dependencies = [ + "arrow", + "datafusion-common", + "indexmap 2.14.0", + "itertools 0.14.0", + "paste", +] + +[[package]] +name = "datafusion-ffi" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b95173344d04ba62755c949bf44f8d1a6e4414cf6392a635db96c07e711b9a3c" +dependencies = [ + "abi_stable", + "arrow", + "arrow-schema", + "async-ffi", + "async-trait", + "datafusion-catalog", + "datafusion-common", + "datafusion-datasource", + "datafusion-execution", + "datafusion-expr", + "datafusion-functions-aggregate-common", + "datafusion-physical-expr", + "datafusion-physical-expr-common", + "datafusion-physical-plan", + "datafusion-proto", + "datafusion-proto-common", + "datafusion-session", + "futures", + "log", + "prost", + "semver", + "tokio", +] + +[[package]] +name = "datafusion-functions" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28aa4e10384e782774b10e72aca4d93ef7b31aa653095d9d4536b0a3dbc51b6" +dependencies = [ + "arrow", + "arrow-buffer", + "base64 0.22.1", + "blake2", + "blake3", + "chrono", + "chrono-tz", + "datafusion-common", + "datafusion-doc", + "datafusion-execution", + "datafusion-expr", + "datafusion-expr-common", + "datafusion-macros", + "hex", + "itertools 0.14.0", + "log", + "md-5", + "memchr", + "num-traits", + "rand 0.9.4", + "regex", + "sha2", + "unicode-segmentation", + "uuid", +] + +[[package]] +name = "datafusion-functions-aggregate" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00aa6217e56098ba84e0a338176fe52f0a84cca398021512c6c8c5eff806d0ad" +dependencies = [ + "ahash", + "arrow", + "datafusion-common", + "datafusion-doc", + "datafusion-execution", + "datafusion-expr", + "datafusion-functions-aggregate-common", + "datafusion-macros", + "datafusion-physical-expr", + "datafusion-physical-expr-common", + "half", + "log", + "num-traits", + "paste", +] + +[[package]] +name = "datafusion-functions-aggregate-common" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b511250349407db7c43832ab2de63f5557b19a20dfd236b39ca2c04468b50d47" +dependencies = [ + "ahash", + "arrow", + "datafusion-common", + "datafusion-expr-common", + "datafusion-physical-expr-common", +] + +[[package]] +name = "datafusion-functions-nested" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef13a858e20d50f0a9bb5e96e7ac82b4e7597f247515bccca4fdd2992df0212a" +dependencies = [ + "arrow", + "arrow-ord", + "datafusion-common", + "datafusion-doc", + "datafusion-execution", + "datafusion-expr", + "datafusion-expr-common", + "datafusion-functions", + "datafusion-functions-aggregate", + "datafusion-functions-aggregate-common", + "datafusion-macros", + "datafusion-physical-expr-common", + "hashbrown 0.16.1", + "itertools 0.14.0", + "itoa", + "log", + "paste", +] + +[[package]] +name = "datafusion-functions-table" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b40d3f5bbb3905f9ccb1ce9485a9595c77b69758a7c24d3ba79e334ff51e7e" +dependencies = [ + "arrow", + "async-trait", + "datafusion-catalog", + "datafusion-common", + "datafusion-expr", + "datafusion-physical-plan", + "parking_lot", + "paste", +] + +[[package]] +name = "datafusion-functions-window" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e88ec9d57c9b685d02f58bfee7be62d72610430ddcedb82a08e5d9925dbfb6" +dependencies = [ + "arrow", + "datafusion-common", + "datafusion-doc", + "datafusion-expr", + "datafusion-functions-window-common", + "datafusion-macros", + "datafusion-physical-expr", + "datafusion-physical-expr-common", + "log", + "paste", +] + +[[package]] +name = "datafusion-functions-window-common" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8307bb93519b1a91913723a1130cfafeee3f72200d870d88e91a6fc5470ede5c" +dependencies = [ + "datafusion-common", + "datafusion-physical-expr-common", +] + +[[package]] +name = "datafusion-macros" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e367e6a71051d0ebdd29b2f85d12059b38b1d1f172c6906e80016da662226bd" +dependencies = [ + "datafusion-doc", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "datafusion-optimizer" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e929015451a67f77d9d8b727b2bf3a40c4445fdef6cdc53281d7d97c76888ace" +dependencies = [ + "arrow", + "chrono", + "datafusion-common", + "datafusion-expr", + "datafusion-expr-common", + "datafusion-physical-expr", + "indexmap 2.14.0", + "itertools 0.14.0", + "log", + "regex", + "regex-syntax", +] + +[[package]] +name = "datafusion-physical-expr" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b1e68aba7a4b350401cfdf25a3d6f989ad898a7410164afe9ca52080244cb59" +dependencies = [ + "ahash", + "arrow", + "datafusion-common", + "datafusion-expr", + "datafusion-expr-common", + "datafusion-functions-aggregate-common", + "datafusion-physical-expr-common", + "half", + "hashbrown 0.16.1", + "indexmap 2.14.0", + "itertools 0.14.0", + "parking_lot", + "paste", + "petgraph 0.8.3", + "tokio", +] + +[[package]] +name = "datafusion-physical-expr-adapter" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea22315f33cf2e0adc104e8ec42e285f6ed93998d565c65e82fec6a9ee9f9db4" +dependencies = [ + "arrow", + "datafusion-common", + "datafusion-expr", + "datafusion-functions", + "datafusion-physical-expr", + "datafusion-physical-expr-common", + "itertools 0.14.0", +] + +[[package]] +name = "datafusion-physical-expr-common" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b04b45ea8ad3ac2d78f2ea2a76053e06591c9629c7a603eda16c10649ecf4362" +dependencies = [ + "ahash", + "arrow", + "chrono", + "datafusion-common", + "datafusion-expr-common", + "hashbrown 0.16.1", + "indexmap 2.14.0", + "itertools 0.14.0", + "parking_lot", +] + +[[package]] +name = "datafusion-physical-optimizer" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cb13397809a425918f608dfe8653f332015a3e330004ab191b4404187238b95" +dependencies = [ + "arrow", + "datafusion-common", + "datafusion-execution", + "datafusion-expr", + "datafusion-expr-common", + "datafusion-physical-expr", + "datafusion-physical-expr-common", + "datafusion-physical-plan", + "datafusion-pruning", + "itertools 0.14.0", +] + +[[package]] +name = "datafusion-physical-plan" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5edc023675791af9d5fb4cc4c24abf5f7bd3bd4dcf9e5bd90ea1eff6976dcc79" +dependencies = [ + "ahash", + "arrow", + "arrow-ord", + "arrow-schema", + "async-trait", + "datafusion-common", + "datafusion-common-runtime", + "datafusion-execution", + "datafusion-expr", + "datafusion-functions", + "datafusion-functions-aggregate-common", + "datafusion-functions-window-common", + "datafusion-physical-expr", + "datafusion-physical-expr-common", + "futures", + "half", + "hashbrown 0.16.1", + "indexmap 2.14.0", + "itertools 0.14.0", + "log", + "num-traits", + "parking_lot", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "datafusion-proto" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a387aaef949dc16bb6abc81bd1af850ec7449183aef011214f9724957495738" +dependencies = [ + "arrow", + "chrono", + "datafusion-catalog", + "datafusion-catalog-listing", + "datafusion-common", + "datafusion-datasource", + "datafusion-datasource-arrow", + "datafusion-datasource-csv", + "datafusion-datasource-json", + "datafusion-datasource-parquet", + "datafusion-execution", + "datafusion-expr", + "datafusion-functions-table", + "datafusion-physical-expr", + "datafusion-physical-expr-common", + "datafusion-physical-plan", + "datafusion-proto-common", + "object_store", + "prost", + "rand 0.9.4", +] + +[[package]] +name = "datafusion-proto-common" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e614c7c53a9c304c6a850b821010bb492e57300311835f1180613f9d2c63d9" +dependencies = [ + "arrow", + "datafusion-common", + "prost", +] + +[[package]] +name = "datafusion-pruning" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac8c76860e355616555081cab5968cec1af7a80701ff374510860bcd567e365a" +dependencies = [ + "arrow", + "datafusion-common", + "datafusion-datasource", + "datafusion-expr-common", + "datafusion-physical-expr", + "datafusion-physical-expr-common", + "datafusion-physical-plan", + "itertools 0.14.0", + "log", +] + +[[package]] +name = "datafusion-session" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5412111aa48e2424ba926112e192f7a6b7e4ccb450145d25ce5ede9f19dc491e" +dependencies = [ + "async-trait", + "datafusion-common", + "datafusion-execution", + "datafusion-expr", + "datafusion-physical-plan", + "parking_lot", +] + +[[package]] +name = "datafusion-sql" +version = "53.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa0d133ddf8b9b3b872acac900157f783e7b879fe9a6bccf389abebbfac45ec1" +dependencies = [ + "arrow", + "bigdecimal", + "chrono", + "datafusion-common", + "datafusion-expr", + "datafusion-functions-nested", + "indexmap 2.14.0", + "log", + "regex", + "sqlparser", +] + +[[package]] +name = "defmt" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6e524506490a1953d237cb87b1cfc1e46f88c18f10a22dfe0f507dc6bfc7f7f" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0a27770e9c8f719a79d8b638281f4d828f77d8fd61e0bd94451b9b85e576a0b" +dependencies = [ + "defmt-parser", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.18", +] + +[[package]] +name = "deranged" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "devserver_lib" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edf215dbb8cb1409cca7645aaed35f9e39fb0a21855bba1ac48bc0334903bf66" + +[[package]] +name = "dify" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ce0fb972943b4e88cd03b8f92953df0c71bb05e0bde8e5b684895d808013cc" +dependencies = [ + "anyhow", + "colored", + "getopts", + "image", + "rayon", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "directories" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16f5094c54661b38d03bd7e50df373292118db60b585c08a411c6d840017fe7d" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.13.0", + "block2 0.6.2", + "libc", + "objc2 0.6.4", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dlib" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" +dependencies = [ + "libloading 0.8.9", +] + +[[package]] +name = "dna" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "itertools 0.14.0", + "rand 0.9.4", + "rerun", +] + +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" + +[[package]] +name = "dtoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "ecolor" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6758be723a3f298bbfda4db75748bc2ba0abafe096b6383c7c32da264764fbc3" +dependencies = [ + "bytemuck", + "color-hex", + "emath", + "serde", +] + +[[package]] +name = "econtext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18aade80d5e09429040243ce1143ddc08a92d7a22820ac512610410a4dd5214f" + +[[package]] +name = "eframe" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dc8234e2f681b2afd2b2e8c332fa614de2fddbdcb28d0acf5c420449682ea90" +dependencies = [ + "ahash", + "bytemuck", + "document-features", + "egui", + "egui-wgpu", + "egui-winit", + "egui_glow", + "egui_inspection", + "glutin", + "glutin-winit", + "home", + "image", + "js-sys", + "log", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", + "parking_lot", + "percent-encoding", + "pollster", + "profiling", + "raw-window-handle", + "ron", + "serde", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "web-time", + "wgpu", + "windows-sys 0.61.2", + "winit", +] + +[[package]] +name = "egui" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796c98d50b79631281d516343a6f6e93c0666462ca36e2c93b39f25d7793325" +dependencies = [ + "accesskit", + "ahash", + "backtrace", + "bitflags 2.13.0", + "emath", + "epaint", + "itertools 0.14.0", + "log", + "nohash-hasher", + "profiling", + "ron", + "serde", + "smallvec", + "unicode-segmentation", +] + +[[package]] +name = "egui-wgpu" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2e6cfac0725563555fa4f91e9f799b9d7c6c5dd831fca6abc8234afc64b7a34" +dependencies = [ + "ahash", + "bytemuck", + "document-features", + "egui", + "epaint", + "log", + "profiling", + "thiserror 2.0.18", + "type-map", + "web-time", + "wgpu", + "winit", +] + +[[package]] +name = "egui-winit" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea6bf3608db949588b95b8b341ee358d0c3f95cf4dc3f53d8d76717edee87db" +dependencies = [ + "accesskit_winit", + "arboard", + "bytemuck", + "egui", + "log", + "objc2 0.6.4", + "objc2-foundation 0.3.2", + "objc2-ui-kit 0.3.2", + "profiling", + "raw-window-handle", + "serde", + "smithay-clipboard", + "web-time", + "webbrowser", + "winit", +] + +[[package]] +name = "egui_animation" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4434e99040717912350c108ffe543ef68d34147691523fb726ae99adf0935b4" +dependencies = [ + "egui", + "hello_egui_utils", + "simple-easing", +] + +[[package]] +name = "egui_commonmark" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c833127228cc61cef806166adadc23572431fe2ea4cf753e60f654f82a2b3270" +dependencies = [ + "egui", + "egui_commonmark_backend", + "egui_extras", + "pulldown-cmark", +] + +[[package]] +name = "egui_commonmark_backend" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5758a1110eb8259743c9b220241c30ff014b2dec53c1a2b861d464e41fa3483e" +dependencies = [ + "egui", + "egui_extras", + "pulldown-cmark", +] + +[[package]] +name = "egui_dnd" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e40c74727cb2a7db02712604dbd293bb2a1dc8fa461e901612d280678fe56c" +dependencies = [ + "egui", + "egui_animation", + "simple-easing", + "web-time", +] + +[[package]] +name = "egui_extras" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2bd33be7338367bf21f54d62e069d58a5fb3ae033fa8bc6df7a77b9ef4cf957" +dependencies = [ + "ahash", + "egui", + "ehttp", + "enum-map", + "image", + "itertools 0.14.0", + "log", + "mime_guess2", + "profiling", + "resvg", + "serde", +] + +[[package]] +name = "egui_glow" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52274b9bfb8d8e252cd0f00c9f6214f360d75a0962baa77a2d62ddb002fe99d4" +dependencies = [ + "bytemuck", + "egui", + "glow", + "log", + "memoffset", + "profiling", + "winit", +] + +[[package]] +name = "egui_inspection" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16f113bb82ab665fce1af4da8941412e7991c9245c043bf1e14412089253735" +dependencies = [ + "egui", + "image", + "log", + "rmp-serde", + "serde", + "serde_bytes", +] + +[[package]] +name = "egui_kittest" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "002c31e1f41461ce206333ffbd2e07563b79e87eb71c27e026151d12ee7b78e0" +dependencies = [ + "dify", + "eframe", + "egui", + "egui-wgpu", + "image", + "kittest", + "log", + "open", + "pollster", + "serde", + "tempfile", + "toml", + "wgpu", +] + +[[package]] +name = "egui_mcp" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5cd8ea7142ea6a93fdaac2ba44b34f93352e0fa2800719d5d55389947c2e31" +dependencies = [ + "accesskit", + "accesskit_consumer 0.37.0", + "base64 0.22.1", + "egui", + "egui_inspection", + "rmcp", + "schemars 1.2.1", + "serde", + "serde_json", + "tokio", + "tracing-subscriber", +] + +[[package]] +name = "egui_plot" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "302515219c63e7f380058ecc899c5a6b2c5fe9f140ef1d91c3b685c9f0355fa3" +dependencies = [ + "ahash", + "egui", + "emath", +] + +[[package]] +name = "egui_table" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "243d2531d1008c778a5b78d5b46858f70e78229d518885824af40fa673e44a63" +dependencies = [ + "egui", + "serde", + "vec1", +] + +[[package]] +name = "egui_tiles" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eb8fef6130bd04fcb7bb3584845605e57c56fed249bc3ca5a568e696cc0a174" +dependencies = [ + "ahash", + "egui", + "itertools 0.14.0", + "log", + "serde", +] + +[[package]] +name = "ehttp" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2f1b93eb2e039aaff63ce07cca59bd1dca02f2ce30075a17b619d2c42f56efc" +dependencies = [ + "async-channel", + "document-features", + "futures-util", + "js-sys", + "serde", + "serde_json", + "ureq 3.3.0", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "emath" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd4ec073c9898516584d8c6cfdcee95b530b3d941cd5031ef4050aa36812308b" +dependencies = [ + "bytemuck", + "serde", +] + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "endi" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" + +[[package]] +name = "enum-map" +version = "2.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" +dependencies = [ + "enum-map-derive", + "serde", +] + +[[package]] +name = "enum-map-derive" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "enumn" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "enumset" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "839c4174b41e75c8f7306110b2c51996a293b8d1d850edd529011841d9fede7d" +dependencies = [ + "enumset_derive", +] + +[[package]] +name = "enumset_derive" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd536557b58c682b217b8fb199afdff47cd3eff260623f19e77074eb073d63a" +dependencies = [ + "darling 0.21.3", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "env_filter" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" +dependencies = [ + "log", +] + +[[package]] +name = "epaint" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e60a8888b51da911df23918fd7301359b1d43a406a0ff3b8863af093dd7fc6c" +dependencies = [ + "ahash", + "bytemuck", + "ecolor", + "emath", + "epaint_default_fonts", + "font-types", + "harfrust", + "log", + "nohash-hasher", + "parking_lot", + "profiling", + "rayon", + "self_cell", + "serde", + "skrifa", + "smallvec", + "unicode-general-category", + "unicode-segmentation", + "vello_cpu", +] + +[[package]] +name = "epaint_default_fonts" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13ee4e1f553a3584c301f3a56ff1a775f1384781396cea301c8d952e9b93f560" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "error-code" +version = "3.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" + +[[package]] +name = "ethnum" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40404c3f5f511ec4da6fe866ddf6a717c309fdbb69fbbad7b0f3edab8f2e835f" + +[[package]] +name = "euclid" +version = "0.22.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06" +dependencies = [ + "num-traits", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "extend_viewer_ui" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "mimalloc", + "rerun", +] + +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fast-float2" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8eb564c5c7423d25c886fb561d1e4ee69f72354d16918afa32c08811f6b6a55" + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "fearless_simd" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97b65636e5b9ef369943878ac74335ba1c55c1cb6adbf1e2c293c624248d693" + +[[package]] +name = "ffmpeg-sidecar" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126522985748cb6a56a966037c3d86d94414be7a01d7749eccf71f7290f6eacd" +dependencies = [ + "anyhow", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0399f9d26e5191ce32c498bebd31e7a3ceabc2745f0ac54af3f335126c3f24b3" + +[[package]] +name = "fixed" +version = "1.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c566da967934c6c7ee0458a9773de9b2a685bd2ce26a3b28ddfc740e640182f5" +dependencies = [ + "az", + "bytemuck", + "half", + "serde", + "typenum", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "fjadra" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1671b620ba6e60c11c62b0ea5fec4f8621991e7b1229fa13c010a2cd04e4342" + +[[package]] +name = "flatbuffers" +version = "25.12.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35f6839d7b3b98adde531effaf34f0c2badc6f4735d26fe74709d8e513a96ef3" +dependencies = [ + "bitflags 2.13.0", + "rustc_version", +] + +[[package]] +name = "flate2" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" +dependencies = [ + "crc32fast", + "libz-rs-sys", + "miniz_oxide", +] + +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "font-types" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b38ad915f6dadd993ced50848a8291a543bd41ca62bc10740d5e64e2ab4cfd7" +dependencies = [ + "bytemuck", + "serde", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "four-cc" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "795cbfc56d419a7ce47ccbb7504dd9a5b7c484c083c356e797de08bd988d9629" + +[[package]] +name = "fsevent-sys" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" +dependencies = [ + "libc", +] + +[[package]] +name = "fsst" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7af6e24ed12cf382082d5a7f365df2b8e3d6b1518f615d54c85165e9b9718250" +dependencies = [ + "arrow-array", + "rand 0.9.4", +] + +[[package]] +name = "fst" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ab85b9b05e3978cc9a9cf8fea7f01b494e1a09ed3037e16ba39edc7a29eb61a" +dependencies = [ + "utf8-ranges", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generational-arena" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877e94aff08e743b651baaea359664321055749b398adff8740a7399af7796e7" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "generator" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f04ae4152da20c76fe800fa48659201d5cf627c5149ca0b707b69d7eef6cf9" +dependencies = [ + "cc", + "cfg-if", + "libc", + "log", + "rustversion", + "windows-link", + "windows-result", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "geo-types" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24f8647af4005fa11da47cd56252c6ef030be8fa97bdbf355e7dfb6348f0a82c" +dependencies = [ + "approx", + "num-traits", + "serde", +] + +[[package]] +name = "gethostname" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" +dependencies = [ + "libc", + "windows-targets 0.48.5", +] + +[[package]] +name = "getopts" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cba6ae63eb948698e300f645f87c70f76630d505f23b8907cf1e193ee85048c1" +dependencies = [ + "unicode-width 0.2.2", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 5.3.0", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "wasip2", + "wasip3", +] + +[[package]] +name = "gilrs" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fa85c2e35dc565c90511917897ea4eae16b77f2773d5223536f7b602536d462" +dependencies = [ + "fnv", + "gilrs-core", + "log", + "uuid", + "vec_map", +] + +[[package]] +name = "gilrs-core" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d23f2cc5144060a7f8d9e02d3fce5d06705376568256a509cdbc3c24d47e4f04" +dependencies = [ + "inotify", + "js-sys", + "libc", + "libudev-sys", + "log", + "nix", + "objc2-core-foundation", + "objc2-io-kit", + "uuid", + "vec_map", + "wasm-bindgen", + "web-sys", + "windows", +] + +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" +dependencies = [ + "fallible-iterator", + "indexmap 2.14.0", + "stable_deref_trait", +] + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glam" +version = "0.30.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19fc433e8437a212d1b6f1e68c7824af3aed907da60afa994e7f542d18d12aa9" +dependencies = [ + "bytemuck", + "serde_core", +] + +[[package]] +name = "glifo" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d99fc21d493812643aae86d53b7bbd02f376434a90317e8a790bc209fdd6605e" +dependencies = [ + "bytemuck", + "foldhash 0.2.0", + "hashbrown 0.17.1", + "log", + "peniko", + "skrifa", + "smallvec", + "vello_common", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "globset" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "glow" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29038e1c483364cc6bb3cf78feee1816002e127c331a1eec55a4d202b9e1adb5" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gltf" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ce1918195723ce6ac74e80542c5a96a40c2b26162c1957a5cd70799b8cacf7" +dependencies = [ + "base64 0.13.1", + "byteorder", + "gltf-json", + "image", + "lazy_static", + "serde_json", + "urlencoding", +] + +[[package]] +name = "gltf-derive" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14070e711538afba5d6c807edb74bcb84e5dbb9211a3bf5dea0dfab5b24f4c51" +dependencies = [ + "inflections", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "gltf-json" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6176f9d60a7eab0a877e8e96548605dedbde9190a7ae1e80bbcc1c9af03ab14" +dependencies = [ + "gltf-derive", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "glutin" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12124de845cacfebedff80e877bb37b5b75c34c5a4c89e47e1cdd67fb6041325" +dependencies = [ + "bitflags 2.13.0", + "cfg_aliases", + "cgl", + "dispatch2", + "glutin_egl_sys", + "glutin_glx_sys", + "glutin_wgl_sys", + "libloading 0.8.9", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "once_cell", + "raw-window-handle", + "wayland-sys", + "windows-sys 0.52.0", + "x11-dl", +] + +[[package]] +name = "glutin-winit" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85edca7075f8fc728f28cb8fbb111a96c3b89e930574369e3e9c27eb75d3788f" +dependencies = [ + "cfg_aliases", + "glutin", + "raw-window-handle", + "winit", +] + +[[package]] +name = "glutin_egl_sys" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c4680ba6195f424febdc3ba46e7a42a0e58743f2edb115297b86d7f8ecc02d2" +dependencies = [ + "gl_generator", + "windows-sys 0.52.0", +] + +[[package]] +name = "glutin_glx_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7bb2938045a88b612499fbcba375a77198e01306f52272e692f8c1f3751185" +dependencies = [ + "gl_generator", + "x11-dl", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "gpu-allocator" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51255ea7cfaadb6c5f1528d43e92a82acb2b96c43365989a28b2d44ee38f8795" +dependencies = [ + "ash", + "hashbrown 0.16.1", + "log", + "presser", + "thiserror 2.0.18", + "windows", +] + +[[package]] +name = "gpu-descriptor" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" +dependencies = [ + "bitflags 2.13.0", + "gpu-descriptor-types", + "hashbrown 0.15.5", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" +dependencies = [ + "bitflags 2.13.0", +] + +[[package]] +name = "graph_lattice" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "rerun", +] + +[[package]] +name = "guillotiere" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b17e70c989c36bad147b27a58d148c0741c51448aa5653436547323e524d0ab" +dependencies = [ + "euclid", +] + +[[package]] +name = "h2" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.14.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h264-reader" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "036a78b2620d92f0ec57690bc792b3bb87348632ee5225302ba2e66a48021c6c" +dependencies = [ + "bitstream-io", + "hex-slice", + "log", + "memchr", + "rfc6381-codec", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "bytemuck", + "cfg-if", + "crunchy", + "num-traits", + "zerocopy 0.8.27", +] + +[[package]] +name = "harfrust" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0431e8e389aa0f1e72bb9d1c2db8957a1a7a3580e8ed97db819c14837aac9b3e" +dependencies = [ + "bitflags 2.13.0", + "bytemuck", + "read-fonts", + "smallvec", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", + "serde", + "serde_core", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hello_egui_utils" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e31f814d47d37c03981b24094192586560fbe490c0b4ae94e808bdf076610b6" +dependencies = [ + "concat-idents", + "egui", +] + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex-slice" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5491a308e0214554f07a81d8944abe45f552871c12e3c3c6e7e5d354039a6c4c" + +[[package]] +name = "hexasphere" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29a164ceff4500f2a72b1d21beaa8aa8ad83aec2b641844c659b190cb3ea2e0b" +dependencies = [ + "constgebra", + "glam", + "tinyvec", +] + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "http" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "http-cache" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1437561a949a2168929d7559aecd2f0ecb18b9e676080396388cdc399ddb723a" +dependencies = [ + "async-trait", + "bincode", + "cacache", + "http", + "http-cache-semantics", + "httpdate", + "serde", + "url", +] + +[[package]] +name = "http-cache-reqwest" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccca775a066b2a65da33611921e078ebdcfc27065c8bee96794703541101886" +dependencies = [ + "anyhow", + "async-trait", + "http", + "http-cache", + "http-cache-semantics", + "reqwest", + "reqwest-middleware", + "serde", + "url", +] + +[[package]] +name = "http-cache-semantics" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92baf25cf0b8c9246baecf3a444546360a97b569168fdf92563ee6a47829920c" +dependencies = [ + "http", + "http-serde", + "serde", + "time", +] + +[[package]] +name = "http-serde" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f056c8559e3757392c8d091e796416e4649d8e49e88b8d76df6c002f05027fd" +dependencies = [ + "http", + "serde", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "humantime" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" + +[[package]] +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-native-certs", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots 1.0.2", +] + +[[package]] +name = "hyper-timeout" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +dependencies = [ + "hyper", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2 0.6.4", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "hyperloglogplus" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "621debdf94dcac33e50475fdd76d34d5ea9c0362a834b9db08c3024696c1fbe3" +dependencies = [ + "serde", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5a396343c7208121dc86e35623d3dfe19814a7613cfd14964994cdc9c9a2e26" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_locale_data", + "icu_provider", + "potential_utf", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "serde", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locale_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fdcc9ac77c6d74ff5cf6e65ef3181d6af32003b16fce3a77fb451d2f695993" + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "serde", + "stable_deref_trait", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_segmenter" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c0794db0b1a86193ac9c48768d0e6c52c54448e0870ad87907d456ee0dac964" +dependencies = [ + "icu_collections", + "icu_locale", + "icu_provider", + "icu_segmenter_data", + "potential_utf", + "utf8_iter", + "zerovec", +] + +[[package]] +name = "icu_segmenter_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a2c462a4d927d512f5f882a033ddd62f33a05bb9f230d98f736ac3dc85938f" + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" +dependencies = [ + "rayon", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "image" +version = "0.25.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" +dependencies = [ + "bytemuck", + "byteorder-lite", + "num-traits", + "png", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "imagesize" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" + +[[package]] +name = "incremental_logging" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "clap", + "rand 0.9.4", + "rerun", +] + +[[package]] +name = "indent" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f1a0777d972970f204fdf8ef319f1f4f8459131636d7e3c96c5d59570d0fa6" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "indicatif" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25470f23803092da7d239834776d653104d551bc4d7eacaf31e6837854b8e9eb" +dependencies = [ + "console 0.16.1", + "portable-atomic", + "unicode-width 0.2.2", + "unit-prefix", + "web-time", +] + +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + +[[package]] +name = "inflections" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a" + +[[package]] +name = "inotify" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" +dependencies = [ + "bitflags 2.13.0", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + +[[package]] +name = "insta" +version = "1.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f0f8fee8c926415c58d6ae43a08523a26faccb2323f5e6b644fe7dd4ef6b82" +dependencies = [ + "console 0.16.1", + "globset", + "once_cell", + "pest", + "pest_derive", + "regex", + "serde", + "similar", + "strip-ansi-escapes", + "tempfile", + "walkdir", +] + +[[package]] +name = "integer-encoding" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" + +[[package]] +name = "io-uring" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d09b98f7eace8982db770e4408e7470b028ce513ac28fecdc6bf4c30fe92b62" +dependencies = [ + "bitflags 2.13.0", + "cfg-if", + "libc", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jiff" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34f877a98676d2fb664698d74cc6a51ce6c484ce8c770f05d0108ec9090aeb46" +dependencies = [ + "defmt", + "jiff-static", + "jiff-tzdb-platform", + "js-sys", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "jiff-static" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0666b5ab5ecaca213fc2a85b8c0083d9004e84ee2d5f9a7e0017aaf50986f25f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "jiff-tzdb" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1283705eb0a21404d2bfd6eef2a7593d240bc42a0bdb39db0ad6fa2ec026524" + +[[package]] +name = "jiff-tzdb-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" +dependencies = [ + "jiff-tzdb", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.0", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys 0.4.1", + "log", + "simd_cesu8", + "thiserror 2.0.18", + "walkdir", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn 2.0.117", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "jpeg-decoder" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" + +[[package]] +name = "js-sys" +version = "0.3.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" +dependencies = [ + "cfg-if", + "futures-util", + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "jsonb" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a452366d21e8d3cbca680c41388e01d6a88739afef7877961946a6da409f9ccd" +dependencies = [ + "byteorder", + "ethnum", + "fast-float2", + "itoa", + "jiff", + "nom", + "num-traits", + "ordered-float 5.3.0", + "rand 0.9.4", + "ryu", + "serde", + "serde_json", +] + +[[package]] +name = "jsonwebtoken" +version = "10.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eba32bfb4ffdeaca3e34431072faf01745c9b26d25504aa7a6cf5684334fc4fc" +dependencies = [ + "base64 0.22.1", + "getrandom 0.2.17", + "js-sys", + "serde", + "serde_json", + "signature", + "zeroize", +] + +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading 0.8.9", + "pkg-config", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "kittest" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ceaa75eb0036a32b6b9833962eb18137449e9817e2e586006471925b727fd5" +dependencies = [ + "accesskit", + "accesskit_consumer 0.35.0", +] + +[[package]] +name = "konst" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" +dependencies = [ + "konst_macro_rules", +] + +[[package]] +name = "konst_macro_rules" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" + +[[package]] +name = "kqueue" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" +dependencies = [ + "kqueue-sys", + "libc", +] + +[[package]] +name = "kqueue-sys" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +dependencies = [ + "bitflags 1.3.2", + "libc", +] + +[[package]] +name = "kurbo" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1077d333efea6170d9ccb96d3c3026f300ca0773da4938cc4c811daa6df68b0c" +dependencies = [ + "arrayvec", + "smallvec", +] + +[[package]] +name = "kurbo" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b60dfc32f652b926df6192e55525b16d186c69d47876c3ead4da5cc9f8450e2" +dependencies = [ + "arrayvec", + "euclid", + "polycool", + "smallvec", +] + +[[package]] +name = "lance" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2122e9f5f5f4b38bb9f0c4991c8d5171696402b3cc6187885c8385875f6df2e" +dependencies = [ + "arc-swap", + "arrow", + "arrow-arith", + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-ipc", + "arrow-ord", + "arrow-row", + "arrow-schema", + "arrow-select", + "async-recursion", + "async-trait", + "async_cell", + "bitpacking", + "byteorder", + "bytes", + "chrono", + "crossbeam-queue", + "crossbeam-skiplist", + "dashmap", + "datafusion", + "datafusion-expr", + "datafusion-functions", + "datafusion-physical-expr", + "datafusion-physical-plan", + "either", + "fst", + "futures", + "half", + "humantime", + "itertools 0.13.0", + "lance-arrow", + "lance-core", + "lance-datafusion", + "lance-encoding", + "lance-file", + "lance-index", + "lance-io", + "lance-linalg", + "lance-namespace", + "lance-select", + "lance-table", + "lance-tokenizer", + "log", + "moka", + "object_store", + "permutation", + "pin-project", + "prost", + "prost-build", + "prost-types", + "rand 0.9.4", + "rayon", + "roaring", + "rustc-hash 2.1.1", + "semver", + "serde", + "serde_json", + "snafu", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", + "url", + "uuid", +] + +[[package]] +name = "lance-arrow" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95f45fb7e0822cc0233d686222ab451f6ec58879620029e0b7bae8192c2f7c7e" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-ipc", + "arrow-ord", + "arrow-schema", + "arrow-select", + "bytes", + "futures", + "getrandom 0.2.17", + "half", + "jsonb", + "num-traits", + "rand 0.9.4", +] + +[[package]] +name = "lance-arrow-scalar" +version = "58.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771f68b04b47f3addf781116f65061808de94b05e1e9411c23c18f32d14ebe79" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-data", + "arrow-row", + "arrow-schema", + "half", +] + +[[package]] +name = "lance-arrow-stats" +version = "58.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd47ec33c90bf29f688fd02118e37d3a5ad5c339caa3163f89e417dc0867001f" +dependencies = [ + "arrow-array", + "arrow-schema", + "half", + "lance-arrow-scalar", +] + +[[package]] +name = "lance-bitpacking" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56c21a39860ca7bae712b4e24b9fd066029c570a72428a579faf697de5b8822" +dependencies = [ + "arrayref", + "paste", + "seq-macro", +] + +[[package]] +name = "lance-core" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ccc7b0b61c11bdb74f929111214553b36b1ee43c88445edda17bc9a2bda75e9" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "async-trait", + "byteorder", + "bytes", + "datafusion-common", + "datafusion-sql", + "futures", + "itertools 0.13.0", + "lance-arrow", + "lance-derive", + "libc", + "libm", + "log", + "moka", + "num_cpus", + "object_store", + "pin-project", + "prost", + "rand 0.9.4", + "roaring", + "serde_json", + "snafu", + "tempfile", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", + "twox-hash", + "url", +] + +[[package]] +name = "lance-datafusion" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0932140306faa6c3c4e17f0478c031e2be659ea2721311a530fb7c664e1b9a0" +dependencies = [ + "arrow", + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-ord", + "arrow-schema", + "arrow-select", + "async-trait", + "chrono", + "datafusion", + "datafusion-common", + "datafusion-functions", + "datafusion-physical-expr", + "futures", + "jsonb", + "lance-arrow", + "lance-core", + "lance-datagen", + "log", + "pin-project", + "prost", + "prost-build", + "tokio", + "tracing", +] + +[[package]] +name = "lance-datagen" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "075c8154e6b27ff6859f90886efd8cbac348cca255c8b855da630994b4fed714" +dependencies = [ + "arrow", + "arrow-array", + "arrow-cast", + "arrow-schema", + "chrono", + "futures", + "half", + "hex", + "rand 0.9.4", + "rand_distr", + "rand_xoshiro", +] + +[[package]] +name = "lance-derive" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7056da2e742fd466f6bdfaa876c91d3e0e99bb4f756be058e374ceae2630ec2f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "lance-encoding" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e165c668ae61fce336d5f6f9a999ee99b963bb395a3fb818737c533fc9528d1" +dependencies = [ + "arrow-arith", + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-data", + "arrow-schema", + "arrow-select", + "bytemuck", + "byteorder", + "bytes", + "fsst", + "futures", + "hex", + "hyperloglogplus", + "itertools 0.13.0", + "lance-arrow", + "lance-bitpacking", + "lance-core", + "log", + "lz4", + "num-traits", + "prost", + "prost-build", + "rand 0.9.4", + "strum", + "tokio", + "tracing", + "xxhash-rust", + "zstd", +] + +[[package]] +name = "lance-file" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1691bd5c37bc5e07bde00e32950b5526c2e5653bd2493a3773712574366a37a1" +dependencies = [ + "arrow-arith", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", + "async-recursion", + "async-trait", + "byteorder", + "bytes", + "datafusion-common", + "futures", + "lance-arrow", + "lance-core", + "lance-encoding", + "lance-io", + "log", + "num-traits", + "object_store", + "prost", + "prost-build", + "prost-types", + "tokio", + "tracing", +] + +[[package]] +name = "lance-index" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4792b56f0e047eed706d05a1eedc5f549090913fb4527585bb3a331b83416b" +dependencies = [ + "arc-swap", + "arrow", + "arrow-arith", + "arrow-array", + "arrow-ord", + "arrow-schema", + "arrow-select", + "async-channel", + "async-recursion", + "async-trait", + "bitpacking", + "bitvec", + "bytes", + "chrono", + "crossbeam-queue", + "datafusion", + "datafusion-common", + "datafusion-expr", + "datafusion-physical-expr", + "dirs", + "fst", + "futures", + "half", + "itertools 0.13.0", + "jsonb", + "lance-arrow", + "lance-arrow-stats", + "lance-core", + "lance-datafusion", + "lance-datagen", + "lance-encoding", + "lance-file", + "lance-io", + "lance-linalg", + "lance-select", + "lance-table", + "lance-tokenizer", + "libsais-rs", + "log", + "ndarray", + "num-traits", + "object_store", + "prost", + "prost-build", + "prost-types", + "rand 0.9.4", + "rand_distr", + "rangemap", + "rayon", + "regex-syntax", + "roaring", + "serde", + "serde_json", + "smallvec", + "tempfile", + "tokio", + "tracing", + "uuid", +] + +[[package]] +name = "lance-io" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c81dda99d5b8c8741f413d65650a28ff203d94eda3cbbdda6fd3af3ea9b2a69" +dependencies = [ + "arrow", + "arrow-arith", + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-data", + "arrow-schema", + "arrow-select", + "async-recursion", + "async-trait", + "byteorder", + "bytes", + "chrono", + "futures", + "http", + "io-uring", + "lance-arrow", + "lance-core", + "lance-namespace", + "log", + "moka", + "object_store", + "path_abs", + "pin-project", + "prost", + "rand 0.9.4", + "serde", + "tempfile", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "lance-linalg" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c0a8d2a2bc7e6b6229abe320ec6d9e2049a0e65e084684cba01cf032fc71896" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-schema", + "cc", + "half", + "lance-arrow", + "lance-core", + "num-traits", + "rand 0.9.4", +] + +[[package]] +name = "lance-namespace" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ee2d75929caec41747e58ce090b1a061b650a16cb10d09998128d7912203b1d" +dependencies = [ + "arrow", + "async-trait", + "bytes", + "lance-core", + "lance-namespace-reqwest-client", + "snafu", +] + +[[package]] +name = "lance-namespace-reqwest-client" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3f0a235e3ed5f8805205649ccc7d7d0f3df23ce1294242c9265ad488d7f19d" +dependencies = [ + "reqwest", + "serde", + "serde_json", + "serde_repr", + "serde_with", + "url", +] + +[[package]] +name = "lance-select" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf3a2162385a4392376ed7a732e070afd1432bb6f86b0ebcb7c4304c7196953b" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-schema", + "byteorder", + "bytes", + "itertools 0.13.0", + "lance-core", + "roaring", + "tracing", +] + +[[package]] +name = "lance-table" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73da3932a85489e80d5458d4bbc1d340e15c72b89bab529723f575d4d8fda5eb" +dependencies = [ + "arrow", + "arrow-array", + "arrow-buffer", + "arrow-ipc", + "arrow-schema", + "async-trait", + "byteorder", + "bytes", + "chrono", + "futures", + "lance-arrow", + "lance-core", + "lance-file", + "lance-io", + "lance-select", + "log", + "object_store", + "prost", + "prost-build", + "prost-types", + "rand 0.9.4", + "rangemap", + "roaring", + "semver", + "serde", + "serde_json", + "snafu", + "tokio", + "tracing", + "url", + "uuid", +] + +[[package]] +name = "lance-tokenizer" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16326f6b6d3b736aac40a0ffa78d8aa17d3a53a3766cd0af6d23db87472bd5e" +dependencies = [ + "icu_segmenter", + "rust-stemmers", + "serde", + "stop-words", + "unicode-normalization", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "lenses" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "arrow", + "rerun", +] + +[[package]] +name = "lexical-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8d125a277f807e55a77304455eb7b1cb52f2b18c143b60e766c120bd64a594" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a9f232fbd6f550bc0137dcb5f99ab674071ac2d690ac69704593cb4abbea56" +dependencies = [ + "lexical-parse-integer", + "lexical-util", +] + +[[package]] +name = "lexical-parse-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a7a039f8fb9c19c996cd7b2fcce303c1b2874fe1aca544edc85c4a5f8489b34" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "lexical-util" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" + +[[package]] +name = "lexical-write-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" +dependencies = [ + "lexical-util", + "lexical-write-integer", +] + +[[package]] +name = "lexical-write-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link", +] + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "libmimalloc-sys" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "667f4fec20f29dfc6bc7357c582d91796c169ad7e2fce709468aefeb2c099870" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "libredox" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1580801010e535496706ba011c15f8532df6b42297d2e471fec38ceadd8c0638" +dependencies = [ + "bitflags 2.13.0", + "libc", + "redox_syscall 0.5.18", +] + +[[package]] +name = "libsais-rs" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40fe164dbd47ea0c20e78a121c980ef673326905f1d4fba55e3645a20ef6717f" +dependencies = [ + "rayon", +] + +[[package]] +name = "libudev-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "libz-rs-sys" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "840db8cf39d9ec4dd794376f38acc40d0fc65eec2a8f484f7fd375b84602becd" +dependencies = [ + "zlib-rs", +] + +[[package]] +name = "linebender_resource_handle" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a5ff6bcca6c4867b1c4fd4ef63e4db7436ef363e0ad7531d1558856bae64f4" + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", + "serde", +] + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "log-once" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d8a05e3879b317b1b6dbf353e5bba7062bedcc59815267bb23eaa0c576cebf0" +dependencies = [ + "log", +] + +[[package]] +name = "log_benchmark" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "clap", + "emath", + "glam", + "itertools 0.14.0", + "rand 0.9.4", + "re_tracing", + "rerun", +] + +[[package]] +name = "log_file" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "clap", + "rerun", +] + +[[package]] +name = "logos" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb2c55a318a87600ea870ff8c2012148b44bf18b74fad48d0f835c38c7d07c5f" +dependencies = [ + "logos-derive", +] + +[[package]] +name = "logos-codegen" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58b3ffaa284e1350d017a57d04ada118c4583cf260c8fb01e0fe28a2e9cf8970" +dependencies = [ + "fnv", + "proc-macro2", + "quote", + "regex-automata", + "regex-syntax", + "syn 2.0.117", +] + +[[package]] +name = "logos-derive" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52d3a9855747c17eaf4383823f135220716ab49bea5fbea7dd42cc9a92f8aa31" +dependencies = [ + "logos-codegen", +] + +[[package]] +name = "loom" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "lru" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a860605968fce16869fd239cf4237a82f3ac470723415db603b0e8b6c8d4fb9" +dependencies = [ + "hashbrown 0.17.1", +] + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "lz4" +version = "1.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a20b523e860d03443e98350ceaac5e71c6ba89aea7d960769ec3ce37f4de5af4" +dependencies = [ + "lz4-sys", +] + +[[package]] +name = "lz4-sys" +version = "1.11.1+lz4-1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "lz4_flex" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db9a0d582c2874f68138a16ce1867e0ffde6c0bb0a0df85e1f36d04146db488a" +dependencies = [ + "twox-hash", +] + +[[package]] +name = "macaw" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c96b82556b0d4aa25cd4771b64ef9bde7c120afb588a083fcb242bf01e4a09b" +dependencies = [ + "glam", + "num-traits", + "serde", +] + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + +[[package]] +name = "matrixmultiply" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" +dependencies = [ + "autocfg", + "num_cpus", + "once_cell", + "rawpointer", + "thread-tree", +] + +[[package]] +name = "mcap" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b215e79631de2a19ed76fda13cd52950c3057b487a2f41d9dc85c4079b969c40" +dependencies = [ + "bimap", + "binrw", + "byteorder", + "crc32fast", + "enumset", + "log", + "lz4", + "num_cpus", + "paste", + "static_assertions", + "thiserror 2.0.18", + "zstd", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memmap2" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memory-stats" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c73f5c649995a115e1a0220b35e4df0a1294500477f97a91d0660fb5abeb574a" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "miette" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59bb584eaeeab6bd0226ccf3509a69d7936d148cf3d036ad350abe35e8c6856e" +dependencies = [ + "miette-derive", + "once_cell", + "thiserror 1.0.69", + "unicode-width 0.1.14", +] + +[[package]] +name = "miette-derive" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "mimalloc" +version = "0.1.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1ee66a4b64c74f4ef288bcbb9192ad9c3feaad75193129ac8509af543894fd8" +dependencies = [ + "libmimalloc-sys", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "mime_guess2" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1706dc14a2e140dec0a7a07109d9a3d5890b81e85bd6c60b906b249a77adf0ca" +dependencies = [ + "mime", + "phf 0.11.3", + "phf_shared 0.11.3", + "unicase", +] + +[[package]] +name = "minicov" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4869b6a491569605d66d3952bcdf03df789e5b536e5f0cf7758a7f08a55ae24d" +dependencies = [ + "cc", + "walkdir", +] + +[[package]] +name = "minidom-14" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0233972f8e82ae98ec4e9fd6daa3f6e29c2732c55b3626e9a3bde856e986345c" +dependencies = [ + "quick-xml 0.36.2", +] + +[[package]] +name = "minimal" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "rerun", +] + +[[package]] +name = "minimal_options" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "clap", + "glam", + "rerun", +] + +[[package]] +name = "minimal_serve" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "rerun", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mint" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff" + +[[package]] +name = "mio" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "moka" +version = "0.12.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8261cd88c312e0004c1d51baad2980c66528dfdb2bee62003e643a4d8f86b077" +dependencies = [ + "async-lock", + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "equivalent", + "event-listener", + "futures-util", + "parking_lot", + "portable-atomic", + "rustc_version", + "smallvec", + "tagptr", + "uuid", +] + +[[package]] +name = "mp4ra-rust" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdbc3d3867085d66ac6270482e66f3dd2c5a18451a3dc9ad7269e94844a536b7" +dependencies = [ + "four-cc", +] + +[[package]] +name = "mpeg4-audio-const" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96a1fe2275b68991faded2c80aa4a33dba398b77d276038b8f50701a22e55918" + +[[package]] +name = "multimap" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" + +[[package]] +name = "naga" +version = "29.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd91265cc2454558f659b3b4b9640f0ddb8cc6521277f166b8a8c181c898079" +dependencies = [ + "arrayvec", + "bit-set", + "bitflags 2.13.0", + "cfg-if", + "cfg_aliases", + "codespan-reporting", + "half", + "hashbrown 0.16.1", + "hexf-parse", + "indexmap 2.14.0", + "libm", + "log", + "num-traits", + "once_cell", + "rustc-hash 1.1.0", + "spirv", + "thiserror 2.0.18", + "unicode-ident", +] + +[[package]] +name = "nasm-rs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12fcfa1bd49e0342ec1d07ed2be83b59963e7acbeb9310e1bb2c07b69dadd959" +dependencies = [ + "jobserver", +] + +[[package]] +name = "natord" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308d96db8debc727c3fd9744aac51751243420e46edf401010908da7f8d5e57c" + +[[package]] +name = "ndarray" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841" +dependencies = [ + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "portable-atomic", + "portable-atomic-util", + "rawpointer", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.13.0", + "jni-sys 0.3.0", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.0", +] + +[[package]] +name = "never" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96aba5aa877601bb3f6dd6a63a969e1f82e60646e81e71b14496995e9853c91" + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags 2.13.0", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset", +] + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "notify" +version = "8.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" +dependencies = [ + "bitflags 2.13.0", + "crossbeam-channel", + "fsevent-sys", + "inotify", + "kqueue", + "libc", + "log", + "mio", + "notify-types", + "walkdir", + "windows-sys 0.60.2", +] + +[[package]] +name = "notify-types" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e0826a989adedc2a244799e823aece04662b66609d96af8dff7ac6df9a8925d" + +[[package]] +name = "ntapi" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae" +dependencies = [ + "winapi", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "nucleo-matcher" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf33f538733d1a5a3494b836ba913207f14d9d4a1d3cd67030c5061bdd2cac85" +dependencies = [ + "memchr", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", + "serde", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "numpy" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "778da78c64ddc928ebf5ad9df5edf0789410ff3bdbf3619aed51cd789a6af1e2" +dependencies = [ + "libc", + "ndarray", + "num-complex", + "num-integer", + "num-traits", + "pyo3", + "pyo3-build-config", + "rustc-hash 2.1.1", +] + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.13.0", + "block2 0.5.1", + "libc", + "objc2 0.5.2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation 0.2.2", + "objc2-quartz-core 0.2.2", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.13.0", + "block2 0.6.2", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.13.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.13.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.13.0", + "dispatch2", + "objc2 0.6.4", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.13.0", + "dispatch2", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal 0.2.2", +] + +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-contacts", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.13.0", + "block2 0.5.1", + "dispatch", + "libc", + "objc2 0.5.2", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.13.0", + "block2 0.6.2", + "objc2 0.6.4", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15" +dependencies = [ + "bitflags 2.13.0", + "libc", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.13.0", + "objc2 0.6.4", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.13.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-metal" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794" +dependencies = [ + "bitflags 2.13.0", + "block2 0.6.2", + "objc2 0.6.4", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.13.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal 0.2.2", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.13.0", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "objc2-metal 0.3.2", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.13.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-image", + "objc2-core-location", + "objc2-foundation 0.2.2", + "objc2-link-presentation", + "objc2-quartz-core 0.2.2", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.13.0", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.13.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "object_store" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622acbc9100d3c10e2ee15804b0caa40e55c933d5aa53814cd520805b7958a49" +dependencies = [ + "async-trait", + "bytes", + "chrono", + "futures-channel", + "futures-core", + "futures-util", + "http", + "humantime", + "itertools 0.14.0", + "parking_lot", + "percent-encoding", + "thiserror 2.0.18", + "tokio", + "tracing", + "url", + "walkdir", + "wasm-bindgen-futures", + "web-time", +] + +[[package]] +name = "objectron" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "clap", + "glam", + "prost", + "prost-build", + "protoc-prebuilt", + "re_build_tools", + "rerun", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + +[[package]] +name = "oorandom" +version = "11.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" + +[[package]] +name = "open" +version = "5.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2483562e62ea94312f3576a7aca397306df7990b8d89033e18766744377ef95" +dependencies = [ + "is-wsl", + "libc", + "pathdiff", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "opentelemetry" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0142c63252a9e054e68a4c61a5778f7b14f576274d593f8ce883d191a099682" +dependencies = [ + "futures-core", + "futures-sink", + "js-sys", + "pin-project-lite", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "opentelemetry-appender-tracing" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c0080f0dc1d7c786f467cd85a4e395fcab11ee852004f39a29a18ab7c25d837" +dependencies = [ + "opentelemetry", + "tracing", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "opentelemetry-http" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5683015d09e2df236ef005b17f6f196f0d5f6313c4fa43a7b6a53b52776e4331" +dependencies = [ + "async-trait", + "bytes", + "http", + "http-body-util", + "hyper", + "hyper-util", + "opentelemetry", + "tokio", +] + +[[package]] +name = "opentelemetry-otlp" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9966929966d17620d7c316c643ba62631826e10021409357772d5eea84f62c35" +dependencies = [ + "http", + "opentelemetry", + "opentelemetry-http", + "opentelemetry-proto", + "opentelemetry_sdk", + "prost", + "thiserror 2.0.18", + "tokio", + "tonic", + "tonic-types", +] + +[[package]] +name = "opentelemetry-proto" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56d658ba1faf63f7b9c492cfbe6e0ec365440a16132d3270c1065f7b33f1b638" +dependencies = [ + "opentelemetry", + "opentelemetry_sdk", + "prost", + "tonic", + "tonic-prost", +] + +[[package]] +name = "opentelemetry_sdk" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b59f80e1ac4d5ff7a2db8fb6c80badb7f0f3f858211fba08dd9aaec750894f9" +dependencies = [ + "futures-channel", + "futures-executor", + "futures-util", + "opentelemetry", + "percent-encoding", + "portable-atomic", + "rand 0.9.4", + "thiserror 2.0.18", + "tokio", + "tokio-stream", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "orbclient" +version = "0.3.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" +dependencies = [ + "libredox", +] + +[[package]] +name = "ordered-float" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "ordered-float" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e" +dependencies = [ + "num-traits", +] + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "owo-colors" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d211803b9b6b570f68772237e415a029d5a50c65d382910b879fb19d3271f94d" + +[[package]] +name = "page_size" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "backtrace", + "cfg-if", + "libc", + "petgraph 0.6.5", + "redox_syscall 0.5.18", + "smallvec", + "windows-link", +] + +[[package]] +name = "parquet" +version = "58.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dafa7d01085b62a47dd0c1829550a0a36710ea9c4fe358a05a85477cec8a908" +dependencies = [ + "ahash", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-ipc", + "arrow-schema", + "arrow-select", + "base64 0.22.1", + "brotli", + "bytes", + "chrono", + "flate2", + "futures", + "half", + "hashbrown 0.17.1", + "lz4_flex", + "num-bigint", + "num-integer", + "num-traits", + "object_store", + "paste", + "seq-macro", + "simdutf8", + "snap", + "thrift", + "tokio", + "twox-hash", + "zstd", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pastey" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ee67f1008b1ba2321834326597b8e186293b049a023cdef258527550b9935b4" + +[[package]] +name = "path_abs" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ef02f6342ac01d8a93b65f96db53fe68a92a15f41144f97fb00a9e669633c3" +dependencies = [ + "serde", + "serde_derive", + "std_prelude", + "stfu8", +] + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "peg" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9928cfca101b36ec5163e70049ee5368a8a1c3c6efc9ca9c5f9cc2f816152477" +dependencies = [ + "peg-macros", + "peg-runtime", +] + +[[package]] +name = "peg-macros" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6298ab04c202fa5b5d52ba03269fb7b74550b150323038878fe6c372d8280f71" +dependencies = [ + "peg-runtime", + "proc-macro2", + "quote", +] + +[[package]] +name = "peg-runtime" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "132dca9b868d927b35b5dd728167b2dee150eb1ad686008fc71ccb298b776fca" + +[[package]] +name = "peniko" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "839c8299360d2e998bdb106dc0a6cd71dcc5f4df51df1b620361bf50e283cca6" +dependencies = [ + "bytemuck", + "color", + "kurbo 0.13.1", + "linebender_resource_handle", + "smallvec", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "permutation" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df202b0b0f5b8e389955afd5f27b007b00fb948162953f1db9c70d2c7e3157d7" + +[[package]] +name = "pest" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "989e7521a040efde50c3ab6bbadafbe15ab6dc042686926be59ac35d74607df4" +dependencies = [ + "memchr", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc58706f770acb1dbd0973e6530a3cff4746fb721207feb3a8a6064cd0b6c663" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d4f36811dfe07f7b8573462465d5cb8965fffc2e71ae377a33aecf14c2c9a2f" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "pest_meta" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42919b05089acbd0a5dcd5405fb304d17d1053847b81163d09c4ad18ce8e8420" +dependencies = [ + "pest", + "sha2", +] + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset 0.4.2", + "indexmap 2.14.0", +] + +[[package]] +name = "petgraph" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" +dependencies = [ + "fixedbitset 0.5.7", + "hashbrown 0.15.5", + "indexmap 2.14.0", + "serde", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" +dependencies = [ + "phf_shared 0.12.1", +] + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros 0.13.1", + "phf_shared 0.13.1", + "serde", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared 0.11.3", + "rand 0.8.6", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", + "syn 2.0.117", + "unicase", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", + "unicase", +] + +[[package]] +name = "phf_shared" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pico-args" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plot_dashboard_stress" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "clap", + "rand 0.9.4", + "rand_distr", + "re_log", + "rerun", +] + +[[package]] +name = "plotters" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" + +[[package]] +name = "plotters-svg" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "ply-rs-bw" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe55bbee2b70d1c1e58d8340eda9a80c5ce11fb9b1bc10b5fc1575c490d38fa9" +dependencies = [ + "byteorder", + "indexmap 2.14.0", + "peg", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "poll-promise" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6a58fecbf9da8965bcdb20ce4fd29788d1acee68ddbb64f0ba1b81bccdb7df" +dependencies = [ + "document-features", + "static_assertions", + "tokio", + "wasm-bindgen", + "wasm-bindgen-futures", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix 1.1.4", + "windows-sys 0.61.2", +] + +[[package]] +name = "pollster" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" + +[[package]] +name = "polycool" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50596ddc09eb5ad5f75cacd40209568e66df71baf86e1499a0e99c4cff12a5a6" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "serde", + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy 0.8.27", +] + +[[package]] +name = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" +dependencies = [ + "profiling-procmacros", + "puffin", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4488a4a36b9a4ba6b9334a32a39971f77c1436ec82c38707bce707699cc3bbcb" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "prometheus-client" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba70bf887030e45213b4a95c9b08d5a450b157f87c1d63661ed0847a12fa2aad" +dependencies = [ + "dtoa", + "itoa", + "parking_lot", + "prometheus-client-derive-encode", +] + +[[package]] +name = "prometheus-client-derive-encode" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9adf1691c04c0a5ff46ff8f262b58beb07b0dbb61f96f9f54f6cbd82106ed87f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "prost" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03da047801ff44bb6a4d407d4860c05fd70bb81714e6b2f3812603d5b145b042" +dependencies = [ + "heck", + "itertools 0.14.0", + "log", + "multimap", + "petgraph 0.8.3", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 2.0.117", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "prost-reflect" +version = "0.16.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "590aa145fee8f7a26b5a6055365e7c5e89a5c1caae9869de76ec0ee73181a2f9" +dependencies = [ + "logos", + "prost", + "prost-types", +] + +[[package]] +name = "prost-types" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f94967dc7688f3054c7fac87473ffae4cc4c3904800e2d9f5b857246d8963b0a" +dependencies = [ + "prost", +] + +[[package]] +name = "protoc-prebuilt" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d85d4641fe3b8c6e853dfd09fe35379bc6b6e66bd692ac29ed4f7087de69ed5" +dependencies = [ + "ureq 2.12.1", + "zip 0.6.6", +] + +[[package]] +name = "puffin" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84b514d95a258be801fde8a1ff1c974f4a4841d9750f5d1d6690fc07a5ad4049" +dependencies = [ + "anyhow", + "bincode", + "byteorder", + "cfg-if", + "itertools 0.14.0", + "lz4_flex", + "parking_lot", + "serde", +] + +[[package]] +name = "puffin_http" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f912991aab1adae69d2be9455e8db0f41e5ad3da87706ab2de64908678c2c76" +dependencies = [ + "anyhow", + "crossbeam-channel", + "log", + "parking_lot", + "puffin", +] + +[[package]] +name = "pulldown-cmark" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e8bbe1a966bd2f362681a44f6edce3c2310ac21e4d5067a6e7ec396297a6ea0" +dependencies = [ + "bitflags 2.13.0", + "memchr", + "unicase", +] + +[[package]] +name = "pyo3" +version = "0.28.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91fd8e38a3b50ed1167fb981cd6fd60147e091784c427b8f7183a7ee32c31c12" +dependencies = [ + "chrono", + "libc", + "once_cell", + "portable-atomic", + "pyo3-build-config", + "pyo3-ffi", + "pyo3-macros", +] + +[[package]] +name = "pyo3-build-config" +version = "0.28.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e368e7ddfdeb98c9bca7f8383be1648fd84ab466bf2bc015e94008db6d35611e" +dependencies = [ + "target-lexicon", +] + +[[package]] +name = "pyo3-ffi" +version = "0.28.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f29e10af80b1f7ccaf7f69eace800a03ecd13e883acfacc1e5d0988605f651e" +dependencies = [ + "libc", + "pyo3-build-config", +] + +[[package]] +name = "pyo3-macros" +version = "0.28.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df6e520eff47c45997d2fc7dd8214b25dd1310918bbb2642156ef66a67f29813" +dependencies = [ + "proc-macro2", + "pyo3-macros-backend", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "pyo3-macros-backend" +version = "0.28.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4cdc218d835738f81c2338f822078af45b4afdf8b2e33cbb5916f108b813acb" +dependencies = [ + "heck", + "proc-macro2", + "pyo3-build-config", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "quick-xml" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quick-xml" +version = "0.39.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" +dependencies = [ + "memchr", +] + +[[package]] +name = "quinn" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.1.1", + "rustls", + "socket2 0.5.10", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.4", + "ring", + "rustc-hash 2.1.1", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcebb1209ee276352ef14ff8732e24cc2b02bbac986cd74a4c81bcb2f9881970" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2 0.5.10", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "quiver" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30fc53445d63835c1580064663c42973fb3c64ea5d19ed1a666a5fac5dc191e4" +dependencies = [ + "quiver_derive", + "quiver_types", +] + +[[package]] +name = "quiver_derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11c3bc8019d249c8926310ac15808d0b1d5af20b187c24eedbc8d1116fdcd3d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "quiver_types" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28ae5ccd523981092a925ce1bf414c4f61eebd19d62881f79d2639df602b0c9" +dependencies = [ + "arrow", + "half", + "thiserror 2.0.18", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +dependencies = [ + "rand_chacha", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_distr" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" +dependencies = [ + "num-traits", + "rand 0.9.4", +] + +[[package]] +name = "rand_xoshiro" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f703f4665700daf5512dcca5f43afa6af89f09db47fb56be587f80636bda2d41" +dependencies = [ + "rand_core 0.9.3", +] + +[[package]] +name = "range-alloc" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" + +[[package]] +name = "rangemap" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93e7e49bb0bf967717f7bd674458b3d6b0c5f48ec7e3038166026a69fc22223" + +[[package]] +name = "raw-cpuid" +version = "11.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df7ab838ed27997ba19a4664507e6f82b41fe6e20be42929332156e5e85146" +dependencies = [ + "bitflags 2.13.0", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "raw-window-metal" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40d213455a5f1dc59214213c7330e074ddf8114c9a42411eb890c767357ce135" +dependencies = [ + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", +] + +[[package]] +name = "raw_mesh" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "bytes", + "clap", + "gltf", + "rerun", +] + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "re_analytics" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "crossbeam", + "directories", + "ehttp", + "jiff", + "re_build_info", + "re_log", + "re_quota_channel", + "regex-lite", + "serde", + "serde_json", + "sha2", + "thiserror 2.0.18", + "url", + "uuid", + "web-sys", +] + +[[package]] +name = "re_arrow_ui" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "arrow", + "egui", + "egui_kittest", + "insta", + "itertools 0.14.0", + "jiff", + "re_arrow_util", + "re_format", + "re_log_types", + "re_sdk_types", + "re_tracing", + "re_ui", +] + +[[package]] +name = "re_arrow_util" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "arrow", + "comfy-table", + "datafusion", + "half", + "insta", + "itertools 0.14.0", + "re_log", + "re_tracing", + "re_tuid", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "re_auth" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "async-trait", + "base64 0.22.1", + "directories", + "ehttp", + "getrandom 0.2.17", + "getrandom 0.3.4", + "hmac", + "http", + "indicatif", + "jiff", + "js-sys", + "jsonwebtoken", + "parking_lot", + "rand 0.9.4", + "re_analytics", + "re_log", + "ring", + "saturating_cast", + "serde", + "serde_json", + "sha2", + "signature", + "thiserror 2.0.18", + "tiny_http", + "tokio", + "tonic", + "tower", + "url", + "uuid", + "wasm-bindgen", + "web-sys", + "webbrowser", +] + +[[package]] +name = "re_backoff" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "futures", + "getrandom 0.3.4", + "js-sys", + "rand 0.9.4", + "tokio", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "re_blueprint_tree" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "egui", + "egui_kittest", + "egui_tiles", + "insta", + "itertools 0.14.0", + "re_chunk_store", + "re_context_menu", + "re_data_ui", + "re_entity_db", + "re_log", + "re_log_types", + "re_sdk_types", + "re_test_context", + "re_test_viewport", + "re_tracing", + "re_ui", + "re_view_spatial", + "re_viewer_context", + "re_viewport_blueprint", + "serde", + "smallvec", +] + +[[package]] +name = "re_build_info" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "re_byte_size", + "serde", +] + +[[package]] +name = "re_build_tools" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "cargo_metadata", + "glob", + "jiff", + "regex-lite", + "sha2", + "unindent", + "walkdir", +] + +[[package]] +name = "re_byte_size" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "arrow", + "ecolor", + "egui", + "glam", + "half", + "insta", + "macaw", + "parking_lot", + "re_byte_size_derive", + "smallvec", + "vec1", +] + +[[package]] +name = "re_byte_size_derive" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "re_capabilities" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "document-features", + "egui", + "re_log", + "static_assertions", +] + +[[package]] +name = "re_case" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "convert_case", +] + +[[package]] +name = "re_cdr" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bba10c21433b597481f366b978cdf2617e56785b38cb0dcc3833c6b8ad7e061a" +dependencies = [ + "bytemuck", + "byteorder", + "serde", + "thiserror 2.0.18", +] + +[[package]] +name = "re_chunk" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "anyhow", + "arrow", + "bytemuck", + "crossbeam", + "document-features", + "half", + "insta", + "itertools 0.14.0", + "nohash-hasher", + "rand 0.9.4", + "re_arrow_util", + "re_byte_size", + "re_error", + "re_format", + "re_log", + "re_log_types", + "re_quota_channel", + "re_sorbet", + "re_span", + "re_tracing", + "re_types_core", + "similar-asserts", + "thiserror 2.0.18", +] + +[[package]] +name = "re_chunk_store" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "anyhow", + "arrow", + "criterion", + "document-features", + "indent", + "insta", + "itertools 0.14.0", + "mimalloc", + "nohash-hasher", + "parking_lot", + "rand 0.9.4", + "re_arrow_util", + "re_byte_size", + "re_chunk", + "re_format", + "re_log", + "re_log_encoding", + "re_log_types", + "re_sdk_types", + "re_sorbet", + "re_tracing", + "re_types_core", + "saturating_cast", + "similar-asserts", + "tempfile", + "thiserror 2.0.18", + "web-time", +] + +[[package]] +name = "re_chunk_store_ui" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "arrow", + "egui", + "egui_extras", + "itertools 0.14.0", + "re_arrow_ui", + "re_arrow_util", + "re_byte_size", + "re_chunk_store", + "re_format", + "re_log", + "re_log_types", + "re_types_core", + "re_ui", + "re_viewer_context", +] + +[[package]] +name = "re_component_fallbacks" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "re_log_types", + "re_sdk_types", + "re_video", + "re_viewer_context", +] + +[[package]] +name = "re_component_ui" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "arrow", + "egui", + "egui_dnd", + "egui_extras", + "egui_kittest", + "egui_plot", + "itertools 0.14.0", + "nohash-hasher", + "re_data_ui", + "re_format", + "re_log", + "re_log_types", + "re_protos", + "re_sdk_types", + "re_test_context", + "re_tracing", + "re_types_core", + "re_ui", + "re_uri", + "re_viewer_context", +] + +[[package]] +name = "re_context_menu" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "egui", + "egui_tiles", + "itertools 0.14.0", + "nohash-hasher", + "re_entity_db", + "re_log", + "re_log_channel", + "re_log_types", + "re_sdk_types", + "re_tracing", + "re_ui", + "re_uri", + "re_viewer_context", + "re_viewport_blueprint", + "static_assertions", +] + +[[package]] +name = "re_crash_handler" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "backtrace", + "econtext", + "itertools 0.14.0", + "libc", + "parking_lot", + "re_analytics", + "re_build_info", +] + +[[package]] +name = "re_data_source" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "ehttp", + "itertools 0.14.0", + "rayon", + "re_format", + "re_grpc_client", + "re_importer", + "re_log", + "re_log_channel", + "re_log_encoding", + "re_log_types", + "re_redap_client", + "re_tracing", + "re_uri", + "tokio", + "url", + "wasm-bindgen-futures", +] + +[[package]] +name = "re_data_ui" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "anyhow", + "bytemuck", + "egui", + "egui_extras", + "egui_plot", + "itertools 0.14.0", + "jiff", + "re_arrow_ui", + "re_capabilities", + "re_chunk_store", + "re_entity_db", + "re_format", + "re_log", + "re_log_channel", + "re_log_types", + "re_query", + "re_renderer", + "re_sdk_types", + "re_sorbet", + "re_tracing", + "re_types_core", + "re_ui", + "re_uri", + "re_video", + "re_viewer_context", + "rexif", + "unindent", +] + +[[package]] +name = "re_dataframe" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "arrow", + "criterion", + "insta", + "itertools 0.14.0", + "mimalloc", + "nohash-hasher", + "rayon", + "re_arrow_util", + "re_chunk", + "re_chunk_store", + "re_log", + "re_log_types", + "re_query", + "re_sdk_types", + "re_sorbet", + "re_span", + "re_tracing", + "re_types_core", + "similar-asserts", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "re_dataframe_ui" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "arrow", + "async-trait", + "cfg-if", + "crossbeam", + "datafusion", + "egui", + "egui_dnd", + "egui_kittest", + "egui_table", + "futures", + "insta", + "itertools 0.14.0", + "jiff", + "nohash-hasher", + "ordered-float 5.3.0", + "re_arrow_util", + "re_chunk_store", + "re_component_ui", + "re_data_source", + "re_dataframe", + "re_entity_db", + "re_format", + "re_log", + "re_log_types", + "re_mutex", + "re_protos", + "re_quota_channel", + "re_redap_client", + "re_sdk_types", + "re_sorbet", + "re_test_context", + "re_tracing", + "re_types_core", + "re_ui", + "re_uri", + "re_viewer_context", + "re_viewport", + "re_viewport_blueprint", + "serde", + "static_assertions", + "strum", + "thiserror 2.0.18", + "tokio", +] + +[[package]] +name = "re_datafusion" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "arrow", + "async-stream", + "async-trait", + "chrono", + "datafusion", + "futures", + "futures-util", + "getrandom 0.3.4", + "itertools 0.14.0", + "jiff", + "opentelemetry", + "opentelemetry-proto", + "parking_lot", + "quiver", + "re_analytics", + "re_arrow_util", + "re_backoff", + "re_byte_size", + "re_dataframe", + "re_format", + "re_log", + "re_log_encoding", + "re_log_types", + "re_perf_telemetry", + "re_protos", + "re_redap_client", + "re_sorbet", + "re_tracing", + "re_types_core", + "re_uri", + "reqwest", + "tokio", + "tokio-stream", + "tonic", + "tracing", + "wasm-bindgen-futures", + "web-time", +] + +[[package]] +name = "re_dev_tools" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "argh", + "camino", + "cargo_metadata", + "glob", + "indicatif", + "itertools 0.14.0", + "rayon", + "re_build_tools", + "re_format", + "roxmltree", + "serde", + "serde_json", + "tempfile", + "toml", + "ureq 3.3.0", + "url", + "wasm-bindgen-cli-support", +] + +[[package]] +name = "re_entity_db" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "anyhow", + "arrow", + "document-features", + "emath", + "indexmap 2.14.0", + "insta", + "itertools 0.14.0", + "nohash-hasher", + "poll-promise", + "re_arrow_util", + "re_build_info", + "re_byte_size", + "re_chunk", + "re_chunk_store", + "re_format", + "re_log", + "re_log_channel", + "re_log_encoding", + "re_log_types", + "re_mutex", + "re_query", + "re_sorbet", + "re_tracing", + "re_types_core", + "re_uri", + "serde", + "similar-asserts", + "static_assertions", + "tap", + "thiserror 2.0.18", + "vec1", + "web-time", +] + +[[package]] +name = "re_error" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", +] + +[[package]] +name = "re_format" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "half", + "itertools 0.14.0", + "num-traits", + "re_log", +] + +[[package]] +name = "re_gamepad" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "gilrs", + "glam", + "parking_lot", + "re_log", +] + +[[package]] +name = "re_grpc_client" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "async-stream", + "crossbeam", + "re_chunk", + "re_error", + "re_log", + "re_log_channel", + "re_log_encoding", + "re_log_types", + "re_protos", + "re_quota_channel", + "re_sorbet", + "re_tracing", + "re_uri", + "rerun-tonic-web-wasm-client", + "thiserror 2.0.18", + "tokio", + "tokio-stream", + "tonic", + "wasm-bindgen-futures", + "web-time", +] + +[[package]] +name = "re_grpc_headers" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "http", + "pin-project-lite", + "tonic", + "tower", +] + +[[package]] +name = "re_grpc_server" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "async-stream", + "futures", + "itertools 0.14.0", + "parking_lot", + "re_byte_size", + "re_chunk", + "re_error", + "re_format", + "re_log", + "re_log_channel", + "re_log_encoding", + "re_log_types", + "re_memory", + "re_protos", + "re_quota_channel", + "re_sdk_types", + "re_sorbet", + "re_tracing", + "re_uri", + "similar-asserts", + "tokio", + "tokio-stream", + "tokio-util", + "tonic", + "tonic-web", + "tower-http", + "wildmatch", +] + +[[package]] +name = "re_importer" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "anyhow", + "arrow", + "cfg-if", + "crossbeam", + "image", + "indexmap 2.14.0", + "insta", + "itertools 0.14.0", + "mcap", + "memmap2 0.9.11", + "notify", + "parking_lot", + "parquet", + "rayon", + "re_arrow_util", + "re_build_info", + "re_chunk", + "re_chunk_store", + "re_crash_handler", + "re_error", + "re_format", + "re_lenses", + "re_lenses_core", + "re_log", + "re_log_channel", + "re_log_encoding", + "re_log_types", + "re_mcap", + "re_mp4_reader", + "re_parquet", + "re_quota_channel", + "re_sdk_types", + "re_tracing", + "re_video", + "serde", + "serde_json", + "tempfile", + "thiserror 2.0.18", + "urdf-rs", + "walkdir", +] + +[[package]] +name = "re_integration_test" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "arrow", + "datafusion", + "directories", + "egui", + "egui_kittest", + "egui_tiles", + "futures", + "insta", + "ndarray", + "parking_lot", + "re_build_info", + "re_dataframe_ui", + "re_datafusion", + "re_log_encoding", + "re_log_types", + "re_protos", + "re_redap_client", + "re_sdk", + "re_sdk_types", + "re_server", + "re_test_context", + "re_uri", + "re_view_bar_chart", + "re_view_state_timeline", + "re_view_tensor", + "re_view_text_document", + "re_view_text_log", + "re_view_time_series", + "re_viewer", + "re_viewer_context", + "re_viewport_blueprint", + "reqwest", + "serde", + "tempfile", + "tokio", + "uuid", +] + +[[package]] +name = "re_lenses" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "arrow", + "insta", + "re_arrow_util", + "re_lenses_core", + "re_log", + "re_sdk_types", +] + +[[package]] +name = "re_lenses_core" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "arrow", + "insta", + "itertools 0.14.0", + "nohash-hasher", + "re_arrow_util", + "re_byte_size", + "re_chunk", + "re_log", + "re_log_types", + "re_sdk_types", + "thiserror 2.0.18", + "vec1", +] + +[[package]] +name = "re_log" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "crossbeam", + "log", + "log-once", + "parking_lot", + "tracing", + "tracing-log", + "tracing-subscriber", + "tracing-web", +] + +[[package]] +name = "re_log_channel" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "camino", + "crossbeam", + "futures", + "parking_lot", + "re_byte_size", + "re_log_encoding", + "re_log_types", + "re_protos", + "re_quota_channel", + "re_tracing", + "re_uri", + "serde", + "thiserror 2.0.18", +] + +[[package]] +name = "re_log_encoding" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "arrow", + "bytes", + "criterion", + "crossbeam", + "ehttp", + "insta", + "itertools 0.14.0", + "js-sys", + "lz4_flex", + "mimalloc", + "parking_lot", + "re_arrow_util", + "re_build_info", + "re_byte_size", + "re_chunk", + "re_log", + "re_log_types", + "re_protos", + "re_quota_channel", + "re_sdk_types", + "re_sorbet", + "re_span", + "re_tracing", + "re_types_core", + "sha2", + "similar-asserts", + "tempfile", + "thiserror 2.0.18", + "tokio", + "tokio-stream", + "tracing", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "web-time", + "xxhash-rust", +] + +[[package]] +name = "re_log_types" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "arrow", + "bytemuck", + "clean-path", + "criterion", + "document-features", + "fixed", + "half", + "itertools 0.14.0", + "jiff", + "mimalloc", + "natord", + "nohash-hasher", + "num-derive", + "num-traits", + "parking_lot", + "quiver", + "re_arrow_util", + "re_build_info", + "re_byte_size", + "re_format", + "re_log", + "re_string_interner", + "re_tracing", + "re_tuid", + "re_types_core", + "serde", + "similar-asserts", + "static_assertions", + "thiserror 2.0.18", + "typenum", + "uuid", + "web-time", + "xxhash-rust", +] + +[[package]] +name = "re_mcap" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "anyhow", + "arrow", + "byteorder", + "crossbeam", + "insta", + "itertools 0.14.0", + "mcap", + "prost-reflect", + "rayon", + "re_arrow_util", + "re_cdr", + "re_chunk", + "re_log", + "re_log_types", + "re_quota_channel", + "re_ros_msg", + "re_sdk_types", + "re_tracing", + "regex-lite", + "saturating_cast", + "serde", + "serde_bytes", + "strum", + "thiserror 2.0.18", +] + +[[package]] +name = "re_memory" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "backtrace", + "crossbeam", + "itertools 0.14.0", + "memory-stats", + "nohash-hasher", + "parking_lot", + "re_format", + "re_log", + "re_quota_channel", + "re_tracing", + "saturating_cast", + "serde", + "smallvec", + "sysinfo", + "wasm-bindgen", + "web-time", +] + +[[package]] +name = "re_memory_view" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "eframe", + "egui", + "re_byte_size", + "re_format", + "wgpu", +] + +[[package]] +name = "re_mp4" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63d71dca1bc07c053ed67ccfd0b52df652192a6541fbdf85cc3d46142e20d709" +dependencies = [ + "byteorder", + "bytes", + "num-rational", + "serde", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "re_mp4_reader" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "arrow", + "itertools 0.14.0", + "re_chunk", + "re_log", + "re_log_types", + "re_sdk_types", + "re_tracing", + "re_video", + "thiserror 2.0.18", +] + +[[package]] +name = "re_mutex" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "cfg-if", + "parking_lot", + "re_byte_size", + "re_log", +] + +[[package]] +name = "re_parquet" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "arrow", + "bytes", + "itertools 0.14.0", + "parquet", + "re_chunk", + "re_lenses", + "re_lenses_core", + "re_log", + "re_log_types", + "re_sdk_types", + "re_tracing", + "thiserror 2.0.18", +] + +[[package]] +name = "re_perf_telemetry" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "anyhow", + "axum", + "base64 0.22.1", + "clap", + "http", + "memory-stats", + "opentelemetry", + "opentelemetry-appender-tracing", + "opentelemetry-http", + "opentelemetry-otlp", + "opentelemetry_sdk", + "parking_lot", + "prometheus-client", + "rand 0.9.4", + "re_auth", + "re_grpc_headers", + "re_test_mocks", + "serde", + "serde_json", + "tokio", + "tonic", + "tower", + "tower-http", + "tracing", + "tracing-opentelemetry", + "tracing-subscriber", + "tracing-tracy", +] + +[[package]] +name = "re_plot" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "egui", + "indexmap 2.14.0", + "re_ui", +] + +[[package]] +name = "re_protos" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "arrow", + "http", + "insta", + "itertools 0.14.0", + "jiff", + "lz4_flex", + "opentelemetry", + "prost", + "prost-types", + "pyo3", + "quiver", + "re_arrow_util", + "re_build_info", + "re_byte_size", + "re_chunk", + "re_grpc_headers", + "re_log_types", + "re_sorbet", + "re_tracing", + "re_tuid", + "re_types_core", + "serde", + "thiserror 2.0.18", + "tonic", + "tonic-prost", + "tower", + "tracing", + "url", +] + +[[package]] +name = "re_protos_builder" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "camino", + "re_log", + "tonic-prost-build", +] + +[[package]] +name = "re_query" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "anyhow", + "arrow", + "bytemuck", + "criterion", + "indent", + "itertools 0.14.0", + "mimalloc", + "nohash-hasher", + "parking_lot", + "paste", + "rand 0.9.4", + "re_arrow_util", + "re_byte_size", + "re_chunk", + "re_chunk_store", + "re_error", + "re_format", + "re_log", + "re_log_encoding", + "re_log_types", + "re_sdk_types", + "re_tracing", + "re_types_core", + "seq-macro", + "similar-asserts", + "thiserror 2.0.18", +] + +[[package]] +name = "re_quota_channel" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "crossbeam", + "parking_lot", + "re_byte_size", + "re_format", + "re_log", + "tokio", +] + +[[package]] +name = "re_rav1d" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5eb64c43c68024d96d99d52ef0525030d17bdcc6a6b4ddba048ec8f713c91fc" +dependencies = [ + "assert_matches", + "atomig", + "av-data", + "bitflags 2.13.0", + "cc", + "cfg-if", + "libc", + "nasm-rs", + "parking_lot", + "paste", + "raw-cpuid", + "static_assertions", + "strum", + "to_method", + "zerocopy 0.7.35", +] + +[[package]] +name = "re_recording_panel" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "egui", + "insta", + "itertools 0.14.0", + "re_data_ui", + "re_entity_db", + "re_log", + "re_log_channel", + "re_log_types", + "re_redap_browser", + "re_sdk_types", + "re_test_context", + "re_tracing", + "re_ui", + "re_uri", + "re_viewer_context", + "serde", +] + +[[package]] +name = "re_redap_browser" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "cfg-if", + "crossbeam", + "datafusion", + "egui", + "egui_extras", + "futures", + "itertools 0.14.0", + "js-sys", + "re_auth", + "re_backoff", + "re_component_ui", + "re_dataframe_ui", + "re_datafusion", + "re_log", + "re_log_types", + "re_protos", + "re_quota_channel", + "re_redap_client", + "re_sorbet", + "re_ui", + "re_uri", + "re_viewer_context", + "serde", + "serde_json", + "url", + "uuid", + "wasm-bindgen", + "web-sys", + "webbrowser", +] + +[[package]] +name = "re_redap_client" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "arrow", + "bitflags 2.13.0", + "ehttp", + "futures", + "http", + "http-body", + "itertools 0.14.0", + "jiff", + "opentelemetry", + "opentelemetry-proto", + "quiver", + "re_arrow_util", + "re_auth", + "re_backoff", + "re_byte_size", + "re_chunk", + "re_error", + "re_format", + "re_log", + "re_log_channel", + "re_log_encoding", + "re_log_types", + "re_perf_telemetry", + "re_protos", + "re_tracing", + "re_types_core", + "re_uri", + "rerun-tonic-web-wasm-client", + "serde", + "thiserror 2.0.18", + "tokio", + "tokio-stream", + "tonic", + "tonic-prost", + "tower", + "tracing", + "url", + "web-time", +] + +[[package]] +name = "re_redap_tests" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "arrow", + "async-trait", + "datafusion", + "futures", + "insta", + "itertools 0.14.0", + "lance", + "parking_lot", + "prost-types", + "re_arrow_util", + "re_chunk", + "re_chunk_store", + "re_datafusion", + "re_log_types", + "re_protos", + "re_sdk", + "re_sdk_types", + "re_sorbet", + "re_tuid", + "re_types_core", + "tempfile", + "tokio", + "tonic", + "url", +] + +[[package]] +name = "re_renderer" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "anyhow", + "bitflags 2.13.0", + "bytemuck", + "cfg_aliases", + "clean-path", + "criterion", + "crossbeam", + "dae-parser", + "document-features", + "ecolor", + "enumset", + "getrandom 0.3.4", + "glam", + "gltf", + "half", + "itertools 0.14.0", + "js-sys", + "macaw", + "never", + "notify", + "ordered-float 5.3.0", + "parking_lot", + "pathdiff", + "pollster", + "profiling", + "re_build_tools", + "re_byte_size", + "re_error", + "re_log", + "re_mutex", + "re_quota_channel", + "re_tracing", + "re_video", + "regex-lite", + "serde", + "slotmap", + "smallvec", + "static_assertions", + "stl_io", + "thiserror 2.0.18", + "tobj", + "type-map", + "unindent", + "walkdir", + "wasm-bindgen", + "web-sys", + "wgpu", +] + +[[package]] +name = "re_renderer_examples" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "anyhow", + "bytemuck", + "clap", + "console_error_panic_hook", + "glam", + "image", + "itertools 0.14.0", + "macaw", + "pollster", + "rand 0.9.4", + "re_log", + "re_renderer", + "wasm-bindgen-futures", + "web-sys", + "web-time", + "wgpu", + "winit", +] + +[[package]] +name = "re_ros_msg" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "re_cdr", + "thiserror 2.0.18", +] + +[[package]] +name = "re_rvl" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "byteorder", + "thiserror 2.0.18", +] + +[[package]] +name = "re_sdk" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "arrow", + "const_format", + "crossbeam", + "document-features", + "insta", + "itertools 0.14.0", + "libc", + "nohash-hasher", + "parking_lot", + "percent-encoding", + "re_build_info", + "re_build_tools", + "re_byte_size", + "re_chunk", + "re_grpc_client", + "re_grpc_server", + "re_importer", + "re_lenses", + "re_lenses_core", + "re_log", + "re_log_channel", + "re_log_encoding", + "re_log_types", + "re_memory", + "re_quota_channel", + "re_sdk_types", + "re_sorbet", + "re_tracing", + "re_uri", + "re_web_viewer_server", + "serde", + "serde_json", + "similar-asserts", + "thiserror 2.0.18", + "tokio", + "uuid", + "webbrowser", +] + +[[package]] +name = "re_sdk_types" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "array-init", + "arrow", + "bytemuck", + "document-features", + "ecolor", + "egui_plot", + "emath", + "glam", + "half", + "image", + "infer", + "itertools 0.14.0", + "macaw", + "mime_guess2", + "mint", + "ndarray", + "nohash-hasher", + "ply-rs-bw", + "rand 0.9.4", + "re_byte_size", + "re_error", + "re_format", + "re_log", + "re_log_types", + "re_rvl", + "re_sorbet", + "re_tracing", + "re_types_core", + "re_video", + "serde", + "similar-asserts", + "smallvec", + "thiserror 2.0.18", + "tiff", + "uuid", +] + +[[package]] +name = "re_selection_panel" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "arrow", + "egui", + "egui_tiles", + "itertools 0.14.0", + "nohash-hasher", + "re_case", + "re_chunk", + "re_chunk_store", + "re_component_ui", + "re_context_menu", + "re_data_ui", + "re_entity_db", + "re_format", + "re_lenses_core", + "re_log", + "re_log_types", + "re_sdk_types", + "re_test_context", + "re_test_viewport", + "re_tracing", + "re_types_core", + "re_ui", + "re_view", + "re_viewer_context", + "re_viewport_blueprint", + "serde", + "smallvec", + "static_assertions", +] + +[[package]] +name = "re_server" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "anyhow", + "arrow", + "axum", + "bincode", + "bytes", + "cfg-if", + "chrono", + "clap", + "datafusion", + "ehttp", + "futures", + "getrandom 0.3.4", + "http", + "http-body", + "itertools 0.14.0", + "jiff", + "js-sys", + "lance", + "nohash-hasher", + "opentelemetry", + "parking_lot", + "percent-encoding", + "re_arrow_util", + "re_build_info", + "re_build_tools", + "re_byte_size", + "re_chunk", + "re_chunk_store", + "re_entity_db", + "re_format", + "re_grpc_server", + "re_log", + "re_log_encoding", + "re_log_types", + "re_protos", + "re_redap_tests", + "re_sorbet", + "re_span", + "re_tuid", + "re_types_core", + "serde", + "tempfile", + "thiserror 2.0.18", + "tokio", + "tokio-stream", + "tonic", + "tonic-web", + "tower", + "tower-service", + "tracing", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test", + "web-sys", +] + +[[package]] +name = "re_sorbet" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "arrow", + "itertools 0.14.0", + "nohash-hasher", + "re_arrow_util", + "re_byte_size", + "re_log", + "re_log_types", + "re_tracing", + "re_tuid", + "re_types_core", + "semver", + "strum", + "thiserror 2.0.18", + "tracing", + "web-time", +] + +[[package]] +name = "re_span" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "num-traits", +] + +[[package]] +name = "re_string_interner" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "nohash-hasher", + "parking_lot", + "paste", + "re_byte_size", + "serde", + "static_assertions", +] + +[[package]] +name = "re_test_context" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "anyhow", + "egui", + "egui-wgpu", + "egui_kittest", + "jiff", + "parking_lot", + "pollster", + "re_build_info", + "re_chunk", + "re_chunk_store", + "re_component_fallbacks", + "re_entity_db", + "re_log", + "re_log_channel", + "re_log_encoding", + "re_log_types", + "re_redap_client", + "re_renderer", + "re_sdk_types", + "re_tracing", + "re_types_core", + "re_ui", + "re_uri", + "re_viewer_context", + "wgpu", +] + +[[package]] +name = "re_test_mocks" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "axum", + "opentelemetry-proto", + "parking_lot", + "reqwest", + "serde_json", + "tokio", + "tokio-stream", + "tonic", +] + +[[package]] +name = "re_test_viewport" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "egui", + "re_byte_size", + "re_chunk", + "re_context_menu", + "re_entity_db", + "re_log_types", + "re_sdk_types", + "re_test_context", + "re_ui", + "re_viewer_context", + "re_viewport", + "re_viewport_blueprint", +] + +[[package]] +name = "re_tf" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "arrow", + "bitflags 2.13.0", + "criterion", + "glam", + "insta", + "itertools 0.14.0", + "mimalloc", + "nohash-hasher", + "parking_lot", + "re_arrow_util", + "re_byte_size", + "re_chunk_store", + "re_entity_db", + "re_log", + "re_log_encoding", + "re_log_types", + "re_mutex", + "re_sdk_types", + "re_tracing", + "thiserror 2.0.18", +] + +[[package]] +name = "re_time_panel" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "anyhow", + "criterion", + "egui", + "insta", + "itertools 0.14.0", + "nohash-hasher", + "rand 0.9.4", + "re_byte_size", + "re_chunk", + "re_chunk_store", + "re_context_menu", + "re_data_ui", + "re_entity_db", + "re_format", + "re_log", + "re_log_encoding", + "re_log_types", + "re_sdk_types", + "re_test_context", + "re_time_ruler", + "re_tracing", + "re_ui", + "re_viewer_context", + "re_viewport_blueprint", + "serde", + "smallvec", + "vec1", +] + +[[package]] +name = "re_time_ruler" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "egui", + "itertools 0.14.0", + "re_format", + "re_log", + "re_log_types", + "re_sdk_types", + "re_tracing", + "re_ui", + "re_viewer_context", +] + +[[package]] +name = "re_tracing" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "parking_lot", + "puffin", + "puffin_http", + "re_log", + "rfd", + "wayland-sys", +] + +[[package]] +name = "re_tuid" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "bytemuck", + "criterion", + "document-features", + "getrandom 0.3.4", + "quiver", + "rand 0.9.4", + "re_byte_size", + "re_log", + "serde", + "web-time", +] + +[[package]] +name = "re_types" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "re_sdk_types", +] + +[[package]] +name = "re_types_builder" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "camino", + "clang-format", + "colored", + "crossbeam", + "flatbuffers", + "indent", + "itertools 0.14.0", + "prettyplease", + "proc-macro2", + "quote", + "rayon", + "re_build_tools", + "re_case", + "re_error", + "re_log", + "re_quota_channel", + "re_tracing", + "regex-lite", + "serde", + "syn 2.0.117", + "tempfile", + "toml", + "unindent", + "xshell", +] + +[[package]] +name = "re_types_core" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "arrow", + "bitflags 2.13.0", + "bytemuck", + "criterion", + "document-features", + "half", + "itertools 0.14.0", + "nohash-hasher", + "quiver", + "re_arrow_util", + "re_byte_size", + "re_case", + "re_error", + "re_log", + "re_string_interner", + "re_tracing", + "re_tuid", + "serde", + "similar-asserts", + "thiserror 2.0.18", +] + +[[package]] +name = "re_ui" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "anyhow", + "cfg-if", + "crossbeam", + "eframe", + "egui", + "egui_commonmark", + "egui_extras", + "egui_kittest", + "egui_tiles", + "getrandom 0.3.4", + "itertools 0.14.0", + "jiff", + "notify", + "nucleo-matcher", + "num-traits", + "parking_lot", + "rand 0.9.4", + "raw-window-handle", + "re_analytics", + "re_build_tools", + "re_entity_db", + "re_error", + "re_format", + "re_log", + "re_log_types", + "re_mutex", + "re_quota_channel", + "re_tracing", + "re_uri", + "ron", + "serde", + "smallvec", + "strum", + "strum_macros", + "thiserror 2.0.18", + "url", + "wayland-client", + "wayland-protocols", + "web-time", +] + +[[package]] +name = "re_uri" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "percent-encoding", + "re_byte_size", + "re_log", + "re_log_types", + "re_tuid", + "re_types_core", + "serde", + "static_assertions", + "thiserror 2.0.18", + "url", +] + +[[package]] +name = "re_video" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "bit-vec", + "bytemuck", + "cfg_aliases", + "criterion", + "cros-codecs", + "econtext", + "ffmpeg-sidecar", + "getrandom 0.3.4", + "h264-reader", + "image", + "indicatif", + "itertools 0.14.0", + "js-sys", + "poll-promise", + "re_byte_size", + "re_log", + "re_mp4", + "re_mutex", + "re_quota_channel", + "re_rav1d", + "re_rvl", + "re_span", + "re_tracing", + "re_tuid", + "saturating_cast", + "scuffle-av1", + "scuffle-bytes-util", + "serde", + "smallvec", + "thiserror 2.0.18", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "web-time", +] + +[[package]] +name = "re_view" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "egui", + "glam", + "itertools 0.14.0", + "nohash-hasher", + "re_chunk_store", + "re_entity_db", + "re_lenses_core", + "re_log", + "re_log_types", + "re_query", + "re_renderer", + "re_sdk_types", + "re_tracing", + "re_types_core", + "re_ui", + "re_viewer_context", + "re_viewport_blueprint", + "thiserror 2.0.18", +] + +[[package]] +name = "re_view_bar_chart" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "arrow", + "egui", + "egui_plot", + "itertools 0.14.0", + "re_chunk_store", + "re_format", + "re_log_types", + "re_plot", + "re_sdk_types", + "re_test_context", + "re_test_viewport", + "re_tracing", + "re_ui", + "re_view", + "re_viewer_context", + "re_viewport_blueprint", +] + +[[package]] +name = "re_view_dataframe" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "arrow", + "egui", + "egui_dnd", + "egui_table", + "itertools 0.14.0", + "re_byte_size", + "re_chunk_store", + "re_component_ui", + "re_dataframe", + "re_dataframe_ui", + "re_error", + "re_format", + "re_log", + "re_log_types", + "re_sdk_types", + "re_sorbet", + "re_test_context", + "re_test_viewport", + "re_tracing", + "re_types_core", + "re_ui", + "re_viewer_context", + "re_viewport_blueprint", +] + +[[package]] +name = "re_view_graph" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "egui", + "fjadra", + "itertools 0.14.0", + "nohash-hasher", + "re_byte_size", + "re_chunk", + "re_chunk_store", + "re_data_ui", + "re_entity_db", + "re_format", + "re_log", + "re_log_types", + "re_query", + "re_sdk_types", + "re_test_context", + "re_test_viewport", + "re_tracing", + "re_ui", + "re_view", + "re_viewer_context", + "re_viewport_blueprint", +] + +[[package]] +name = "re_view_map" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "bytemuck", + "egui", + "glam", + "itertools 0.14.0", + "macaw", + "re_byte_size", + "re_data_ui", + "re_entity_db", + "re_log", + "re_log_types", + "re_query", + "re_renderer", + "re_sdk_types", + "re_test_context", + "re_tracing", + "re_ui", + "re_view", + "re_viewer_context", + "re_viewport_blueprint", + "walkers", +] + +[[package]] +name = "re_view_spatial" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "anyhow", + "arrow", + "bitflags 2.13.0", + "bytemuck", + "egui", + "glam", + "half", + "hexasphere", + "image", + "insta", + "itertools 0.14.0", + "macaw", + "ndarray", + "nohash-hasher", + "ordered-float 5.3.0", + "re_byte_size", + "re_chunk_store", + "re_component_ui", + "re_data_ui", + "re_entity_db", + "re_error", + "re_format", + "re_gamepad", + "re_log", + "re_log_types", + "re_mp4", + "re_query", + "re_renderer", + "re_rvl", + "re_sdk_types", + "re_test_context", + "re_test_viewport", + "re_tf", + "re_tracing", + "re_ui", + "re_video", + "re_view", + "re_viewer_context", + "re_viewport", + "re_viewport_blueprint", + "saturating_cast", + "serde", + "smallvec", + "thiserror 2.0.18", + "vec1", +] + +[[package]] +name = "re_view_state_timeline" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "egui", + "nohash-hasher", + "re_byte_size", + "re_chunk_store", + "re_component_ui", + "re_log_types", + "re_sdk_types", + "re_selection_panel", + "re_test_context", + "re_test_viewport", + "re_time_ruler", + "re_tracing", + "re_ui", + "re_view", + "re_viewer_context", + "re_viewport", + "re_viewport_blueprint", +] + +[[package]] +name = "re_view_tensor" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "bytemuck", + "egui", + "half", + "ndarray", + "re_byte_size", + "re_chunk_store", + "re_data_ui", + "re_log_types", + "re_query", + "re_renderer", + "re_sdk_types", + "re_test_context", + "re_test_viewport", + "re_tracing", + "re_ui", + "re_view", + "re_viewer_context", + "re_viewport_blueprint", + "thiserror 2.0.18", + "wgpu", +] + +[[package]] +name = "re_view_text_document" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "egui", + "egui_commonmark", + "re_byte_size", + "re_chunk_store", + "re_log_types", + "re_sdk_types", + "re_test_context", + "re_test_viewport", + "re_tracing", + "re_ui", + "re_view", + "re_viewer_context", + "re_viewport_blueprint", +] + +[[package]] +name = "re_view_text_log" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "egui", + "egui_extras", + "itertools 0.14.0", + "re_byte_size", + "re_chunk", + "re_chunk_store", + "re_data_ui", + "re_entity_db", + "re_log", + "re_log_types", + "re_query", + "re_sdk_types", + "re_test_context", + "re_test_viewport", + "re_tracing", + "re_ui", + "re_view", + "re_viewer_context", + "re_viewport_blueprint", +] + +[[package]] +name = "re_view_time_series" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "arrayvec", + "egui", + "egui_plot", + "glam", + "itertools 0.14.0", + "macaw", + "nohash-hasher", + "rayon", + "re_byte_size", + "re_chunk", + "re_chunk_store", + "re_component_ui", + "re_format", + "re_log", + "re_log_types", + "re_plot", + "re_query", + "re_renderer", + "re_sdk_types", + "re_test_context", + "re_test_viewport", + "re_tracing", + "re_ui", + "re_view", + "re_viewer_context", + "re_viewport_blueprint", + "smallvec", + "vec1", +] + +[[package]] +name = "re_viewer" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "anyhow", + "arrow", + "bytemuck", + "camino", + "cfg-if", + "crossbeam", + "eframe", + "egui", + "egui-wgpu", + "egui_inspection", + "egui_kittest", + "egui_plot", + "ehttp", + "emath", + "futures", + "glam", + "image", + "insta", + "itertools 0.14.0", + "jiff", + "js-sys", + "num-traits", + "parking_lot", + "poll-promise", + "rayon", + "re_analytics", + "re_auth", + "re_blueprint_tree", + "re_build_info", + "re_build_tools", + "re_byte_size", + "re_capabilities", + "re_chunk", + "re_chunk_store", + "re_chunk_store_ui", + "re_component_fallbacks", + "re_component_ui", + "re_data_source", + "re_data_ui", + "re_dataframe_ui", + "re_entity_db", + "re_error", + "re_format", + "re_gamepad", + "re_importer", + "re_log", + "re_log_channel", + "re_log_encoding", + "re_log_types", + "re_memory", + "re_memory_view", + "re_mutex", + "re_perf_telemetry", + "re_protos", + "re_query", + "re_recording_panel", + "re_redap_browser", + "re_redap_client", + "re_renderer", + "re_sdk_types", + "re_selection_panel", + "re_server", + "re_sorbet", + "re_string_interner", + "re_test_context", + "re_test_viewport", + "re_time_panel", + "re_tracing", + "re_types_core", + "re_ui", + "re_uri", + "re_video", + "re_view", + "re_view_bar_chart", + "re_view_dataframe", + "re_view_graph", + "re_view_map", + "re_view_spatial", + "re_view_state_timeline", + "re_view_tensor", + "re_view_text_document", + "re_view_text_log", + "re_view_time_series", + "re_viewer_context", + "re_viewport", + "re_viewport_blueprint", + "rfd", + "ron", + "serde", + "serde-wasm-bindgen", + "serde_json", + "strum", + "strum_macros", + "tap", + "tempfile", + "thiserror 2.0.18", + "tokio", + "tokio-stream", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "web-time", + "wgpu", + "winit", +] + +[[package]] +name = "re_viewer_context" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "anyhow", + "arrow", + "bitflags 2.13.0", + "bytemuck", + "camino", + "crossbeam", + "datafusion", + "directories", + "egui", + "egui-wgpu", + "egui_tiles", + "emath", + "glam", + "half", + "home", + "image", + "indexmap 2.14.0", + "itertools 0.14.0", + "linked-hash-map", + "macaw", + "ndarray", + "nohash-hasher", + "parking_lot", + "rand 0.9.4", + "rayon", + "re_arrow_ui", + "re_arrow_util", + "re_byte_size", + "re_capabilities", + "re_chunk", + "re_chunk_store", + "re_data_source", + "re_entity_db", + "re_error", + "re_format", + "re_lenses_core", + "re_log", + "re_log_channel", + "re_log_encoding", + "re_log_types", + "re_memory", + "re_mutex", + "re_query", + "re_quota_channel", + "re_redap_client", + "re_renderer", + "re_sdk_types", + "re_string_interner", + "re_tf", + "re_tracing", + "re_types_core", + "re_ui", + "re_uri", + "re_video", + "rfd", + "serde", + "slotmap", + "smallvec", + "static_assertions", + "strum_macros", + "thiserror 2.0.18", + "tokio", + "uuid", + "vec1", + "wasm-bindgen-futures", + "web-sys", + "wgpu", +] + +[[package]] +name = "re_viewer_mcp" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "egui_inspection", + "egui_mcp", + "insta", + "parking_lot", + "re_log", + "re_protos", + "rmcp", + "schemars 1.2.1", + "serde", + "serde_json", + "tokio", + "tonic", +] + +[[package]] +name = "re_viewport" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "egui", + "egui_tiles", + "nohash-hasher", + "rayon", + "re_context_menu", + "re_entity_db", + "re_format", + "re_log", + "re_log_types", + "re_renderer", + "re_sdk_types", + "re_tracing", + "re_ui", + "re_viewer_context", + "re_viewport_blueprint", + "web-time", +] + +[[package]] +name = "re_viewport_blueprint" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "arrow", + "criterion", + "egui", + "egui_tiles", + "itertools 0.14.0", + "mimalloc", + "nohash-hasher", + "rand 0.9.4", + "re_chunk", + "re_chunk_store", + "re_entity_db", + "re_log", + "re_log_types", + "re_mutex", + "re_sdk_types", + "re_test_context", + "re_tracing", + "re_types_core", + "re_ui", + "re_viewer_context", + "slotmap", + "smallvec", + "thiserror 2.0.18", +] + +[[package]] +name = "re_web_viewer_server" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "document-features", + "re_analytics", + "re_build_tools", + "re_log", + "thiserror 2.0.18", + "tiny_http", + "zip 8.6.0", +] + +[[package]] +name = "read-fonts" +version = "0.39.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4ed38b89c2c77ff968c524145ad65fb010f38af5c7a224b53b81d47ac2daa81" +dependencies = [ + "bytemuck", + "font-types", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.0", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.18", +] + +[[package]] +name = "ref-cast" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "reflink-copy" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13362233b147e57674c37b802d216b7c5e3dcccbed8967c84f0d8d223868ae27" +dependencies = [ + "cfg-if", + "libc", + "rustix 1.1.4", + "windows", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-lite" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973" + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "renderdoc-sys" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + +[[package]] +name = "repr_offset" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb1070755bd29dffc19d0971cab794e607839ba2ef4b69a9e6fbc8733c1b72ea" +dependencies = [ + "tstr", +] + +[[package]] +name = "reqwest" +version = "0.12.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" +dependencies = [ + "async-compression", + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "mime", + "mime_guess", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-native-certs", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots 1.0.2", +] + +[[package]] +name = "reqwest-middleware" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57f17d28a6e6acfe1733fe24bcd30774d13bffa4b8a22535b4c8c98423088d4e" +dependencies = [ + "anyhow", + "async-trait", + "http", + "reqwest", + "serde", + "thiserror 1.0.69", + "tower-service", +] + +[[package]] +name = "rerun" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "anyhow", + "arrow", + "camino", + "cfg-if", + "clap", + "crossbeam", + "document-features", + "env_filter", + "indexmap 2.14.0", + "indicatif", + "itertools 0.14.0", + "jiff", + "log", + "mcap", + "parking_lot", + "puffin", + "rayon", + "re_analytics", + "re_arrow_util", + "re_auth", + "re_build_info", + "re_build_tools", + "re_byte_size", + "re_capabilities", + "re_chunk", + "re_chunk_store", + "re_crash_handler", + "re_data_source", + "re_dataframe", + "re_entity_db", + "re_error", + "re_format", + "re_grpc_server", + "re_log", + "re_log_channel", + "re_log_encoding", + "re_log_types", + "re_mcap", + "re_memory", + "re_perf_telemetry", + "re_protos", + "re_quota_channel", + "re_redap_client", + "re_sdk", + "re_sdk_types", + "re_server", + "re_sorbet", + "re_tracing", + "re_uri", + "re_video", + "re_viewer", + "re_viewer_mcp", + "re_web_viewer_server", + "similar-asserts", + "tokio", + "unindent", + "url", + "walkdir", +] + +[[package]] +name = "rerun-cli" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "document-features", + "mimalloc", + "re_build_info", + "re_build_tools", + "re_error", + "re_log", + "re_memory", + "re_server", + "rerun", +] + +[[package]] +name = "rerun-importer-rust-file" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "argh", + "rerun", +] + +[[package]] +name = "rerun-tonic-web-wasm-client" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0cf00a06feab41977adfc4f2593cb60ed937351924d5bb0edeaa3eafbc02a6a" +dependencies = [ + "base64 0.22.1", + "byteorder", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "httparse", + "js-sys", + "pin-project", + "thiserror 2.0.18", + "tonic", + "tower-service", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "rerun_c" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "ahash", + "arrow", + "infer", + "itertools 0.14.0", + "parking_lot", + "re_arrow_util", + "re_build_info", + "re_build_tools", + "re_crash_handler", + "re_log", + "re_sdk", + "re_video", +] + +[[package]] +name = "rerun_py" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "arrow", + "chrono", + "comfy-table", + "crossbeam", + "datafusion", + "datafusion-ffi", + "document-features", + "futures", + "infer", + "itertools 0.14.0", + "jiff", + "memmap2 0.9.11", + "mimalloc", + "numpy", + "parking_lot", + "pyo3", + "pyo3-build-config", + "rand 0.9.4", + "re_arrow_util", + "re_auth", + "re_build_info", + "re_build_tools", + "re_chunk", + "re_chunk_store", + "re_datafusion", + "re_error", + "re_format", + "re_grpc_client", + "re_grpc_server", + "re_importer", + "re_lenses", + "re_lenses_core", + "re_log", + "re_log_encoding", + "re_log_types", + "re_mcap", + "re_memory", + "re_mp4_reader", + "re_parquet", + "re_perf_telemetry", + "re_protos", + "re_quota_channel", + "re_redap_client", + "re_sdk", + "re_server", + "re_sorbet", + "re_tracing", + "re_tuid", + "re_types_core", + "re_uri", + "re_video", + "re_web_viewer_server", + "rustls", + "strum", + "strum_macros", + "tempfile", + "thiserror 2.0.18", + "tokio", + "tokio-stream", + "tonic", + "tracing", + "url", + "uuid", +] + +[[package]] +name = "resvg" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8928798c0a55e03c9ca6c4c6846f76377427d2c1e1f7e6de3c06ae57942df43" +dependencies = [ + "log", + "pico-args", + "rgb", + "svgtypes", + "tiny-skia", + "usvg", +] + +[[package]] +name = "rexif" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be932047c168919c8d5af065b16fa7d4bd24835ffa256bf0cf1ff463f91c15df" + +[[package]] +name = "rfc6381-codec" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed54c20f5c3ec82eab6d998b313dc75ec5d5650d4f57675e61d72489040297fd" +dependencies = [ + "mp4ra-rust", + "mpeg4-audio-const", +] + +[[package]] +name = "rfd" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20dafead71c16a34e1ff357ddefc8afc11e7d51d6d2b9fbd07eaa48e3e540220" +dependencies = [ + "block2 0.6.2", + "dispatch2", + "js-sys", + "libc", + "log", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "percent-encoding", + "pollster", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rgb" +version = "0.8.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a457e416a0f90d246a4c3288bd7a25b2304ca727f253f95be383dd17af56be8f" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rmcp" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1f571c72940a19d9532fe52dbea8bc9912bf1d766c2970bb824056b86f3f59" +dependencies = [ + "async-trait", + "base64 0.22.1", + "chrono", + "futures", + "pastey", + "pin-project-lite", + "rmcp-macros", + "schemars 1.2.1", + "serde", + "serde_json", + "thiserror 2.0.18", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "rmcp-macros" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aad0035b69380782d78ea95b508327e6deaa2235909053e596eea8f27b5e1d5" +dependencies = [ + "darling 0.23.0", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.117", +] + +[[package]] +name = "rmp" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ba8be72d372b2c9b35542551678538b562e7cf86c3315773cae48dfbfe7790c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "rmp-serde" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f81bee8c8ef9b577d1681a70ebbc962c232461e397b22c208c43c04b67a155" +dependencies = [ + "rmp", + "serde", +] + +[[package]] +name = "roaring" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dedc5658c6ecb3bdb5ef5f3295bb9253f42dcf3fd1402c03f6b1f7659c3c4a9" +dependencies = [ + "bytemuck", + "byteorder", +] + +[[package]] +name = "ron" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81116b9531d61eabc41aeb228e4b6b2435bcca3233b98cf3b3077d4e6e9debb3" +dependencies = [ + "bitflags 2.13.0", + "once_cell", + "serde", + "serde_derive", + "typeid", + "unicode-ident", +] + +[[package]] +name = "roxmltree" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" + +[[package]] +name = "run_wasm" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "cargo-run-wasm", + "pico-args", + "webbrowser", +] + +[[package]] +name = "rust-stemmers" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e46a2036019fdb888131db7a4c847a1063a7493f971ed94ea82c67eada63ca54" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.13.0", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.13.0", + "errno", + "libc", + "linux-raw-sys 0.12.1", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "saturating_cast" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fc4972f129a0ea378b69fa7c186d63255606e362ad00795f00b869dea5265eb" + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "chrono", + "dyn-clone", + "ref-cast", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d115b50f4aaeea07e79c1912f645c7513d81715d0420f8bc77a18c6260b307f" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.117", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scuffle-av1" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "028eddc8b17fe9dba817b238c56d3acf03748bdbed4c35783cfb93857ef15955" +dependencies = [ + "byteorder", + "bytes", + "scuffle-bytes-util", + "scuffle-workspace-hack", +] + +[[package]] +name = "scuffle-bytes-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0417748c2a42f4a08d4e634b68b1d64f22a8c24bef2e7ac93df33aa61202a45b" +dependencies = [ + "byteorder", + "bytes", + "bytestring", + "scuffle-workspace-hack", +] + +[[package]] +name = "scuffle-workspace-hack" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8028ded836a0d9fabdfa4d713389b76a2098b5153f50a135c8faed7e3a3d5ae2" + +[[package]] +name = "security-framework" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +dependencies = [ + "bitflags 2.13.0", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "self_cell" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89" + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "seq-macro" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde-xml-rs" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb3aa78ecda1ebc9ec9847d5d3aba7d618823446a049ba2491940506da6e2782" +dependencies = [ + "log", + "serde", + "thiserror 1.0.69", + "xml-rs", +] + +[[package]] +name = "serde_bytes" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" +dependencies = [ + "base64 0.22.1", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.0", + "schemars 0.9.0", + "schemars 1.2.1", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" +dependencies = [ + "darling 0.23.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "sha-1" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shared_recording" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "rerun", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "simd_cesu8" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33" +dependencies = [ + "rustc_version", + "simdutf8", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "similar" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" +dependencies = [ + "bstr", + "unicode-segmentation", +] + +[[package]] +name = "similar-asserts" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b441962c817e33508847a22bd82f03a30cff43642dc2fae8b050566121eb9a" +dependencies = [ + "console 0.15.11", + "similar", +] + +[[package]] +name = "simple-easing" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "832ddd7df0d98d6fd93b973c330b7c8e0742d5cb8f1afc7dea89dba4d2531aa1" + +[[package]] +name = "simplecss" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9c6883ca9c3c7c90e888de77b7a5c849c779d25d74a1269b0218b14e8b136c" +dependencies = [ + "log", +] + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "skrifa" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c34617370ae968efb7161bb2beb517d9084659aae19e24b89e3db25b46e4564" +dependencies = [ + "bytemuck", + "read-fonts", +] + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "slotmap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" +dependencies = [ + "serde", + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +dependencies = [ + "serde", +] + +[[package]] +name = "smithay-client-toolkit" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" +dependencies = [ + "bitflags 2.13.0", + "calloop", + "calloop-wayland-source", + "cursor-icon", + "libc", + "log", + "memmap2 0.9.11", + "rustix 0.38.44", + "thiserror 1.0.69", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smithay-clipboard" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc8216eec463674a0e90f29e0ae41a4db573ec5b56b1c6c1c71615d249b6d846" +dependencies = [ + "libc", + "smithay-client-toolkit", + "wayland-backend", +] + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + +[[package]] +name = "snafu" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1d4bced6a69f90b2056c03dcff2c4737f98d6fb9e0853493996e1d253ca29c6" +dependencies = [ + "snafu-derive", +] + +[[package]] +name = "snafu-derive" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54254b8531cafa275c5e096f62d48c81435d1015405a91198ddb11e967301d40" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "snap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" + +[[package]] +name = "snippets" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "crossbeam", + "itertools 0.14.0", + "ndarray", + "rand 0.9.4", + "rand_distr", + "re_build_tools", + "rerun", + "similar-asserts", +] + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "socket2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "spawn_viewer" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "rerun", +] + +[[package]] +name = "spirv" +version = "0.4.0+sdk-1.4.341.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9571ea910ebd84c86af4b3ed27f9dbdc6ad06f17c5f96146b2b671e2976744f" +dependencies = [ + "bitflags 2.13.0", +] + +[[package]] +name = "sqlparser" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbf5ea8d4d7c808e1af1cbabebca9a2abe603bcefc22294c5b95018d53200cb7" +dependencies = [ + "log", + "sqlparser_derive", +] + +[[package]] +name = "sqlparser_derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6dd45d8fc1c79299bfbb7190e42ccbbdf6a5f52e4a6ad98d92357ea965bd289" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ssri" +version = "9.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7a2b3c2bc9693bcb40870c4e9b5bf0d79f9cb46273321bf855ec513e919082" +dependencies = [ + "base64 0.21.7", + "digest", + "hex", + "miette", + "serde", + "sha-1", + "sha2", + "thiserror 1.0.69", + "xxhash-rust", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "state_timeline_example" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "arrow", + "rerun", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "std_prelude" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8207e78455ffdf55661170876f88daf85356e4edd54e0a3dbc79586ca1e50cbe" + +[[package]] +name = "stdio" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "itertools 0.14.0", + "rerun", +] + +[[package]] +name = "stfu8" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51f1e89f093f99e7432c491c382b88a6860a5adbe6bf02574bf0a08efff1978" + +[[package]] +name = "stl_io" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567641995c51a3b8befddb13e1826187bcf7eb7ca8d13746bfd1cc5a22e89fa8" + +[[package]] +name = "stop-words" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d68df56303396bcfb639455b3c166804aeb7994005010aab5e9e8a1277b8871d" +dependencies = [ + "serde_json", +] + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" +dependencies = [ + "float-cmp", +] + +[[package]] +name = "strip-ansi-escapes" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a8f8038e7e7969abb3f1b7c2a811225e9296da208539e0f79c5251d6cac0025" +dependencies = [ + "vte", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.117", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "svgtypes" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" +dependencies = [ + "kurbo 0.11.2", + "siphasher", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "sysinfo" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ab6a2f8bfe508deb3c6406578252e491d299cbbf3bc0529ecc3313aee4a52f" +dependencies = [ + "libc", + "memchr", + "ntapi", + "objc2-core-foundation", + "objc2-io-kit", + "windows", +] + +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "target-lexicon" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df7f62577c25e07834649fc3b39fafdc597c0a3527dc1c60129201ccfcbaa50c" + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.2", + "once_cell", + "rustix 1.1.4", + "windows-sys 0.61.2", +] + +[[package]] +name = "template" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "rerun", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "test_data_density_graph" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "rand 0.9.4", + "re_log", + "rerun", +] + +[[package]] +name = "test_image_memory" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "mimalloc", + "re_format", + "re_memory", + "rerun", +] + +[[package]] +name = "test_label_compaction" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "clap", + "re_log", + "rerun", +] + +[[package]] +name = "test_out_of_order_transforms" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "clap", + "glam", + "re_log", + "rerun", +] + +[[package]] +name = "test_ui_wakeup" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "anyhow", + "clap", + "re_log", + "rerun", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thread-tree" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbd370cb847953a25954d9f63e14824a36113f8c72eecf6eccef5dc4b45d630" +dependencies = [ + "crossbeam-channel", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "thrift" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e54bc85fc7faa8bc175c4bab5b92ba8d9a3ce893d0e9f42cc455c8ab16a9e09" +dependencies = [ + "byteorder", + "integer-encoding", + "ordered-float 2.10.1", +] + +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tiny-skia" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "png", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + +[[package]] +name = "tiny_http" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389915df6413a2e74fb181895f933386023c71110878cd0825588928e64cdc82" +dependencies = [ + "ascii", + "chunked_transfer", + "httpdate", + "log", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "serde_core", + "zerovec", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "to_method" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c4ceeeca15c8384bbc3e011dbd8fccb7f068a440b752b7d9b32ceb0ca0e2e8" + +[[package]] +name = "tobj" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04aca6092e5978e708ee784e8ab9b5cf3cdb598b28f99a2f257446e7081a7025" +dependencies = [ + "ahash", +] + +[[package]] +name = "tokio" +version = "1.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.6.4", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" +dependencies = [ + "indexmap 2.14.0", + "serde_core", + "serde_spanned", + "toml_datetime", + "toml_parser", + "toml_writer", + "winnow 1.0.3", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime", + "toml_parser", + "winnow 1.0.3", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow 1.0.3", +] + +[[package]] +name = "toml_writer" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" + +[[package]] +name = "tonic" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac2a5518c70fa84342385732db33fb3f44bc4cc748936eb5833d2df34d6445ef" +dependencies = [ + "async-trait", + "axum", + "base64 0.22.1", + "bytes", + "flate2", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-timeout", + "hyper-util", + "percent-encoding", + "pin-project", + "rustls-native-certs", + "socket2 0.6.4", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic-build" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c68f61875ac5293cf72e6c8cf0158086428c82c37229e98c840878f1706b0322" +dependencies = [ + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tonic-prost" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50849f68853be452acf590cde0b146665b8d507b3b8af17261df47e02c209ea0" +dependencies = [ + "bytes", + "prost", + "tonic", +] + +[[package]] +name = "tonic-prost-build" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "654e5643eff75d7f8c99197ce1440ed19a3474eada74c12bbac488b2cafdae27" +dependencies = [ + "prettyplease", + "proc-macro2", + "prost-build", + "prost-types", + "quote", + "syn 2.0.117", + "tempfile", + "tonic-build", +] + +[[package]] +name = "tonic-types" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab1b02061f83d519bba3caa167f88f261ef05720ab8ebc954ade70de3348e8" +dependencies = [ + "prost", + "prost-types", + "tonic", +] + +[[package]] +name = "tonic-web" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6a1b6319ca4b61a4c0f0c94d439c8f3ed344cca56fe0df40e1fe4be11380b" +dependencies = [ + "base64 0.22.1", + "bytes", + "http", + "http-body", + "pin-project", + "tokio-stream", + "tonic", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 2.14.0", + "pin-project-lite", + "slab", + "sync_wrapper", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags 2.13.0", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "tracing", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-opentelemetry" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adbc64cba7137545b8044cb1fe9814f7aacf3c6b5f9b45be8bb5db538befdb26" +dependencies = [ + "js-sys", + "opentelemetry", + "smallvec", + "tracing", + "tracing-core", + "tracing-log", + "tracing-subscriber", + "web-time", +] + +[[package]] +name = "tracing-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "tracing-tracy" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eaa1852afa96e0fe9e44caa53dc0bd2d9d05e0f2611ce09f97f8677af56e4ba" +dependencies = [ + "tracing-core", + "tracing-subscriber", + "tracy-client", +] + +[[package]] +name = "tracing-web" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e6a141feebd51f8d91ebfd785af50fca223c570b86852166caa3b141defe7c" +dependencies = [ + "js-sys", + "tracing-core", + "tracing-subscriber", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "tracy-client" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f6fc3baeac5d86ab90c772e9e30620fc653bf1864295029921a15ef478e6a5" +dependencies = [ + "loom", + "once_cell", + "tracy-client-sys", +] + +[[package]] +name = "tracy-client-sys" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f7c95348f20c1c913d72157b3c6dee6ea3e30b3d19502c5a7f6d3f160dacbf" +dependencies = [ + "cc", + "windows-targets 0.52.6", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tstr" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f8e0294f14baae476d0dd0a2d780b2e24d66e349a9de876f5126777a37bdba7" +dependencies = [ + "tstr_proc_macros", +] + +[[package]] +name = "tstr_proc_macros" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78122066b0cb818b8afd08f7ed22f7fdbc3e90815035726f0840d0d26c0747a" + +[[package]] +name = "twox-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" +dependencies = [ + "rand 0.9.4", +] + +[[package]] +name = "type-map" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90" +dependencies = [ + "rustc-hash 2.1.1", +] + +[[package]] +name = "typed-arena" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" + +[[package]] +name = "typed-path" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset", + "tempfile", + "winapi", +] + +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + +[[package]] +name = "unicode-general-category" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b993bddc193ae5bd0d623b49ec06ac3e9312875fdae725a975c51db1cc1677f" + +[[package]] +name = "unicode-ident" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" + +[[package]] +name = "unicode-normalization" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "unindent" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" + +[[package]] +name = "unit-prefix" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "323402cff2dd658f39ca17c789b502021b3f18707c91cdf22e3838e1b4023817" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "urdf-rs" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "074515a3e6dc230bbbdcf35830fd71b67b55ae2ac22bc4ff69d89412fc84b830" +dependencies = [ + "RustyXML", + "quick-xml 0.36.2", + "regex", + "serde", + "serde-xml-rs", + "thiserror 1.0.69", +] + +[[package]] +name = "ureq" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" +dependencies = [ + "base64 0.22.1", + "log", + "once_cell", + "rustls", + "rustls-pki-types", + "url", + "webpki-roots 0.26.11", +] + +[[package]] +name = "ureq" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0" +dependencies = [ + "base64 0.22.1", + "cookie_store", + "flate2", + "log", + "percent-encoding", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "ureq-proto", + "utf8-zero", + "webpki-roots 1.0.2", +] + +[[package]] +name = "ureq-proto" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c" +dependencies = [ + "base64 0.22.1", + "http", + "httparse", + "log", +] + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[package]] +name = "usvg" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80be9b06fbae3b8b303400ab20778c80bbaf338f563afe567cf3c9eea17b47ef" +dependencies = [ + "base64 0.22.1", + "data-url", + "flate2", + "imagesize", + "kurbo 0.11.2", + "log", + "pico-args", + "roxmltree", + "simplecss", + "siphasher", + "strict-num", + "svgtypes", + "tiny-skia-path", + "xmlwriter", +] + +[[package]] +name = "utf8-ranges" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcfc827f90e53a02eaef5e535ee14266c1d569214c6aa70133a624d8a3164ba" + +[[package]] +name = "utf8-zero" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8c0a043c9540bae7c578c88f91dda8bd82e59ae27c21baca69c8b191aaf5a6e" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7" +dependencies = [ + "getrandom 0.4.2", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vec1" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab68b56840f69efb0fefbe3ab6661499217ffdc58e2eef7c3f6f69835386322" +dependencies = [ + "serde", + "smallvec", +] + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "vello_common" +version = "0.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d672facaa2d697285a786cd9d44d614cd2ce54cdc022504bf339f8fff3b750" +dependencies = [ + "bytemuck", + "fearless_simd", + "guillotiere", + "hashbrown 0.17.1", + "log", + "peniko", + "smallvec", + "thiserror 2.0.18", +] + +[[package]] +name = "vello_cpu" +version = "0.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "588691169aed86b5c8fb487266afee01323234e6fd0a3f2aaec0eaa8e4007f23" +dependencies = [ + "bytemuck", + "glifo", + "hashbrown 0.17.1", + "vello_common", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "viewer_callbacks" +version = "0.35.0-alpha.1+dev" +dependencies = [ + "mimalloc", + "rerun", +] + +[[package]] +name = "vte" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "231fdcd7ef3037e8330d8e17e61011a2c244126acc0a982f4040ac3f9f0bc077" +dependencies = [ + "memchr", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "walkers" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936a0d5741eb3dcd0fc2da5ec819447147f0c296492a54f20318e76f3b2f37bc" +dependencies = [ + "bytes", + "egui", + "egui_extras", + "futures", + "geo-types", + "getrandom 0.2.17", + "http-cache-reqwest", + "image", + "log", + "lru", + "reqwest", + "reqwest-middleware", + "thiserror 2.0.18", + "tokio", + "wasm-bindgen-futures", +] + +[[package]] +name = "walrus" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e151599d689dac80e85c66a7cfa6ffd1b2ab79220517f9161040a87a5041aee3" +dependencies = [ + "anyhow", + "gimli", + "id-arena", + "leb128", + "log", + "rayon", + "walrus-macro", + "wasm-encoder 0.245.1", + "wasmparser 0.245.1", +] + +[[package]] +name = "walrus-macro" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a9b0525d7ea6e5f906aca581a172e5c91b4c595290dfa8ad4a2bc9ffef33b44" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen 0.46.0", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen 0.51.0", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-cli-support" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56574baa147c7433657bdfa369f32850d98d928be100828a7b7babb266b31f0e" +dependencies = [ + "anyhow", + "base64 0.22.1", + "leb128", + "log", + "rustc-demangle", + "serde", + "serde_json", + "walrus", + "wasm-bindgen-shared", + "wasmparser 0.245.1", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03623de6905b7206edd0a75f69f747f134b7f0a2323392d664448bf2d3c5d87e" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-bindgen-test" +version = "0.3.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "941c102b3f0c15b6d72a53205e09e6646aafcf2991e18412cc331dbac1806bc0" +dependencies = [ + "async-trait", + "cast", + "js-sys", + "libm", + "minicov", + "nu-ansi-term", + "num-traits", + "oorandom", + "serde", + "serde_json", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test-macro", + "wasm-bindgen-test-shared", +] + +[[package]] +name = "wasm-bindgen-test-macro" +version = "0.3.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26bd6570f39bb1440fd8f01b63461faaf2a3f6078a508e4e54efa99363108d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "wasm-bindgen-test-shared" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c29582b14d5bf030b02fa232b9b57faf2afc322d2c61964dd80bad02bf76207" + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser 0.244.0", +] + +[[package]] +name = "wasm-encoder" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9dca005e69bf015e45577e415b9af8c67e8ee3c0e38b5b0add5aa92581ed5c" +dependencies = [ + "leb128fmt", + "wasmparser 0.245.1", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.14.0", + "wasm-encoder 0.244.0", + "wasmparser 0.244.0", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.13.0", + "hashbrown 0.15.5", + "indexmap 2.14.0", + "semver", +] + +[[package]] +name = "wasmparser" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f08c9adee0428b7bddf3890fc27e015ac4b761cc608c822667102b8bfd6995e" +dependencies = [ + "bitflags 2.13.0", + "hashbrown 0.16.1", + "indexmap 2.14.0", + "semver", + "serde", +] + +[[package]] +name = "wayland-backend" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2857dd20b54e916ec7253b3d6b4d5c4d7d4ca2c33c2e11c6c76a99bd8744755d" +dependencies = [ + "cc", + "downcast-rs", + "rustix 1.1.4", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c7c96bb74690c3189b5c9cb4ca1627062bb23693a4fad9d8c3de958260144" +dependencies = [ + "bitflags 2.13.0", + "rustix 1.1.4", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-csd-frame" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" +dependencies = [ + "bitflags 2.13.0", + "cursor-icon", + "wayland-backend", +] + +[[package]] +name = "wayland-cursor" +version = "0.31.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65317158dec28d00416cb16705934070aef4f8393353d41126c54264ae0f182" +dependencies = [ + "rustix 0.38.44", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d0c813de3daa2ed6520af85a3bd49b0e722a3078506899aa9686fea58dc4b6" +dependencies = [ + "bitflags 2.13.0", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fd38cdad69b56ace413c6bcc1fbf5acc5e2ef4af9d5f8f1f9570c0c83eae175" +dependencies = [ + "bitflags 2.13.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cb6cdc73399c0e06504c437fe3cf886f25568dd5454473d565085b36d6a8bbf" +dependencies = [ + "bitflags 2.13.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c324a910fd86ebdc364a3e61ec1f11737d3b1d6c273c0239ee8ff4bc0d24b4a" +dependencies = [ + "proc-macro2", + "quick-xml 0.39.4", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8eab23fefc9e41f8e841df4a9c707e8a8c4ed26e944ef69297184de2785e3be" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd70027e39b12f0849461e08ffc50b9cd7688d942c1c8e3c7b22273236b4dd0a" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webbrowser" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc95580916af1e68ff6a7be07446fc5db73ebf71cf092de939bbf5f7e189f72" +dependencies = [ + "core-foundation 0.10.1", + "jni 0.22.4", + "log", + "ndk-context", + "objc2 0.6.4", + "objc2-foundation 0.3.2", + "url", + "web-sys", +] + +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.2", +] + +[[package]] +name = "webpki-roots" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "weezl" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" + +[[package]] +name = "wgpu" +version = "29.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb3feacc458f7bee8bc1737149b42b6c731aa461039a4264a67bb6681646b250" +dependencies = [ + "arrayvec", + "bitflags 2.13.0", + "bytemuck", + "cfg-if", + "cfg_aliases", + "document-features", + "hashbrown 0.16.1", + "js-sys", + "log", + "naga", + "parking_lot", + "portable-atomic", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "29.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02da3ad1b568337f25513b317870960ef87073ea0945502e44b864b67a8c77b7" +dependencies = [ + "arrayvec", + "bit-set", + "bit-vec", + "bitflags 2.13.0", + "bytemuck", + "cfg_aliases", + "document-features", + "hashbrown 0.16.1", + "indexmap 2.14.0", + "log", + "naga", + "once_cell", + "parking_lot", + "portable-atomic", + "profiling", + "raw-window-handle", + "rustc-hash 1.1.0", + "smallvec", + "thiserror 2.0.18", + "wgpu-core-deps-apple", + "wgpu-core-deps-emscripten", + "wgpu-core-deps-wasm", + "wgpu-core-deps-windows-linux-android", + "wgpu-hal", + "wgpu-naga-bridge", + "wgpu-types", +] + +[[package]] +name = "wgpu-core-deps-apple" +version = "29.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43acd053312501689cd92a01a9638d37f3e41a5fd9534875efa8917ee2d11ac0" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-emscripten" +version = "29.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef043bf135cc68b6f667c55ff4e345ce2b5924d75bad36a47921b0287ca4b24a" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-wasm" +version = "29.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f7b75e72f49035f000dd5262e4126242e92a090a4fd75931ecfe7e60784e6fa" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-windows-linux-android" +version = "29.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "725d5c006a8c02967b6d93ef04f6537ec4593313e330cfe86d9d3f946eb90f28" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-hal" +version = "29.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f8e1a9e7a8512f276f7c62e018c7fa8d60954303fed2e5750114332049193f" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set", + "bitflags 2.13.0", + "block2 0.6.2", + "bytemuck", + "cfg-if", + "cfg_aliases", + "glow", + "glutin_wgl_sys", + "gpu-allocator", + "gpu-descriptor", + "hashbrown 0.16.1", + "js-sys", + "khronos-egl", + "libc", + "libloading 0.8.9", + "log", + "naga", + "ndk-sys", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "objc2-metal 0.3.2", + "objc2-quartz-core 0.3.2", + "once_cell", + "ordered-float 5.3.0", + "parking_lot", + "portable-atomic", + "portable-atomic-util", + "profiling", + "range-alloc", + "raw-window-handle", + "raw-window-metal", + "renderdoc-sys", + "smallvec", + "thiserror 2.0.18", + "wasm-bindgen", + "wayland-sys", + "web-sys", + "wgpu-naga-bridge", + "wgpu-types", + "windows", + "windows-core", + "windows-result", +] + +[[package]] +name = "wgpu-naga-bridge" +version = "29.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59c654c483f058800972c3645e95388a7eca31bf9fe1933bc20e036588a0be02" +dependencies = [ + "naga", + "wgpu-types", +] + +[[package]] +name = "wgpu-types" +version = "29.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9bcc31518a0e9735aefebedb5f7a9ef3ed1c42549c9f4c882fa9060ceaac639" +dependencies = [ + "bitflags 2.13.0", + "bytemuck", + "js-sys", + "log", + "raw-window-handle", + "web-sys", +] + +[[package]] +name = "wildmatch" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29333c3ea1ba8b17211763463ff24ee84e41c78224c16b001cd907e663a38c68" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections", + "windows-core", + "windows-future", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +dependencies = [ + "windows-core", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core", + "windows-link", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core", + "windows-link", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winit" +version = "0.30.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6755fa58a9f8350bd1e472d4c3fcc25f824ec358933bba33306d0b63df5978d" +dependencies = [ + "ahash", + "android-activity", + "atomic-waker", + "bitflags 2.13.0", + "block2 0.5.1", + "bytemuck", + "calloop", + "cfg_aliases", + "concurrent-queue", + "core-foundation 0.9.4", + "core-graphics", + "cursor-icon", + "dpi", + "js-sys", + "libc", + "memmap2 0.9.11", + "ndk", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", + "objc2-ui-kit 0.2.2", + "orbclient", + "percent-encoding", + "pin-project", + "raw-window-handle", + "redox_syscall 0.4.1", + "rustix 0.38.44", + "smithay-client-toolkit", + "smol_str", + "tracing", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-plasma", + "web-sys", + "web-time", + "windows-sys 0.52.0", + "x11-dl", + "x11rb", + "xkbcommon-dl", +] + +[[package]] +name = "winnow" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap 2.14.0", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.13.0", + "indexmap 2.14.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.244.0", + "wasm-metadata", + "wasmparser 0.244.0", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.14.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.244.0", +] + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading 0.8.9", + "once_cell", + "rustix 0.38.44", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" + +[[package]] +name = "xcursor" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" + +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.13.0", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + +[[package]] +name = "xml-rs" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" + +[[package]] +name = "xmlwriter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" + +[[package]] +name = "xshell" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e7290c623014758632efe00737145b6867b66292c42167f2ec381eb566a373d" +dependencies = [ + "xshell-macros", +] + +[[package]] +name = "xshell-macros" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32ac00cd3f8ec9c1d33fb3e7958a82df6989c42d747bd326c822b1d625283547" + +[[package]] +name = "xxhash-rust" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zbus" +version = "5.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d07e46d035fb8e375b2ce63ba4e4ff90a7f73cf2ffb0138b29e1158d2eaadf7" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "nix", + "ordered-stream", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "windows-sys 0.60.2", + "winnow 0.7.13", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus-lockstep" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29e96e38ded30eeab90b6ba88cb888d70aef4e7489b6cd212c5e5b5ec38045b6" +dependencies = [ + "zbus_xml", + "zvariant", +] + +[[package]] +name = "zbus-lockstep-macros" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6821851fa840b708b4cbbaf6241868cabc85a2dc22f426361b0292bfc0b836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "zbus-lockstep", + "zbus_xml", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57e797a9c847ed3ccc5b6254e8bcce056494b375b511b3d6edcec0aeb4defaca" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.117", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" +dependencies = [ + "serde", + "static_assertions", + "winnow 0.7.13", + "zvariant", +] + +[[package]] +name = "zbus_xml" +version = "5.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589e9a02bfafb9754bb2340a9e3b38f389772684c63d9637e76b1870377bec29" +dependencies = [ + "quick-xml 0.36.2", + "serde", + "static_assertions", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +dependencies = [ + "zerocopy-derive 0.8.27", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "serde", + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zip" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +dependencies = [ + "byteorder", + "crc32fast", + "crossbeam-utils", + "flate2", +] + +[[package]] +name = "zip" +version = "8.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d04a6b5381502aa6087c94c669499eb1602eb9c5e8198e534de571f7154809b" +dependencies = [ + "crc32fast", + "flate2", + "indexmap 2.14.0", + "memchr", + "typed-path", + "zopfli", +] + +[[package]] +name = "zlib-rs" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f06ae92f42f5e5c42443fd094f245eb656abf56dd7cce9b8b263236565e00f2" + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zopfli" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-jpeg" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" +dependencies = [ + "zune-core", +] + +[[package]] +name = "zvariant" +version = "5.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "999dd3be73c52b1fccd109a4a81e4fcd20fab1d3599c8121b38d04e1419498db" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow 0.7.13", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6643fd0b26a46d226bd90d3f07c1b5321fe9bb7f04673cb37ac6d6883885b68e" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.117", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6949d142f89f6916deca2232cf26a8afacf2b9fdc35ce766105e104478be599" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 2.0.117", + "winnow 0.7.13", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..ec05aee --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,981 @@ +[workspace] +resolver = "2" +members = [ + "crates/build/*", + "crates/store/*", + "crates/top/*", + "crates/utils/*", + "crates/viewer/*", + "docs/snippets", + "examples/rust/*", + "rerun_py", + "run_wasm", + "tests/rust/log_benchmark", + "tests/rust/plot_dashboard_stress", + "tests/rust/re_integration_test", + "tests/rust/test_*", +] +exclude = ["examples/rust/revy", "examples/rust/chess_robby_fischer"] + +[workspace.package] +authors = ["rerun.io "] +edition = "2024" +homepage = "https://rerun.io" +include = [ + "../../Cargo.lock", # So that users can pass `--locked` to `cargo install rerun-cli` + "../../LICENSE-APACHE", + "../../LICENSE-MIT", + "**/*.rs", + "Cargo.toml", +] +license = "MIT OR Apache-2.0" +repository = "https://github.com/rerun-io/rerun" +rust-version = "1.92" +version = "0.35.0-alpha.1+dev" + +[workspace.metadata.cargo-shear] +ignored = [ + # rerun crates + "rerun_c", + "re_dev_tools", + "rerun-cli", + "re_types_builder", + "re_protos_builder", + "re_renderer_examples", + + # used for specific targets or features + "home", + "profiling", + "wayland-sys", # only enabled via the `server` feature of `re_tracing` + "windows-core", +] +ignored-paths = [ + "docs/snippets/all/**/*.rs", # complains about unlinked files for our codegen input. +] + +[workspace.dependencies] +# When using alpha-release, always use exact version, e.g. `version = "=0.x.y-alpha.z" +# This is because we treat alpha-releases as incompatible, but semver doesn't. +# In particular: if we compile rerun 0.3.0-alpha.0 we only want it to use +# re_log_types 0.3.0-alpha.0, NOT 0.3.0-alpha.4 even though it is newer and semver-compatible. + +# crates/build: +re_build_info = { path = "crates/build/re_build_info", version = "=0.35.0-alpha.1", default-features = false } +re_build_tools = { path = "crates/build/re_build_tools", version = "=0.35.0-alpha.1", default-features = false } +re_dev_tools = { path = "crates/build/re_dev_tools", version = "=0.35.0-alpha.1", default-features = false } +re_protos_builder = { path = "crates/build/re_protos_builder", version = "=0.35.0-alpha.1", default-features = false } +re_types_builder = { path = "crates/build/re_types_builder", version = "=0.35.0-alpha.1", default-features = false } + +# crates/store: +re_lenses_core = { path = "crates/store/re_lenses_core", version = "=0.35.0-alpha.1", default-features = false } +re_chunk = { path = "crates/store/re_chunk", version = "=0.35.0-alpha.1", default-features = false } +re_chunk_store = { path = "crates/store/re_chunk_store", version = "=0.35.0-alpha.1", default-features = false } +re_importer = { path = "crates/store/re_importer", version = "=0.35.0-alpha.1", default-features = false } +re_data_source = { path = "crates/store/re_data_source", version = "=0.35.0-alpha.1", default-features = false } +re_dataframe = { path = "crates/store/re_dataframe", version = "=0.35.0-alpha.1", default-features = false } +re_datafusion = { path = "crates/store/re_datafusion", version = "=0.35.0-alpha.1", default-features = false } +re_entity_db = { path = "crates/store/re_entity_db", version = "=0.35.0-alpha.1", default-features = false } +re_grpc_client = { path = "crates/store/re_grpc_client", version = "=0.35.0-alpha.1", default-features = false } +re_grpc_server = { path = "crates/store/re_grpc_server", version = "=0.35.0-alpha.1", default-features = false } +re_lenses = { path = "crates/store/re_lenses", version = "=0.35.0-alpha.1", default-features = false } +re_log_channel = { path = "crates/store/re_log_channel", version = "=0.35.0-alpha.1", default-features = false } +re_log_encoding = { path = "crates/store/re_log_encoding", version = "=0.35.0-alpha.1", default-features = false } +re_log_types = { path = "crates/store/re_log_types", version = "=0.35.0-alpha.1", default-features = false } +re_mcap = { path = "crates/store/re_mcap", version = "=0.35.0-alpha.1", default-features = false } +re_mp4_reader = { path = "crates/store/re_mp4_reader", version = "=0.35.0-alpha.1", default-features = false } +re_parquet = { path = "crates/store/re_parquet", version = "=0.35.0-alpha.1", default-features = false } +re_protos = { path = "crates/store/re_protos", version = "=0.35.0-alpha.1", default-features = false } +re_query = { path = "crates/store/re_query", version = "=0.35.0-alpha.1", default-features = false } +re_redap_client = { path = "crates/store/re_redap_client", version = "=0.35.0-alpha.1", default-features = false } +re_redap_tests = { path = "crates/store/re_redap_tests", version = "=0.35.0-alpha.1", default-features = false } +re_sdk_types = { path = "crates/store/re_sdk_types", version = "=0.35.0-alpha.1", default-features = false } +re_server = { path = "crates/store/re_server", version = "=0.35.0-alpha.1", default-features = false } +re_sorbet = { path = "crates/store/re_sorbet", version = "=0.35.0-alpha.1", default-features = false } +re_tf = { path = "crates/store/re_tf", version = "=0.35.0-alpha.1", default-features = false } +re_types_core = { path = "crates/store/re_types_core", version = "=0.35.0-alpha.1", default-features = false } +re_uri = { path = "crates/store/re_uri", version = "=0.35.0-alpha.1", default-features = false } + +# crates/top: +re_sdk = { path = "crates/top/re_sdk", version = "=0.35.0-alpha.1", default-features = false } +rerun = { path = "crates/top/rerun", version = "=0.35.0-alpha.1", default-features = false } +rerun_c = { path = "crates/top/rerun_c", version = "=0.35.0-alpha.1", default-features = false } +rerun-cli = { path = "crates/top/rerun-cli", version = "=0.35.0-alpha.1", default-features = false } + +# crates/utils: +re_analytics = { path = "crates/utils/re_analytics", version = "=0.35.0-alpha.1", default-features = false } +re_arrow_util = { path = "crates/utils/re_arrow_util", version = "=0.35.0-alpha.1", default-features = false } +re_auth = { path = "crates/utils/re_auth", version = "=0.35.0-alpha.1", default-features = false } +re_backoff = { path = "crates/utils/re_backoff", version = "=0.35.0-alpha.1", default-features = false } +re_byte_size = { path = "crates/utils/re_byte_size", version = "=0.35.0-alpha.1", default-features = false } +re_byte_size_derive = { path = "crates/utils/re_byte_size_derive", version = "=0.35.0-alpha.1", default-features = false } +re_capabilities = { path = "crates/utils/re_capabilities", version = "=0.35.0-alpha.1", default-features = false } +re_case = { path = "crates/utils/re_case", version = "=0.35.0-alpha.1", default-features = false } +re_crash_handler = { path = "crates/utils/re_crash_handler", version = "=0.35.0-alpha.1", default-features = false } +re_error = { path = "crates/utils/re_error", version = "=0.35.0-alpha.1", default-features = false } +re_format = { path = "crates/utils/re_format", version = "=0.35.0-alpha.1", default-features = false } +re_grpc_headers = { path = "crates/utils/re_grpc_headers", version = "=0.35.0-alpha.1", default-features = false } +re_log = { path = "crates/utils/re_log", version = "=0.35.0-alpha.1", default-features = false } +re_memory = { path = "crates/utils/re_memory", version = "=0.35.0-alpha.1", default-features = false } +re_mutex = { path = "crates/utils/re_mutex", version = "=0.35.0-alpha.1", default-features = false } +re_perf_telemetry = { path = "crates/utils/re_perf_telemetry", version = "=0.35.0-alpha.1", default-features = false } +re_quota_channel = { path = "crates/utils/re_quota_channel", version = "=0.35.0-alpha.1", default-features = false } +re_ros_msg = { path = "crates/utils/re_ros_msg", version = "=0.35.0-alpha.1", default-features = false } +re_rvl = { path = "crates/utils/re_rvl", version = "=0.35.0-alpha.1", default-features = false } +re_span = { path = "crates/utils/re_span", version = "=0.35.0-alpha.1", default-features = false } +re_string_interner = { path = "crates/utils/re_string_interner", version = "=0.35.0-alpha.1", default-features = false } +re_test_mocks = { path = "crates/utils/re_test_mocks", version = "=0.35.0-alpha.1", default-features = false } +re_tracing = { path = "crates/utils/re_tracing", version = "=0.35.0-alpha.1", default-features = false } +re_tuid = { path = "crates/utils/re_tuid", version = "=0.35.0-alpha.1", default-features = false } +re_video = { path = "crates/utils/re_video", version = "=0.35.0-alpha.1", default-features = false } + +# crates/viewer: +re_arrow_ui = { path = "crates/viewer/re_arrow_ui", version = "=0.35.0-alpha.1", default-features = false } +re_blueprint_tree = { path = "crates/viewer/re_blueprint_tree", version = "=0.35.0-alpha.1", default-features = false } +re_chunk_store_ui = { path = "crates/viewer/re_chunk_store_ui", version = "=0.35.0-alpha.1", default-features = false } +re_component_fallbacks = { path = "crates/viewer/re_component_fallbacks", version = "=0.35.0-alpha.1", default-features = false } +re_component_ui = { path = "crates/viewer/re_component_ui", version = "=0.35.0-alpha.1", default-features = false } +re_context_menu = { path = "crates/viewer/re_context_menu", version = "=0.35.0-alpha.1", default-features = false } +re_data_ui = { path = "crates/viewer/re_data_ui", version = "=0.35.0-alpha.1", default-features = false } +re_dataframe_ui = { path = "crates/viewer/re_dataframe_ui", version = "=0.35.0-alpha.1", default-features = false } +re_gamepad = { path = "crates/viewer/re_gamepad", version = "=0.35.0-alpha.1", default-features = false } +re_memory_view = { path = "crates/viewer/re_memory_view", version = "=0.35.0-alpha.1", default-features = false } +re_plot = { path = "crates/viewer/re_plot", version = "=0.35.0-alpha.1", default-features = false } +re_recording_panel = { path = "crates/viewer/re_recording_panel", version = "=0.35.0-alpha.1", default-features = false } +re_redap_browser = { path = "crates/viewer/re_redap_browser", version = "=0.35.0-alpha.1", default-features = false } +re_renderer = { path = "crates/viewer/re_renderer", version = "=0.35.0-alpha.1", default-features = false } +re_renderer_examples = { path = "crates/viewer/re_renderer_examples", version = "=0.35.0-alpha.1", default-features = false } +re_selection_panel = { path = "crates/viewer/re_selection_panel", version = "=0.35.0-alpha.1", default-features = false } +re_test_context = { path = "crates/viewer/re_test_context", version = "=0.35.0-alpha.1", default-features = false } +re_test_viewport = { path = "crates/viewer/re_test_viewport", version = "=0.35.0-alpha.1", default-features = false } +re_time_panel = { path = "crates/viewer/re_time_panel", version = "=0.35.0-alpha.1", default-features = false } +re_time_ruler = { path = "crates/viewer/re_time_ruler", version = "=0.35.0-alpha.1", default-features = false } +re_ui = { path = "crates/viewer/re_ui", version = "=0.35.0-alpha.1", default-features = false } +re_view = { path = "crates/viewer/re_view", version = "=0.35.0-alpha.1", default-features = false } +re_view_bar_chart = { path = "crates/viewer/re_view_bar_chart", version = "=0.35.0-alpha.1", default-features = false } +re_view_dataframe = { path = "crates/viewer/re_view_dataframe", version = "=0.35.0-alpha.1", default-features = false } +re_view_graph = { path = "crates/viewer/re_view_graph", version = "=0.35.0-alpha.1", default-features = false } +re_view_map = { path = "crates/viewer/re_view_map", version = "=0.35.0-alpha.1", default-features = false } +re_view_spatial = { path = "crates/viewer/re_view_spatial", version = "=0.35.0-alpha.1", default-features = false } +re_view_state_timeline = { path = "crates/viewer/re_view_state_timeline", version = "=0.35.0-alpha.1", default-features = false } +re_view_tensor = { path = "crates/viewer/re_view_tensor", version = "=0.35.0-alpha.1", default-features = false } +re_view_text_document = { path = "crates/viewer/re_view_text_document", version = "=0.35.0-alpha.1", default-features = false } +re_view_text_log = { path = "crates/viewer/re_view_text_log", version = "=0.35.0-alpha.1", default-features = false } +re_view_time_series = { path = "crates/viewer/re_view_time_series", version = "=0.35.0-alpha.1", default-features = false } +re_viewer = { path = "crates/viewer/re_viewer", version = "=0.35.0-alpha.1", default-features = false } +re_viewer_context = { path = "crates/viewer/re_viewer_context", version = "=0.35.0-alpha.1", default-features = false } +re_viewer_mcp = { path = "crates/viewer/re_viewer_mcp", version = "=0.35.0-alpha.1", default-features = false } +re_viewport = { path = "crates/viewer/re_viewport", version = "=0.35.0-alpha.1", default-features = false } +re_viewport_blueprint = { path = "crates/viewer/re_viewport_blueprint", version = "=0.35.0-alpha.1", default-features = false } +re_web_viewer_server = { path = "crates/viewer/re_web_viewer_server", version = "=0.35.0-alpha.1", default-features = false } + +# Rerun crates in other repos: +quiver = { version = "0.4.0", default-features = false } +re_mp4 = "0.5.1" + +# If this package fails to build, install `nasm` locally, or build through `pixi`. +# NOTE: we use `dav1d` as an alias for our own re_rav1d crate +# See https://github.com/rerun-io/re_rav1d/pull/2 +dav1d = { package = "re_rav1d", version = "0.1.3", default-features = false } +# dav1d = { version = "0.10.3" } # Requires separate install of `dav1d` library. Fast in debug builds. Useful for development. + +# core egui-crates: +ecolor = "0.35.0" +eframe = { version = "0.35.0", default-features = false, features = [ + "accesskit", + "default_fonts", + "inspection", + "wayland", + "x11", +] } +egui = { version = "0.35.0", features = ["callstack", "color-hex", "rayon"] } +egui_extras = { version = "0.35.0", features = ["http", "image", "serde", "svg"] } +egui_inspection = { version = "0.35.0", default-features = false, features = ["plugin"] } +egui_kittest = { version = "0.35.0", features = ["wgpu", "snapshot", "eframe"] } +egui_mcp = { version = "0.1.0" } +egui-wgpu = "0.35.0" +emath = "0.35.0" + +# other egui crates: +egui_commonmark = { version = "0.24.0", default-features = false } +egui_dnd = { version = "0.16.0" } +egui_plot = "0.36.0" # https://github.com/emilk/egui_plot +egui_table = "0.9.0" # https://github.com/rerun-io/egui_table +egui_tiles = "0.16.0" # https://github.com/rerun-io/egui_tiles +walkers = "0.56.0" + +# All of our direct external dependencies should be found here: +ahash = "0.8.12" +anyhow = { version = "1.0", default-features = false } +argh = "0.1.19" +arrayvec = "0.7.6" +array-init = "2.1" +arrow = { version = "58.3", default-features = false, features = [ + # NOTE: Similar to `datafusion`, we enable many features on a workspace level + # to avoid re-compilation when changing compile targets. + "ffi", + "ipc", + "json", +] } +async-stream = "0.3.6" +async-trait = "0.1.89" +axum = "0.8.9" +backtrace = "0.3.76" +base64 = "0.22.1" +bincode = "1.3" +bit-vec = "0.9.1" +bitflags = { version = "2.13", features = ["bytemuck"] } +bytemuck = { version = "1.25", features = ["extern_crate_alloc"] } +byteorder = "1.5" +bytes = "1.12" +camino = "1.2" +cargo_metadata = "0.23.1" +cargo-run-wasm = "0.4.0" +cfg_aliases = "0.2.1" +cfg-if = "1.0" +chrono = { version = "0.4.45", default-features = false } # Needed for datafusion, see `re_datafusion`'s Cargo.toml +clang-format = "0.3.0" +clap = { version = "4.6", features = ["derive"] } +clean-path = "0.2.1" +colored = "2.2" # Old b/c of dify +comfy-table = { version = "7.2", default-features = false } +console_error_panic_hook = "0.1.7" +const_format = "0.2.36" +convert_case = "0.11.0" +criterion = "0.8.2" +cros-codecs = "0.0.6" +crossbeam = "0.8.4" +dae-parser = "0.11.0" +datafusion = { version = "53.1", default-features = false, features = [ + # NOTE: we enable the same features everywhere + # because otherwise we will recompile datafusion all the time based on our current compile target. + # The features here are the same as in https://github.com/rerun-io/lance/blob/release-8.0.0/Cargo.toml#L125 + # This is very hacky, and I don't like it. + "crypto_expressions", + "datetime_expressions", + "encoding_expressions", + "nested_expressions", + "regex_expressions", + "sql", + "string_expressions", + "unicode_expressions", +] } +datafusion-ffi = "53.1" +directories = "6.0" +document-features = "0.2.12" +econtext = "0.2.0" # Prints error contexts on crashes +ehttp = "0.7.1" +enumset = "1.1" +env_filter = { version = "1.0", default-features = false } +ffmpeg-sidecar = { version = "2.5", default-features = false } +fixed = { version = "1.30", default-features = false } +fjadra = "0.2.1" +flatbuffers = "25.12" +futures = "0.3.32" +futures-util = "0.3.32" +getrandom = "0.3.4" +getrandom02 = { package = "getrandom", version = "0.2.17" } +gilrs = "0.11.1" +glam = { version = "0.30.10", features = [ + "debug-glam-assert", + "serde", +] } # pinned to 0.30 by `macaw`; 0.33 would duplicate glam. Bump once macaw releases a glam-0.33 version. +glob = "0.3.3" +gltf = "1.4" +h264-reader = "0.8.0" +half = { version = "2.7", features = ["bytemuck"] } +hexasphere = "16.0" # Update in tandem with glam +hmac = "0.12.1" # pinned by `jsonwebtoken` (RustCrypto family); bump once jsonwebtoken moves to hmac 0.13/sha2 0.11/signature 3. +home = "0.5.12" +http = "1.4" +http-body = "1.0" +image = { version = "0.25.6", default-features = false, features = ["jpeg", "png"] } +indent = "0.1.1" +indexmap = { version = "2.14", features = [ + # indexmap version chosen to align with other dependencies + "std", + "serde", +] } +indicatif = "0.18.4" # Progress bar +infer = "0.19.0" # infer MIME type by checking the magic number signature +insta = "1.48" +itertools = "0.14.0" # 0.15 would duplicate the 0.14 that `datafusion` (pinned) requires. Bump once datafusion moves to itertools 0.15. +jiff = { version = "0.2.29", features = ["js"] } +js-sys = "0.3.94" +jsonwebtoken = { version = "10.4", default-features = false } +lance = { version = "8.0", default-features = false } # When you update this, also update the list of features enabled for `datafusion` (~50 lines up) +libc = "0.2.186" +linked-hash-map = { version = "0.5.6", default-features = false } +log = "0.4.33" +log-once = "0.4.1" +lz4_flex = "0.13.0" +macaw = "0.30.0" +mcap = "0.25.0" +memmap2 = "0.9.11" +memory-stats = "1.2" +mimalloc = { version = "=0.1.48", features = [ + # A) we want to use v3 because of https://github.com/rerun-io/rerun/pull/11703 + # B) we need to pin to 0.1.48 because of https://github.com/microsoft/mimalloc/issues/1287 + "v3", +] } # Waiting for fix from microsoft/mimalloc/issues/1287 to land in mimalloc crate +mime_guess2 = "2.3" # infer MIME type by file extension, and map mime to file extension +mint = "0.5.9" +natord = "1.0" +ndarray = "0.16.1" # pinned by `lance-index` (lance family) and `numpy` to 0.16; 0.17 would duplicate. +never = "0.1.0" +nohash-hasher = "0.2.0" +notify = { version = "8.2", features = ["macos_kqueue"] } +# `unicode-segmentation` is off so that match indices are plain `char` indices, +# which is what we index with when highlighting matched characters. +nucleo-matcher = { version = "0.3.1", default-features = false, features = [ + "unicode-casefold", + "unicode-normalization", +] } +num-derive = "0.4.2" +num-traits = "0.2.19" +numpy = "0.28.0" +opentelemetry = { version = "0.32.0", features = ["metrics"] } +opentelemetry-appender-tracing = "0.32.0" +opentelemetry-http = "0.32.0" +opentelemetry-otlp = { version = "0.32.0", default-features = false, features = [ + "grpc-tonic", + "gzip-tonic", + "http-proto", + "hyper-client", + "trace", + "metrics", + "logs", +] } +opentelemetry-proto = { version = "0.32.0", default-features = false } +opentelemetry_sdk = { version = "0.32.1", features = ["rt-tokio"] } +ordered-float = "5.3" +parking_lot = { version = "0.12.5", features = ["serde"] } +parquet = { version = "58.3", default-features = false } +paste = "1.0" +pathdiff = "0.2.3" +percent-encoding = "2.3" +pico-args = "0.5.0" +pin-project-lite = "0.2.17" +ply-rs-bw = { version = "=3.0.0", default-features = false } # ply-rs-bw has released semver breaking changes in patch releases before. Fool me once, shame on you… +poll-promise = "0.3.0" +pollster = "0.4.0" +prettyplease = "0.2.37" +proc-macro-crate = "3.5" +proc-macro2 = { version = "1.0", default-features = false } +profiling = { version = "1.0", default-features = false } +prometheus-client = "0.25.0" +prost = "0.14.4" +prost-build = "0.14.4" +prost-reflect = "0.16.4" +prost-types = "0.14.4" +protoc-prebuilt = "0.3.0" +puffin = "0.20.0" +puffin_http = "0.17.0" +pyo3 = "0.28.3" +pyo3-build-config = "0.28.3" +quote = "1.0" +rand = { version = "0.9.4", default-features = false, features = [ + "small_rng", + "std", + "thread_rng", +] } +rand_distr = { version = "0.5.1", default-features = false, features = ["std"] } +raw-window-handle = "0.6.2" +rayon = "1.12" +re_cdr = "0.1" +regex-lite = "0.1.9" +reqwest = { version = "0.12.22", default-features = false, features = [ + "rustls-tls", +] } # 0.13 blocked: `walkers` (latest 0.54) and `http-cache-reqwest` still depend on reqwest 0.12. Bump once walkers moves to reqwest 0.13 (also unblocks tower-http 0.7). +rexif = "0.7.5" +rfd = { version = "0.17.2", default-features = false, features = ["xdg-portal"] } +ron = { version = "0.12.1", features = ["integer128"] } +roxmltree = "0.20.0" # 0.21 would duplicate the 0.20 that `resvg` (via egui_extras) requires. Bump once egui_extras/resvg move to roxmltree 0.21. +ring = "0.17.14" +rustls = { version = "0.23.40", default-features = false } +saturating_cast = "0.1.0" +scuffle-av1 = "0.1.4" +scuffle-bytes-util = "0.1.5" +semver = "1.0" +seq-macro = "0.3.6" +serde = { version = "1.0", features = ["derive"] } +serde_bytes = "0.11.19" +serde_json = { version = "1.0", default-features = false, features = ["std"] } +serde-wasm-bindgen = "0.6.5" +sha2 = "0.10.9" # pinned by `jsonwebtoken` (RustCrypto family); see hmac note. +signature = { version = "2.2", features = [ + "std", +] } # pinned by `jsonwebtoken` (^2.2); see hmac note. +similar-asserts = "1.7" # 2.0 pulls in `similar` 3.x, duplicating the `similar` 2.x that `insta` needs (cargo-deny ban). Bump once `insta` moves to `similar` 3. +slotmap = { version = "1.1", features = ["serde"] } +smallvec = { version = "1.15", features = ["const_generics", "union"] } +static_assertions = "1.1" +stl_io = "0.11.0" +strum = { version = "0.26.3", features = ["derive"] } # need to update re_rav1d first +strum_macros = "0.26.4" # need to update re_rav1d first +syn = "2.0" +sysinfo = { version = "0.38.4", default-features = false } +tap = "1.0" +tempfile = "3.27" +thiserror = "2.0" +tiff = "0.9.1" # 0.11 duplicates `png` (via the older `image`/`png` stack) and adds a `DecodingResult::F16` variant. Bump once `image` moves to the matching `png`. +tiny_http = { version = "0.12.0", default-features = false } +tobj = "4.0" +tokio = { version = "1.52", default-features = false } +tokio-stream = "0.1.18" +tokio-util = { version = "0.7.18", default-features = false } +toml = { version = "1.1", default-features = false } +tonic = { version = "0.14.6", default-features = false } +tonic-prost = { version = "0.14.6", default-features = false } +tonic-prost-build = { version = "0.14.6", default-features = false } +tonic-web = "0.14.6" +# tonic-web-wasm-client = "0.8.0" # 0.9 pulls wasm-streams 0.5, duplicating the 0.4 from reqwest 0.12. Update when we update to reqwest 0.13. +tonic-web-wasm-client = { version = "0.8.1", package = "rerun-tonic-web-wasm-client" } # our fork of 0.8.1 +tower = "0.5.3" +tower-http = "0.6.11" # 0.7 duplicates the 0.6 that reqwest 0.12 (via http-cache-reqwest/walkers) requires. Update when we update to reqwest 0.13. +tower-service = "0.3.3" +tracing = "0.1.44" +tracing-log = "0.2.0" # Route `log` through `tracing`. +tracing-opentelemetry = "0.33.0" +tracing-subscriber = { version = "0.3.23", features = ["tracing-log", "fmt", "env-filter"] } +tracing-tracy = { version = "0.11.4", default-features = false, features = [ + "broadcast", + "callstack-inlines", + "code-transfer", + "context-switch-tracing", + "enable", + "ondemand", # much nicer for a long-lived program + "system-tracing", +] } # no sampling, it's very noisy and not that useful +tracing-web = "0.1.3" +type-map = "0.5.1" +typenum = "1.20" +unindent = "0.2.4" +urdf-rs = "0.9.0" +ureq = { version = "3.3", features = ["json"] } +url = "2.5" +uuid = { version = "1.23", features = ["serde", "v4", "js"] } +vec1 = { version = "1.12", features = ["serde", "smallvec-v1"] } +walkdir = "2.5" +wildmatch = "2.6" +# TODO(#8766): `rerun_js/web-viewer/build-wasm.mjs` is HIGHLY sensitive to changes in `wasm-bindgen`. +# Whenever updating `wasm-bindgen`, update this and the narrower dependency specifications in +# `crates/viewer/re_viewer/Cargo.toml`, and make sure that notebooks still work: +# See `rerun_notebook/README.md` for how to run notebooks. +# Try running a cell which starts a viewer, and then running it again. +# There should be no errors in the browser console. +# Do not make this an `=` dependency, because that may break Rust users’ builds when a newer +# version is released, even if they are not building the web viewer. +# For details see https://github.com/rerun-io/rerun/issues/8766 +wasm-bindgen = "0.2.117" # ⚠️ read above notice before touching this! +wasm-bindgen-cli-support = "0.2.117" # ⚠️ read above notice before touching this! +wasm-bindgen-futures = "0.4.67" +wasm-bindgen-test = "0.3.67" +wayland-client = "0.31.14" +wayland-protocols = { version = "0.32.13", default-features = false } +wayland-sys = "0.31.11" +web-sys = "0.3.94" +web-time = "1.1" +webbrowser = "1.2" +windows-core = { version = "0.62.2", default-features = false, features = [ + "std", +] } # Ensure `std` is enabled so `windows-result::Error` impls `core::error::Error` (needed by wgpu-hal gles on Windows) +winit = { version = "0.30.13", default-features = false } +# TODO(andreas): Try to get rid of `fragile-send-sync-non-atomic-wasm`. This requires re_renderer being aware of single-thread restriction on resources. +# See also https://gpuweb.github.io/gpuweb/explainer/#multithreading-transfer (unsolved part of the Spec as of writing!) +wgpu = { version = "29.0", default-features = false, features = [ + # Backends (see https://docs.rs/wgpu/latest/wgpu/#feature-flags) + "gles", + "metal", + "vulkan-portability", # Enables use of Vulkan on MacOS. We use this for software rasterizing our CI (there aren't any Metal software rasterizers and we had issues with flaky tests when creating lots of Metal devices in parallel) + "vulkan", + "webgl", + "webgpu", + #"dx12", # DX12 backend on wgpu isn't as stable. Also, we want to reduce the number of backends on native. Ideally we only have Vulkan & Metal, but we also keep GL as a manual fallback. + #"angle", # As above, we want to limit the numbers of backends we support. GL support via angle isn't great and we didn't need it so far. + + # Shader options: + "wgsl", + + # Other: + "fragile-send-sync-non-atomic-wasm", +] } +xshell = "0.2.7" +xxhash-rust = { version = "0.8.15", features = ["xxh32", "xxh64"] } +zip = { version = "8.6", default-features = false, features = ["deflate"] } + +# --------------------------------------------------------------------------------- +[profile] + +## Dev + +# Our dev profile has some optimizations turned on, as well as debug assertions. +[profile.dev] +opt-level = 1 # Make debug builds run faster +# See for a thorough explanation of why. +# This does not affect cfg(debug_assertions). +# Use the `debugging` profile (see below) if you need debug symbols. +debug = false + + +# Use the following command to grab the list of workspace crates: +# cargo metadata --no-deps --format-version 1 | jq '.packages[].name' | rg '"re_' +# +# There is, as far we know, no way to do this without enumerating all crates manually. + +[profile.dev.package] +"re_analytics".debug = true +"re_arrow_ui".debug = true +"re_arrow_util".debug = true +"re_auth".debug = true +"re_blueprint_tree".debug = true +"re_build_info".debug = true +"re_build_tools".debug = true +"re_byte_size".debug = true +"re_byte_size_derive".debug = true +"re_capabilities".debug = true +"re_case".debug = true +"re_chunk_store_ui".debug = true +"re_chunk_store".debug = true +"re_chunk".debug = true +"re_component_ui".debug = true +"re_context_menu".debug = true +"re_crash_handler".debug = true +"re_importer".debug = true +"re_data_source".debug = true +"re_data_ui".debug = true +"re_dataframe_ui".debug = true +"re_dataframe".debug = true +"re_datafusion".debug = true +"re_dev_tools".debug = true +"re_entity_db".debug = true +"re_error".debug = true +"re_format".debug = true +"re_gamepad".debug = true +"re_grpc_client".debug = true +"re_grpc_server".debug = true +"re_integration_test".debug = true +"re_log_channel".debug = true +"re_log_encoding".debug = true +"re_log_types".debug = true +"re_log".debug = true +"re_mcap".debug = true +"re_memory".debug = true +"re_perf_telemetry".debug = true +"re_protos_builder".debug = true +"re_protos".debug = true +"re_query".debug = true +"re_recording_panel".debug = true +"re_redap_browser".debug = true +"re_redap_client".debug = true +"re_renderer_examples".debug = true +"re_renderer".debug = true +"re_sdk".debug = true +"re_selection_panel".debug = true +"re_server".debug = true +"re_sorbet".debug = true +"re_span".debug = true +"re_string_interner".debug = true +"re_test_context".debug = true +"re_test_viewport".debug = true +"re_tf".debug = true +"re_time_panel".debug = true +"re_tracing".debug = true +"re_tuid".debug = true +"re_types_builder".debug = true +"re_types_core".debug = true +"re_sdk_types".debug = true +"re_ui".debug = true +"re_uri".debug = true +"re_video".debug = true +"re_view_bar_chart".debug = true +"re_view_dataframe".debug = true +"re_view_graph".debug = true +"re_view_map".debug = true +"re_view_spatial".debug = true +"re_view_state_timeline".debug = true +"re_view_tensor".debug = true +"re_view_text_document".debug = true +"re_view_text_log".debug = true +"re_view_time_series".debug = true +"re_view".debug = true +"re_viewer_context".debug = true +"re_viewer".debug = true +"re_viewport_blueprint".debug = true +"re_viewport".debug = true +"re_web_viewer_server".debug = true + +# panic = "abort" leads to better optimizations and smaller binaries (and is the default in Wasm anyways), +# but it also means backtraces don't work with the `backtrace` library (https://github.com/rust-lang/backtrace-rs/issues/397). +# egui has a feature where if you hold down all modifiers keys on your keyboard and hover any UI widget, +# you will see the backtrace to that widget, and we don't want to break that feature in dev builds. + +# Optimize all dependencies even in debug builds (does not affect workspace packages): +[profile.dev.package."*"] +opt-level = 2 + +# Make extra sure the AV1 decoder is optimized in dev builds. otherwise decoding comes to a crawl in debug builds. +[profile.dev.package.re_rav1d] +opt-level = 3 +debug-assertions = false + +## Release + +[profile.release] +# debug = true # good for profilers +panic = "abort" # This leads to better optimizations and smaller binaries (and is the default in Wasm anyways). +lto = "thin" # This leads to smaller binaries, but slower compile times. +codegen-units = 1 # Smaller binaries (but slower compile time) + +[profile.web-release] +panic = 'abort' # Removes panic handling code +inherits = "release" +lto = true +opt-level = 'z' # Optimize for size +codegen-units = 1 + + +## Bench + +[profile.bench] +debug = false + + +## Debugging + +# Set up a `debugging` profile that turns of optimization of the workspace and select packages. +# Note that the profile name `debug` is reserved. +[profile.debugging] +inherits = "dev" +opt-level = 0 +debug = true + +[profile.debugging.package.egui] +opt-level = 0 # we often debug egui via Rerun + +[profile.debugging.build-override] +debug = true # enable debug symbols for build scripts + + +## Dev-fast (Cranelift) + +# A fast-compiling dev profile optimized for ultimate compile speed using the Cranelift backend. +# Fast compile profile using the Cranelift codegen backend. +# The codegen-backend settings are in .cargo/config.toml (requires nightly). +# Usage: pixi run rerun-build-fast +# Requires: rustup component add rustc-codegen-cranelift-preview --toolchain nightly +[profile.dev-fast] +inherits = "dev" +debug = false +strip = "debuginfo" + +[profile.dev-fast.package."*"] +opt-level = 1 + +# AV1 decoder is unusable without optimization. +[profile.dev-fast.package.re_rav1d] +opt-level = 3 +debug-assertions = false + + +# --------------------------------------------------------------------------------- + + +[workspace.lints.rust] +unknown_lints = "deny" +unsafe_code = "deny" + +absolute_paths_not_starting_with_crate = "warn" +elided_lifetimes_in_paths = "warn" +future_incompatible = { level = "warn", priority = -1 } +non_ascii_idents = "warn" +nonstandard_style = { level = "warn", priority = -1 } +noop_method_call = "warn" +rust_2018_idioms = { level = "warn", priority = -1 } +rust_2021_prelude_collisions = "warn" +semicolon_in_expressions_from_macros = "warn" +trivial_numeric_casts = "warn" +unsafe_op_in_unsafe_fn = "warn" # `unsafe_op_in_unsafe_fn` may become the default in future Rust versions: https://github.com/rust-lang/rust/issues/71668 +unexpected_cfgs = { level = "deny", check-cfg = [ + 'cfg(TODO)', # NOLINT allow `#[cfg(TODO)]` to compile (it will still fail CI) +] } +unused_extern_crates = "warn" +unused_import_braces = "warn" +unused_lifetimes = "warn" + +trivial_casts = "allow" +unused_qualifications = "allow" + +[workspace.lints.rustdoc] +all = "warn" +missing_crate_level_docs = "warn" + +# See also clippy.toml +[workspace.lints.clippy] +allow_attributes = "warn" +as_ptr_cast_mut = "warn" +await_holding_lock = "warn" +bool_to_int_with_if = "warn" +branches_sharing_code = "warn" +cast_possible_wrap = "warn" +char_lit_as_u8 = "warn" +checked_conversions = "warn" +clear_with_drain = "warn" +cloned_instead_of_copied = "warn" +coerce_container_to_any = "warn" +dbg_macro = "warn" +debug_assert_with_mut_call = "warn" +default_union_representation = "warn" +derive_partial_eq_without_eq = "warn" +disallowed_macros = "warn" # See clippy.toml +disallowed_methods = "warn" # See clippy.toml +disallowed_names = "warn" # See clippy.toml +disallowed_script_idents = "warn" # See clippy.toml +disallowed_types = "warn" # See clippy.toml +doc_broken_link = "warn" +doc_comment_double_space_linebreaks = "warn" +doc_include_without_cfg = "warn" +doc_link_with_quotes = "warn" +doc_markdown = "warn" +elidable_lifetime_names = "warn" +empty_enum = "warn" +empty_enum_variants_with_brackets = "warn" +empty_line_after_outer_attr = "warn" +enum_glob_use = "warn" +equatable_if_let = "warn" +exit = "warn" +expl_impl_clone_on_copy = "warn" +explicit_deref_methods = "warn" +explicit_into_iter_loop = "warn" +explicit_iter_loop = "warn" +fallible_impl_from = "warn" +filter_map_next = "warn" +flat_map_option = "warn" +float_cmp_const = "warn" +fn_params_excessive_bools = "warn" +fn_to_numeric_cast_any = "warn" +format_push_string = "warn" +from_iter_instead_of_collect = "warn" +get_unwrap = "warn" +if_let_mutex = "warn" +ignore_without_reason = "warn" +ignored_unit_patterns = "warn" +implicit_clone = "warn" +implied_bounds_in_impls = "warn" +imprecise_flops = "warn" +inconsistent_struct_constructor = "warn" +index_refutable_slice = "warn" +inefficient_to_string = "warn" +infinite_loop = "warn" +into_iter_without_iter = "warn" +invalid_upcast_comparisons = "warn" +ip_constant = "warn" +iter_filter_is_ok = "warn" +iter_filter_is_some = "warn" +iter_not_returning_iterator = "warn" +iter_on_empty_collections = "warn" +iter_on_single_items = "warn" +iter_without_into_iter = "warn" +large_digit_groups = "warn" +large_futures = "warn" +large_include_file = "warn" +large_stack_arrays = "warn" +large_stack_frames = "warn" +large_types_passed_by_value = "warn" +let_underscore_must_use = "warn" +let_unit_value = "warn" +linkedlist = "warn" +literal_string_with_formatting_args = "warn" +lossy_float_literal = "warn" +macro_use_imports = "warn" +manual_assert = "warn" +manual_clamp = "warn" +manual_instant_elapsed = "warn" +manual_is_power_of_two = "warn" +manual_is_variant_and = "warn" +manual_let_else = "warn" +manual_midpoint = "warn" # NOTE using `midpoint` is nicer for readability, but slower for floats +manual_ok_or = "warn" +manual_string_new = "warn" +map_err_ignore = "warn" +map_flatten = "warn" +match_bool = "warn" +match_same_arms = "warn" +match_wild_err_arm = "warn" +match_wildcard_for_single_variants = "warn" +mem_forget = "warn" +mismatching_type_param_order = "warn" +missing_enforced_import_renames = "warn" +missing_fields_in_debug = "warn" +missing_safety_doc = "warn" +mixed_attributes_style = "warn" +mut_mut = "warn" +mutex_integer = "warn" +needless_borrow = "warn" +needless_continue = "warn" +needless_for_each = "warn" +needless_pass_by_ref_mut = "warn" +needless_pass_by_value = "warn" +negative_feature_names = "warn" +non_std_lazy_statics = "warn" +non_zero_suggestions = "warn" +nonstandard_macro_braces = "warn" +only_used_in_recursion = "warn" +option_as_ref_cloned = "warn" +option_option = "warn" +or_fun_call = "warn" +path_buf_push_overwrite = "warn" +pathbuf_init_then_push = "warn" +precedence_bits = "warn" +ptr_as_ptr = "warn" +ptr_cast_constness = "warn" +pub_underscore_fields = "warn" +pub_without_shorthand = "warn" +rc_mutex = "warn" +readonly_write_lock = "warn" +redundant_type_annotations = "warn" +ref_as_ptr = "warn" +ref_option_ref = "warn" +rest_pat_in_fully_bound_structs = "warn" +return_and_then = "warn" +same_functions_in_if_condition = "warn" +self_only_used_in_recursion = "warn" +semicolon_if_nothing_returned = "warn" +set_contains_or_insert = "warn" +should_panic_without_expect = "warn" +single_char_pattern = "warn" +single_match_else = "warn" +single_option_map = "warn" +str_split_at_newline = "warn" +str_to_string = "warn" +string_add = "warn" +string_add_assign = "warn" +string_lit_as_bytes = "warn" +string_lit_chars_any = "warn" +suspicious_command_arg_space = "warn" +suspicious_xor_used_as_pow = "warn" +todo = "warn" +too_long_first_doc_paragraph = "warn" +too_many_lines = "warn" +trailing_empty_array = "warn" +trait_duplication_in_bounds = "warn" +transmute_ptr_to_ptr = "warn" +tuple_array_conversions = "warn" +unchecked_time_subtraction = "warn" +undocumented_unsafe_blocks = "warn" +unimplemented = "warn" +uninhabited_references = "warn" +uninlined_format_args = "warn" +unnecessary_box_returns = "warn" +unnecessary_literal_bound = "warn" +unnecessary_safety_doc = "warn" +unnecessary_self_imports = "warn" +unnecessary_semicolon = "warn" +unnecessary_struct_initialization = "warn" +unnecessary_wraps = "warn" +unnested_or_patterns = "warn" +unused_async = "warn" +unused_peekable = "warn" +unused_rounding = "warn" +unused_self = "warn" +unused_trait_names = "warn" +unwrap_used = "warn" +use_self = "warn" +useless_let_if_seq = "warn" +useless_transmute = "warn" +verbose_file_reads = "warn" +wildcard_dependencies = "warn" +wildcard_imports = "warn" +zero_sized_map_values = "warn" + +# Disabled waiting on https://github.com/rust-lang/rust-clippy/issues/9602 +#self_named_module_files = "warn" + +# Things we explicitly allow: +manual_range_contains = "allow" # this one is just worse imho +map_unwrap_or = "allow" # so is this one +ref_patterns = "allow" # It's nice to avoid ref pattern, but there are some situations that are hard (impossible?) to express without. +too_many_arguments = "allow" # yes, we should avoid too many arguments, but enforcing it by lint is pointless. + +# TODO(emilk): enable more of these lints: +cast_possible_truncation = "allow" # Moo much noise, sadly +clone_on_ref_ptr = "allow" # Might be too much with this enabled +iter_over_hash_type = "allow" +let_underscore_untyped = "allow" +missing_assert_message = "allow" +missing_errors_doc = "allow" +ref_option = "warn" +significant_drop_tightening = "allow" # An update of parking_lot made this trigger in a lot of places. TODO(emilk): fix those places +unnecessary_debug_formatting = "allow" + +[patch.crates-io] +# Try to avoid patching crates! It prevents us from publishing the crates on crates.io. +# If you do patch always prefer to patch to the trunk branch of the upstream repo (i.e. `main`, `master`, …). +# If that is not possible, patch to a branch that has a PR open on the upstream repo. +# As a last resort, patch to a branch on our own repository. +# +# Prefer patching with `branch` over `rev` and let `Cargo.lock` handle the commit hash. +# That makes it easy to upade with `cargo update -p $CRATE`. + +# datafusion = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-catalog = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-catalog-listing = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-common = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-common-runtime = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-datasource = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-doc = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-execution = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-expr = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-expr-common = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-functions = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-ffi = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-functions-aggregate = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-functions-aggregate-common = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-functions-nested = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-functions-table = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-functions-window = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-functions-window-common = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-macros = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-optimizer = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-physical-expr = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-physical-expr-common = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-physical-optimizer = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-physical-plan = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } +# datafusion-sql = { git = "https://github.com/rerun-io/arrow-datafusion.git", branch = "tsaucer/52.3.0-inner-ffi" } + +# ecolor = { git = "https://github.com/emilk/egui", branch = "main" } +# eframe = { git = "https://github.com/emilk/egui", branch = "main" } +# egui = { git = "https://github.com/emilk/egui", branch = "main" } +# egui_extras = { git = "https://github.com/emilk/egui", branch = "main" } +# egui_kittest = { git = "https://github.com/emilk/egui", branch = "main" } +# egui-wgpu = { git = "https://github.com/emilk/egui", branch = "main" } +# emath = { git = "https://github.com/emilk/egui", branch = "main" } + +# kittest = { git = "https://github.com/rerun-io/kittest.git", rev = 'ce7a2f3b12c36021889b50bdff671cec8016b0fb' } + +# Useful while developing: +# ecolor = { path = "../../egui/crates/ecolor" } +# eframe = { path = "../../egui/crates/eframe" } +# egui = { path = "../../egui/crates/egui" } +# egui_extras = { path = "../../egui/crates/egui_extras" } +# egui_kittest = { path = "../../egui/crates/egui_kittest" } +# egui-wgpu = { path = "../../egui/crates/egui-wgpu" } +# emath = { path = "../../egui/crates/emath" } +# wgpu = { path = "../../wgpu/wgpu" } + +# egui_plot = { git = "https://github.com/lucasmerlin/egui_plot.git", branch = "lucas/update-egui-0.35" } +# egui_plot = { path = "../../../egui_plot/egui_plot" } + +# egui_tiles = { git = "https://github.com/rerun-io/egui_tiles", branch = "main" } +# egui_tiles = { path = "../egui_tiles" } + +# egui_table = { git = "https://github.com/rerun-io/egui_table", branch = "lucas/update-egui" } +# egui_table = { path = "../egui_table" } + +# egui_dnd = { git = "https://github.com/lucasmerlin/hello_egui.git", branch = "malmal/main" } + +# egui_commonmark = { git = "https://github.com/rerun-io/egui_commonmark.git", branch = "lucas/update-egui-0.35" } +# egui_commonmark = { path = "../../forks/egui_commonmark/egui_commonmark" } + +# walkers = { git = "https://github.com/rerun-io/walkers", branch = "emilk/egui-0.34" } + +# dav1d = { path = "/home/cmc/dev/rerun-io/rav1d", package = "re_rav1d", version = "0.1.1" } diff --git a/DESIGN.md b/DESIGN.md new file mode 100644 index 0000000..d0762af --- /dev/null +++ b/DESIGN.md @@ -0,0 +1,48 @@ +# Design guidelines +Guidelines for UI design, covering GUI, CLI, documentation, log messages, etc + +## Text +#### Sentences +Short, single-sentence text do NOT end in a period in the UI. + +Multi-sentence text ALWAYS ends in a period. + +#### Casing +We prefer normal casing, and avoid Title Casing. + +We only use Title Casing for company and product names (Rerun, Rerun Viewer, Discord, …), but NOT for concepts like “container”, “view”, etc. + +#### Examples +Good: `log("File saved")` + +Bad: `log("file saved.")` + +#### Dashes +Use a spaced em dash (` — `) for parenthetical breaks in prose (docs, comments, log messages, UI text). + +Avoid: +- Unspaced em dashes (`word—word`) — add spaces around the em dash. +- En dashes (`–`) used as sentence punctuation — use an em dash instead. + +En dashes are reserved for numeric/range expressions (`2020–2025`, `pp. 10–15`, `~3–4 GB`). + +#### Line breaks in markdown +Write one sentence per line in markdown files (`.md`, docs, READMEs, agent guides). +Markdown joins consecutive non-empty lines into a single paragraph, so this does not affect rendering — but it produces much cleaner diffs. +Each edited sentence shows up as a single changed line, instead of reflowing an entire paragraph. + +Use a blank line between paragraphs as usual. + +### Buttons + +When a button action requires more input after pressing, suffix it with `…`. + +Good: `Save recording…` (leads to a save-dialog) + +## GUI labels + +We do not use a colon suffix for labels in front of a value. + +Good: `Color 🔴` + +Bad: `Color: 🔴` diff --git a/LICENSE-APACHE b/LICENSE-APACHE new file mode 100644 index 0000000..11069ed --- /dev/null +++ b/LICENSE-APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/LICENSE-MIT b/LICENSE-MIT new file mode 100644 index 0000000..79a5d00 --- /dev/null +++ b/LICENSE-MIT @@ -0,0 +1,25 @@ +Copyright (c) 2022 Rerun Technologies AB + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..e0379bb --- /dev/null +++ b/README.md @@ -0,0 +1,208 @@ +

+ + Banner with Rerun logo + + +

+ +

+ PyPi + crates.io + MIT + Apache + Rerun Discord +

+ +# The data layer for physical AI + +Log, query, visualize, and stream to training on shared columnar storage built for multimodal data. + +**What it does:** Rerun ingests multi-rate, multimodal data (images, point clouds, transforms, time series, joint states, video) from many sources and formats (robot logs, human-data rigs, sim, web video; MCAP, rrd, LeRobot). The built-in viewer renders everything in sync, in realtime: scrub episodes, compare sensors side-by-side, watch CV pipelines run live. The same data is queryable with [dataframes](https://rerun.io/docs/howto/query-and-transform/get-data-out) or SQL, and streams directly into training. Built in Rust on column-chunk storage purpose-built for multi-rate physical data. SDKs in Python, Rust, and C++. + +**Quickstart:** `pip install rerun-sdk` — log your first multimodal data and see it in the viewer in under 2 minutes. + +* [Run the Rerun Viewer in your browser](https://www.rerun.io/viewer) +* [Read about what Rerun is and who it is for](https://www.rerun.io/docs/overview/what-is-rerun) + +### Use cases +- Ingest robot logs, egocentric/UMI rigs, sim, and web video into one substrate +- Run CV pipelines (SLAM, hand tracking, motion retargeting) as table edits +- Query raw, intermediate, and derived data with dataframes or SQL +- Visualize multi-rate, multimodal sequences across the pipeline +- Stream dataset mixes directly to training — no export jobs, no stale copies + +### Data types +Multi-rate, multimodal, spatial: images, point clouds, time series, tensors, transforms, joint states, video. Preserved end-to-end. + +### A short taste +```py +import rerun as rr # pip install rerun-sdk + +rr.init("rerun_example_app") + +rr.spawn() # Spawn a child process with a viewer and connect +# rr.save("recording.rrd") # Stream all logs to disk +# rr.connect_grpc() # Connect to a remote viewer + +# Associate subsequent data with 42 on the “frame” timeline +rr.set_time("frame", sequence=42) + +# Log colored 3D points to the entity at `path/to/points` +rr.log("path/to/points", rr.Points3D(positions, colors=colors)) +… +``` + +

+ + + + + + + +

+ +## Getting started +* [**C++**](https://www.rerun.io/docs/getting-started/data-in/cpp) +* [**Python**](https://www.rerun.io/docs/getting-started/data-in/python): `pip install rerun-sdk` or on [`conda`](https://github.com/conda-forge/rerun-sdk-feedstock) +* [**Rust**](https://www.rerun.io/docs/getting-started/data-in/rust): `cargo add rerun` + +### Installing the Rerun Viewer binary +To stream log data over the network or load our `.rrd` data files you also need the `rerun` binary. +It can be installed with `pip install rerun-sdk` or with `cargo install rerun-cli --locked --features nasm` (see note below). +Note that only the Python SDK comes bundled with the Viewer whereas C++ & Rust always rely on a separate install. + +**Note**: the `nasm` Cargo feature requires the [`nasm`](https://github.com/netwide-assembler/nasm) CLI to be installed and available in your path. +Alternatively, you may skip enabling this feature, but this may result in inferior video decoding performance. + +You should now be able to run `rerun --help` in any terminal. + + +### Documentation +- 📚 [High-level docs](https://rerun.io/docs) +- ⏃ [Loggable Types](https://www.rerun.io/docs/reference/types) +- ⚙️ [Examples](https://rerun.io/examples) +- 📖 [Code snippets](./docs/snippets/INDEX.md) +- 🌊 [C++ API docs](https://ref.rerun.io/docs/cpp) +- 🐍 [Python API docs](https://ref.rerun.io/docs/python) +- 🦀 [Rust API docs](https://docs.rs/rerun/) +- ⁉️ [Troubleshooting](https://www.rerun.io/docs/overview/installing-rerun/troubleshooting) + + +### Agent skills +This repo ships a set of agent skills that help coding agents write Rerun code. + +Install them into your agent with the `skills` CLI: + +```sh +npx skills add rerun-io/rerun +``` + +The skills themselves live in [`skills/`](./skills) if you want to read them directly. + + +## Status +We are in active development. +There are many features we want to add, and the API is still evolving. +_Expect breaking changes!_ + +Some shortcomings: +* [The viewer slows down when there are too many entities](https://github.com/rerun-io/rerun/issues/7115) +* [Multi-million point clouds can be slow](https://github.com/rerun-io/rerun/issues/1136) + + +## What is Rerun for? + +Rerun is built to help you understand and improve complex processes that include rich multimodal data, like 2D, 3D, text, time series, tensors, etc. +It is used in many industries, including robotics, simulation, computer vision, +or anything that involves a lot of sensors or other signals that evolve over time. + +### Example use case +Say you're building a vacuum cleaning robot and it keeps running into walls. Why is it doing that? You need some tool to debug it, but a normal debugger isn't gonna be helpful. Similarly, just logging text won't be very helpful either. The robot may log "Going through doorway" but that won't explain why it thinks the wall is a door. + +What you need is a visual and temporal debugger, that can log all the different representations of the world the robots holds in its little head, such as: + +* RGB camera feed +* depth images +* lidar scan +* segmentation image (how the robot interprets what it sees) +* its 3D map of the apartment +* all the objects the robot has detected (or thinks it has detected), as 3D shapes in the 3D map +* its confidence in its prediction +* etc + +You also want to see how all these streams of data evolve over time so you can go back and pinpoint exactly what went wrong, when and why. + +Maybe it turns out that a glare from the sun hit one of the sensors in the wrong way, confusing the segmentation network leading to bad object detection. Or maybe it was a bug in the lidar scanning code. Or maybe the robot thought it was somewhere else in the apartment, because its odometry was broken. Or it could be one of a thousand other things. Rerun will help you find out! + +But seeing the world from the point of the view of the robot is not just for debugging - it will also give you ideas on how to improve the algorithms, new test cases to set up, or datasets to collect. It will also let you explain the brains of the robot to your colleagues, boss, and customers. And so on. Seeing is believing, and an image is worth a thousand words, and multimodal temporal logging is worth a thousand images :) + +While seeing and understanding your data is core to making progress in robotics, there is one more thing: +You can also use the data you collected for visualization to create new datasets for training and evaluating the models and algorithms that run on your robot. +Rerun provides query APIs to make it easy to extract clean datasets from your recording for exactly that purpose. + +Of course, Rerun is useful for much more than just robots. Any time you have any form of sensors, or 2D or 3D state evolving over time, Rerun is a great tool. + +### Rerun vs. Rviz + +When coming from pure visualization tools like [RViz](https://docs.ros.org/en/rolling/Tutorials/Intermediate/RViz/RViz-Main.html), you might be used to seeing the latest data only. +Rerun is more than a pure visualization solution, it provides a platform for multimodal data with a powerful visualizer, storage model and query engine (see also: [*"What is Rerun?"*](https://rerun.io/docs/overview/what-is-rerun)). +In robotics, you can use Rerun e.g. to record test runs, manage and query training data, visually debug live streams or recordings (also from third-party formats like [MCAP](https://rerun.io/docs/howto/logging-and-ingestion/mcap)) and much more. + +So while Rerun makes your data streams visualizable in the viewer, integrating Rerun logging into your robotics applications also opens up the door for leveraging Rerun's broader capabilities. + +If you are only interested in visualization, the Rerun viewer has powerful features like the ability to go back in time thanks to its time-aware in-memory database. +You can adjust the size of this buffer to your needs (see [here](https://rerun.io/docs/howto/visualization/limit-ram)), e.g. to a smaller size if you want to use Rerun as an RViz replacement in long-running or memory-constrained applications. + + +## Business model +Rerun uses an open-core model. Everything in this repository will stay open source and free (both as in beer and as in freedom). + +We are also building Rerun Hub, a scalable catalog for robotic data. +Right now that is only available for a few select design partners. +[Click here if you're interested](https://rerun.io/pricing). + +The Rerun open source project targets the needs of individual developers. +The commercial product targets the needs specific to teams that build and run computer vision and robotics products. + +## How to cite Rerun + +When using Rerun in your research, please cite it to acknowledge its contribution to your work. This can be done by +including a reference to Rerun in the software or methods section of your paper. + +Suggested citation format: + +```bibtex +@software{RerunSDK, + title = {Rerun: A Visualization SDK for Multimodal Data}, + author = {{Rerun Development Team}}, + url = {https://www.rerun.io}, + version = {insert version number}, + date = {insert date of usage}, + year = {2024}, + publisher = {{Rerun Technologies AB}}, + address = {Online}, + note = {Available from https://www.rerun.io/ and https://github.com/rerun-io/rerun} +} +``` + +Please replace "insert version number" with the version of Rerun you used and "insert date of usage" with the date(s) +you used the tool in your research. +This citation format helps ensure that Rerun's development team receives appropriate credit for their work and +facilitates the tool's discovery by other researchers. + +# Development +* [`ARCHITECTURE.md`](ARCHITECTURE.md) +* [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md) +* [`CODE_STYLE.md`](CODE_STYLE.md) +* [`CONTRIBUTING.md`](CONTRIBUTING.md) +* [`BUILD.md`](BUILD.md) +* [`rerun_py/README.md`](rerun_py/README.md) - instructions for Python SDK +* [`rerun_cpp/README.md`](rerun_cpp/README.md) - instructions for C++ SDK + + +## Installing a pre-release Python SDK + +1. Download the correct `.whl` from [GitHub Releases](https://github.com/rerun-io/rerun/releases) +2. Run `pip install rerun_sdk<…>.whl` (replace `<…>` with the actual filename) +3. Test it: `rerun --version` diff --git a/README.wehub.md b/README.wehub.md new file mode 100644 index 0000000..8fd6287 --- /dev/null +++ b/README.wehub.md @@ -0,0 +1,7 @@ +# WeHub 来源说明 + +- 原始项目:`rerun-io/rerun` +- 原始仓库:https://github.com/rerun-io/rerun +- 导入方式:上游默认分支的最新快照 +- 原作者、版权和许可证信息以原始仓库及本仓库 LICENSE 为准 +- 本文件仅用于记录来源,不代表 WeHub 是原项目作者 diff --git a/RELEASES.md b/RELEASES.md new file mode 100644 index 0000000..fa341e1 --- /dev/null +++ b/RELEASES.md @@ -0,0 +1,190 @@ +# Releases and versioning + +This document describes the current release and versioning strategy. This strategy is likely to change as Rerun matures. + +## See also + +- [`ARCHITECTURE.md`](ARCHITECTURE.md) +- [`BUILD.md`](BUILD.md) +- [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md) +- [`CODE_STYLE.md`](CODE_STYLE.md) +- [`CONTRIBUTING.md`](CONTRIBUTING.md) + +## Repository + +:warning: The steps & workflows in this document are targeting the open-source Rerun repository (https://github.com/rerun-io/rerun), not our internal monorepo. + +## Release cadence + +New Rerun versions are released every two weeks. Sometimes we do out-of-schedule patch releases. +We do not block a release on a PR. Incomplete work should be hidden behind a feature flag. + +## Library versioning and release cadence + +Each release include new versions of: + +- All Rust crates +- The Python SDK +- The Rust SDK +- The C++ SDK + +We use semantic versioning. All versions are increased in lockstep, with a minor version bump each time (`0.1.0`, `0.2.0`, `0.3.0`, …). + +This means we might add breaking changes in each new release. + +In rare cases we will do patch releases, e.g. `0.3.1`, when there is a critical bug fix. These patch releases will not contain any breaking changes. + +We sometimes do pre-releases. Then we use the versioning `0.2.0-alpha.0` etc. + +The version on our `main` branch is always an `-alpha.N+dev` version. We build artifacts from `main` every day, though these are not published on package registries. +You can find the latest development version in our [GitHub releases](https://github.com/rerun-io/rerun/releases/tag/prerelease). + +## Rust version policy + +Our Minimum Supported Rust Version (MSRV) is always _at least_ one minor release behind the latest Rust version, and ideally two releases. + +- This means users of our libraries aren't forced to update to the very latest Rust version +- This lets us sometimes avoid new bugs in the newly released Rust compiler + +## Data and communication versioning + +We have not yet committed to any backwards or forwards compatibility. + +We tag all data files (`.rrd` files) and communication protocols with the Rerun version number. If there is a version mismatch, a warning is logged, but an attempt is still made to load the older or newer data. +As of 0.23, we automatically migrate data from older versions, with an N-1 compatibility policy. That means `0.24` supports migrating `0.23` data, `0.25` supports migrating `0.24` data, etc. + +# Release process + +Before doing anything, read all the steps in full! + +### 1. Determine what the next version should be + +There usually isn't any ambiguity, as releases are planned ahead of time. + +You can always find the latest release on our [GitHub releases](https://github.com/rerun-io/rerun/releases/tag/prerelease) page. + +### 2. Create a release branch + +The branch name is the single source of truth for the _release version_. Our release workflow automatically updates all versions +in the repository to what is specified in the branch name, so the format is important: + +- `prepare-release-0.x.y` for minor and patch releases. +- `prepare-release-0.x.y-alpha.N` for alpha releases. + +Note that `prepare-release-0.x` is _invalid_. Always specify the `y`, even if it is `0`, e.g. `prepare-release-0.15.0` instead of `prepare-release-0.15`. + +The _base_ of the branch should depends on what kind of release it is: + +- For a _minor_ release, the branch is created from `main`. +- For a _patch_ release, the branch is created from `docs-latest` ( :warning: branching off `docs-latest` instead of the latest release tag ensures that documentation patches will be included) +- For an _alpha_ release, the branch is created from `main`. + +You can do this either using `git` on your command line, or through the UI: + +![Image showing the branch create UI. You can find the `new branch` button at https://github.com/rerun-io/rerun/branches](https://github.com/rerun-io/rerun/assets/1665677/becaad03-9262-4476-b811-c23d40305aec) + +Once the branch has been created, push it to the remote repository. + +**NOTE (for patch releases)**: upon creation of the branch, the version is set to the final version of the previous release. This can create issues when testing the patch release, since it has a non-"+dev" version identical to/conflicting with an existing release. Because of that, an RC (release candidate) should preferably be created before testing. +The release workflow section below explains how you can create an RC. +Do this once you have prepared your patch-release branch and it's ready for testing. + +### 3. If this is a patch release, cherry-pick commits for inclusion in the release into the branch + +In GitHub we have a `consider-patch` label that we put on PRs that we might want to include in the release. +The fastest way to get an overview of all the patch candidate PRs from both repositories and their corresponding commit hashes is to run this script: + +``` +uv run scripts/fetch_patch_candidates.py +``` + +After cherry-picking a commit into the patch, please make sure to remove the `consider-patch` label. + +### 4. Update [`CHANGELOG.md`](./CHANGELOG.md) + +⚠️ Skip this step when preparing an alpha release. + +Update the change log. It should include: + +- A one-line summary of the release +- A multi-line summary of the release + - You may ask feature leads to write a summary for each highlighted item +- A gif or screenshot showing one or more major new features + - Try to avoid `mp4`s, gifs have a better experience on GitHub + - You can upload images to a PR, use the link it generates to use GitHub as an image hosting service. +- Run `pixi run uvpy scripts/generate_changelog.py > new_changelog.md` +- Edit PR descriptions/labels to improve the generated changelog +- Copy-paste the results into `CHANGELOG.md`. +- Editorialize the changelog if necessary +- Make sure the changelog includes instructions for handling any breaking changes + +### 5. Clean up documentation links + +⚠️ Skip this step when preparing an alpha release. + +Remove all the `attr.docs.unreleased` attributes in all `.fbs` files, followed by `pixi run codegen`. + +Remove the speculative link markers (`?speculative-link`). + +Update the [python support table](./rerun_py/docs/gen_common_index.py) for the major release. + +Once you're done, commit and push onto the release branch. + +### 6. Run the [release workflow](https://github.com/rerun-io/rerun/actions/workflows/release.yml) + +In the UI: + +- Set `Use workflow from` to the release branch you created in step (2). +- Then choose one of the following values in the dropdown: + - `alpha` if the branch name is `prepare-release-x.y.z-alpha.N`. + This will create a one-off alpha release. + + - `rc` if the branch name is `prepare-release-x.y.z`. + This will publish a release candidate. + + - `final` for the final public release. + +In all three cases, the workflow opens (or updates) a release pull request against `main`. + +![Image showing the Run workflow UI. It can be found at https://github.com/rerun-io/rerun/actions/workflows/release.yml](https://github.com/rerun-io/rerun/assets/1665677/6cdc8e7e-c0fc-4cf1-99cb-0749957b8328) + +### 7. Wait for the release workflow to finish + +Once the release workflow is started, it will create a pull request for the release. +The pull request description will tell you what to do next. + +[The `Release` workflow](https://github.com/rerun-io/rerun/actions/workflows/release.yml) will build artifacts, run PR checks, and publish them to PyPI, crates.io, npm, etc. +For `rc` and `final` releases it also creates a **draft** [GitHub release](https://github.com/rerun-io/rerun/releases) (in the `tag-release` job) and attaches a comment to the release PR pointing at it. + +Once the `Release` workflow has finished successfully and you've sanity-checked the artifacts, edit the GitHub release draft (changelog, header media) and click `Publish release`. +Publishing the release triggers the [`GitHub Release` workflow](https://github.com/rerun-io/rerun/actions/workflows/on_gh_release.yml), which syncs the binary assets from `build.rerun.io` onto the published GitHub release. +**Make sure that workflow also finishes successfully** so the release ends up with all of its assets attached. + +### 8. Merge changes to `main` + +The release branch will contain a post-release version bump commit made by the release bot. +For example, `prepare-release-0.25.0` will be bumped to `0.26.0-alpha.1+dev` once everything has been released. +Additionally, it's common for us to push small changes and bug fixes directly to the release branch. + +We want all of this to land back on `main`, so: + +- For a minor release, merge the release branch to `main`. +- For a patch release, manually create a new PR from `main` and cherry-pick the commits. This includes at least +the `CHANGELOG.md` update, plus any other changes made on the release branch that haven't been cherry-picked in the +first place. +- For an alpha release, it's should be merged _if and only if_ the release job was successful. + Otherwise, do not merge, as this could introduce breakage across the repository, such as in documentation links. + If needed, cherry-pick any additional commits made back to `main`. + +Make sure the `consider-patch` label on GitHub is up-to-date. For a full release, this usually means removing it from all PRs. + +### 9. Optional: write a post mortem about the release + +Summarize your experience with the release process to our [Release Postmortems](https://www.notion.so/rerunio/Release-Postmortems-271b24554b1980589770df810d2e4ed5) Notion page. + +Create tickets if you think we can improve the process, put them into the `Actionable items` section. + +### 10. Clean up PR labels + +`uv run scripts/fetch_patch_candidates.py` will show a warning for `consider-patch`-labeled PRs that have been merged before a release. +Make sure to remove the label from PRs that are already part of a release. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..f7ececd --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,9 @@ +Security Policy +========================== + +Reporting a Vulnerability +-------------------------- +In case you found or suspect a security vulnerabilities which can be directly exploited, please report to opensource@rerun.io. +We ask that you do not use other channels or contact project contributors directly. Do NOT raise a GitHub Issue to report a security vulnerability. + +Non-vulnerability related security issues such as new great new ideas for security features are welcome on GitHub Issues. diff --git a/TESTING.md b/TESTING.md new file mode 100644 index 0000000..53916c4 --- /dev/null +++ b/TESTING.md @@ -0,0 +1,104 @@ +# Testing + +This is an overview of our testing infrastructure. + +## See also +* [`rerun_py/README.md`](rerun_py/README.md) - build instructions for Python SDK +* [`ARCHITECTURE.md`](ARCHITECTURE.md) +* [`BUILD.md`](BUILD.md) +* [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md) +* [`CODE_STYLE.md`](CODE_STYLE.md) +* [`CONTRIBUTING.md`](CONTRIBUTING.md) +* [`RELEASES.md`](RELEASES.md) + + + +## Rust unit tests + +We use the standard Rust test framework. +We like to use [nextest](https://nexte.st) because it's faster, but `cargo test` should work fine. + +While developing, default to using `--all-features`. +(Our CI runs checks and tests with many feature configurations.) + +Typically: + +``` +cargo nextest run -p re_XXX --all-features +``` +where `re_XXX` is the crate under development. + +### Snapshot tests + +We use [insta](https://insta.rs) for snapshot tests. + +To create or update snapshots, you may use: + +``` +INSTA_FORCE_PASS=1 cargo nextest run -p re_XXX --all-features +``` + +Then, use this to review the created/updated snapshots: + +``` +cargo insta review +``` + +### UI snapshot tests + +We use [`egui_kittest`](https://github.com/emilk/egui/tree/main/crates/egui_kittest) extensively for UI snapshot tests. + +To create or update snapshots, you may use: + +``` +UPDATE_SNAPSHOTS=1 cargo nextest run -p re_XXX --all-features +``` + +Our CI automatically provides a link in PR for [kitdiff](https://github.com/rerun-io/kitdiff), our custom visual image diff tool. + + +## Python unit tests + +We use [pytest](https://docs.pytest.org/) for Python unit tests, along with [syrupy](https://github.com/syrupy-project/syrupy) for snapshot testing. + +To run tests, use: + +``` +pixi run py-test +``` + +Creating or updating snapshots is done by adding `--snapshot-update` to the pytest command. + + +## Redap tests + +Redap stands for "Rerun data protocol." It is the interface between clients such as the Rerun viewer or SDK, and servers such as Rerun OSS or Rerun Hub. + +We have several test harnesses related to redap. + +### `re_redap_tests` + +This is a Rust-based compliance test suite that builds directly against the server's service handler. It is run both against the OSS server in this repository, and our Rerun's proprietary implementation Rerun Hub. This test suite does not run through an actual gRPC connection. It directly links to the servers' code. + +This test suite is executed by the OSS server tests, so you can run it locally with: + +``` +cargo nextest run -p re_server --all-features +``` + +### `re_integration_test` + +This is a Rust-based test suite that runs both our Rust-based client and the OSS server. The harness spins up a local server and the tests connect to it. + +Run it with: + +``` +cargo nextest run -p re_integration_test --all-features +``` + + +### `e2e_redap_tests` + +This is a python-based end-to-end test suite that uses our Python SDK and connects, by default, to the OSS server. It is executed by `pytest`. More in formation in the [`e2e_redap_tests` README](rerun_py/tests/e2e_redap_tests/README.md). + + diff --git a/bacon.toml b/bacon.toml new file mode 100644 index 0000000..5eb5eb9 --- /dev/null +++ b/bacon.toml @@ -0,0 +1,97 @@ +# This is a configuration file for the bacon tool +# More info at https://github.com/Canop/bacon + +default_job = "clippy" + +[jobs] + +[jobs.clippy] +command = ["cargo", "clippy", "--all-targets", "--all-features", "--color=always"] +need_stdout = false +watch = ["tests", "benches", "examples"] + +[jobs.libs] +command = ["cargo", "clippy", "--lib", "--all-features", "--color=always"] +need_stdout = false +watch = ["tests", "benches", "examples"] + +[jobs.wasm] +command = [ + "cargo", + "clippy", + "-p=re_viewer", + "--target=wasm32-unknown-unknown", + "--target-dir=target_wasm", + "--all-features", + "--color=always", +] +need_stdout = false +watch = ["tests", "benches", "examples"] + +[jobs.check] +command = ["cargo", "check", "--all-targets", "--all-features", "--color=always"] +need_stdout = false +watch = ["tests", "benches", "examples"] + +[jobs.test] +command = ["cargo", "test", "--all-features", "--color=always"] +need_stdout = true +watch = ["tests"] + +[jobs.nextest] +command = [ + "cargo", + "nextest", + "run", + "--hide-progress-bar", + "--all-features", + "--failure-output", + "final", +] +need_stdout = true +analyzer = "nextest" + +[jobs.doc] +command = ["cargo", "doc", "--color=always", "--all-features", "--no-deps"] +need_stdout = false + +# if the doc compiles, then it opens in your browser and bacon switches +# to the previous job +[jobs.doc-open] +command = ["cargo", "doc", "--color=always", "--all-features", "--no-deps", "--open"] +need_stdout = false +on_success = "back" # so that we don't open the browser at each change + +# You can run your application and have the result displayed in bacon, +# *if* it makes sense for this crate. You can run an example the same +# way. +[jobs.run] +command = ["pixi", "run", "rerun"] +need_stdout = true +on_success = "back" + +[jobs.codegen] +command = ["pixi", "run", "codegen"] +need_stdout = true +on_success = "back" + +[jobs.codegen-proto] +command = ["pixi", "run", "codegen-protos"] +need_stdout = true +on_success = "back" + + +# You may define here keybindings that would be specific to +# a project, for example a shortcut to launch a specific job. +# Shortcuts to internal functions (scrolling, toggling, etc.) +# should go in your personal prefs.toml file instead. +[keybindings] +i = "job:initial" +c = "job:clippy" +d = "job:doc-open" +t = "job:test" +r = "job:run" +a = "job:wasm" +n = "job:nextest" +g = "job:codegen" +p = "job:codegen-proto" diff --git a/ci_docker/Dockerfile b/ci_docker/Dockerfile new file mode 100644 index 0000000..7aa3db0 --- /dev/null +++ b/ci_docker/Dockerfile @@ -0,0 +1,52 @@ +FROM quay.io/pypa/manylinux_2_28 +LABEL maintainer="opensource@rerun.io" +# Remember to update the version in publish.sh +# TODO(jleibs) use this version in the publish.sh script and below in the CACHE_KEY +LABEL version="0.18.0-x86-64" +LABEL description="Docker image used for the CI of https://github.com/rerun-io/rerun" + +RUN set -eux; \ + dnf update -y; \ + dnf install -y ca-certificates wget; \ + dnf install -y https://packages.apache.org/artifactory/arrow/almalinux/$(cut -d: -f5 /etc/system-release-cpe | cut -d. -f1)/apache-arrow-release-latest.rpm; \ + dnf config-manager --set-enabled epel; \ + dnf config-manager --set-enabled powertools; \ + dnf update -y; \ + dnf install -y \ + arrow-devel \ + make automake gcc gcc-c++ kernel-devel \ + cmake \ + curl \ + git \ + git-lfs \ + atk at-spi2-atk \ + fontconfig-devel \ + freetype-devel \ + glib2-devel \ + gtk3-devel \ + openssl-devel \ + xcb-util-renderutil-devel \ + xcb-util-devel \ + xcb-util-wm-devel \ + libxkbcommon-devel \ + python3-pip \ + tar \ + zstd \ + jq \ + sudo; \ + dnf clean all; + +ENV RUSTUP_HOME=/usr/local/rustup \ + CARGO_HOME=/usr/local/cargo \ + PATH=/usr/local/cargo/bin:$PATH + +# Install Rustup +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + +# Increment this to invalidate cache +ENV CACHE_KEY=rerun_docker_v0.18.0 + +# See: https://github.com/actions/runner-images/issues/6775#issuecomment-1410270956 +RUN git config --system --add safe.directory '*' + + diff --git a/ci_docker/README.md b/ci_docker/README.md new file mode 100644 index 0000000..4d46788 --- /dev/null +++ b/ci_docker/README.md @@ -0,0 +1,7 @@ +If you see this error while trying to publish: +> ERROR: failed to solve: failed to compute cache key: failed to rename: rename /var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/new-3352706846 /var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/33: file exists: unknown + +It means your docker cache is corrupt. Fix it by pruning the cache: +```sh +docker system prune -af +``` diff --git a/ci_docker/publish.sh b/ci_docker/publish.sh new file mode 100755 index 0000000..cebb07d --- /dev/null +++ b/ci_docker/publish.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +set -eux + +VERSION=0.18.0 # Bump on each new version. Remember to update the version in the Dockerfile too. + +# The build needs to run from top of repo to access the requirements.txt +cd "$(git rev-parse --show-toplevel)/rerun" + +# Build and push the image to GitHub Container Registry +# buildx wants to do all of this in one step +docker buildx build --pull --platform linux/arm64,linux/amd64 -t ghcr.io/rerun-io/ci_docker -t ghcr.io/rerun-io/ci_docker:$VERSION --push -f ci_docker/Dockerfile . diff --git a/clippy.toml b/clippy.toml new file mode 100644 index 0000000..b44a8e8 --- /dev/null +++ b/clippy.toml @@ -0,0 +1,136 @@ +# There is also a scripts/clippy_wasm/clippy.toml which forbids some methods that are not available in wasm. + +# ----------------------------------------------------------------------------- +# Section identical to the main scripts/clippy_wasm/clippy.toml: + +msrv = "1.92" + +allow-unwrap-in-tests = true + +# https://doc.rust-lang.org/nightly/clippy/lint_configuration.html#avoid-breaking-exported-api +# We want suggestions, even if it changes public API. +avoid-breaking-exported-api = false + +excessive-nesting-threshold = 16 # TODO(emilk): lower this + +max-fn-params-bools = 1 + +# https://rust-lang.github.io/rust-clippy/master/index.html#/large_include_file +max-include-file-size = 1000000 + +# https://rust-lang.github.io/rust-clippy/master/index.html#/large_stack_frames +stack-size-threshold = 512000 + +too-many-lines-threshold = 600 # TODO(emilk): decrease this + +# ----------------------------------------------------------------------------- + +# https://rust-lang.github.io/rust-clippy/master/index.html#disallowed_macros +disallowed-macros = [ + 'std::dbg', + + { path = "egui::hex_color", reason = "Do not hard-code colors - declare them design_tokens.rs instead, and define in light/dark_theme.json" }, + + { path = "std::debug_assert", reason = "Use `re_log::debug_assert` instead" }, + { path = "std::debug_assert_eq", reason = "Use `re_log::debug_assert_eq` instead" }, + + # TODO(emilk): consider forbidding these to encourage the use of proper log stream, and then explicitly allow legitimate uses + # 'std::eprint', + # 'std::eprintln', + # 'std::print', + # 'std::println', + + # 'std::unimplemented', # generated by ArrowDeserialize derive-macro :( +] + +# https://rust-lang.github.io/rust-clippy/master/index.html#disallowed_methods +disallowed-methods = [ + { path = "arrow_array::record_batch::RecordBatch::try_new", reason = "Use `arrow_array::record_batch::RecordBatch::try_new_with_options` instead. There is a corner case for empty batches that require the length specified." }, + { path = "arrow::compute::concat", reason = "Use `re_arrow_util::arrow_util::concat_arrays` instead, which has better memory management" }, + { path = "arrow::compute::filter", reason = "Use `re_arrow_util::arrow_util::filter_array` instead" }, + { path = "arrow::compute::take", reason = "Use `re_arrow_util::arrow_util::take_array` instead" }, + { path = "arrow::datatypes::Schema::new", reason = "Use `arrow::datatypes::Schema::new_with_metadata` instead. There is usually some metadata you want to preserve." }, + { path = "crossbeam::channel::Sender::send", reason = "Use `re_quota_channel::send_crossbeam` instead, which warns if the channel is full." }, + { path = "crossbeam::channel::unbounded", reason = "Consider using bounded channels (like re_quota_channel) to apply backpressure. Only use unbounded channels when the sender and receiver are on the same thread." }, + { path = "ecolor::Color32::from_additive_luminance", reason = "Do not hard-code colors - declare them design_tokens.rs instead, and define in light/dark_theme.json" }, + { path = "ecolor::Color32::from_black_alpha", reason = "Do not hard-code colors - declare them design_tokens.rs instead, and define in light/dark_theme.json" }, + { path = "ecolor::Color32::from_gray", reason = "Do not hard-code colors - declare them design_tokens.rs instead, and define in light/dark_theme.json" }, + { path = "ecolor::Color32::from_rgb", reason = "Do not hard-code colors - declare them design_tokens.rs instead, and define in light/dark_theme.json" }, + { path = "ecolor::Color32::from_rgba_premultiplied", reason = "Do not hard-code colors - declare them design_tokens.rs instead, and define in light/dark_theme.json" }, + { path = "ecolor::Color32::from_rgba_unmultiplied", reason = "Do not hard-code colors - declare them design_tokens.rs instead, and define in light/dark_theme.json" }, + { path = "ecolor::Color32::from_white_alpha", reason = "Do not hard-code colors - declare them design_tokens.rs instead, and define in light/dark_theme.json" }, + { path = "ecolor::Rgba::from_black_alpha", reason = "Do not hard-code colors - declare them design_tokens.rs instead, and define in light/dark_theme.json" }, + { path = "ecolor::Rgba::from_gray", reason = "Do not hard-code colors - declare them design_tokens.rs instead, and define in light/dark_theme.json" }, + { path = "ecolor::Rgba::from_luminance_alpha", reason = "Do not hard-code colors - declare them design_tokens.rs instead, and define in light/dark_theme.json" }, + { path = "ecolor::Rgba::from_rgb", reason = "Do not hard-code colors - declare them design_tokens.rs instead, and define in light/dark_theme.json" }, + { path = "ecolor::Rgba::from_rgba_premultiplied", reason = "Do not hard-code colors - declare them design_tokens.rs instead, and define in light/dark_theme.json" }, + { path = "ecolor::Rgba::from_rgba_unmultiplied", reason = "Do not hard-code colors - declare them design_tokens.rs instead, and define in light/dark_theme.json" }, + { path = "ecolor::Rgba::from_white_alpha", reason = "Do not hard-code colors - declare them design_tokens.rs instead, and define in light/dark_theme.json" }, + { path = "egui_extras::TableBody::row", reason = "`row` doesn't scale. Use `rows` instead." }, + { path = "egui::Ui::checkbox", reason = "Use `re_checkbox` from `re_ui::UiEx" }, + { path = "egui::Ui::radio_value", reason = "Use `re_radio_value` from `re_ui::UiEx" }, + { path = "egui::Ui::spinner", reason = "Use `ui.loading_indicator` from `re_ui::UiEx" }, + { path = "glam::Vec2::normalize", reason = "normalize() can create NaNs. Use try_normalize or normalize_or_zero" }, + { path = "glam::Vec3::normalize", reason = "normalize() can create NaNs. Use try_normalize or normalize_or_zero" }, + { path = "macaw::BoundingBox::from_points", reason = "from_points propagates NaN/inf. Use re_renderer::util::bounding_box_from_points instead" }, + { path = "opentelemetry::metrics::HistogramBuilder::with_boundaries", reason = "We have automatic bucketing - with_boundaries has no effect" }, + { path = "sha1::Digest::new", reason = "SHA1 is cryptographically broken" }, + { path = "std::env::temp_dir", reason = "Use the tempdir crate instead" }, + { path = "std::panic::catch_unwind", reason = "We compile with `panic = 'abort'`" }, + { path = "std::sync::mpsc::channel", reason = "Use bounded channels (like re_quota_channel) to apply backpressure." }, + { path = "std::thread::spawn", reason = "Use `std::thread::Builder` and name the thread" }, + { path = "std::time::Duration::from_secs_f32", reason = "Use try_from_secs_f32 instead to avoid panics" }, + { path = "std::time::Duration::from_secs_f64", reason = "Use try_from_secs_f64 instead to avoid panics" }, + { path = "tokio::sync::mpsc::unbounded_channel", reason = "Use bounded channels to apply backpressure." }, + + # There are many things that aren't allowed on wasm, + # but we cannot disable them all here (because of e.g. https://github.com/rust-lang/rust-clippy/issues/10406) + # so we do that in `clippy_wasm.toml` instead. +] + +# https://rust-lang.github.io/rust-clippy/master/index.html#disallowed_names +disallowed-names = [] + +# https://rust-lang.github.io/rust-clippy/master/index.html#disallowed_types +disallowed-types = [ + { path = "egui::Checkbox", reason = "Use `re_checkbox` from `re_ui::UiEx" }, + { path = "egui::Spinner", reason = "Use re_ui::loading_indicator" }, + { path = "once_cell::sync::OnceCell", reason = "Use `std::sync::OnceLock` instead" }, + { path = "std::sync::Condvar", reason = "Use parking_lot instead" }, + { path = "std::sync::Mutex", reason = "Use parking_lot instead" }, + { path = "std::sync::RwLock", reason = "Use parking_lot instead" }, + + # "std::sync::Once", # enabled for now as the `log_once` macro uses it internally +] + +# Allow-list of words for markdown in docstrings https://rust-lang.github.io/rust-clippy/master/index.html#doc_markdown +doc-valid-idents = [ + # You must also update the same list in `scripts/clippy_wasm/clippy.toml`! + "AOMedia", + "DataFusion", + "GiB", + "GitHub", + "GLB", + "GLTF", + "GoP", # Group of Pictures - common video term + "GoPs", # Group of Pictures - common video term + "iOS", + "IPv4", + "IPv6", + "macOS", + "MessagePack", + "MiB", + "MiMalloc", + "NaN", + "OBJ", + "OpenGL", + "OpenID", + "PyPI", + "sRGB", + "sRGBA", + "WebCodec", + "WebGL", + "WebGPU", + "WebSocket", + "WebSockets", +] diff --git a/crates/build/README.md b/crates/build/README.md new file mode 100644 index 0000000..8e09a07 --- /dev/null +++ b/crates/build/README.md @@ -0,0 +1 @@ +Crates run at build-time diff --git a/crates/build/re_build_info/Cargo.toml b/crates/build/re_build_info/Cargo.toml new file mode 100644 index 0000000..19ccdec --- /dev/null +++ b/crates/build/re_build_info/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "re_build_info" +authors.workspace = true +description = "Information about the build. Use together with re_build_tools" +edition.workspace = true +homepage.workspace = true +include.workspace = true +license.workspace = true +publish = true +readme = "README.md" +repository.workspace = true +rust-version.workspace = true +version.workspace = true + +[lints] +workspace = true + +[package.metadata.docs.rs] +all-features = true + + +[features] +default = [] + + +[dependencies] +re_byte_size.workspace = true +serde = { workspace = true, features = ["derive", "rc"] } diff --git a/crates/build/re_build_info/README.md b/crates/build/re_build_info/README.md new file mode 100644 index 0000000..290ca8d --- /dev/null +++ b/crates/build/re_build_info/README.md @@ -0,0 +1,10 @@ +# re_build_info + +Part of the [`rerun`](https://github.com/rerun-io/rerun) family of crates. + +[![Latest version](https://img.shields.io/crates/v/re_build_info.svg)](https://crates.io/crates/re_build_info) +[![Documentation](https://docs.rs/re_build_info/badge.svg)](https://docs.rs/re_build_info) +![MIT](https://img.shields.io/badge/license-MIT-blue.svg) +![Apache](https://img.shields.io/badge/license-Apache-blue.svg) + +Build information provider for help/version commands and analytics. diff --git a/crates/build/re_build_info/src/build_info.rs b/crates/build/re_build_info/src/build_info.rs new file mode 100644 index 0000000..5002a49 --- /dev/null +++ b/crates/build/re_build_info/src/build_info.rs @@ -0,0 +1,199 @@ +use std::borrow::Cow; + +/// Information about the build of a Rust crate. +/// +/// Create this with [`crate::build_info!`]. +/// +/// The `git_` fields are all empty on failure. Most likely git fails because we're not in a git repository +/// to begin with, which happens because we've imported the published crate from crates.io. +/// +/// There are a few other cases though, like +/// - `git` is not installed +/// - the user downloaded rerun as a tarball and then imported via a `path = …` import +/// - others? +#[derive(Clone, Debug)] +pub struct BuildInfo { + /// `CARGO_PKG_NAME` + pub crate_name: Cow<'static, str>, + + /// Space-separated names of all features enabled for this crate. + pub features: Cow<'static, str>, + + /// Crate version, parsed from `CARGO_PKG_VERSION`, ignoring any `+metadata` suffix. + pub version: super::CrateVersion, + + /// The raw version string of the Rust compiler used, or an empty string. + pub rustc_version: Cow<'static, str>, + + /// The raw version string of the LLVM toolchain used, or an empty string. + pub llvm_version: Cow<'static, str>, + + /// Git commit hash, or empty string. + pub git_hash: Cow<'static, str>, + + /// Current git branch, or empty string. + pub git_branch: Cow<'static, str>, + + /// True if we are building within the rerun repository workspace. + /// + /// This is a good proxy for "user checked out the project and built it from source". + pub is_in_rerun_workspace: bool, + + /// Target architecture and OS + /// + /// Example: `xaarch64-apple-darwin` + pub target_triple: Cow<'static, str>, + + /// ISO 8601 / RFC 3339 build time. + /// + /// Example: `"2023-02-23T19:33:26Z"` + /// + /// Empty if unknown. + pub datetime: Cow<'static, str>, + + /// True if this is a debug build. + pub is_debug_build: bool, +} + +impl BuildInfo { + pub fn git_hash_or_tag(&self) -> String { + if self.git_hash.is_empty() { + format!("v{}", self.version) + } else { + self.git_hash.to_string() + } + } + + pub fn short_git_hash(&self) -> &str { + if self.git_hash.is_empty() { + "" + } else { + &self.git_hash[..7] + } + } + + pub fn is_final(&self) -> bool { + self.version.meta.is_none() + } +} + +/// For use with e.g. `--version` +impl std::fmt::Display for BuildInfo { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let Self { + crate_name, + features, + version, + rustc_version, + llvm_version, + git_hash, + git_branch, + is_in_rerun_workspace: _, + target_triple, + datetime, + is_debug_build, + } = self; + + let rustc_version = (!rustc_version.is_empty()).then(|| format!("rustc {rustc_version}")); + let llvm_version = (!llvm_version.is_empty()).then(|| format!("LLVM {llvm_version}")); + + write!(f, "{crate_name} {version}")?; + + if !features.is_empty() { + write!(f, " ({features})")?; + } + + if let Some(rustc_version) = rustc_version { + write!(f, " [{rustc_version}")?; + if let Some(llvm_version) = llvm_version { + write!(f, ", {llvm_version}")?; + } + write!(f, "]")?; + } + + if !target_triple.is_empty() { + write!(f, " {target_triple}")?; + } + + if !git_branch.is_empty() { + write!(f, " {git_branch}")?; + } + if !git_hash.is_empty() { + let git_hash: String = git_hash.chars().take(7).collect(); // shorten + write!(f, " {git_hash}")?; + } + + if !datetime.is_empty() { + write!(f, ", built {datetime}")?; + } + + if *is_debug_build { + write!(f, " (debug)")?; + } + + Ok(()) + } +} + +// --- + +use crate::CrateVersion; + +impl CrateVersion { + /// Attempts to parse a [`CrateVersion`] from a [`BuildInfo`]'s string representation (`rerun --version`). + /// + /// Refer to `BuildInfo as std::fmt::Display>::fmt` to see what the string representation is + /// expected to look like. Roughly: + /// ```ignore + /// [] + /// ``` + pub fn try_parse_from_build_info_string(s: impl AsRef) -> Result { + // `CrateVersion::try_parse` is `const` (for good reasons), and needs a `&'static str`. + // In order to accomplish this, we need to leak the string here. + let s = Box::leak(s.as_ref().to_owned().into_boxed_str()); + + let parts = s.split_whitespace().collect::>(); + if parts.len() < 2 { + return Err(format!("{s:?} is not a valid BuildInfo string")); + } + Self::try_parse(parts[1]).map_err(ToOwned::to_owned) + } +} + +#[test] +fn crate_version_from_build_info_string() { + let build_info = BuildInfo { + crate_name: "re_build_info".into(), + features: "default extra".into(), + version: CrateVersion { + major: 0, + minor: 10, + patch: 0, + meta: Some(crate::crate_version::Meta::DevAlpha { + alpha: 7, + commit: None, + }), + }, + rustc_version: "1.76.0 (d5c2e9c34 2023-09-13)".into(), + llvm_version: "16.0.5".into(), + git_hash: "".into(), + git_branch: "".into(), + is_in_rerun_workspace: true, + target_triple: "x86_64-unknown-linux-gnu".into(), + datetime: "".into(), + is_debug_build: true, + }; + + let build_info_str = build_info.to_string(); + + { + let expected_crate_version = build_info.version; + let crate_version = CrateVersion::try_parse_from_build_info_string(&build_info_str); + + assert_eq!( + crate_version, + Ok(expected_crate_version), + "Failed to parse {build_info_str:?}" + ); + } +} diff --git a/crates/build/re_build_info/src/crate_version.rs b/crates/build/re_build_info/src/crate_version.rs new file mode 100644 index 0000000..5c9f5d3 --- /dev/null +++ b/crates/build/re_build_info/src/crate_version.rs @@ -0,0 +1,707 @@ +mod meta { + pub const TAG_MASK: u8 = 0b11000000; + pub const VALUE_MASK: u8 = 0b00111111; + pub const MAX_VALUE: u8 = VALUE_MASK; + + pub const RC: u8 = 0b01000000; + pub const ALPHA: u8 = 0b10000000; + pub const DEV_ALPHA: u8 = 0b11000000; +} + +/// The version of a Rerun crate. +/// +/// Sub-set of semver supporting `major.minor.patch-{alpha,rc}.N+dev`. +/// +/// The string value of build metadata is not preserved. +/// +/// Examples: `1.2.3`, `1.2.3-alpha.4`, `1.2.3-alpha.1+dev`. +/// +/// `-alpha.N+dev` versions are used for local or CI builds. +/// `-alpha.N` versions are used for weekly releases. +/// `-rc.N` versions are used for release candidates as we're preparing for a full release. +/// +/// The version numbers (`N`) aren't allowed to be very large (current max: 63). +/// This limited subset is chosen so that we can encode the version in 32 bits +/// in our `.rrd` files and on the wire. +/// +/// Here is the current binary format: +/// ```text,ignore +/// major minor patch meta +/// 00000000 00000000 00000000 00NNNNNN +/// ▲▲▲ ▲ +/// ││└─┬──┘ +/// ││ └─ N +/// │└─ rc/dev +/// └─ alpha +/// ``` +/// +/// The valid bit patterns for `meta` are: +/// - `10NNNNNN` -> `-alpha.N` +/// - `11NNNNNN` -> `-alpha.N+dev` +/// - `01NNNNNN` -> `-rc.N` +/// - `00000000` -> none of the above +#[derive(Clone, Copy, Debug, PartialEq, Eq, re_byte_size::SizeBytes)] +pub struct CrateVersion { + pub major: u8, + pub minor: u8, + pub patch: u8, + pub meta: Option, +} + +impl Ord for CrateVersion { + #[inline] + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + let Self { + major, + minor, + patch, + meta: _, + } = self; + + match major.cmp(&other.major) { + core::cmp::Ordering::Equal => {} + ord => return ord, + } + match minor.cmp(&other.minor) { + core::cmp::Ordering::Equal => {} + ord => return ord, + } + patch.cmp(&other.patch) + } +} + +impl PartialOrd for CrateVersion { + #[inline] + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl CrateVersion { + pub const LOCAL: Self = Self::parse(env!("CARGO_PKG_VERSION")); + + /// If this version is stable returns it, otherwise returns the version prior to that. + /// + /// Doesn't have knowledge of release patched versions, so the returned version will be conservative, + /// and not contain any patched versions. + /// Similarly, it doesn't know whether a version release was skipped. + /// ``` + /// # use re_build_info::CrateVersion; + /// assert_eq!(CrateVersion::parse("0.19.1").latest_stable(), CrateVersion::parse("0.19.1")); + /// assert_eq!(CrateVersion::parse("0.19.1-rc.1").latest_stable(), CrateVersion::parse("0.19.1-rc.1")); + /// assert_eq!(CrateVersion::parse("0.19.1-alpha.1+dev").latest_stable(), CrateVersion::parse("0.19.0")); + /// assert_eq!(CrateVersion::parse("0.19.0-alpha.1+dev").latest_stable(), CrateVersion::parse("0.18.0")); + /// assert_eq!(CrateVersion::parse("2.0.0-alpha.1+dev").latest_stable(), CrateVersion::parse("1.0.0")); + /// ``` + pub fn latest_stable(self) -> Self { + // If it is a dev version, walk one version back. + if self.is_dev() { + if self.patch == 0 { + // There might be a patched version of the latest minor/major, but we don't know that unfortunately. + if self.minor == 0 { + Self { + major: self.major - 1, + minor: 0, + patch: 0, + meta: None, + } + } else { + Self { + major: self.major, + minor: self.minor - 1, + patch: 0, + meta: None, + } + } + } else { + Self { + major: self.major, + minor: self.minor, + patch: self.patch - 1, + meta: None, + } + } + } else { + self + } + } +} + +#[derive( + Clone, Copy, Debug, PartialEq, Eq, re_byte_size::SizeBytes, serde::Deserialize, serde::Serialize, +)] +pub enum Meta { + Rc(u8), + Alpha(u8), + + /// `0.19.1-alpha.2+dev` or `0.19.1-alpha.2+aab0b4e` + DevAlpha { + alpha: u8, + + /// The commit hash, if known + /// + /// `None` corresponds to `+dev`. + /// + /// In order to support compile-time parsing of versions strings + /// this needs to be `&'static` and `[u8]` instead of `String`. + /// But in practice this is guaranteed to be valid UTF-8. + /// + /// The commit hash is NOT sent over the wire, + /// so `0.19.1-alpha.2+aab0b4e` will end up as `0.19.1-alpha.2+dev` + /// on the other end. + commit: Option<&'static [u8]>, + }, +} + +impl Meta { + pub fn to_byte(self) -> u8 { + match self { + Self::Rc(value) => value | meta::RC, + Self::Alpha(value) => value | meta::ALPHA, + + // We ignore the commit hash, if any + Self::DevAlpha { alpha, .. } => alpha | meta::DEV_ALPHA, + } + } + + pub const fn from_byte(v: u8) -> Option { + let tag = v & meta::TAG_MASK; + let value = v & meta::VALUE_MASK; + match tag { + meta::RC => Some(Self::Rc(value)), + meta::ALPHA => Some(Self::Alpha(value)), + meta::DEV_ALPHA => Some(Self::DevAlpha { + alpha: value, + commit: None, + }), + _ => None, + } + } +} + +/// Helper function to slice slices in a `const` context. +/// Instead of using this directly, use the `slice` macro. +/// +/// This is equivalent to `v[start..end]`. +const fn const_u8_slice_util(v: &[u8], start: Option, end: Option) -> &[u8] { + let (start, end) = match (start, end) { + (Some(start), Some(end)) => (start, end), + (Some(start), None) => (start, v.len()), + (None, Some(end)) => (0, end), + (None, None) => return v, + }; + + assert!(start <= v.len()); + assert!(end <= v.len()); + assert!(start <= end); + + { + // The only reason we do this is to allow slicing in `const` functions. + #![expect(unsafe_code)] + + let ptr = v.as_ptr(); + // SAFETY: + // - the read is valid, because the following is true: + // - `ptr` is valid for reads of `len` elements, because it is taken from a valid slice. + // this means it is already guaranteed to be non-null and properly aligned, and the + // entire length of the slice is contained within a single allocated object. + // - `start <= len && end <= len && start <= end` + // - the returned slice appears to be a shared borrow from `v`, + // so the borrow checker will ensure users will not mutate `v` + // until this slice is dropped. + unsafe { std::slice::from_raw_parts(ptr.add(start), end - start) } + } +} + +/// Slice `s` by some `start` and `end` bounds. +/// +/// This is equivalent to doing `s[start..end]`, +/// but works in a `const` context. +macro_rules! slice { + ($s:expr, .., $end:expr) => { + const_u8_slice_util($s, None, Some($end)) + }; + ($s:expr, $start:expr, ..) => { + const_u8_slice_util($s, Some($start), None) + }; + ($s:expr, $start:expr, $end:expr) => { + const_u8_slice_util($s, Some($start), Some($end)) + }; +} + +const fn equals(a: &[u8], b: &[u8]) -> bool { + if a.len() != b.len() { + return false; + } + + let len = a.len(); + let mut i = 0; + while i < len { + if a[i] != b[i] { + return false; + } + i += 1; + } + true +} + +const fn split_at(s: &[u8], i: usize) -> (&[u8], &[u8]) { + (slice!(s, .., i), slice!(s, i, ..)) +} + +impl CrateVersion { + pub const fn new(major: u8, minor: u8, patch: u8) -> Self { + Self { + major, + minor, + patch, + meta: None, + } + } + + /// True is this version has no metadata at all (rc, dev, alpha, etc). + /// + /// I.e. it's an actual, final release. + pub fn is_release(&self) -> bool { + self.meta.is_none() + } + + /// Whether or not this build has a `+dev` suffix. + /// + /// This is used to identify builds which are not explicit releases, + /// such as local builds and CI builds for every commit. + pub fn is_dev(&self) -> bool { + matches!(self.meta, Some(Meta::DevAlpha { .. })) + } + + /// Whether or not this is an alpha version (`-alpha.N` or `-alpha.N+dev`). + pub fn is_alpha(&self) -> bool { + matches!(self.meta, Some(Meta::Alpha(..) | Meta::DevAlpha { .. })) + } + + /// Whether or not this is a release candidate (`-rc.N`). + pub fn is_rc(&self) -> bool { + matches!(self.meta, Some(Meta::Rc(..))) + } + + /// From a compact 32-bit representation crated with [`Self::to_bytes`]. + pub fn from_bytes([major, minor, patch, meta]: [u8; 4]) -> Self { + Self { + major, + minor, + patch, + meta: Meta::from_byte(meta), + } + } + + /// A compact 32-bit representation. See also [`Self::from_bytes`]. + pub fn to_bytes(self) -> [u8; 4] { + [ + self.major, + self.minor, + self.patch, + self.meta.map(Meta::to_byte).unwrap_or_default(), + ] + } + + #[expect(clippy::unnested_or_patterns)] + pub fn is_compatible_with(self, other: Self) -> bool { + match (self.meta, other.meta) { + // release candidates are always compatible with each other + // and their finalized version: + // 1.0.0-rc.1 == 1.0.0-rc.2 == 1.0.0 + (Some(Meta::Rc(..)), Some(Meta::Rc(..))) + | (Some(Meta::Rc(..)), None) + | (None, Some(Meta::Rc(..))) => {} + (this, other) => { + if this != other { + // Alphas can contain breaking changes + return false; + } + } + } + + if self.major == 0 { + // before 1.0.0 we break compatibility using the minor: + (self.major, self.minor) == (other.major, other.minor) + } else { + // major version is the only breaking change: + self.major == other.major + } + } +} + +impl CrateVersion { + /// Parse a version string according to our subset of semver. + /// + /// See [`CrateVersion`] for more information. + pub const fn parse(version_string: &'static str) -> Self { + match Self::try_parse(version_string) { + Ok(version) => version, + Err(_err) => { + // We previously used const_panic to concatenate the actual version but it crashed + // the 1.72.0 linker on mac :/ + panic!("invalid version string") + } + } + } + + /// Parse a version string according to our subset of semver. + /// + /// See [`CrateVersion`] for more information. + pub const fn try_parse(version_string: &'static str) -> Result { + // Note that this is a const function, which means we are extremely limited in what we can do! + + const fn maybe(s: &[u8], c: u8) -> (bool, &[u8]) { + if !s.is_empty() && s[0] == c { + (true, slice!(s, 1, ..)) + } else { + (false, s) + } + } + + const fn maybe_token<'a>(s: &'a [u8], token: &[u8]) -> (bool, &'a [u8]) { + if s.len() < token.len() { + return (false, s); + } + + let (left, right) = split_at(s, token.len()); + if equals(left, token) { + (true, right) + } else { + (false, s) + } + } + + macro_rules! eat { + ($s:ident, $c:expr, $msg:literal) => {{ + if $s.is_empty() || $s[0] != $c { + return Err($msg); + } + slice!($s, 1, ..) + }}; + } + + macro_rules! eat_u8 { + ($s:ident, $msg:literal) => {{ + if $s.is_empty() { + return Err($msg); + } + + if $s.len() > 1 && $s[1].is_ascii_digit() { + if $s[0] == b'0' { + return Err("multi-digit number cannot start with zero"); + } + } + + let mut num = 0u64; + let mut i = 0; + while i < $s.len() && $s[i].is_ascii_digit() { + let digit = ($s[i] - b'0') as u64; + num = num * 10 + digit; + i += 1; + } + + if num > u8::MAX as u64 { + return Err("digit cannot be larger than 255"); + } + let num = num as u8; + let remainder = slice!($s, i, ..); + + (num, remainder) + }}; + } + + let mut s = version_string.as_bytes(); + let (major, minor, patch); + let mut meta = None; + + (major, s) = eat_u8!(s, "expected major version number"); + s = eat!(s, b'.', "expected `.` after major version number"); + (minor, s) = eat_u8!(s, "expected minor version number"); + s = eat!(s, b'.', "expected `.` after minor version number"); + (patch, s) = eat_u8!(s, "expected patch version number"); + + if let (true, remainder) = maybe(s, b'-') { + s = remainder; + + let build; + if let (true, remainder) = maybe_token(s, b"alpha") { + s = eat!(remainder, b'.', "expected `.` after `-alpha`"); + (build, s) = eat_u8!(s, "expected digit after `-alpha.`"); + if build > meta::MAX_VALUE { + return Err("`-alpha` build number is larger than 63"); + } + meta = Some(Meta::Alpha(build)); + } else if let (true, remainder) = maybe_token(s, b"rc") { + s = eat!(remainder, b'.', "expected `.` after `-rc`"); + (build, s) = eat_u8!(s, "expected digit after `-rc.`"); + if build > meta::MAX_VALUE { + return Err("`-rc` build number is larger than 63"); + } + meta = Some(Meta::Rc(build)); + } else { + return Err("expected `alpha` or `rc` after `-`"); + } + } + + if let (true, remainder) = maybe(s, b'+') { + s = remainder; + match meta { + Some(Meta::Alpha(build)) => { + if let (true, remainder) = maybe_token(s, b"dev") { + s = remainder; + meta = Some(Meta::DevAlpha { + alpha: build, + commit: None, + }); + } else if s.is_empty() { + return Err("expected `dev` after `+`"); + } else { + let commit_hash = s; + s = &[]; + meta = Some(Meta::DevAlpha { + alpha: build, + commit: Some(commit_hash), + }); + } + } + Some(..) => return Err("unexpected `-rc` with `+dev`"), + None => return Err("unexpected `+dev` without `-alpha`"), + } + } + + if !s.is_empty() { + return Err("expected end of string"); + } + + Ok(Self { + major, + minor, + patch, + meta, + }) + } +} + +impl std::fmt::Display for Meta { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Rc(build) => write!(f, "-rc.{build}"), + Self::Alpha(build) => write!(f, "-alpha.{build}"), + Self::DevAlpha { alpha, commit } => { + if let Some(commit) = commit.and_then(|s| std::str::from_utf8(s).ok()) { + write!(f, "-alpha.{alpha}+{commit}") + } else { + write!(f, "-alpha.{alpha}+dev") + } + } + } + } +} + +impl std::fmt::Display for CrateVersion { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let Self { + major, + minor, + patch, + meta, + } = *self; + + write!(f, "{major}.{minor}.{patch}")?; + if let Some(meta) = meta { + write!(f, "{meta}")?; + } + Ok(()) + } +} + +#[test] +fn test_parse_version() { + macro_rules! assert_parse_ok { + ($input:literal, $expected:expr) => { + assert_eq!(CrateVersion::try_parse($input), Ok($expected)) + }; + } + + assert_parse_ok!("0.2.0", CrateVersion::new(0, 2, 0)); + assert_parse_ok!("0.2.0", CrateVersion::new(0, 2, 0)); + assert_parse_ok!("1.2.3", CrateVersion::new(1, 2, 3)); + assert_parse_ok!("12.23.24", CrateVersion::new(12, 23, 24)); + assert_parse_ok!( + "12.23.24-rc.63", + CrateVersion { + major: 12, + minor: 23, + patch: 24, + meta: Some(Meta::Rc(63)), + } + ); + assert_parse_ok!( + "12.23.24-alpha.63", + CrateVersion { + major: 12, + minor: 23, + patch: 24, + meta: Some(Meta::Alpha(63)), + } + ); + assert_parse_ok!( + "12.23.24-alpha.63+dev", + CrateVersion { + major: 12, + minor: 23, + patch: 24, + meta: Some(Meta::DevAlpha { + alpha: 63, + commit: None + }), + } + ); + // We use commit hash suffixes in some cases: + assert_parse_ok!( + "12.23.24-alpha.63+aab0b4e", + CrateVersion { + major: 12, + minor: 23, + patch: 24, + meta: Some(Meta::DevAlpha { + alpha: 63, + commit: Some(b"aab0b4e") + }), + } + ); +} + +#[test] +fn test_format_parse_roundtrip() { + for version in [ + "0.2.0", + "1.2.3", + "12.23.24", + "12.23.24-rc.63", + "12.23.24-alpha.63", + "12.23.24-alpha.63+dev", + "12.23.24-alpha.63+aab0b4e", + ] { + assert_eq!(CrateVersion::parse(version).to_string(), version); + } +} + +#[test] +fn test_format_parse_roundtrip_bytes() { + for version in [ + "0.2.0", + "1.2.3", + "12.23.24", + "12.23.24-rc.63", + "12.23.24-alpha.63", + "12.23.24-alpha.63+dev", + // "12.23.24-alpha.63+aab0b4e", // we don't serialize commit hashes! + ] { + let version = CrateVersion::parse(version); + let bytes = version.to_bytes(); + assert_eq!(CrateVersion::from_bytes(bytes), version); + } +} + +#[test] +fn test_compatibility() { + fn are_compatible(a: &'static str, b: &'static str) -> bool { + CrateVersion::parse(a).is_compatible_with(CrateVersion::parse(b)) + } + + assert!(are_compatible("0.2.0", "0.2.0")); + assert!(are_compatible("0.2.0", "0.2.1")); + assert!(are_compatible("1.2.0", "1.3.0")); + assert!( + !are_compatible("0.2.0", "1.2.0"), + "Different major versions are incompatible" + ); + assert!( + !are_compatible("0.2.0", "0.3.0"), + "Different minor versions are incompatible" + ); + assert!(are_compatible("0.2.0-alpha.0", "0.2.0-alpha.0")); + assert!(are_compatible("0.2.0-rc.0", "0.2.0-rc.0")); + assert!( + !are_compatible("0.2.0-rc.0", "0.2.0-alpha.0"), + "Rc and Alpha are incompatible" + ); + assert!( + !are_compatible("0.2.0-rc.0", "0.2.0-alpha.0+dev"), + "Rc and Dev are incompatible" + ); + assert!( + !are_compatible("0.2.0-alpha.0", "0.2.0-alpha.0+dev"), + "Alpha and Dev are incompatible" + ); + assert!( + !are_compatible("0.2.0-alpha.0", "0.2.0-alpha.1"), + "Different alpha builds are always incompatible" + ); + assert!( + are_compatible("0.2.0-rc.0", "0.2.0-rc.1"), + "Different rc builds are always compatible" + ); + assert!( + are_compatible("0.2.0-rc.0", "0.2.0"), + "rc build is compatible with the finalized version" + ); + assert!( + are_compatible("0.2.0", "0.2.1-rc.0"), + "rc build is compatible by patch version" + ); +} + +#[test] +fn test_bad_parse() { + macro_rules! assert_parse_err { + ($input:literal, $expected:literal) => { + assert_eq!(CrateVersion::try_parse($input), Err($expected)) + }; + } + + assert_parse_err!("10", "expected `.` after major version number"); + assert_parse_err!("10.", "expected minor version number"); + assert_parse_err!("10.0", "expected `.` after minor version number"); + assert_parse_err!("10.0.", "expected patch version number"); + assert_parse_err!("10.0.2-", "expected `alpha` or `rc` after `-`"); + assert_parse_err!("10.0.2-alpha", "expected `.` after `-alpha`"); + assert_parse_err!("10.0.2-alpha.", "expected digit after `-alpha.`"); + assert_parse_err!( + "10.0.2-alpha.255", + "`-alpha` build number is larger than 63" + ); + assert_parse_err!("10.0.2-rc", "expected `.` after `-rc`"); + assert_parse_err!("10.0.2-rc.", "expected digit after `-rc.`"); + assert_parse_err!("10.0.2-rc.255", "`-rc` build number is larger than 63"); + assert_parse_err!("10.0.2-alpha.1+", "expected `dev` after `+`"); + assert_parse_err!("10.0.2-rc.1+dev", "unexpected `-rc` with `+dev`"); + assert_parse_err!("10.0.2+dev", "unexpected `+dev` without `-alpha`"); + assert_parse_err!( + "10.0.2-alpha.1+dev extra_characters", + "expected end of string" + ); + assert_parse_err!("256.0.2-alpha.1+dev", "digit cannot be larger than 255"); + assert_parse_err!("10.256.2-alpha.1+dev", "digit cannot be larger than 255"); + assert_parse_err!("10.0.256-alpha.1+dev", "digit cannot be larger than 255"); + assert_parse_err!("10.0.2-alpha.256+dev", "digit cannot be larger than 255"); + assert_parse_err!( + "01.0.2-alpha.256+dev", + "multi-digit number cannot start with zero" + ); + assert_parse_err!( + "10.01.2-alpha.256+dev", + "multi-digit number cannot start with zero" + ); + assert_parse_err!( + "10.0.01-alpha.256+dev", + "multi-digit number cannot start with zero" + ); + assert_parse_err!( + "10.0.2-alpha.01+dev", + "multi-digit number cannot start with zero" + ); +} diff --git a/crates/build/re_build_info/src/lib.rs b/crates/build/re_build_info/src/lib.rs new file mode 100644 index 0000000..454813a --- /dev/null +++ b/crates/build/re_build_info/src/lib.rs @@ -0,0 +1,79 @@ +//! Information about the build of a Rust crate. +//! +//! To use this you also need to call `re_build_tools::export_env_vars()` from your build.rs. + +mod build_info; +mod crate_version; + +pub use build_info::BuildInfo; +pub use crate_version::{CrateVersion, Meta}; + +// Re-export for use in macros +#[doc(hidden)] +pub use std::sync::OnceLock; + +/// Create a [`BuildInfo`] at compile-time using environment variables exported by +/// calling `re_build_tools::export_env_vars()` from your build.rs. +#[macro_export] +macro_rules! build_info { + () => { + $crate::BuildInfo { + crate_name: env!("CARGO_PKG_NAME").into(), + features: env!("RE_BUILD_FEATURES").into(), + version: $crate::CrateVersion::parse(env!("CARGO_PKG_VERSION")), + rustc_version: env!("RE_BUILD_RUSTC_VERSION").into(), + llvm_version: env!("RE_BUILD_LLVM_VERSION").into(), + git_hash: env!("RE_BUILD_GIT_HASH").into(), + git_branch: env!("RE_BUILD_GIT_BRANCH").into(), + // TODO(cmc): `PartialEq` is not available in const contexts, so this won't actually + // build if you try to instantiate a BuildInfo in a constant. + is_in_rerun_workspace: env!("RE_BUILD_IS_IN_RERUN_WORKSPACE") == "yes", + target_triple: env!("RE_BUILD_TARGET_TRIPLE").into(), + datetime: env!("RE_BUILD_DATETIME").into(), + is_debug_build: cfg!(debug_assertions), + } + }; +} + +/// Returns the exposed version string from the `EXPOSED_VERSION` environment variable. +/// +/// If `EXPOSED_VERSION` is not set or empty, falls back to a version string constructed +/// from build info, prefixed with `"build:"`. +/// Format: `build:{CARGO_PKG_VERSION}[-{git_branch}][-{short_git_hash}]` +/// +/// This macro must be called from a crate that has a build.rs calling +/// `re_build_tools::export_build_info_vars_for_crate()`. +/// +/// The result is cached on first call. +#[macro_export] +macro_rules! exposed_version { + () => {{ + static EXPOSED_VERSION: $crate::OnceLock = $crate::OnceLock::new(); + + EXPOSED_VERSION + .get_or_init(|| { + if let Some(version) = std::env::var("EXPOSED_VERSION") + .ok() + .filter(|v| !v.is_empty()) + { + version + } else { + let info = $crate::build_info!(); + let mut version = format!("build:{}", env!("CARGO_PKG_VERSION")); + + if !info.git_branch.is_empty() { + version.push('-'); + version.push_str(&info.git_branch); + } + + if !info.short_git_hash().is_empty() { + version.push('-'); + version.push_str(info.short_git_hash()); + } + + version + } + }) + .as_str() + }}; +} diff --git a/crates/build/re_build_tools/Cargo.toml b/crates/build/re_build_tools/Cargo.toml new file mode 100644 index 0000000..4d5eb72 --- /dev/null +++ b/crates/build/re_build_tools/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "re_build_tools" +authors.workspace = true +description = "build.rs helpers for generating build info" +edition.workspace = true +homepage.workspace = true +include.workspace = true +license.workspace = true +publish = true +readme = "README.md" +repository.workspace = true +rust-version.workspace = true +version.workspace = true + +[lints] +workspace = true + +[package.metadata.docs.rs] +all-features = true + + +[dependencies] +anyhow = { workspace = true, default-features = true } +cargo_metadata.workspace = true +glob.workspace = true +jiff.workspace = true +sha2.workspace = true +unindent.workspace = true +walkdir.workspace = true + +[dev-dependencies] +regex-lite.workspace = true diff --git a/crates/build/re_build_tools/README.md b/crates/build/re_build_tools/README.md new file mode 100644 index 0000000..2a938a4 --- /dev/null +++ b/crates/build/re_build_tools/README.md @@ -0,0 +1,24 @@ +# re_build_tools + +Part of the [`rerun`](https://github.com/rerun-io/rerun) family of crates. + +[![Latest version](https://img.shields.io/crates/v/re_build_tools.svg)](https://crates.io/crates/re_build_tools) +[![Documentation](https://docs.rs/re_build_tools/badge.svg)](https://docs.rs/re_build_tools) +![MIT](https://img.shields.io/badge/license-MIT-blue.svg) +![Apache](https://img.shields.io/badge/license-Apache-blue.svg) + +Library to be used in `build.rs` files in order to build the build info defined in `re_build_info` by setting environment variables. + +Some information in `re_build_info` can be provided through env vars: + +- `GIT_HASH` (the full sha, like `e264b9decab9257ae79100a006bb69c0d289e20c`) +- `GIT_BRANCH` (the `symbolic-ref --short`, like `asdf/my-branch`) +- `DATETIME` (ISO8601, like `2025-12-10T15:49:52.089915278Z`) + +If these are required but not provided, they will be gathered by: + +- `GIT_HASH`: running `git rev-parse HEAD` +- `GIT_BRANCH`: running `git symbolic-ref --short HEAD` +- `DATETIME` retrieving system time during the build + +If you'd like to avoid these for whatever reason, then set them externally. diff --git a/crates/build/re_build_tools/src/git.rs b/crates/build/re_build_tools/src/git.rs new file mode 100644 index 0000000..7ed0505 --- /dev/null +++ b/crates/build/re_build_tools/src/git.rs @@ -0,0 +1,90 @@ +//! # Situations to consider regarding git +//! +//! ## Using the published crate +//! +//! The published crate carries its version around, which in turns gives us the git tag, which makes +//! the commit hash irrelevant. +//! We still need to compute _something_ so that we can actually build, but that value will be +//! ignored when the crate is built by the end user anyhow. +//! +//! ## Working directly within the workspace +//! +//! When working within the workspace, we can simply try and call `git` and we're done. +//! +//! ## Using an unpublished crate (e.g. `path = "…"` or `git = "…"` or `[patch.crates-io]`) +//! +//! In these cases we may or may not have access to the workspace (e.g. a `path = …` import likely +//! will, while a crate patch won't). +//! +//! This is not an issue however, as we can simply try and see what we get. +//! If we manage to compute a commit hash, great, otherwise we still have the crate version to +//! fallback on. + +use std::path::PathBuf; + +use crate::{rerun_if_changed, run_command}; + +pub fn rebuild_if_branch_or_commit_changes() { + if let Ok(head_path) = git_path("HEAD") { + rerun_if_changed(&head_path); // Track changes to branch + if let Ok(head) = std::fs::read_to_string(&head_path) + && let Some(git_file) = head.strip_prefix("ref: ") + && let Ok(path) = git_path(git_file) + { + if path.exists() { + rerun_if_changed(path); // Track changes to commit hash + } else { + // Weird that it doesn't exist. Maybe we will miss a git hash change, + // but that is better that tracking a non-existing files (which leads to constant rebuilds). + // See https://github.com/rerun-io/rerun/issues/2380 for more + } + } + } +} + +/// Get the full commit hash +pub fn git_commit_hash() -> anyhow::Result { + let git_hash = run_command("git", &["rev-parse", "HEAD"])?; + if git_hash.is_empty() { + anyhow::bail!("empty commit hash"); + } + Ok(git_hash) +} + +/// Get the first 7 characters of the commit hash +pub fn git_commit_short_hash() -> anyhow::Result { + Ok(git_commit_hash()?[0..7].to_string()) +} + +fn parse_branch_from_github_ref() -> Option { + // The ref given is fully-formed, meaning that for branches the format is refs/heads/, + // for pull requests it is refs/pull//merge, and for tags it is refs/tags/. + // For example, refs/heads/feature-branch-1. + // https://docs.github.com/en/actions/learn-github-actions/variables#default-environment-variables + + let github_ref = std::env::var("GITHUB_REF").ok()?; + let branch = github_ref + .strip_prefix("refs/")? + .split_once('/')? + .1 + .to_owned(); + Some(branch) +} + +/// Get the current git branch name +pub fn git_branch() -> anyhow::Result { + if let Some(branch) = parse_branch_from_github_ref() { + Ok(branch) + } else { + run_command("git", &["symbolic-ref", "--short", "HEAD"]) + } +} + +/// From : +/// +/// Resolve `$GIT_DIR/` and takes other path relocation variables such as `$GIT_OBJECT_DIRECTORY`, `$GIT_INDEX_FILE…​` into account. +/// For example, if `$GIT_OBJECT_DIRECTORY` is set to /foo/bar then `git rev-parse --git-path objects/abc` returns `/foo/bar/abc`. +fn git_path(path: &str) -> anyhow::Result { + let path = run_command("git", &["rev-parse", "--git-path", path])?; + Ok(path.into()) +} diff --git a/crates/build/re_build_tools/src/hashing.rs b/crates/build/re_build_tools/src/hashing.rs new file mode 100644 index 0000000..885110b --- /dev/null +++ b/crates/build/re_build_tools/src/hashing.rs @@ -0,0 +1,216 @@ +use std::fmt::Write as _; +use std::path::{Path, PathBuf}; +use std::{fs, io}; + +use anyhow::Context as _; +use sha2::{Digest as _, Sha256}; + +use crate::{rerun_if_changed, rerun_if_changed_or_doesnt_exist}; + +// --- + +fn encode_hex(bytes: &[u8]) -> String { + let mut s = String::with_capacity(bytes.len() * 2); + for &b in bytes { + write!(&mut s, "{b:02x}").expect("writing to string should never fail"); + } + s +} + +/// Recursively walks the directory at `path` in filename order. +/// +/// If `extensions` is specified, only files with the right extensions will be iterated. +/// Specified extensions should _not_ include the leading dot, e.g. `fbs` rather than `.fbs`. +pub fn iter_dir<'a>( + path: impl AsRef, + extensions: Option<&'a [&'a str]>, +) -> impl Iterator + 'a { + iter_dir_filtered(path, move |entry: &Path| { + extensions.is_none_or(|extensions| { + extensions.iter().any(|ext| { + entry + .extension() + .is_some_and(|ext2| *ext == ext2.to_string_lossy()) + }) + }) + }) +} + +/// Recursively walks the directory at `path` in filename order with an arbitrary filter. +pub fn iter_dir_filtered<'a>( + path: impl AsRef, + custom_filter: impl Fn(&Path) -> bool + 'a, +) -> impl Iterator + 'a { + fn filter(entry: &walkdir::DirEntry, custom_filter: &impl Fn(&Path) -> bool) -> bool { + let is_dir = entry.file_type().is_dir(); + let is_interesting = custom_filter(entry.path()); + is_dir || is_interesting + } + + let path = path.as_ref(); + walkdir::WalkDir::new(path) + .sort_by_file_name() + .into_iter() + .filter_entry(move |entry| filter(entry, &custom_filter)) + .filter_map(|entry| entry.ok()) + .filter_map(|entry| entry.file_type().is_file().then(|| entry.into_path())) +} + +/// Given a file path, computes the sha256 hash of its contents and returns an hexadecimal string +/// for it. +/// +/// This will automatically emit a `rerun-if-changed` clause for the specified file. +/// +/// Panics if the file doesn't exist. +pub fn compute_file_hash(path: impl AsRef) -> String { + let mut hasher = Sha256::new(); + + let path = path.as_ref(); + let mut file = fs::File::open(path) + .with_context(|| format!("couldn't open {path:?}")) + .unwrap(); + io::copy(&mut file, &mut hasher) + .with_context(|| format!("couldn't copy from {path:?}")) + .unwrap(); + + rerun_if_changed(path); + + encode_hex(hasher.finalize().as_slice()) +} + +/// Given a directory path, computes the sha256 hash of the accumulated contents of all of its +/// files (ordered by filename), and returns an hexadecimal string for it. +/// +/// This includes files in sub-directories (i.e. it's recursive). +/// +/// This will automatically emit a `rerun-if-changed` clause for all the files that were hashed. +/// +/// If `extensions` is specified, only files with the right extensions will be iterated. +/// Specified extensions should _not_ include the leading dot, e.g. `fbs` rather than `.fbs`. +pub fn compute_dir_hash<'a>(path: impl AsRef, extensions: Option<&'a [&'a str]>) -> String { + let mut hasher = Sha256::new(); + + let path = path.as_ref(); + for filepath in iter_dir(path, extensions) { + let mut file = fs::File::open(&filepath) + .with_context(|| format!("couldn't open {filepath:?}")) + .unwrap(); + io::copy(&mut file, &mut hasher) + .with_context(|| format!("couldn't copy from {filepath:?}")) + .unwrap(); + + rerun_if_changed(filepath); + } + + encode_hex(hasher.finalize().as_slice()) +} + +/// Given a directory path, computes the sha256 hash of the accumulated contents of all of its +/// files (ordered by filename) except those failing a custom filter, and returns an hexadecimal string for it. +/// +/// This includes files in sub-directories (i.e. it's recursive). +/// +/// This will automatically emit a `rerun-if-changed` clause for all the files that were hashed. +pub fn compute_dir_filtered_hash<'a>( + path: impl AsRef, + custom_filter: impl Fn(&Path) -> bool + 'a, +) -> String { + let mut hasher = Sha256::new(); + + let path = path.as_ref(); + for filepath in iter_dir_filtered(path, custom_filter) { + let mut file = fs::File::open(&filepath) + .with_context(|| format!("couldn't open {filepath:?}")) + .unwrap(); + io::copy(&mut file, &mut hasher) + .with_context(|| format!("couldn't copy from {filepath:?}")) + .unwrap(); + + rerun_if_changed(filepath); + } + + encode_hex(hasher.finalize().as_slice()) +} + +/// Given a crate name, computes the sha256 hash of its source code (ordered by filename) and +/// returns an hexadecimal string for it. +/// +/// This includes the source code of all its direct and indirect dependencies. +/// +/// This will automatically emit a `rerun-if-changed` clause for all the files that were hashed. +pub fn compute_crate_hash(pkg_name: impl AsRef) -> String { + use cargo_metadata::{CargoOpt, MetadataCommand}; + let metadata = MetadataCommand::new() + .features(CargoOpt::AllFeatures) + .exec() + .unwrap(); + + let pkg_name = pkg_name.as_ref(); + let mut files = Default::default(); + + let pkgs = crate::Packages::from_metadata(&metadata); + pkgs.track_implicit_dep(pkg_name, &mut files); + + let mut files = files.into_iter().collect::>(); + files.sort(); + + let hashes = files.into_iter().map(compute_file_hash).collect::>(); + let hashes = hashes.iter().map(|s| s.as_str()).collect::>(); + + compute_strings_hash(&hashes) +} + +/// Given a bunch of strings, computes the sha256 hash of their contents (in the order they +/// were passed in) and returns an hexadecimal string for it. +pub fn compute_strings_hash(strs: &[&str]) -> String { + let mut hasher = Sha256::new(); + + for s in strs { + hasher.update(s); + } + + encode_hex(hasher.finalize().as_slice()) +} + +/// Writes the given `hash` at the specified `path`. +/// +/// `hash` should have been computed using of the methods in this module: [`compute_file_hash`], +/// [`compute_dir_hash`], [`compute_crate_hash`]. +/// +/// Panics on I/O errors. +/// +/// Use [`read_versioning_hash`] to read it back. +pub fn write_versioning_hash(path: impl AsRef, hash: impl AsRef) { + let path = path.as_ref(); + let hash = hash.as_ref(); + + let contents = unindent::unindent(&format!( + " + # This is a sha256 hash for all direct and indirect dependencies of this crate's build script. + # It can be safely removed at anytime to force the build script to run again. + # Check out build.rs to see how it's computed. + {hash} + " + )); + std::fs::write(path, contents.trim_start()) + .with_context(|| format!("couldn't write to {path:?}")) + .unwrap(); +} + +/// Reads back a versioning hash that was written with [`write_versioning_hash`]. +/// +/// This will automatically emit a `rerun-if-changed` clause for the specified filepath. +/// +/// Returns `None` on error. +pub fn read_versioning_hash(path: impl AsRef) -> Option { + let path = path.as_ref(); + + // NOTE: It's important we trigger if the file doesn't exist, as this means the user explicitly + // deleted the versioning file, i.e. they're trying to force a rebuild. + rerun_if_changed_or_doesnt_exist(path); + + let contents = std::fs::read_to_string(path).ok()?; + contents + .lines() + .find_map(|line| (!line.trim().starts_with('#')).then(|| line.trim().to_owned())) +} diff --git a/crates/build/re_build_tools/src/lib.rs b/crates/build/re_build_tools/src/lib.rs new file mode 100644 index 0000000..cd8816d --- /dev/null +++ b/crates/build/re_build_tools/src/lib.rs @@ -0,0 +1,361 @@ +#![expect(clippy::unwrap_used)] +#![allow( + clippy::allow_attributes, + clippy::disallowed_methods, + clippy::disallowed_types +)] // False positives for using files on Wasm +#![warn(missing_docs)] + +//! This crate is to be used from `build.rs` build scripts. + +use std::process::Command; +use std::sync::atomic::{AtomicBool, Ordering}; + +use anyhow::Context as _; + +mod git; +mod hashing; +mod rebuild_detector; +mod rustfmt; + +pub use self::git::{git_branch, git_commit_hash, git_commit_short_hash}; +pub use self::hashing::{ + compute_crate_hash, compute_dir_filtered_hash, compute_dir_hash, compute_file_hash, + compute_strings_hash, iter_dir, read_versioning_hash, write_versioning_hash, +}; +pub(crate) use self::rebuild_detector::Packages; +pub use self::rebuild_detector::{ + get_and_track_env_var, is_tracked_env_var_set, rebuild_if_crate_changed, rerun_if_changed, + rerun_if_changed_glob, rerun_if_changed_or_doesnt_exist, write_file_if_necessary, +}; +pub use self::rustfmt::rustfmt_str; + +// ------------------ + +/// Should we export the current git hash/branch for developers in the workspace? +/// +/// It will be visible in analytics, in the viewer's about-menu, and with `rerun --version`. +/// +/// To do so accurately may incur unnecessary recompiles, so only turn this on if you really need it. +const EXPORT_GIT_FOR_DEVELOPERS: bool = false; + +// ------------------ + +/// Atomic bool indicating whether or not to print the cargo build instructions +pub(crate) static OUTPUT_CARGO_BUILD_INSTRUCTIONS: AtomicBool = AtomicBool::new(true); + +/// Change whether or not this library should output cargo build instructions +pub fn set_output_cargo_build_instructions(output_instructions: bool) { + OUTPUT_CARGO_BUILD_INSTRUCTIONS.store(output_instructions, Ordering::Relaxed); +} + +/// Helper to check whether or not cargo build instructions should be printed. +pub(crate) fn should_output_cargo_build_instructions() -> bool { + OUTPUT_CARGO_BUILD_INSTRUCTIONS.load(Ordering::Relaxed) +} + +// ------------------ + +/// Where is this `build.rs` build script running? +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum Environment { + /// We are running `cargo publish` (via `scripts/ci/crates.py`); _probably_ on CI. + PublishingCrates, + + /// We are running on CI for the Rerun workspace, but NOT publishing crates. + RerunCI, + + /// We are running in the conda build environment. + /// + /// This is a particularly special build environment because the branch checked out is + /// from the conda feed-stock and the build happens via source downloaded from the + /// github-hosted tgz. + /// + /// See . + CondaBuild, + + /// Are we a developer running inside the workspace of ? + DeveloperInWorkspace, + + /// We are not on Rerun's CI, and not in the Rerun workspace. + /// + /// This is _most likely_ a Rerun user who is compiling a `re_` crate + /// because they depend on it either directly or indirectly in their `Cargo.toml`, + /// or they running `cargo install rerun-cli --locked` or other tool that depend on a `re_` crate. + /// + /// In these cases we should do as little shenanigans in the `build.rs` as possible. + UsedAsDependency, +} + +impl Environment { + /// Detect what environment we are running in. + pub fn detect() -> Self { + let is_in_rerun_workspace = is_tracked_env_var_set("IS_IN_RERUN_WORKSPACE"); + + if is_tracked_env_var_set("RERUN_IS_PUBLISHING_CRATES") { + // "RERUN_IS_PUBLISHING_CRATES" is set by `scripts/ci/crates.py` + eprintln!("Environment: env-var RERUN_IS_PUBLISHING_CRATES is set"); + Self::PublishingCrates + } else if is_in_rerun_workspace && std::env::var("CI").is_ok() { + // `CI` is an env-var set by GitHub actions. + eprintln!("Environment: env-var IS_IN_RERUN_WORKSPACE and CI are set"); + Self::RerunCI + } else if std::env::var("CONDA_BUILD").is_ok() { + // `CONDA_BUILD` is an env-var set by conda build + eprintln!("Environment: env-var CONDA_BUILD is set"); + Self::CondaBuild + } else if is_in_rerun_workspace { + // IS_IN_RERUN_WORKSPACE is set by `.cargo/config.toml` and also in the Rust-analyzer settings in `.vscode/settings.json` + eprintln!("Environment: env-var IS_IN_RERUN_WORKSPACE is set"); + Self::DeveloperInWorkspace + } else { + eprintln!("Environment: Not on CI and not in workspace"); + Self::UsedAsDependency + } + } +} + +/// Call from the `build.rs` file of any crate you want to generate build info for. +/// +/// Use this crate together with the `re_build_info` crate. +pub fn export_build_info_vars_for_crate(crate_name: &str) { + let environment = Environment::detect(); + + let export_datetime = match environment { + Environment::PublishingCrates | Environment::RerunCI | Environment::CondaBuild => true, + + // Datetime won't always be accurate unless we rebuild as soon as a dependency changes, + // and we don't want to add that burden to our users. Thus, it's off by default. + Environment::DeveloperInWorkspace | Environment::UsedAsDependency => { + is_tracked_env_var_set("RERUN_ADD_BUILD_TIME_TO_BUILD_INFO") + } + }; + + let export_git_info = match environment { + Environment::PublishingCrates | Environment::RerunCI => true, + + Environment::DeveloperInWorkspace => EXPORT_GIT_FOR_DEVELOPERS, + + // We shouldn't show the users git hash/branch in the rerun viewer. + // TODO(jleibs): Conda builds run off a downloaded source tar-ball + // the git environment is from conda itself. + Environment::UsedAsDependency | Environment::CondaBuild => false, + }; + + if export_datetime && is_tracked_env_var_set("DATETIME") { + // set externally: + set_env( + "RE_BUILD_DATETIME", + &std::env::var("DATETIME").unwrap_or_default(), + ); + } else if export_datetime { + set_env("RE_BUILD_DATETIME", &date_time()); + + // The only way to make sure the build datetime is up-to-date is to run + // `build.rs` on every build, and there is really no good way of doing + // so except to manually check if any files have changed: + rebuild_if_crate_changed(crate_name); + } else { + set_env("RE_BUILD_DATETIME", ""); + } + + if export_git_info && is_tracked_env_var_set("GIT_HASH") && is_tracked_env_var_set("GIT_BRANCH") + { + // set externally: + set_env( + "RE_BUILD_GIT_HASH", + &std::env::var("GIT_HASH").unwrap_or_default(), + ); + set_env( + "RE_BUILD_GIT_BRANCH", + &std::env::var("GIT_BRANCH").unwrap_or_default(), + ); + } else if export_git_info { + set_env( + "RE_BUILD_GIT_HASH", + &git::git_commit_hash().unwrap_or_default(), + ); + set_env( + "RE_BUILD_GIT_BRANCH", + &git::git_branch().unwrap_or_default(), + ); + + // Make sure the above are up-to-date + git::rebuild_if_branch_or_commit_changes(); + } else { + set_env("RE_BUILD_GIT_HASH", ""); + set_env("RE_BUILD_GIT_BRANCH", ""); + } + + // Stuff that doesn't change, so doesn't need rebuilding: + { + // target triple + set_env("RE_BUILD_TARGET_TRIPLE", &std::env::var("TARGET").unwrap()); + + // rust version + let (rustc, llvm) = rust_llvm_versions().unwrap_or_default(); + set_env("RE_BUILD_RUSTC_VERSION", &rustc); + set_env("RE_BUILD_LLVM_VERSION", &llvm); + + // We need to check `IS_IN_RERUN_WORKSPACE` in the build-script (here), + // because otherwise it won't show up when compiling through maturin. + // We must also make an exception for when we build actual wheels (on CI) for release. + if environment == Environment::RerunCI { + // e.g. building wheels on CI. + set_env("RE_BUILD_IS_IN_RERUN_WORKSPACE", "no"); + } else { + set_env( + "RE_BUILD_IS_IN_RERUN_WORKSPACE", + &std::env::var("IS_IN_RERUN_WORKSPACE").unwrap_or_default(), + ); + } + } + + if environment == Environment::PublishingCrates { + // We can't query this during `cargo publish`, but we also don't need the info. + set_env("RE_BUILD_FEATURES", ""); + } else { + let features = enabled_features_of(crate_name); + let features = match features { + Ok(features) => features.join(" "), + + // When building as a dependency on users' end, feature flag collection can fail for a + // bunch of reasons (e.g. there's no `cargo` to begin with (Bazel, Buck, etc)). + // Failing the build entirely is a bit too harsh in that case, everything will still + // work just fine otherwise. + Err(_err) if environment == Environment::UsedAsDependency => "".to_owned(), + + Err(err) => panic!("{err}"), + }; + + set_env("RE_BUILD_FEATURES", &features); + } +} + +/// Jiff directly gives IOS 8601 / RFC 3339 format +fn date_time() -> String { + jiff::Timestamp::now().to_string() +} + +fn set_env(name: &str, value: &str) { + if should_output_cargo_build_instructions() { + println!("cargo:rustc-env={name}={value}"); + } +} + +fn run_command(cmd: &str, args: &[&str]) -> anyhow::Result { + let output = Command::new(cmd) + .args(args) + .output() + .with_context(|| format!("running '{cmd}'"))?; + + anyhow::ensure!( + output.status.success(), + "Failed to run '{cmd} {args:?}':\n{}\n{}\n", + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr), + ); + + Ok(String::from_utf8(output.stdout)?.trim().to_owned()) +} + +/// Returns `(rustc, LLVM)` versions. +/// +/// Defaults to `"unknown"` if, for whatever reason, the output from `rustc -vV` did not contain +/// version information and/or the output format underwent breaking changes. +fn rust_llvm_versions() -> anyhow::Result<(String, String)> { + let cmd = std::env::var("RUSTC").unwrap_or_else(|_| "rustc".into()); + let args = &["-vV"]; + + // $ rustc -vV + // rustc 1.67.0 (fc594f156 2023-01-24) + // binary: rustc + // commit-hash: fc594f15669680fa70d255faec3ca3fb507c3405 + // commit-date: 2023-01-24 + // host: x86_64-unknown-linux-gnu + // release: 1.67.0 + // LLVM version: 15.0.6 + + let res = run_command(&cmd, args)?; + + let mut rustc_version = None; + let mut llvm_version = None; + + for line in res.lines() { + if let Some(version) = line.strip_prefix("rustc ") { + rustc_version = Some(version.to_owned()); + } else if let Some(version) = line.strip_prefix("LLVM version: ") { + llvm_version = Some(version.to_owned()); + } + } + + // NOTE: This should never happen, but if it does, we want to make sure we can differentiate + // between "failed to invoke rustc" vs. "rustc's output did not contain any version (??) + // and/or the output format has changed". + Ok(( + rustc_version.unwrap_or_else(|| "unknown".to_owned()), + llvm_version.unwrap_or_else(|| "unknown".to_owned()), + )) +} + +/// Returns info parsed from an invocation of the `cargo metadata` command. +/// +/// You may not run this during crate publishing. +pub fn cargo_metadata() -> anyhow::Result { + // See https://github.com/rerun-io/rerun/pull/7885 + anyhow::ensure!( + Environment::detect() != Environment::PublishingCrates, + "Can't get metadata during crate publishing - it would create a Cargo.lock file" + ); + + Ok(cargo_metadata::MetadataCommand::new() + .no_deps() + // Make sure this works without a connection, since docs.rs won't have one either. + // See https://github.com/rerun-io/rerun/issues/8165 + .other_options(vec!["--frozen".to_owned()]) + .exec()?) +} + +/// Returns a list of all the enabled features of the given package. +/// +/// You may not run this during crate publishing. +pub fn enabled_features_of(crate_name: &str) -> anyhow::Result> { + let metadata = cargo_metadata()?; + + let mut features = vec![]; + for package in &metadata.packages { + if package.name.as_str() == crate_name { + for feature in package.features.keys() { + println!("Checking if feature is enabled: {feature:?}"); + let feature_in_screaming_snake_case = + feature.to_ascii_uppercase().replace('-', "_"); + if std::env::var(format!("CARGO_FEATURE_{feature_in_screaming_snake_case}")).is_ok() + { + features.push(feature.clone()); + } + } + } + } + + Ok(features) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_date_time_format() { + // Get a timestamp string + let timestamp = date_time(); + + // Check it matches the expected format: YYYY-MM-DDThh:mm:ssZ + // This regex checks for the ISO 8601 / RFC 3339 format + let regex = + regex_lite::Regex::new(r"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?Z$").unwrap(); + assert!( + regex.is_match(×tamp), + "Timestamp format is incorrect: {timestamp}" + ); + } +} diff --git a/crates/build/re_build_tools/src/rebuild_detector.rs b/crates/build/re_build_tools/src/rebuild_detector.rs new file mode 100644 index 0000000..a1aba55 --- /dev/null +++ b/crates/build/re_build_tools/src/rebuild_detector.rs @@ -0,0 +1,213 @@ +#![expect(clippy::unwrap_used)] + +use std::collections::{HashMap, HashSet}; +use std::path::{Path, PathBuf}; + +use cargo_metadata::camino::Utf8Path; +use cargo_metadata::{CargoOpt, Metadata, MetadataCommand, Package, PackageId}; + +use crate::should_output_cargo_build_instructions; + +fn should_run() -> bool { + #![expect(clippy::match_same_arms)] + use super::Environment; + + match Environment::detect() { + // We cannot run this during publishing, + // we don't need to, + // and it can also can cause a Cargo.lock file to be generated. + Environment::PublishingCrates | Environment::CondaBuild => false, + + // Dependencies shouldn't change on CI, but who knows 🤷‍♂️ + Environment::RerunCI => true, + + // Yes - this is what we want tracking for. + Environment::DeveloperInWorkspace => true, + + // Definitely not + Environment::UsedAsDependency => false, + } +} + +/// Call from `build.rs` to trigger a rebuild whenever any source file of the given package +/// _or any of its dependencies_ changes, recursively. +/// +/// This will work even if the package depends on crates that are outside of the workspace, +/// included with `path = …` +/// +/// However, this is a complex beast, and may have bugs in it. +/// Maybe it is even causing spurious re-compiles (). +pub fn rebuild_if_crate_changed(pkg_name: &str) { + if !should_run() { + return; + } + + let metadata = MetadataCommand::new() + .features(CargoOpt::AllFeatures) + .exec() + .unwrap(); + + let mut files_to_watch = Default::default(); + + let pkgs = Packages::from_metadata(&metadata); + pkgs.track_implicit_dep(pkg_name, &mut files_to_watch); + + for path in &files_to_watch { + rerun_if_changed(path); + } +} + +/// Read the environment variable and trigger a rebuild whenever the environment variable changes. +pub fn get_and_track_env_var(env_var_name: &str) -> Result { + if should_output_cargo_build_instructions() { + println!("cargo:rerun-if-env-changed={env_var_name}"); + } + std::env::var(env_var_name) +} + +/// Read the environment variable and trigger a rebuild whenever the environment variable changes. +/// +/// Returns `true` if that variable has been set to a truthy value. +pub fn is_tracked_env_var_set(env_var_name: &str) -> bool { + match get_and_track_env_var(env_var_name) { + Err(_) => false, + Ok(value) => match value.to_lowercase().as_str() { + "1" | "yes" | "true" => true, + "0" | "no" | "false" => false, + _ => { + panic!("Failed to understand boolean env-var {env_var_name}={value}"); + } + }, + } +} + +/// Call from `build.rs` to trigger a rebuild whenever the file at `path` changes. +/// +/// This requires the file to exist, which may or may not be what you want! +pub fn rerun_if_changed(path: impl AsRef) { + let path = path.as_ref(); + // Make sure the file exists, otherwise we'll be rebuilding all the time. + assert!(path.exists(), "Failed to find {path:?}"); + if should_output_cargo_build_instructions() { + println!("cargo:rerun-if-changed={}", path.to_str().unwrap()); + } +} + +/// Call from `build.rs` to trigger a rebuild whenever the file at `path` changes, or it doesn't +/// exist. +pub fn rerun_if_changed_or_doesnt_exist(path: impl AsRef) { + let path = path.as_ref(); + if should_output_cargo_build_instructions() { + println!("cargo:rerun-if-changed={}", path.to_str().unwrap()); + } +} + +/// Call from `build.rs` to trigger a rebuild whenever any of the files identified by the given +/// globbed `path` change. +pub fn rerun_if_changed_glob(path: impl AsRef, files_to_watch: &mut HashSet) { + let path = path.as_ref(); + + // Workaround for windows verbatim paths not working with glob. + // Issue: https://github.com/rust-lang/glob/issues/111 + // Fix: https://github.com/rust-lang/glob/pull/112 + // Fixed on upstream, but no release containing the fix as of writing. + let path = path.to_str().unwrap().trim_start_matches(r"\\?\"); + + for path in glob::glob(path).unwrap() { + files_to_watch.insert(path.unwrap()); + } +} + +/// Writes `content` to a file iff it differs from what's already there. +/// +/// This prevents recursive feedback loops where one generates source files from build.rs, which in +/// turn triggers `cargo`'s implicit `rerun-if-changed=src/**` clause. +// +// TODO(cmc): use the same source tracking system as re_sdk_types* instead +pub fn write_file_if_necessary( + path: impl AsRef, + content: &[u8], +) -> std::io::Result<()> { + if let Ok(cur_bytes) = std::fs::read(&path) + && cur_bytes == content + { + return Ok(()); + } + + std::fs::write(path, content) +} + +/// Track any files that are part of the given crate, identified by the manifest path. +fn track_crate_files(manifest_path: &Utf8Path, files_to_watch: &mut HashSet) { + let mut dep_path = manifest_path.to_owned(); + dep_path.pop(); + + rerun_if_changed_glob(dep_path.join("Cargo.toml"), files_to_watch); // manifest too! + rerun_if_changed_glob(dep_path.join("**/*.rs"), files_to_watch); + rerun_if_changed_glob(dep_path.join("**/*.wgsl"), files_to_watch); +} + +// --- + +pub struct Packages<'a> { + pkgs: HashMap<&'a str, &'a Package>, +} + +impl<'a> Packages<'a> { + pub fn from_metadata(metadata: &'a Metadata) -> Self { + let pkgs = metadata + .packages + .iter() + .map(|pkg| (pkg.name.as_str(), pkg)) + .collect::>(); + + Self { pkgs } + } + + /// Tracks an implicit dependency of the given name. + /// + /// This will generate all the appropriate `cargo:rerun-if-changed` clauses + /// so that package `pkg_name` as well as all of it direct and indirect + /// dependencies are properly tracked whether they are remote, in-workspace, + /// or locally patched. + pub fn track_implicit_dep(&self, pkg_name: &str, files_to_watch: &mut HashSet) { + let pkg = self.pkgs.get(pkg_name).unwrap_or_else(|| { + let found_names: Vec<&str> = self.pkgs.values().map(|pkg| pkg.name.as_str()).collect(); + panic!("Failed to find package {pkg_name:?} among {found_names:?}") + }); + + // Track the root package itself + track_crate_files(&pkg.manifest_path, files_to_watch); + + // Track all direct and indirect dependencies of that root package + let mut tracked = HashSet::new(); + self.track_patched_deps(&mut tracked, pkg, files_to_watch); + } + + /// Recursively walk the tree of dependencies of the given `root` package, making sure + /// to track all potentially modified, locally patched dependencies. + fn track_patched_deps( + &self, + tracked: &mut HashSet, + root: &Package, + files_to_watch: &mut HashSet, + ) { + for dep_pkg in root + .dependencies + .iter() + // NOTE: We'd like to just use `dep.source`/`dep.path`, unfortunately they do not + // account for crate patches at this level, so we build our own little index + // and use that instead. + .filter_map(|dep| self.pkgs.get(dep.name.as_str())) + { + let exists_on_local_disk = dep_pkg.source.is_none(); + if exists_on_local_disk { + track_crate_files(&dep_pkg.manifest_path, files_to_watch); + } + + if tracked.insert(dep_pkg.id.clone()) { + self.track_patched_deps(tracked, dep_pkg, files_to_watch); + } + } + } +} diff --git a/crates/build/re_build_tools/src/rustfmt.rs b/crates/build/re_build_tools/src/rustfmt.rs new file mode 100644 index 0000000..8ea983c --- /dev/null +++ b/crates/build/re_build_tools/src/rustfmt.rs @@ -0,0 +1,41 @@ +/// Run `rustfmt` on some Rust code. +pub fn rustfmt_str(source: &str) -> Option { + // We need to run `cago fmt` several times because it is not idempotent; + // see https://github.com/rust-lang/rustfmt/issues/5824 + let source = rustfmt_once(source)?; + rustfmt_once(&source) +} + +fn rustfmt_once(source: &str) -> Option { + use std::io::Write as _; + use std::process::Stdio; + + let rust_fmt = std::env::var_os("RUSTFMT") + .map(|s| s.display().to_string()) + .unwrap_or_else(|| String::from("rustfmt")); + + // Launch rustfmt + let mut proc = std::process::Command::new(&rust_fmt) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .arg("--edition=2024") + .spawn() + .ok()?; + + // Get stdin and send our source code to it to be formatted + let mut stdin = proc.stdin.take()?; + stdin.write_all(source.as_bytes()).ok()?; + + drop(stdin); // Close stdin + + // Parse the results and return stdout/stderr + let output = proc.wait_with_output().ok()?; + + if output.status.success() { + String::from_utf8(output.stdout).ok() + } else { + // let stderr = String::from_utf8(output.stderr).ok()?; + None + } +} diff --git a/crates/build/re_dev_tools/Cargo.toml b/crates/build/re_dev_tools/Cargo.toml new file mode 100644 index 0000000..c2ef447 --- /dev/null +++ b/crates/build/re_dev_tools/Cargo.toml @@ -0,0 +1,42 @@ +[package] +name = "re_dev_tools" +authors.workspace = true +description = "Various tools for rerun development" +edition.workspace = true +homepage.workspace = true +include.workspace = true +license.workspace = true +publish = false +readme = "README.md" +repository.workspace = true +rust-version.workspace = true +version.workspace = true + +[lints] +workspace = true + +[package.metadata.docs.rs] +all-features = true + + +[dependencies] +re_build_tools.workspace = true +re_format.workspace = true + +# External +anyhow.workspace = true +argh.workspace = true +camino.workspace = true +cargo_metadata.workspace = true +glob.workspace = true +indicatif.workspace = true +itertools.workspace = true +rayon.workspace = true +roxmltree.workspace = true +serde = { workspace = true, features = ["derive"] } +serde_json.workspace = true +tempfile.workspace = true +toml = { workspace = true, features = ["parse", "preserve_order", "serde"] } +ureq = { workspace = true, features = ["json"] } +url.workspace = true +wasm-bindgen-cli-support.workspace = true diff --git a/crates/build/re_dev_tools/README.md b/crates/build/re_dev_tools/README.md new file mode 100644 index 0000000..1a4c549 --- /dev/null +++ b/crates/build/re_dev_tools/README.md @@ -0,0 +1,11 @@ +# re_dev_tools +Crate that combines several development utilities. +To get an overview over all tools run `pixi run dev-tools --help`. + +We keep all smaller Rust "scripts" in this single crate so we don't needlessly +increase the number of such utility crates and to make it easy to get +an overview over all build tooling written in Rust. + +## Adding a new tool +* Create a folder under `src` with your new tool +* Add a new enum entry to `main.rs` diff --git a/crates/build/re_dev_tools/src/build_examples/example.rs b/crates/build/re_dev_tools/src/build_examples/example.rs new file mode 100644 index 0000000..ede7336 --- /dev/null +++ b/crates/build/re_dev_tools/src/build_examples/example.rs @@ -0,0 +1,376 @@ +//! Example collection and parsing. + +use std::collections::BTreeMap; +use std::fmt::Display; +use std::path::{Path, PathBuf}; +use std::str::FromStr; + +use anyhow::Context as _; + +pub struct Example { + /// Name of the folder it's stored in. + pub name: String, + pub title: String, + pub dir: PathBuf, + pub description: String, + pub tags: Vec, + pub thumbnail_url: String, + pub thumbnail_dimensions: [u64; 2], + pub script_args: Vec, + pub readme_body: String, + pub language: Language, + + /// If `false` (default), warnings will be treated as errors. + /// + /// Set to true if the example produces a warning that is outside of our control, i.e. in a dependency. + pub allow_warnings: bool, + + /// If `true`, include this example in the manifest generation. + pub include_in_manifest: bool, +} + +impl Example { + fn exists( + workspace_root: impl AsRef, + name: &str, + language: Language, + ) -> anyhow::Result { + Ok(workspace_root + .as_ref() + .join("examples") + .join(language.examples_dir()) + .join(name) + .try_exists()?) + } + + pub fn load( + workspace_root: impl AsRef, + name: &str, + language: Language, + ) -> anyhow::Result> { + let workspace_root = workspace_root.as_ref(); + + if !Self::exists(workspace_root, name, language)? { + return Ok(None); + } + + let dir = workspace_root + .join("examples") + .join(language.examples_dir()) + .join(name); + let readme_path = dir.join("README.md"); + let Some((readme, body)) = Frontmatter::load(&readme_path).with_context(|| { + format!( + "loading example {}/{name} README.md", + language.examples_dir().display() + ) + })? + else { + anyhow::bail!("example {name:?} has no frontmatter"); + }; + Ok(Some(Self { + name: name.to_owned(), + title: readme.title, + dir, + description: readme.description, + tags: readme.tags, + thumbnail_url: readme.thumbnail, + thumbnail_dimensions: readme.thumbnail_dimensions, + script_args: readme.build_args, + allow_warnings: readme.allow_warnings, + include_in_manifest: readme.include_in_manifest, + readme_body: body, + language, + })) + } +} + +#[derive(Clone, Copy)] +pub enum Language { + Rust, + Python, + #[expect(dead_code)] + C, + Cpp, + Notebook, +} + +impl Language { + /// Path of the directory where examples for this language are stored, + /// relative to `{workspace_root}/examples`. + pub fn examples_dir(&self) -> &'static Path { + match self { + Self::Rust => Path::new("rust"), + Self::Python => Path::new("python"), + Self::C => Path::new("c"), + Self::Cpp => Path::new("cpp"), + Self::Notebook => Path::new("notebook"), + } + } + + /// Extension without the leading dot, e.g. `rs`. + pub fn extension(&self) -> &'static str { + match self { + Self::Rust => "rs", + Self::Python => "py", + Self::C => "c", + Self::Cpp => "cpp", + Self::Notebook => "ipynb", + } + } +} + +#[derive(serde::Deserialize)] +pub struct ExamplesManifest { + pub categories: BTreeMap, +} + +impl ExamplesManifest { + /// Loads the `examples/manifest.toml` file. + pub fn load(workspace_root: impl AsRef) -> anyhow::Result { + let manifest_toml = workspace_root + .as_ref() + .join("examples") + .join("manifest.toml"); + let manifest = + std::fs::read_to_string(manifest_toml).context("loading examples/manifest.toml")?; + Ok(toml::from_str(&manifest)?) + } +} + +#[derive(serde::Deserialize)] +pub struct ExampleCategory { + /// Used to sort categories in the `rerun.io/examples` navbar. + #[expect(unused)] + pub order: u64, + + /// `snake_case` name. + pub title: String, + + /// Multi-line description. + pub prelude: String, + + /// List of example names. + /// + /// `rerun.io/examples` attempts to search for these names under `examples/{language}`, + /// where `language` is any of the languages we currently support. + pub examples: Vec, +} + +#[derive(Clone, Copy, serde::Deserialize, PartialEq, Eq)] +#[serde(rename_all = "lowercase")] +pub enum Channel { + /// Our main examples, built on each PR + Main, + + /// Examples built for each release, plus all `Main` examples. + Release, + + /// Examples built nightly, plus all `Main` and `Release`. + Nightly, +} + +impl Channel { + pub fn includes(self, other: Self) -> bool { + match self { + Self::Main => matches!(other, Self::Main), + + // Include all `main` examples in `release` + Self::Release => { + matches!(other, Self::Main | Self::Release) + } + + // Include all `main` and `release` examples in `nightly` + Self::Nightly => { + matches!(other, Self::Main | Self::Release | Self::Nightly) + } + } + } + + pub fn examples(self, workspace_root: impl AsRef) -> anyhow::Result> { + // currently we only treat Python examples as runnable + let language = Language::Python; + self.collect_language(workspace_root, language) + } + + pub fn notebooks(self, workspace_root: impl AsRef) -> anyhow::Result> { + let language = Language::Notebook; + self.collect_language(workspace_root, language) + } + + fn collect_language( + self, + workspace_root: impl AsRef, + language: Language, + ) -> anyhow::Result> { + let mut examples = vec![]; + + let dir = workspace_root + .as_ref() + .join("examples") + .join(language.examples_dir()); + if !dir.exists() { + anyhow::bail!("Failed to find {dir:?}") + } + if !dir.is_dir() { + anyhow::bail!("{dir:?} is not a directory") + } + + let folders: std::collections::BTreeMap = + std::fs::read_dir(&dir)? + .filter_map(Result::ok) + .map(|folder| { + let name = folder.file_name().to_string_lossy().to_string(); + (name, folder) + }) + .collect(); + + for (name, folder) in folders { + let metadata = folder.metadata()?; + let readme_path = folder.path().join("README.md"); + if metadata.is_dir() && readme_path.exists() { + let Some((readme, body)) = Frontmatter::load(&readme_path)? else { + eprintln!("{name:?}: skipped - MISSING FRONTMATTER"); + continue; + }; + + let Some(channel) = readme.channel else { + eprintln!("{name:?}: skipped - missing `channel` in frontmatter"); + continue; + }; + + if !self.includes(channel) { + eprintln!("{name:?}: skipped"); + continue; + } + + eprintln!("{name:?}: added"); + let dir = folder.path(); + examples.push(Example { + name, + title: readme.title, + dir, + description: readme.description, + tags: readme.tags, + thumbnail_url: readme.thumbnail, + thumbnail_dimensions: readme.thumbnail_dimensions, + script_args: readme.build_args, + readme_body: body, + language, + allow_warnings: readme.allow_warnings, + include_in_manifest: readme.include_in_manifest, + }); + } + } + + if examples.is_empty() { + anyhow::bail!("No examples found in {dir:?}") + } + + examples.sort_unstable_by(|a, b| a.name.cmp(&b.name)); + Ok(examples) + } +} + +impl Display for Channel { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let s = match self { + Self::Main => "main", + Self::Nightly => "nightly", + Self::Release => "release", + }; + f.write_str(s) + } +} + +impl FromStr for Channel { + type Err = InvalidChannelName; + + fn from_str(s: &str) -> Result { + match s { + "main" => Ok(Self::Main), + "nightly" => Ok(Self::Nightly), + "release" => Ok(Self::Release), + _ => Err(InvalidChannelName), + } + } +} + +#[derive(Debug)] +pub struct InvalidChannelName; + +impl std::error::Error for InvalidChannelName {} + +impl Display for InvalidChannelName { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str("invalid channel name") + } +} + +/// The header of the `README.md` file of an example. +#[derive(serde::Deserialize)] +struct Frontmatter { + #[serde(default)] + title: String, + + #[serde(default)] + tags: Vec, + + #[serde(default)] + description: String, + + #[serde(default)] + thumbnail: String, + + #[serde(default)] + thumbnail_dimensions: [u64; 2], + + #[serde(default)] + channel: Option, + + #[serde(default)] + build_args: Vec, + + /// If `false` (default), warnings will be treated as errors. + /// + /// Set to true if the example produces a warning that is outside of our control, i.e. in a dependency. + #[serde(default)] + allow_warnings: bool, + + /// If `true`, include this example in the manifest generation. + /// + /// Defaults to `false` so examples can be built/tested via channel without being included in manifests. + #[serde(default)] + include_in_manifest: bool, +} + +impl Frontmatter { + fn load(path: &Path) -> anyhow::Result> { + const START: &str = ""; + + let content = + std::fs::read_to_string(path).with_context(|| format!("loading {}", path.display()))?; + + let Some(start) = content.find(START) else { + return Ok(None); + }; + let start = start + START.len(); + + let Some(end) = content[start..].find(END) else { + anyhow::bail!("{path:?} has invalid frontmatter: missing {END:?} terminator"); + }; + let end = start + end; + + let frontmatter: Self = toml::from_str(content[start..end].trim()).map_err(|err| { + #[expect(clippy::unwrap_used)] + let p = path.parent().unwrap().file_name().unwrap(); + anyhow::anyhow!("Failed to parse TOML metadata of {p:?}: {err}") + })?; + + Ok(Some(( + frontmatter, + content[end + END.len()..].trim().to_owned(), + ))) + } +} diff --git a/crates/build/re_dev_tools/src/build_examples/install.rs b/crates/build/re_dev_tools/src/build_examples/install.rs new file mode 100644 index 0000000..874565b --- /dev/null +++ b/crates/build/re_dev_tools/src/build_examples/install.rs @@ -0,0 +1,50 @@ +use std::process::Command; + +use indicatif::MultiProgress; + +use super::Channel; +use crate::build_examples::wait_for_output::wait_for_output; + +/// Install the selected examples in the current environment. +#[derive(argh::FromArgs)] +#[argh(subcommand, name = "install")] +pub struct Install { + #[argh(option, description = "include only examples in this channel")] + pub(crate) channel: Channel, + + #[argh(option, description = "run only these examples")] + pub(crate) examples: Vec, +} + +impl Install { + pub fn run(self) -> anyhow::Result<()> { + let workspace_root = re_build_tools::cargo_metadata()?.workspace_root; + let mut examples = if self.examples.is_empty() { + self.channel.examples(workspace_root)? + } else { + Channel::Nightly + .examples(workspace_root)? + .into_iter() + .filter(|example| self.examples.contains(&example.name)) + .collect() + }; + examples.sort_by(|a, b| a.name.cmp(&b.name)); + + let mut cmd = Command::new("uv"); + cmd.arg("sync") + .arg("--inexact") + .arg("--no-install-package") + .arg("rerun-sdk"); + + for example in &examples { + cmd.arg("--package").arg(&example.name); + } + + let progress = MultiProgress::new(); + wait_for_output(cmd, "installing examples", &progress)?; + + println!("Successfully installed examples"); + + Ok(()) + } +} diff --git a/crates/build/re_dev_tools/src/build_examples/manifest.rs b/crates/build/re_dev_tools/src/build_examples/manifest.rs new file mode 100644 index 0000000..6836d35 --- /dev/null +++ b/crates/build/re_dev_tools/src/build_examples/manifest.rs @@ -0,0 +1,173 @@ +use std::path::PathBuf; + +use re_build_tools::Environment; + +use super::{Channel, Example}; + +/// Collect examples in the repository and produce a manifest file. +/// +/// The manifest file contains example metadata, such as their names +/// and links to `.rrd` files. +#[derive(argh::FromArgs)] +#[argh(subcommand, name = "manifest")] +pub struct Manifest { + #[argh( + positional, + description = "output path for the manifest file (must not exist)" + )] + output_path: PathBuf, + + #[argh( + option, + description = "where examples are uploaded, e.g. `https://app.rerun.io/version/main`" + )] + base_url: Option, + + #[argh(option, description = "include only examples in this channel")] + channel: Channel, +} + +impl Manifest { + pub fn run(self) -> anyhow::Result<()> { + let build_env = Environment::detect(); + + let base_url = if matches!(self.channel, Channel::Nightly) { + "https://app.rerun.io/version/nightly".to_owned() + } else { + match &self.base_url { + Some(base_url) => base_url.clone(), + None => get_base_url(build_env)?, + } + }; + + let base_source_url = get_base_source_url(build_env)?; + + let workspace_root = re_build_tools::cargo_metadata()?.workspace_root; + let manifest = self + .channel + .examples(workspace_root)? + .into_iter() + .filter(|example| example.include_in_manifest) + .map(|example| ManifestEntry::new(example, &base_url, &base_source_url)) + .collect::>(); + + if manifest.is_empty() { + anyhow::bail!("No examples found!"); + } + + std::fs::write(self.output_path, serde_json::to_string_pretty(&manifest)?)?; + + Ok(()) + } +} + +#[derive(serde::Serialize)] +struct ManifestEntry { + name: String, + title: String, + description: String, + tags: Vec, + rrd_url: String, + thumbnail: Thumbnail, + source_url: String, +} + +impl ManifestEntry { + fn new(example: Example, base_url: &str, base_source_url: &str) -> Self { + let name = example.name; + Self { + title: example.title, + description: example.description, + tags: example.tags, + rrd_url: format!("{base_url}/examples/{name}.rrd"), + thumbnail: Thumbnail { + url: example.thumbnail_url, + width: example.thumbnail_dimensions[0], + height: example.thumbnail_dimensions[1], + }, + source_url: format!( + "{base_source_url}/examples/{}/{name}", + example.language.examples_dir().to_string_lossy(), + ), + name, + } + } +} + +#[derive(serde::Serialize)] +struct Thumbnail { + url: String, + width: u64, + height: u64, +} + +fn get_base_url(build_env: Environment) -> anyhow::Result { + // In the CondaBuild environment we can't trust the git_branch name -- if it exists + // at all it's going to be the feedstock branch-name, not our Rerun branch. However + // conda should ONLY be building released versions, so we want to version the manifest. + let versioned_manifest = build_env == Environment::CondaBuild || { + let branch = re_build_tools::git_branch()?; + if branch == "main" || build_env != Environment::RerunCI { + // on `main` and local builds, use `version/main` + // this will point to data uploaded by `.github/workflows/reusable_upload_examples.yml` + // on every commit to the `main` branch + return Ok("https://app.rerun.io/version/main".into()); + } + parse_release_version(&branch).is_some() + }; + + if versioned_manifest { + let metadata = re_build_tools::cargo_metadata()?; + let workspace_root = metadata + .root_package() + .ok_or_else(|| anyhow::anyhow!("failed to find workspace root"))?; + + // on `release-x.y.z` builds, use `version/{crate_version}` + // this will point to data uploaded by `.github/workflows/reusable_build_and_publish_web.yml` + return Ok(format!( + "https://app.rerun.io/version/{}", + workspace_root.version + )); + } + + // any other branch that is not `main`, use `commit/{sha}` + // this will point to data uploaded by `.github/workflows/reusable_upload_examples.yml` + let sha = re_build_tools::git_commit_short_hash()?; + Ok(format!("https://app.rerun.io/commit/{sha}")) +} + +fn get_base_source_url(build_env: Environment) -> anyhow::Result { + if build_env == Environment::DeveloperInWorkspace { + // There is a high chance the current commit isn't pushed to the remote, so we use main + // instead. + Ok("https://github.com/rerun-io/rerun/blob/main".to_owned()) + } else { + let commit = re_build_tools::git_commit_short_hash()?; + Ok(format!("https://github.com/rerun-io/rerun/tree/{commit}")) + } +} + +fn parse_release_version(branch: &str) -> Option<&str> { + // release-\d+.\d+.\d+(-alpha.\d+)? + + let version = branch.strip_prefix("release-")?; + + let (major, rest) = version.split_once('.')?; + major.parse::().ok()?; + let (minor, rest) = rest.split_once('.')?; + minor.parse::().ok()?; + let (patch, meta) = rest + .split_once('-') + .map_or((rest, None), |(p, m)| (p, Some(m))); + patch.parse::().ok()?; + + if let Some(meta) = meta { + let (kind, n) = meta.split_once('.')?; + if kind != "alpha" && kind != "rc" { + return None; + } + n.parse::().ok()?; + } + + Some(version) +} diff --git a/crates/build/re_dev_tools/src/build_examples/mod.rs b/crates/build/re_dev_tools/src/build_examples/mod.rs new file mode 100644 index 0000000..9476023 --- /dev/null +++ b/crates/build/re_dev_tools/src/build_examples/mod.rs @@ -0,0 +1,56 @@ +//! This build script collects all examples which should be part of our example page, +//! and either runs them to produce `.rrd` files, or builds a manifest file which +//! serves as an index for the files. +//! +//! It identifies runnable examples by checking if they have `channel` set in +//! their `README.md` frontmatter. The available values are: +//! - `main` for simple/fast examples built on each PR and the `main` branch +//! - `nightly` for heavier examples built once per day +//! +//! An example may also specify args to be run with via the frontmatter +//! `build_args` string array. + +mod example; +mod install; +mod manifest; +mod notebook; +mod rrd; +mod snippets; +mod wait_for_output; + +// ----------------------------------------------------------------------------- +use argh::FromArgs; +use example::Channel; +pub use example::{Example, ExamplesManifest, Language}; +use install::Install; +use wait_for_output::wait_for_output; + +/// Build examples and their manifest. +#[derive(FromArgs)] +#[argh(subcommand, name = "build-examples")] +pub struct Args { + #[argh(subcommand)] + cmd: Cmd, +} + +#[derive(FromArgs)] +#[argh(subcommand)] +enum Cmd { + Install(install::Install), + Rrd(rrd::Rrd), + Manifest(manifest::Manifest), + Snippets(snippets::Snippets), + Notebook(notebook::Notebook), +} + +pub fn main(args: Args) -> anyhow::Result<()> { + re_build_tools::set_output_cargo_build_instructions(false); + + match args.cmd { + Cmd::Install(cmd) => cmd.run(), + Cmd::Rrd(cmd) => cmd.run(), + Cmd::Manifest(cmd) => cmd.run(), + Cmd::Snippets(cmd) => cmd.run(), + Cmd::Notebook(cmd) => cmd.run(), + } +} diff --git a/crates/build/re_dev_tools/src/build_examples/notebook.rs b/crates/build/re_dev_tools/src/build_examples/notebook.rs new file mode 100644 index 0000000..85e8ce3 --- /dev/null +++ b/crates/build/re_dev_tools/src/build_examples/notebook.rs @@ -0,0 +1,102 @@ +use std::fs; +use std::process::Command; + +use indicatif::MultiProgress; +use rayon::prelude::{IntoParallelIterator as _, ParallelIterator as _}; + +use super::{Channel, Example, wait_for_output}; + +/// Collect examples in the repository and run them to produce `.rrd` files. +#[derive(argh::FromArgs)] +#[argh(subcommand, name = "notebook")] +pub struct Notebook { + #[argh(option, description = "include only examples in this channel")] + channel: Channel, + + #[argh(option, description = "run only these examples")] + examples: Vec, +} + +impl Notebook { + pub fn run(self) -> anyhow::Result<()> { + let workspace_root = re_build_tools::cargo_metadata()?.workspace_root; + let mut examples = if self.examples.is_empty() { + self.channel.notebooks(workspace_root)? + } else { + Channel::Nightly + .notebooks(workspace_root)? + .into_iter() + .filter(|example| self.examples.contains(&example.name)) + .collect() + }; + examples.sort_by(|a, b| a.name.cmp(&b.name)); + + let progress = MultiProgress::new(); + let results: Vec> = examples + .into_par_iter() + .map(|example| example.build_notebook(&progress)) + .collect(); + + let mut num_failed = 0; + for result in results { + match result { + Ok(()) => {} + Err(err) => { + eprintln!("{err}"); + num_failed += 1; + } + } + } + if 0 < num_failed { + anyhow::bail!("Failed to run {num_failed} example(s)"); + } + + Ok(()) + } +} + +impl Example { + fn build_notebook(self, progress: &MultiProgress) -> anyhow::Result<()> { + let tempdir = tempfile::tempdir()?; + + // Gather all files in self.dir with self.language.extension() + let extension = self.language.extension(); + let entries = fs::read_dir(&self.dir)?; + let notebook_files: Vec<_> = entries + .filter_map(|entry| { + let entry = entry.ok()?; + let path = entry.path(); + if path.is_file() && path.extension()? == extension { + Some(path) + } else { + None + } + }) + .collect(); + + for notebook_path in notebook_files { + let mut cmd = Command::new("jupyter"); + cmd.arg("nbconvert"); + cmd.arg("--execute"); + cmd.arg("--to").arg("notebook"); + cmd.arg("--output-dir").arg(tempdir.path()); + cmd.arg(¬ebook_path); + + if self.allow_warnings { + cmd.env("PYTHONWARNINGS", "default"); + } else { + // raise exception on warnings, e.g. when using a @deprecated function + cmd.env("PYTHONWARNINGS", "error"); + } + + cmd.env("RERUN_PANIC_ON_WARN", "1"); // any logged warnings/errors should cause a failure + cmd.env("RERUN_STRICT", "1"); // any misuse of the API should cause a failure + // Don't crash on Jupyter deprecation warning. + cmd.env("JUPYTER_PLATFORM_DIRS", "1"); // use platform dirs for jupyter config/cache + + wait_for_output(cmd, &self.name, progress)?; + } + + Ok(()) + } +} diff --git a/crates/build/re_dev_tools/src/build_examples/rrd.rs b/crates/build/re_dev_tools/src/build_examples/rrd.rs new file mode 100644 index 0000000..7c61730 --- /dev/null +++ b/crates/build/re_dev_tools/src/build_examples/rrd.rs @@ -0,0 +1,133 @@ +use std::fs::create_dir_all; +use std::path::{Path, PathBuf}; +use std::process::Command; + +use indicatif::MultiProgress; +use rayon::prelude::{IntoParallelIterator as _, ParallelIterator as _}; + +use super::{Channel, Example, Install, wait_for_output}; + +/// Collect examples in the repository and run them to produce `.rrd` files. +#[derive(argh::FromArgs)] +#[argh(subcommand, name = "rrd")] +pub struct Rrd { + #[argh(positional, description = "directory to output `rrd` files into")] + output_dir: PathBuf, + + #[argh(option, description = "include only examples in this channel")] + channel: Channel, + + #[argh(option, description = "run only these examples")] + examples: Vec, + + #[argh(switch, description = "install examples before running")] + install: bool, +} + +impl Rrd { + pub fn run(self) -> anyhow::Result<()> { + create_dir_all(&self.output_dir)?; + + if self.install { + Install { + channel: self.channel, + examples: self.examples.clone(), + } + .run()?; + } + + let workspace_root = re_build_tools::cargo_metadata()?.workspace_root; + let mut examples = if self.examples.is_empty() { + self.channel.examples(workspace_root)? + } else { + Channel::Nightly + .examples(workspace_root)? + .into_iter() + .filter(|example| self.examples.contains(&example.name)) + .collect() + }; + examples.sort_by(|a, b| a.name.cmp(&b.name)); + + let progress = MultiProgress::new(); + let results: Vec> = examples + .into_par_iter() + .map(|example| example.build_rrd(&progress, &self.output_dir)) + .collect(); + + let mut num_failed = 0; + for result in results { + match result { + Ok(rrd_path) => { + if let Ok(metadata) = std::fs::metadata(&rrd_path) { + println!( + "Output: {} ({})", + rrd_path.display(), + re_format::format_bytes(metadata.len() as _) + ); + } else { + eprintln!("Missing rrd at {}", rrd_path.display()); + num_failed += 1; + } + } + Err(err) => { + eprintln!("{err}"); + num_failed += 1; + } + } + } + if 0 < num_failed { + anyhow::bail!("Failed to run {num_failed} example(s)"); + } + + Ok(()) + } +} + +impl Example { + fn build_rrd(self, progress: &MultiProgress, output_dir: &Path) -> anyhow::Result { + let tempdir = tempfile::tempdir()?; + + let initial_rrd_path = tempdir.path().join(&self.name).with_extension("rrd"); + + { + let mut cmd = Command::new("python3"); + cmd.arg("-m").arg(&self.name); + cmd.arg("--save").arg(&initial_rrd_path); + cmd.args(self.script_args); + + // Configure flushing so that: + // * the resulting file size is deterministic + // * the file is chunked into small batches for better streaming + cmd.env("RERUN_FLUSH_TICK_SECS", 1_000_000_000.to_string()); + cmd.env("RERUN_FLUSH_NUM_BYTES", (128 * 1024).to_string()); + + if self.allow_warnings { + cmd.env("PYTHONWARNINGS", "default"); + } else { + // raise exception on warnings, e.g. when using a @deprecated function + cmd.env("PYTHONWARNINGS", "error"); + } + + cmd.env("RERUN_PANIC_ON_WARN", "1"); // any logged warnings/errors should cause a failure + cmd.env("RERUN_STRICT", "1"); // any misuse of the API should cause a failure + + wait_for_output(cmd, &self.name, progress)?; + } + + // Now run optimization on the result: + let final_rrd_path = output_dir.join(&self.name).with_extension("rrd"); + + let mut cmd = Command::new("python3"); + cmd.arg("-m").arg("rerun"); + cmd.arg("rrd"); + cmd.arg("optimize"); + // Small chunks for better streaming: + cmd.arg("--max-size").arg("128KiB"); + cmd.arg(&initial_rrd_path); + cmd.arg("-o").arg(&final_rrd_path); + + wait_for_output(cmd, &format!("{} optimization", self.name), progress)?; + + Ok(final_rrd_path) + } +} diff --git a/crates/build/re_dev_tools/src/build_examples/snippets.rs b/crates/build/re_dev_tools/src/build_examples/snippets.rs new file mode 100644 index 0000000..a459c0f --- /dev/null +++ b/crates/build/re_dev_tools/src/build_examples/snippets.rs @@ -0,0 +1,250 @@ +use std::collections::HashMap; +use std::fs::{create_dir_all, read_to_string}; +use std::path::{Path, PathBuf}; +use std::process::Command; + +use camino::Utf8Path; +use indicatif::MultiProgress; +use rayon::prelude::{IntoParallelIterator as _, ParallelIterator as _}; + +use super::wait_for_output; + +/// Collect code snippets from `docs/snippets` in the repository and run them to produce `.rrd` files. +#[derive(argh::FromArgs)] +#[argh(subcommand, name = "snippets")] +pub struct Snippets { + #[argh(positional, description = "directory to output `rrd` files into")] + output_dir: PathBuf, +} + +fn install_snippet_deps() { + // uv sync --inexact --no-install-package rerun-sdk --group snippets + let mut cmd = Command::new("uv"); + cmd.arg("sync"); + cmd.arg("--inexact"); + cmd.arg("--no-install-package"); + cmd.arg("rerun-sdk"); + cmd.arg("--group"); + cmd.arg("snippets"); + + let _ = cmd + .status() + .expect("failed to run `uv sync` to install snippet dependencies"); +} + +impl Snippets { + pub fn run(self) -> anyhow::Result<()> { + // Install snippet dependencies by running: + install_snippet_deps(); + + create_dir_all(&self.output_dir)?; + + let snippets_dir = re_build_tools::cargo_metadata()? + .workspace_root + .join("docs/snippets"); + + println!("Reading config…"); + let config = read_to_string(snippets_dir.join("snippets.toml"))?; + let config: Config = toml::from_str(&config)?; + + println!("Collecting snippets…"); + let snippet_root = snippets_dir.join("all"); + let snippets = collect_snippets_recursively(&snippet_root, &config, &snippet_root)?; + + // Check for duplicates as this will lead to undefined behavior (multiple threads writing + // to the same file). + { + let mut deduped = std::collections::HashSet::new(); + for snippet in &snippets { + if !deduped.insert(snippet.name.as_str()) { + anyhow::bail!("Snippet '{}' is defined multiple times", snippet.name); + } + } + } + + let progress = MultiProgress::new(); + + println!("Running {} snippets…", snippets.len()); + let results: Vec>> = snippets + .into_par_iter() + .map(|example| example.build(&progress, &self.output_dir)) + .collect(); + + let mut num_failed = 0; + for result in results { + match result { + Ok(Some(rrd_path)) => { + if let Ok(metadata) = std::fs::metadata(&rrd_path) { + println!( + "Output: {} ({})", + rrd_path.display(), + re_format::format_bytes(metadata.len() as _) + ); + } else { + eprintln!("Missing rrd at {}", rrd_path.display()); + num_failed += 1; + } + } + Ok(None) => { + // Backwards check opted out - no RRD expected + println!("Completed (no RRD output required)"); + } + Err(err) => { + eprintln!("{err}"); + num_failed += 1; + } + } + } + if 0 < num_failed { + anyhow::bail!("Failed to run {num_failed} example(s)"); + } + + Ok(()) + } +} + +fn collect_snippets_recursively( + dir: &Utf8Path, + config: &Config, + snippet_root_path: &Utf8Path, +) -> anyhow::Result> { + let mut snippets = vec![]; + + #[expect(clippy::unwrap_used)] // we just use unwrap for string <-> path conversion here + for snippet in dir.read_dir()? { + let snippet = snippet?; + let meta = snippet.metadata()?; + let path = snippet.path(); + + if path.file_name().is_some_and(|p| p == "__init__.py") { + continue; + } + + // Compare snippet outputs sometimes leaves orphaned rrd files. + if path.extension().is_some_and(|p| p == "rrd") { + continue; + } + + let name = path + .strip_prefix(snippet_root_path)? + .with_extension("") + .to_string_lossy() + .to_string(); + let config_key = name.replace('\\', "/"); + + let is_opted_out_run = config + .opt_out + .run + .get(&config_key) + .is_some_and(|languages| languages.iter().any(|v| v == "py")); + if is_opted_out_run { + println!( + "Skipping {}: explicit opt-out from run in `snippets.toml`", + path.display() + ); + continue; + } + + let is_opted_out_backwards_check = config.opt_out.backwards_check.contains(&config_key); + + let backwards_check_opted_out = is_opted_out_backwards_check; + + if meta.is_dir() { + snippets.extend(collect_snippets_recursively( + Utf8Path::from_path(&path).unwrap(), + config, + snippet_root_path, + )?); + continue; + } + + // We only run python examples, because: + // - Each snippet should already be available in each language + // - Python is the easiest to run + if path.extension().is_none_or(|p| p != "py") { + println!("Skipping {}: not a python example", path.display()); + continue; + } + + println!("Adding {}", path.display()); + let extra_args: Vec = config + .extra_args + .get(&config_key) + .cloned() + .unwrap_or_default() + .into_iter() + .map(|value| value.replace("$config_dir", snippet_root_path.parent().unwrap().as_str())) + .collect(); + snippets.push(Snippet { + path, + name, + extra_args, + backwards_check_opted_out, + }); + } + + Ok(snippets) +} + +#[derive(Debug)] +struct Snippet { + path: PathBuf, + name: String, + extra_args: Vec, + backwards_check_opted_out: bool, +} + +impl Snippet { + fn build(self, progress: &MultiProgress, output_dir: &Path) -> anyhow::Result> { + let rrd_path = output_dir.join(&self.name).with_extension("rrd"); + + if let Some(dir) = rrd_path.parent() { + std::fs::create_dir_all(dir)?; + } + + let mut cmd = Command::new("python3"); + cmd.arg(&self.path); + cmd.args(&self.extra_args); + + cmd.envs([ + ("PYTHONWARNINGS", "error"), // raise exception on warnings, e.g. when using a @deprecated function + ("RERUN_FLUSH_NUM_ROWS", "0"), + ("RERUN_STRICT", "1"), + ("RERUN_PANIC_ON_WARN", "1"), + ]); + + // Only set _RERUN_TEST_FORCE_SAVE if we expect an RRD output + if !self.backwards_check_opted_out { + cmd.env( + "_RERUN_TEST_FORCE_SAVE", + rrd_path.to_string_lossy().as_ref(), + ); + } + + wait_for_output(cmd, &self.name, progress)?; + + if self.backwards_check_opted_out { + Ok(None) + } else { + Ok(Some(rrd_path)) + } + } +} + +/// See `docs/snippets/snippets.toml` for more info +#[derive(serde::Deserialize)] +struct Config { + opt_out: OptOut, + + /// example name -> args + extra_args: HashMap>, +} + +#[derive(serde::Deserialize)] +struct OptOut { + /// example name -> languages + run: HashMap>, + + /// example name (for backwards compatibility check opt-out) + backwards_check: Vec, +} diff --git a/crates/build/re_dev_tools/src/build_examples/wait_for_output.rs b/crates/build/re_dev_tools/src/build_examples/wait_for_output.rs new file mode 100644 index 0000000..9a1fa20 --- /dev/null +++ b/crates/build/re_dev_tools/src/build_examples/wait_for_output.rs @@ -0,0 +1,54 @@ +use std::io::{IsTerminal as _, stdout}; +use std::process::Command; +use std::time::Duration; + +use indicatif::{MultiProgress, ProgressBar}; + +/// Returns an error on non-zero returncode. +pub fn wait_for_output( + mut cmd: Command, + name: &str, + progress: &MultiProgress, +) -> anyhow::Result<()> { + // Remember what we tried to run, for a better error message: + let program = cmd.get_program().to_string_lossy().to_string(); + let args = cmd + .get_args() + .map(|arg| arg.to_string_lossy().to_string()) + .collect::>(); + + let progress = progress.add(ProgressBar::new_spinner().with_message(name.to_owned())); + progress.enable_steady_tick(Duration::from_millis(100)); + + let output = cmd.output()?; + + let elapsed = progress.elapsed().as_secs_f64(); + let tick = if output.status.success() { + "✔" + } else { + "✘" + }; + let message = format!("{tick} {name} ({elapsed:.3}s)"); + + if stdout().is_terminal() { + progress.set_message(message); + progress.finish(); + } else { + println!("{message}"); + } + + if !output.status.success() { + let args = args.join(" "); + let stdout = String::from_utf8(output.stdout)?; + let stderr = String::from_utf8(output.stderr)?; + anyhow::bail!( + "Failed to run `{program} {args}`: \ + \nstdout: \ + \n{stdout} \ + \nstderr: \ + \n{stderr}", + ); + } + + Ok(()) +} diff --git a/crates/build/re_dev_tools/src/build_search_index/README.md b/crates/build/re_dev_tools/src/build_search_index/README.md new file mode 100644 index 0000000..2aaee72 --- /dev/null +++ b/crates/build/re_dev_tools/src/build_search_index/README.md @@ -0,0 +1,24 @@ +# build_search_index + +Builds a Meilisearch index from our documentation. + +### Requirements + +- `pixi` + +### Usage + +Start a local `meilisearch` instance: +``` +pixi run meilisearch +``` + +Index contents of the repository: +``` +$ pixi run search-index build +``` + +Start a REPL against the local `meilisearch` instance: +``` +$ pixi run search-index repl +``` diff --git a/crates/build/re_dev_tools/src/build_search_index/build.rs b/crates/build/re_dev_tools/src/build_search_index/build.rs new file mode 100644 index 0000000..4e21353 --- /dev/null +++ b/crates/build/re_dev_tools/src/build_search_index/build.rs @@ -0,0 +1,33 @@ +use cargo_metadata::semver::Version; + +use super::{DEFAULT_INDEX, DEFAULT_KEY, DEFAULT_URL, ingest, meili}; + +/// Index documentation, examples, and API references for all languages +#[derive(argh::FromArgs)] +#[argh(subcommand, name = "build")] +pub struct Build { + /// name of the meilisearch index to create/query + #[argh(positional, default = "DEFAULT_INDEX.into()")] + index_name: String, + + /// meilisearch URL + #[argh(option, long = "url", default = "DEFAULT_URL.into()")] + meilisearch_url: String, + + /// meilisearch master key (must support both read and write) + #[argh(option, long = "master-key", default = "DEFAULT_KEY.into()")] + meilisearch_master_key: String, + + /// release version to use in URLs + #[argh(option, long = "release-version")] + release_version: Option, +} + +impl Build { + pub fn run(self) -> anyhow::Result<()> { + let client = meili::connect(&self.meilisearch_url, &self.meilisearch_master_key)?; + let documents = ingest::run(self.release_version)?; + client.index(&self.index_name, &documents)?; + Ok(()) + } +} diff --git a/crates/build/re_dev_tools/src/build_search_index/ingest.rs b/crates/build/re_dev_tools/src/build_search_index/ingest.rs new file mode 100644 index 0000000..4fa5e0e --- /dev/null +++ b/crates/build/re_dev_tools/src/build_search_index/ingest.rs @@ -0,0 +1,161 @@ +#![expect(clippy::unwrap_used)] // build tool, so okay here + +/// Docs read from `/docs` +mod docs; + +/// Examples read from `/examples` +mod examples; + +/// Python API reference generated by mkdocs +mod python; + +/// C++ API reference generated by Doxygen +mod cpp; + +use std::borrow::Cow; +use std::cell::{Cell, RefCell}; +use std::io::IsTerminal as _; +use std::time::Duration; + +use camino::Utf8Path; +use cargo_metadata::Package; +use cargo_metadata::semver::Version; +use indicatif::{MultiProgress, ProgressBar}; + +pub fn run(release_version: Option) -> anyhow::Result> { + let ctx = Context::new(release_version)?; + docs::ingest(&ctx)?; + examples::ingest(&ctx)?; + python::ingest(&ctx)?; + cpp::ingest(&ctx)?; + Ok(ctx.finish()) +} + +struct Context { + progress: MultiProgress, + metadata: cargo_metadata::Metadata, + id_gen: IdGen, + documents: RefCell>, + release_version: Option, + is_tty: bool, +} + +impl Context { + fn new(release_version: Option) -> anyhow::Result { + Ok(Self { + progress: MultiProgress::new(), + metadata: re_build_tools::cargo_metadata()?, + id_gen: IdGen::new(), + documents: RefCell::new(Vec::new()), + release_version, + is_tty: std::io::stdout().is_terminal(), + }) + } + + fn is_tty(&self) -> bool { + self.is_tty + } + + fn progress_bar(&self, prefix: impl Into>) -> ProgressBar { + let bar = ProgressBar::new_spinner().with_prefix(prefix); + bar.enable_steady_tick(Duration::from_millis(100)); + #[expect(clippy::literal_string_with_formatting_args)] + bar.set_style(bar.style().template("{spinner} {prefix}: {msg}").unwrap()); + self.progress.add(bar) + } + + #[expect(clippy::needless_pass_by_value)] + fn finish_progress_bar(&self, bar: ProgressBar) { + bar.disable_steady_tick(); + bar.finish_and_clear(); + self.progress.remove(&bar); + let _ = bar; + } + + fn workspace_root(&self) -> &Utf8Path { + &self.metadata.workspace_root + } + + fn rerun_pkg(&self) -> &Package { + self.metadata + .packages + .iter() + .find(|pkg| pkg.name.as_str() == "rerun") + .unwrap() + } + + fn release_version(&self) -> &Version { + self.release_version + .as_ref() + .unwrap_or_else(|| &self.rerun_pkg().version) + } + + fn push(&self, data: DocumentData) { + self.documents.borrow_mut().push(Document { + id: self.id_gen.next(), + data, + }); + } + + fn finish(self) -> Vec { + let documents = self.documents.into_inner(); + println!("collected {} documents", documents.len()); + documents + } +} + +#[derive(serde::Serialize, serde::Deserialize)] +pub struct Document { + id: u64, + #[serde(flatten)] + data: DocumentData, +} + +impl Document { + pub const PRIMARY_KEY: &'static str = "id"; + + pub fn title(&self) -> &String { + &self.data.title + } + + pub fn url(&self) -> &String { + &self.data.url + } + + pub fn content(&self) -> &String { + &self.data.content + } +} + +#[derive(Debug, serde::Serialize, serde::Deserialize)] +struct DocumentData { + kind: DocumentKind, + title: String, + hidden_tags: Vec, + tags: Vec, + content: String, + url: String, +} + +#[derive(Clone, Copy, Debug, serde::Serialize, serde::Deserialize)] +#[serde(rename_all = "snake_case")] +enum DocumentKind { + Docs, + Examples, + Python, + Cpp, +} + +struct IdGen { + v: Cell, +} + +impl IdGen { + fn new() -> Self { + Self { v: Cell::new(0) } + } + + fn next(&self) -> u64 { + self.v.replace(self.v.get() + 1) + } +} diff --git a/crates/build/re_dev_tools/src/build_search_index/ingest/cpp.rs b/crates/build/re_dev_tools/src/build_search_index/ingest/cpp.rs new file mode 100644 index 0000000..2c38c42 --- /dev/null +++ b/crates/build/re_dev_tools/src/build_search_index/ingest/cpp.rs @@ -0,0 +1,243 @@ +#![expect(clippy::unwrap_used)] // build tool, so okay here + +use std::collections::HashSet; +use std::fmt::Display; +use std::fs::read_to_string; +use std::process::Command; + +use camino::Utf8PathBuf; +use itertools::Itertools as _; +use roxmltree::{Children, Descendants, Document, Node}; + +use super::{Context, DocumentData, DocumentKind}; +use crate::build_search_index::util::{CommandExt as _, ProgressBarExt as _}; + +macro_rules! document { + ($dom:ident, $path:expr) => { + let dom = read_to_string($path)?; + let $dom = roxmltree::Document::parse(&dom)?; + }; +} + +pub fn ingest(ctx: &Context) -> anyhow::Result<()> { + let progress = ctx.progress_bar("cpp"); + + progress.set("doxygen", ctx.is_tty()); + + Command::new("doxygen") + .with_arg("docs/Doxyfile") + .with_cwd(ctx.workspace_root().join("rerun_cpp")) + .output()?; + + let base_path = ctx.workspace_root().join("rerun_cpp/docs/xml"); + let mut visitor = Visitor { + ctx, + base_path, + visited: HashSet::new(), + }; + visitor.visit_root()?; + + ctx.finish_progress_bar(progress); + + Ok(()) +} + +struct Visitor<'a> { + ctx: &'a Context, + base_path: Utf8PathBuf, + + /// Set of visited `refid` + visited: HashSet, +} + +impl Visitor<'_> { + fn push(&mut self, id: &str, name: String, description: String, uri: impl Display) { + if self.visited.contains(id) { + return; + } + self.visited.insert(id.to_owned()); + + self.ctx.push(DocumentData { + kind: DocumentKind::Cpp, + title: name, + hidden_tags: vec!["c++".into(), "cpp".into()], + tags: vec![], + content: description, + url: format!("https://ref.rerun.io/docs/cpp/stable/{uri}"), + }); + } + + fn visit_root(&mut self) -> anyhow::Result<()> { + const ROOT_NAMESPACE_REFID: &str = "namespacererun"; + document!( + root, + self.base_path.join(format!("{ROOT_NAMESPACE_REFID}.xml")) + ); + self.visit_namespace_document(&root) + } + + fn visit_children(&mut self, id: &str, children: Children<'_, '_>) -> anyhow::Result<()> { + for node in children { + match node.tag_name().name() { + "innerclass" => { + let refid = get_attr(node, "refid")?; + if refid.contains("_3") { + // skip specializations, e.g. `AsComponents + continue; + } + + let prot = get_attr(node, "prot")?; + if prot == "private" { + continue; // `\private` + } + + document!(doc, self.base_path.join(format!("{refid}.xml"))); + self.visit_innerclass_document(&doc)?; + } + "innernamespace" => { + let refid = get_attr(node, "refid")?; + + document!(doc, self.base_path.join(format!("{refid}.xml"))); + self.visit_namespace_document(&doc)?; + } + "sectiondef" => { + for node in node.children() { + if node.tag_name().name() == "memberdef" { + self.visit_memberdef(id, node)?; + } + } + } + _ => {} + } + } + + Ok(()) + } + + fn visit_namespace_document(&mut self, doc: &Document<'_>) -> anyhow::Result<()> { + let root = get_first_by_tag_name(doc, "compounddef")?; + let id = get_attr(root, "id")?; + self.visit_children(id, root.children())?; + + Ok(()) + } + + fn visit_innerclass_document(&mut self, doc: &Document<'_>) -> anyhow::Result<()> { + let root = get_first_by_tag_name(doc, "compounddef")?; + let id = get_attr(root, "id")?; + let name = get_first_by_tag_name(&root, "compoundname")? + .text() + .unwrap(); + let description = parse_description(root)?; + + self.push(id, name.to_owned(), description, format_args!("{id}.html")); + + self.visit_children(id, root.children())?; + + Ok(()) + } + + fn visit_memberdef(&mut self, parent_id: &str, node: Node<'_, '_>) -> anyhow::Result<()> { + let id = get_attr(node, "id")?; + if id.contains("_3") { + // skip specializations, e.g. `AsComponents + return Ok(()); + } + + let kind = get_attr(node, "kind")?; + if !matches!(kind, "typedef" | "function" | "variable") { + return Ok(()); + } + + let prot = get_attr(node, "prot")?; + if prot == "private" { + return Ok(()); // `\private` + } + + let name = get_first_by_tag_name(&node, "qualifiedname") + .or_else(|_| get_first_by_tag_name(&node, "name"))? + .text() + .unwrap(); + let description = parse_description(node)?; + + if let Some(stripped_id) = id.strip_prefix(parent_id) { + self.push( + id, + name.to_owned(), + description, + format_args!("{parent_id}.html#{}", &stripped_id["_1".len()..]), + ); + } + + Ok(()) + } +} + +fn parse_description(node: Node<'_, '_>) -> anyhow::Result { + let content = |tag: &str| -> anyhow::Result { + // retrieve all text node descendants of `tag` + let text_nodes = node + .children() + .find(|n| n.tag_name().name() == tag) + .ok_or_else(|| { + anyhow::anyhow!("invalid XML: failed to find tag {:?}", "briefdescription") + })? + .descendants() + .filter(|n| n.is_text()) + .map(|n| n.text().unwrap()); + + Ok(text_nodes + .flat_map(|text| text.split_whitespace()) + .filter(|t| !t.is_empty()) + .join(" ")) + }; + + let brief = content("briefdescription")?; + let detailed = content("detaileddescription")?; + + Ok(match (brief.is_empty(), detailed.is_empty()) { + (true, true) => String::new(), + (false, true) => brief, + (true, false) => detailed, + (false, false) => format!("{brief}{detailed}"), + }) +} + +trait HasDescendants<'a, 'input> { + fn descendants(&'a self) -> Descendants<'a, 'input>; +} + +impl<'a, 'input, T> HasDescendants<'a, 'input> for &'_ T +where + T: HasDescendants<'a, 'input>, +{ + fn descendants(&'a self) -> Descendants<'a, 'input> { + T::descendants(self) + } +} + +impl<'a, 'input> HasDescendants<'a, 'input> for Document<'input> { + fn descendants(&'a self) -> Descendants<'a, 'input> { + self.descendants() + } +} + +impl<'a, 'input> HasDescendants<'a, 'input> for Node<'a, 'input> { + fn descendants(&'a self) -> Descendants<'a, 'input> { + self.descendants() + } +} + +fn get_first_by_tag_name<'a, 'input, El: HasDescendants<'a, 'input>>( + el: &'a El, + tag: &str, +) -> anyhow::Result> { + el.descendants() + .find(|n| n.tag_name().name() == tag) + .ok_or_else(|| anyhow::anyhow!("invalid XML: failed to find tag {tag:?}")) +} + +fn get_attr<'a, 'input: 'a>(node: Node<'a, 'input>, attr: &str) -> anyhow::Result<&'a str> { + node.attribute(attr) + .ok_or_else(|| anyhow::anyhow!("invalid XML: missing attribute {attr:?} on node {node:?}")) +} diff --git a/crates/build/re_dev_tools/src/build_search_index/ingest/docs.rs b/crates/build/re_dev_tools/src/build_search_index/ingest/docs.rs new file mode 100644 index 0000000..f9898bb --- /dev/null +++ b/crates/build/re_dev_tools/src/build_search_index/ingest/docs.rs @@ -0,0 +1,87 @@ +use std::path::Path; + +use super::{Context, DocumentData, DocumentKind}; +use crate::build_search_index::util::ProgressBarExt as _; + +pub fn ingest(ctx: &Context) -> anyhow::Result<()> { + let progress = ctx.progress_bar("docs"); + + let dir = ctx.workspace_root().join("docs").join("content"); + for entry in glob::glob(&format!("{dir}/**/*.md"))? { + let entry = entry?; + let path = entry + .strip_prefix(&dir)? + .with_extension("") + .display() + .to_string(); + progress.set(path.clone(), ctx.is_tty()); + let url = format!("https://rerun.io/docs/{path}"); + let (frontmatter, body) = parse_docs_frontmatter(&entry)?; + + ctx.push(DocumentData { + kind: DocumentKind::Docs, + title: frontmatter.title, + hidden_tags: vec![], + tags: vec![], + content: body, + url, + }); + } + + ctx.finish_progress_bar(progress); + + Ok(()) +} + +struct DocsFrontmatter { + title: String, +} + +fn find_frontmatter_and_body(path: &Path) -> anyhow::Result<(String, String)> { + let content = std::fs::read_to_string(path)?; + + const START: &str = "---"; + const END: &str = "---"; + + let Some(start) = content.find(START) else { + anyhow::bail!("{:?} is missing frontmatter", path.display()) + }; + let start = start + START.len(); + + let Some(end) = content[start..].find(END) else { + anyhow::bail!( + "{:?} has invalid frontmatter: missing {END:?} terminator", + path.display() + ); + }; + let end = start + end; + + let frontmatter = content[start..end].trim().to_owned(); + let body = content[end + END.len()..].trim().to_owned(); + + Ok((frontmatter, body)) +} + +fn parse_docs_frontmatter(path: &Path) -> anyhow::Result<(DocsFrontmatter, String)> { + const TITLE_FIELD: &str = "title:"; + + let (frontmatter, body) = find_frontmatter_and_body(path)?; + + // Parse `title: Some Title` and `title: "Some Title"` manually, to avoid depending on yaml. + // If we want to add support for more fields, just switch our frontmatter to be toml, or json, or anything but yaml. + + let Some(title_start) = frontmatter.find(TITLE_FIELD) else { + anyhow::bail!("{:?} is missing title field in frontmatter", path.display()); + }; + let title_start = title_start + TITLE_FIELD.len(); + let title_end = frontmatter[title_start..] + .find('\n') + .map_or(frontmatter.len(), |idx| title_start + idx); + + let title = frontmatter[title_start..title_end] + .trim() + .trim_matches('"') + .to_owned(); + + Ok((DocsFrontmatter { title }, body)) +} diff --git a/crates/build/re_dev_tools/src/build_search_index/ingest/examples.rs b/crates/build/re_dev_tools/src/build_search_index/ingest/examples.rs new file mode 100644 index 0000000..a8fd811 --- /dev/null +++ b/crates/build/re_dev_tools/src/build_search_index/ingest/examples.rs @@ -0,0 +1,51 @@ +use super::{Context, DocumentData, DocumentKind}; +use crate::build_examples::{Example, ExamplesManifest, Language}; +use crate::build_search_index::util::ProgressBarExt as _; + +const LANGUAGES: &[Language] = &[Language::Python, Language::Rust, Language::Cpp]; + +pub fn ingest(ctx: &Context) -> anyhow::Result<()> { + let progress = ctx.progress_bar("examples"); + + let manifest = ExamplesManifest::load(ctx.workspace_root())?; + + for (category_name, category) in &manifest.categories { + ctx.push(DocumentData { + kind: DocumentKind::Examples, + title: category.title.clone(), + hidden_tags: vec![], + tags: vec![], + content: category.prelude.clone(), + url: format!("https://rerun.io/examples/{category_name}"), + }); + + for example_name in &category.examples { + for language in LANGUAGES.iter().copied() { + progress.set( + format!("{category_name}/{example_name}.{}", language.extension()), + ctx.is_tty(), + ); + + let Some(example) = Example::load(ctx.workspace_root(), example_name, language)? + else { + continue; + }; + + ctx.push(DocumentData { + kind: DocumentKind::Examples, + title: example.title, + hidden_tags: vec![], + tags: example.tags, + content: example.readme_body, + url: format!("https://rerun.io/examples/{category_name}/{example_name}"), + }); + + break; + } + } + } + + ctx.finish_progress_bar(progress); + + Ok(()) +} diff --git a/crates/build/re_dev_tools/src/build_search_index/ingest/python.rs b/crates/build/re_dev_tools/src/build_search_index/ingest/python.rs new file mode 100644 index 0000000..ada06a6 --- /dev/null +++ b/crates/build/re_dev_tools/src/build_search_index/ingest/python.rs @@ -0,0 +1,366 @@ +use std::collections::{BTreeMap, HashMap}; +use std::process::Command; + +use anyhow::Context as _; +use serde::Deserialize; + +use super::{Context, DocumentData, DocumentKind}; +use crate::build_search_index::util::{CommandExt as _, ProgressBarExt as _}; + +const RERUN_SDK: &str = "rerun_sdk"; + +pub fn ingest(ctx: &Context) -> anyhow::Result<()> { + let progress = ctx.progress_bar("python"); + + // run `mkdocs` to generate documentation, which also produces a `objects.inv` file + // this file contains every documented item and a URL to where it is documented + progress.set("mkdocs build", ctx.is_tty()); + let mkdocs_config = ctx.workspace_root().join("rerun_py/mkdocs.yml"); + println!("Running mkdocs build with config: {mkdocs_config}"); + println!( + "Current working directory: {:?}", + std::env::current_dir().unwrap_or_default() + ); + + let mkdocs_result = Command::new("mkdocs") + .with_arg("build") + .with_arg("-f") + .with_arg(&mkdocs_config) + .output(); + + match mkdocs_result { + Ok(_) => println!("mkdocs build completed successfully"), + Err(err) => { + eprintln!("Failed to run mkdocs build:"); + eprintln!(" Error: {err}"); + eprintln!(" Config file: {mkdocs_config}"); + eprintln!(" Config file exists: {}", mkdocs_config.exists()); + if let Ok(cwd) = std::env::current_dir() { + eprintln!(" Working directory: {cwd:?}"); + } + return Err(err); + } + } + + // run `sphobjinv` to convert the `objects.inv` file into JSON, and fully resolve all links/names + progress.set("sphobjinv convert", ctx.is_tty()); + let objects_inv_path = ctx.workspace_root().join("rerun_py/site/objects.inv"); + println!("Looking for objects.inv at: {objects_inv_path}"); + println!("objects.inv exists: {}", objects_inv_path.exists()); + + let inv: Inventory = Command::new("sphobjinv") + .with_args(["convert", "json", "--expand"]) + .with_cwd(ctx.workspace_root()) + .with_arg("rerun_py/site/objects.inv") + .with_arg("-") + .parse_json::() + .context( + "sphobjinv may not be installed, try running `pixi run pip install -r rerun_py/requirements-doc.txt`", + )? + .objects + .into_values() + .map(|o| (o.name.clone(), o)) + .collect(); + + // run `griffe` to obtain an tree of the entire public module hierarchy in `rerun_sdk` + // this dump is only used to obtain docstrings + progress.set("griffe dump", ctx.is_tty()); + let dump: Dump = Command::new("griffe") + .with_args(["dump", "rerun_sdk", "-s", "rerun_py"]) + .parse_json() + .context("either griffe or rerun_sdk is not installed, try running `pixi run pip install -r rerun_py/requirements-doc.txt` and building the SDK")?; + + let docs = collect_docstrings(&dump[RERUN_SDK]); + + // index each documented item + let base_url = format!( + "https://ref.rerun.io/docs/python/{version}", + version = ctx.release_version() + ); + // let base_url = "https://ref.rerun.io/docs/python/main"; + for (path, obj) in inv { + ctx.push(DocumentData { + kind: DocumentKind::Python, + hidden_tags: vec!["py".into(), "python".into()], + tags: vec![], + content: docs.get(&path).cloned().unwrap_or_default(), + url: format!("{base_url}/{uri}", uri = obj.uri), + title: path, + }); + } + + ctx.finish_progress_bar(progress); + + Ok(()) +} + +#[derive(Debug)] +struct Docstrings { + /// `item_path -> docstring` + docstrings: HashMap, + + /// `alias_path -> item_path` + /// + /// Also includes the `item_path` itself + aliases: HashMap, +} + +impl Docstrings { + fn get(&self, path: &str) -> Option<&String> { + // try get the docstring directly + if let Some(v) = self.docstrings.get(path) { + return Some(v); + } + + // if `path` is an alias, get the qualified path + let path = self.aliases.get(path)?; + + self.docstrings.get(path) + } +} + +fn collect_docstrings(root: &Item) -> Docstrings { + #[derive(Default)] + struct CollectDocstrings { + /// `item_path -> docstring` + docstrings: HashMap, + + /// `alias_path -> item_path` + /// + /// Also includes `item_path -> item_path` + aliases: HashMap, + module_path: Vec, + } + + impl CollectDocstrings { + fn qualified_path(&self, item_name: &str) -> String { + let mut path = self.module_path.join("."); + path.push('.'); + path.push_str(item_name); + path + } + } + + impl Visitor for CollectDocstrings { + fn visit_module(&mut self, module: &Module) { + let qpath = self.qualified_path(&module.name); + if let Some(docstring) = &module.docstring { + self.docstrings + .insert(qpath.clone(), docstring.value.clone()); + } + self.aliases.insert(qpath.clone(), qpath); + + self.module_path.push(module.name.clone()); + module.visit(self); + self.module_path.pop(); + } + + fn visit_alias(&mut self, alias: &Alias) { + let qpath = self.qualified_path(&alias.name); + self.aliases.insert(qpath, alias.target_path.clone()); + + alias.visit(self); + } + + fn visit_attribute(&mut self, attribute: &Attribute) { + let qpath = self.qualified_path(&attribute.name); + if let Some(docstring) = &attribute.docstring { + self.docstrings + .insert(qpath.clone(), docstring.value.clone()); + } + self.aliases.insert(qpath.clone(), qpath); + + attribute.visit(self); + } + + fn visit_function(&mut self, function: &Function) { + let qpath = self.qualified_path(&function.name); + if let Some(docstring) = &function.docstring { + self.docstrings + .insert(qpath.clone(), docstring.value.clone()); + } + self.aliases.insert(qpath.clone(), qpath); + + function.visit(self); + } + + fn visit_class(&mut self, class: &Class) { + let qpath = self.qualified_path(&class.name); + if let Some(docstring) = &class.docstring { + self.docstrings + .insert(qpath.clone(), docstring.value.clone()); + } + self.aliases.insert(qpath.clone(), qpath); + + class.visit(self); + } + } + + let mut visitor = CollectDocstrings::default(); + + let Item::Module(root) = root else { + panic!("root must be a module"); + }; + + for member in root.members.values() { + member.visit(&mut visitor); + } + + Docstrings { + docstrings: visitor.docstrings, + aliases: visitor.aliases, + } +} + +#[expect(dead_code)] // unused fields exist only to make deserialization work +#[derive(Debug, Deserialize)] +struct SphinxObjectInv { + // load-bearing fields: do not remove! + project: String, + version: String, + count: usize, + + /// Keys in this hashmap are the index of the object, + /// not the name/path. + #[serde(flatten)] + objects: HashMap, +} + +#[derive(Debug, Deserialize)] +struct Object { + name: String, + uri: String, +} + +type Inventory = HashMap; + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "snake_case")] +#[serde(tag = "kind")] +enum Item { + Module(Box), + Alias(Box), + Attribute(Box), + Function(Box), + Class(Box), +} + +#[derive(Debug, Deserialize)] +struct Module { + name: String, + // labels: Vec, + #[serde(default)] + members: BTreeMap, + docstring: Option, +} + +#[derive(Debug, Deserialize)] +struct Alias { + name: String, + target_path: String, +} + +#[derive(Debug, Deserialize)] +struct Attribute { + name: String, + // labels: HashSet