All projects
SampleSample · unsupportedUnsupported · no SLA

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.

MIT licensed · Updated Oct 14, 2026

Offload dashboard with fleet metrics and recent sessions
The Offload Dashboard shows fleet-wide metrics — sessions, robots, objects in bucket, storage used — with a recent-sessions table.

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.

Offload page with target-session selector
The Offload page picks a target session and streams closed rosbag2 splits straight into bags/<robot>/<session>/ on B2.
Session catalog listing all offloaded recordings
The Session Catalog lists every offloaded recording with distro, topic count, split count, size, and compression per session.
Catalog filtered to a single robot's sessions
Catalog Search filters the catalog by robot, session, ROS distro, or topic.
Session detail with describe output, splits, and replay
Session Detail expands one session: rosbag2 describe (topics, messages, duration), the split files, and presigned-URL replay.

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.
Sample · unsupported

Project status and support

Report defects and feature requests through the repository's GitHub Issues; it carries no SLA and no guaranteed support.