Skip to content

Repository files navigation

Plures Object + Stream Platform

S3-compatible object storage + streaming platform powered by PluresDB.

Content-addressed chunks • Graph-native metadata • Hyperswarm P2P replication

Architecture

┌─────────────────────────────────────────────────┐
│ 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 │
└─────────────────────────────────────────────────┘

Crates

CratePurpose
plures-object-coreShared types, traits, error types
plures-chunkstoreContent-addressed blob storage (fs + memory)
plures-manifestObject-to-chunk manifest storage
plures-manifest-dbGraph-native manifest backend (filesystem; CRDT-style version history)
plures-object-storeObject service (PutObject, GetObject, multipart)
plures-object-httpS3-compatible HTTP API gateway (axum)
plures-object-cliCLI binary (plures-object serve)
plures-streamEvent streaming engine

On-Disk Layout

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

Quick Start

use std::sync::Arc;use plures_object_store::ObjectService;use plures_chunkstore::MemChunkStore;use plures_manifest::MemManifestStore;#[tokio::main]asyncfnmain(){let svc = ObjectService::new(Arc::new(MemChunkStore::new()),Arc::new(MemManifestStore::new()),);// PutObjectlet 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);// GetObjectlet(_, data) = svc.get_object(&"photos/sunset.jpg".into()).await.unwrap();println!("Retrieved {} bytes", data.len());// ListObjectslet objects = svc.list_objects(Some("photos/")).await.unwrap();println!("Found {} objects", objects.len());}

Key Features

  • 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

Milestones

  1. ✅ Core storage + metadata
  2. ✅ Multipart upload support
  3. ✅ S3 HTTP API layer (axum)
  4. ✅ PluresDB metadata backend (graph-native CRDT manifest store)
  5. ✅ Streaming event bus
  6. ⬜ Hyperswarm replication via Stream Engine
  7. ⬜ Garbage collection for orphaned chunks

Part of the Plures Ecosystem

PackageRole
PluresDBGraph database + vector search + Hyperswarm
UnumReactive state bindings (Svelte 5 ↔ PluresDB)
ChronosGraph-native state chronicle
Plures ObjectS3-compatible object storage + streaming
Pares AgensAI agent framework
Design DojoUI component library
Plures VaultEncrypted secret storage

License

AGPL-3.0-or-later

About

S3-compatible object storage + streaming platform powered by PluresDB — content-addressed chunks, graph-native metadata, Hyperswarm P2P replication

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages