S3-compatible object storage + streaming platform powered by PluresDB.
Content-addressed chunks • Graph-native metadata • Hyperswarm P2P replication
┌─────────────────────────────────────────────────┐
│ S3 API Gateway │
│ PutObject · GetObject · DeleteObject · List │
├─────────────────────────────────────────────────┤
│ Object Service (plures-object-store) │
│ Orchestrates chunks + manifests │
├───────────────────┬─────────────────────────────┤
│ ChunkStore │ Manifest Store │
│ Content-addressed│ Object → chunk mapping │
│ SHA-256 dedup │ Multipart support │
├───────────────────┴─────────────────────────────┤
│ PluresDB (metadata plane) │
│ CRDT graph · Vector search · Hyperswarm sync │
├─────────────────────────────────────────────────┤
│ Stream Engine (plures-stream) │
│ Events · Replication · Workflows │
└─────────────────────────────────────────────────┘
| Crate | Purpose |
|---|---|
plures-object-core |
Shared types, traits, error types |
plures-chunkstore |
Content-addressed blob storage (fs + memory) |
plures-manifest |
Object-to-chunk manifest storage |
plures-object-store |
Object service (PutObject, GetObject, etc.) |
plures-stream |
Event streaming engine |
data/
├── chunks/ # Content-addressed blobs, sharded by hash prefix
│ ├── a1/
│ │ └── a1b2c3...
│ └── ff/
│ └── ffab01...
├── manifests/ # Object → chunk mappings (PluresDB backed)
├── staging/ # In-progress multipart uploads
└── gc/ # Garbage collection metadata
use std::sync::Arc;
use plures_object_store::ObjectService;
use plures_chunkstore::MemChunkStore;
use plures_manifest::MemManifestStore;
#[tokio::main]
async fn main() {
let svc = ObjectService::new(
Arc::new(MemChunkStore::new()),
Arc::new(MemManifestStore::new()),
);
// PutObject
let meta = svc.put_object(
"photos/sunset.jpg",
bytes::Bytes::from_static(b"image data..."),
Some("image/jpeg".into()),
).await.unwrap();
println!("Stored: {} ({} bytes, etag: {})", meta.key, meta.size, meta.etag);
// GetObject
let (_, data) = svc.get_object(&"photos/sunset.jpg".into()).await.unwrap();
println!("Retrieved {} bytes", data.len());
// ListObjects
let objects = svc.list_objects(Some("photos/")).await.unwrap();
println!("Found {} objects", objects.len());
}- Content-addressed deduplication — identical data stored once regardless of how many objects reference it
- Chunked storage — large objects split into configurable chunks (default 8 MiB)
- S3-compatible API surface — PutObject, GetObject, DeleteObject, ListObjects, HeadObject
- Event streaming — every operation emits events for replication, workflows, and audit
- Pluggable backends — trait-based storage allows memory, filesystem, or PluresDB backends
- ✅ Core storage + metadata (this commit)
- ⬜ Multipart upload support
- ⬜ S3 HTTP API layer (axum)
- ⬜ PluresDB metadata backend (replace MemManifestStore)
- ⬜ Hyperswarm replication via Stream Engine
- ⬜ Garbage collection for orphaned chunks
| Package | Role |
|---|---|
| PluresDB | Graph database + vector search + Hyperswarm |
| Unum | Reactive state bindings (Svelte 5 ↔ PluresDB) |
| Chronos | Graph-native state chronicle |
| Plures Object | S3-compatible object storage + streaming |
| Pares Agens | AI agent framework |
| Design Dojo | UI component library |
| Plures Vault | Encrypted secret storage |
AGPL-3.0-or-later