hflow README

The project's README from github.com/Hebbian-Robotics/hflow. As one markdown file: README.md.

Hebbian Robotics
Hebbian Robotics (YC S26)

HFlow

Open source SDK for scalable multimodal data pipelines in robotics and physical AI

Y Combinator S26 Apache 2.0 license Join the Discord community

Hebbian Robotics (YC S26) is building HFlow, an open source SDK for scalable multimodal data pipelines in robotics and physical AI. It makes data tooling and practices typically developed inside large robotics teams accessible to teams of any size.

We believe processing data is a major bottleneck in robotics. A corpus can combine video, state, actions, timestamps, and metadata from many recording systems. Teams often feel the problem first in quality control: determining whether cameras froze, streams drifted out of sync, required topics disappeared, or duplicate recordings entered the corpus. As the corpus grows, fragmented scripts make it difficult to know what ran, audit the results, or reproduce a dataset.

Teams can start with HFlow's built-in checks, write new transformations, checks, labels, and enrichments, or connect processing code they already use. HFlow handles the orchestration, storage, versioning, and curation around those steps.

HFlow stamps each processed episode with its provenance, renders the pipeline as a graph, and records metadata and quality evidence in a queryable catalog. You can trace how outputs were produced, monitor every stage, and investigate a corpus without loading the underlying recordings.

MCAP is HFlow's v1 input and output boundary because it efficiently stores and serves synchronized video, state, action, and other time-series streams. That format requirement does not define where the data comes from: human-worn cameras, teleoperated robots, autonomous policies, and other collection systems can all feed the pipeline once their data is represented as a supported MCAP episode.

Status: pre-v1, with the core lifecycle working end to end. HFlow is ready to try locally. See what is implemented and open issues for current details and remaining work.

Help grow the open robotics community. Star the repository, share it with your network, or contribute. Our goal is an open source community where anyone can participate in building the future of robotics. No robot hardware is required to contribute.

HFlow's boundary
Input Supported standard MCAP episodes directly; LeRobot Dataset v3 repositories through hflow import lerobot
Processing Your Python transforms, checks, labels, and enrichments
Execution In-process for development; generated Airflow 3 DAGs for scheduled runs
Durable output Canonical MCAP episodes, provenance, artifacts, and a Parquet catalog
Curation DuckDB SQL that writes a version-pinned manifest

What you get

Human and robot data move through a four-stage lifecycle:

collection --> ingestion ---------------> curation ------> delivery
(landing       (transform -> QC gate ->  (SQL over        (curated MCAP +
 bucket)        enrich, as an             episode          manifest; convert
                Airflow DAG)              catalog)         for training)

HFlow pipeline demo

Open DuckDB's browser over the catalog at any time, including before the first run starts:

hflow catalog ui

Hosting and scale

The open-source deployment is built to be easy to own: run one single-tenant workspace with the included Docker Compose runtime, or deploy its generated DAG bundle into an Airflow 3 environment you already operate. It has no user accounts, RBAC, or multi-tenant control plane.

The data plane is kept separate from account and control-plane concerns so the same engine can be scaled as multiple isolated workspaces (for example, one per team or customer) behind an external control plane. That is the intended path to a future hosted version, but the hosted control plane is not implemented in this repository and is not a pre-v1 release commitment. docs/HOSTING.md documents the data-plane contract that makes such a control plane an addition rather than a rearchitecture: the workspace unit, the seams a service drives (manifests, remote runtime addressing, credential injection), the trust model, and the current limits.

Community and hosted interest

For reproducible bugs and scoped feature requests, use GitHub issues.

Install and try it

Install the SDK from PyPI with uv:

uv add hflow

The Hebbian Robotics project starts at version 0.2.0. Earlier 0.1.x releases under the same PyPI name belonged to an unrelated, inactive project before the name was transferred.

To run the repository's bundled quickstart:

git clone https://github.com/Hebbian-Robotics/hflow.git
cd hflow
uv sync --locked
uv run python examples/quickstart.py

The quickstart synthesizes a small multimodal episode with camera and state streams when no input file is given, runs the pipeline in-process, and writes its outputs under the gitignored data/ directory. It needs no Docker or Airflow. To use your own recording:

uv run python examples/quickstart.py path/to/episode.mcap

For the recommended first run on real egocentric footage, follow Evaluate your first egocentric episode. It runs HFlow's local deterministic quality baseline and two hosted semantic checks together, without requiring an account, API key, or model server.

Use uv run hflow --help to see the CLI. When you are ready to schedule the same pipeline, continue with the runtime guide. Developers and contributors should start with CONTRIBUTING.md. Browse the examples catalog for the egocentric-corpus and OpenAI vision paths.

To import a LeRobot Dataset v3 episode into the same canonical MCAP boundary:

uv run hflow import lerobot \
  --repo lerobot/pusht --revision main \
  --camera observation.image --episode-index 0 \
  --output-dir ./data/lerobot_pusht

The importer resolves main to an immutable source commit and records it as episode provenance. See the LeRobot import guide for the supported feature subset and a multi-camera example.

What it looks like

Get started in six lines of code. This fuller example uses a robot teleoperation episode, but the same step interface applies to egocentric video and other physical-AI recordings.

import hflow
from hflow.checks import camera_frame_stats
from your_existing_qc import check_joint_smoothness  # use your existing checks

app = hflow.App("kitchen-pipeline")  # data root: $HFLOW_DATA_ROOT, hflow.toml, else ./data


@app.check(version="1")
def joint_smoothness(ep: hflow.Episode) -> hflow.CheckResult:
    joints = ep.channel("/joint_states").to_numpy()  # our line: extract
    result = check_joint_smoothness(joints, rate_hz=100)  # your line: unchanged
    return hflow.CheckResult(measurements=result)  # our line: record


@app.check(version="1", critical=True)
def camera_blackout(ep: hflow.Episode) -> hflow.CheckResult:
    camera_topic = next(topic for topic in ep.cameras if "wrist_cam" in topic)
    evidence = camera_frame_stats(ep, cameras=[camera_topic])
    black_frame_percent = evidence.measurements[f"{camera_topic}/black_frame_pct"]
    assert isinstance(black_frame_percent, float)
    return hflow.CheckResult(
        measurements={"black_pct": black_frame_percent},
        verdict=black_frame_percent < 50.0,  # percent; your threshold
    )


if __name__ == "__main__":
    app.test("episode_0001.mcap")  # whole pipeline, in-process, no infra
    # Or call app.run() here to start the Compose runtime, then use `hflow ingest`.

Every check, enrichment, and derived channel declares a version. HFlow stores that value exactly as written: keep it for behavior-preserving refactors, and bump it when old and new results should no longer be treated as comparable.

Curation comes afterwards, via hflow.curate(data_root / "catalog", sql, output="manifest.parquet") or hflow curate "<sql>" on the command line, either way reporting coverage denominators alongside the manifest:

SELECT episode_id, uri FROM episodes
WHERE task = 'fold_napkin'
  AND status = 'ok'
  AND black_pct < 1.0                      -- percent, user-owned threshold
  AND pipeline_version = 'a41c9f27b3d8'    -- pin one reprocessing generation

Design principles

  1. Democratize the architecture, defer the optimizations. Preserve the useful workflow and standard interfaces at small scale, and label each production-scale mechanism honestly as implemented, simplified, deferred, or out of scope.
  2. Evidence, not verdicts. Checks record measurements with coverage; pass/fail policy belongs to the consumer, at curation time. Quality tags route episodes; they never delete data.
  3. Standard formats at every boundary. MCAP episodes, Parquet catalogs, Airflow DAGs. Our code exists only where the format forces bridging or a pitfall is genuinely non-obvious.
  4. Your code stays your code. Existing transforms, checks, and enrichments plug in through small adapters instead of being rewritten.

Requirements

Documentation

References

Contributing

Thank you to all our contributors for making HFlow awesome! See CONTRIBUTING.md to join our community.

HFlow contributors

License

Apache-2.0. The license covers the code, not the names: see the trademark policy.

hflow (Hebbian-Robotics/hflow)

Searching Database…

300 ·GitHub
这是什么?HFlow 是 Hebbian Robotics(YC S26)推出的开源 SDK,用于为机器人和具身智能构建可扩展的多模态数据管道,让团队能验证自己训练 AI 模型所用数据的质量。
这是我必须重写代码才能用的框架,还是更像一个工具包?它是一个 Python SDK 加 CLI:你的检查、转换、标注和增强逻辑仍以普通 Python 函数的形式留在自己的代码里,HFlow 则在外层为它们提供编排、存储、版本管理和策展。
怎么试用?用 uv 从 PyPI 安装 SDK,然后运行自带的快速入门:它会合成一个带相机和状态流的小型多模态 episode,并在进程内运行管道,不需要 Docker 或 Airflow。
用之前需要先配好 Docker 或 Airflow 吗?快速的本地测试不需要;但要做定时的生产运行,你需要 Python 3.11+,外加 Docker(用于自带的 Docker Compose 运行时)或你自己的 Airflow 3 部署(例如 Astronomer、MWAA 或 Cloud Composer)。
它达到生产可用水准了吗?没有,HFlow 明确处于 v1 之前的阶段:核心生命周期可以端到端运行、适合在本地试用,而目前的开源部署没有用户账号、RBAC 或多租户控制平面。
它能在 Windows 上跑吗?可以,但只能通过 WSL2,因为 Apache Airflow 无法在 Windows 上原生运行。
Apache-2.0 许可证也涵盖 HFlow 这个名称吗?不涵盖,Apache-2.0 许可证只覆盖代码;Hebbian Robotics 和 HFlow 名称的使用由单独的商标政策管理。
什么是 MCAP?HFlow 为什么需要它?MCAP 是一种开放容器格式,ROS 2 原生用它录制,Foxglove/Rerun 也能直接打开。HFlow 把它作为输入/输出边界,因为它能高效存储同步的视频、状态、动作等时间序列流。
我能导入已经用 LeRobot 采集的数据吗?可以,CLI 命令 hflow import lerobot 会把 LeRobot Dataset v3 仓库转换成 HFlow 规范的 MCAP episode,并记录来源 commit 作为溯源信息。
数据流经 HFlow 时究竟会发生什么?episode 会经过四个阶段:你用普通 Python 写的处理代码、盖上溯源信息(schema、管道、工具版本)的 MCAP 输出、以 Airflow DAG 形式可见的编排,以及一个可查询的 DuckDB/Parquet 目录,供策展使用。
Hebbian Robotics 为什么要做这个,而不是靠临时拼凑的脚本?随着语料库在众多录制系统之间增长,碎片化的质量控制脚本让人难以弄清哪些跑过、审计结果或复现数据集。HFlow 内置了溯源、版本管理和可查询目录,让团队能把任何结果追溯到源头。
Size
10.6 MB
Stars
300
Age
2mo
Commits · 90 Days