Rosbag2 Cloud Offload
Full-stack sample (Next.js 16 + FastAPI) that streams ROS 2 rosbag2 recordings off the robot into Backblaze B2 over the S3-compatible API, describes each session from rosbag2's own metadata, and catalogs every session in Parquet so any bag is searchable and replayable with ros2 bag play from a presigned URL.
Built for: Developers and AI coding agents running a ROS 2 robot or vehicle program who need durable, queryable off-machine storage for the bag splits rosbag2 writes on every run.

What it's built with
Each piece of the stack, and the job it does in this project.
- Next.js 16 + React 19
- Web application and dashboard UI
- Tailwind CSS v4 + shadcn/ui
- Design tokens and reusable interface primitives
- TanStack Query
- Client-side data fetching, caching, and cache invalidation
- FastAPI + Pydantic v2
- Typed, layered Python API with boundary validation
- boto3 + Backblaze B2
- S3-compatible object storage access, contained in the repo layer
- pyarrow
- Parquet session catalog
- rosbag2
- Bag describe engine (ros2 bag info when present, else metadata.yaml)
- pnpm workspaces
- TypeScript and Python monorepo workflow
Core capabilities
What the project does out of the box, before you write any code of your own.
Continuous bag offload
Presigned-PUT each closed rosbag2 split into bags/<robot>/<session>/ while recording continues; the local copy is deleted only after a head_object confirms the object landed in B2.
Session catalog and search
Every session rolls into a Parquet catalog keyed by robot, date, topic set, and ROS distro, searchable by robot, session, distro, or topic.
Bag describe from rosbag2 metadata
Uses ros2 bag info when a ROS 2 environment is present, otherwise parses rosbag2's own metadata.yaml — never a third-party bag reader — and records topics, messages, duration, and compression.
Replay via presigned URL
A presigned GET manifest streams a session's splits so it can be replayed with ros2 bag play directly against B2.
Full-bucket explorer
Browse every object across the bags/ and catalog/ namespaces from the app.
Offload dashboard
Offload volume, session count, and compression-ratio statistics computed over the bags/ prefix.
A closer look
More screens from the running project.




Choose it for the right job
Rosbag2 Cloud Offload is a head start for a specific shape of project, not a supported, general-purpose product.
Use it when
- You run a ROS 2 robot or vehicle and need durable, queryable off-machine storage for the bag splits rosbag2 writes on every run.
- You want each offloaded session described from rosbag2's own metadata and rolled into a searchable Parquet catalog.
- You need a presigned B2 URL to replay a recording with ros2 bag play.
- You want a production-minded full-stack sample to clone and extend, with a strict layered architecture, contract checks, and tests.
Choose another path when
- You need a complete hosted fleet-data platform or a drop-in production service rather than a sample to adapt.
- You need managed hosting, user accounts, authentication, tenant isolation, billing, or retention management out of the box — the API is unauthenticated and bucket-wide.
- You want the app to run ros2 bag record for you; recording happens on the robot, and this app owns everything after a split closes.
- Your app is a generic file-upload dashboard with no robotics or rosbag2 specifics — the Vibe Coding Starter Kit is the closer starting point.
Project status and support
Report defects and feature requests through the repository's GitHub Issues; it carries no SLA and no guaranteed support.