One API, all storage
Object storage, file systems, cloud SaaS, databases, protocols and key-value services reached through a single Operator and one mental model.
One zero-cost Operator for object storage, file systems, databases and more — in the language you already ship.
use opendal::services::S3;
use opendal::Operator;
// Configure a backend once, then use one Operator.
let builder = S3::default().bucket("data");
let op = Operator::new(builder)?.finish();
op.write("hello.txt", "Hello, World!").await?;
let bytes = op.read("hello.txt").await?;
OpenDAL runs in production across the open-source ecosystem. These are some of the projects that build on it.
OpenDAL turns one vision — One Layer, All Storage — into a practical foundation for applications, libraries and data systems.
Object storage, file systems, cloud SaaS, databases, protocols and key-value services reached through a single Operator and one mental model.
Built in Rust with composable services and layers. Compile in only the backends and capabilities you use, and pay for nothing else.
Stack retry, timeout, logging, tracing, metrics, throttling and concurrency limits as reusable layers — no rewrites, no glue code.
Add services, layers and language bindings without forking the model. Developed in the open and governed the Apache Way.
One Operator is a full toolkit for real-world data — read and write at scale, recover from failures, and work with files — the same way on every backend.
let op = Operator::new(S3::default().bucket("data"))?.finish();
// Read just the bytes you need.
let head = op.read_with("logs/today").range(0..64 * 1024).await?;
// Or pull a large object in parallel chunks.
let full = op
.read_with("big.parquet")
.concurrent(8)
.chunk(8 * 1024 * 1024)
.await?;
Enable only the backends your application needs. The Operator contract stays identical across every one.
Each binding exposes the same OpenDAL service model while following its own ecosystem's conventions.
Stack cross-cutting concerns as reusable layers. The order is explicit and the core stays zero-cost.
use opendal::layers::RetryLayer;
// Exponential backoff with jitter; interrupted
// reads and writes resume where they left off.
let op = op.layer(
RetryLayer::new().with_max_times(5).with_jitter(),
);
Join the infrastructure builders, platform teams and application developers accessing data freely, painlessly and efficiently.