ReductStore v1.19: Open Data Backbone for Robotics and ROS

ReductStore 1.19.0 is now available. This release extends the storage model for robotics and telemetry workloads and introduces new integration points for ROS and Zenoh.
To download the latest release, visit the Download Page.
What's new in 1.19.0?
The first major change in v1.19 is licensing. ReductStore Core is now open source under Apache 2.0, which makes the core database easier to evaluate, integrate, and extend in production systems.
The second major change is the data model. ReductStore now supports hierarchical entry names, similar to ROS topics, and adds entry attachments for schemas and metadata. This makes it possible to represent structured robotics data without flattening topic hierarchies or moving context into external systems.
The release also introduces a native Zenoh API for direct ingestion and querying over Zenoh, and ReductBridge for ROS1 and ROS2 integration.
Nested Data Model with Attachments
The new hierarchical data model lets you organize data in a path-based structure, similar to ROS topics, Zenoh key expressions, or MQTT topics. Instead of relying on a flat namespace, ReductStore can now store data in a form that matches the structure used by upstream systems.
Each entry can also include attachments for schemas and metadata. These attachments preserve the context required by downstream tooling without changing the record payload itself. For example, the ROS Extension can use them to decode serialized ROS messages and export them to MCAP files.

Native Zenoh API
Zenoh is increasingly used in robotics and edge environments as a low-overhead protocol for distributed data exchange. With the native Zenoh API, ReductStore can participate directly in Zenoh-based systems without requiring an additional bridge or adapter.
You can start ReductStore with the Zenoh API enabled using a minimal Docker configuration:
docker pull reduct/store:v1.19.0
docker run --env "RS_ZENOH_ENABLED=ON" \
--env "RS_ZENOH_CONFIG={}" \
--env "RS_ZENOH_SUB_KEYEXPRS=**" \
-p 8383:8383 -p 36597:36597 -p 7446:7446 \
reduct/store:v1.19.0
Once enabled, the API allows you to write data to ReductStore directly over Zenoh. If a sample includes a JSON attachment, ReductStore stores it as record labels:
import json
import zenoh
KEY = "factory/line1/camera"
PAYLOAD = b"<binary payload>"
LABELS = {"robot": "alpha", "status": "ok"}
with zenoh.open(zenoh.Config()) as session:
session.put(
KEY,
PAYLOAD,
attachment=json.dumps(LABELS).encode(),
)
You can also query data through Zenoh. For conditional queries, pass a when expression in the query attachment. If you want all matching records returned individually, use zenoh.ConsolidationMode.NONE:
import json
import zenoh
KEY = "factory/line1/when-query"
CONSOLIDATION = zenoh.ConsolidationMode.NONE
attachment = json.dumps({"when": {"&status": {"$eq": "ok"}}}).encode()
with zenoh.open(zenoh.Config()) as session:
replies = [
reply
for reply in session.get(
KEY,
timeout=5.0,
attachment=attachment,
consolidation=CONSOLIDATION,
)
if reply.ok
]
for reply in replies:
print(reply.ok.payload.to_bytes())
Data ingested through Zenoh is stored in ReductStore like data written through the HTTP API, so it remains available for querying, replication, and downstream tools and extensions.
ReductBridge for ROS Integration
This release also introduces ReductBridge, a new project for integrating ReductStore with ROS1 and ROS2. ReductBridge automatically labels ROS messages and stores related schemas and metadata as attachments.
This makes raw ROS payloads usable after ingestion: they can be decoded later with the ROS Extension or exported to MCAP files. ROS support is the first target, but the same pattern can be extended to operating system metrics, logs, and other telemetry to build a unified storage layer with consistent labeling and metadata.
What’s Next
The next area of work is data compression and storage efficiency, especially for robotics workloads where payload sizes and formats vary significantly. We plan to introduce backend compression optimized for ReductStore's storage model, where many records are packed into a single block.
We also plan to store metadata in Parquet format. This should improve query efficiency, make metadata accessible without scanning the underlying data blocks, and simplify integration with analytics and data lake tooling.
Compatibility and Migration
Starting with v1.19, ReductStore Docker images no longer run as root for security reasons. If you deploy with Docker, make sure the mounted data directory is writable by UID/GID 10001:10001 before upgrading.
If you have questions or feedback, join the ReductStore Community forum.
Thanks for using ReductStore!