Object storage, built for developers.

Lioran S3 is developer-first object storage with simple buckets, fast reads and writes, an official TypeScript driver, and a production CLI.

# 1. Create a storage bucket
$ liorans3 bucket create assets --quota-gb 50
✔ Bucket 'assets' created successfully (versioning: disabled, quota: 50.00 GiB).
# 2. Upload with bounded-memory streaming
$ liorans3 object put assets 2026/dataset.parquet ./dataset.parquet
✔ Uploaded '2026/dataset.parquet' (124.50 MiB in 398ms, 312.81 MB/s, SHA-256: 8f4e2d...)
# 3. Generate expiring presigned download URL
$ liorans3 object presign assets 2026/dataset.parquet --expires 3600
https://s3.example.com/api/v1/buckets/assets/objects/2026/dataset.parquet?expires=1798765432&signature=a9f8...
300+ MB/s
Write Throughput
Benchmarked streaming uploads
300+ MB/s
Read Throughput
Benchmarked streaming downloads
100 GB
Tested Workload
Soak-tested single-node datasets

* Benchmark results measured in controlled local and network test environments. Actual throughput varies with hardware, storage media (NVMe vs SSD), object size distribution, concurrency, networking, and configured durability settings (strict vs balanced).

Developer Quickstart

Get up and running in minutes with the official CLI or TypeScript driver.

1. Install CLI
npm install -g @liorans3/cli@prealpha
2. Configure Connection
liorans3 configure --endpoint http://127.0.0.1:27118
3. Create Bucket
liorans3 bucket create assets --quota-gb 50
4. Stream Upload Object
liorans3 object put assets file.bin ./file.bin

Engineered for Predictability

Core storage primitives designed to eliminate memory spikes and locking contention.

Memory Model

Bounded-Memory Streaming

Uploads and downloads stream through fixed-size buffers (64 KiB–4 MiB) between network sockets and disk descriptors. Objects are never buffered entirely in RAM.

Persistence

Decoupled RocksDB Metadata

Bucket configurations, quotas, ETags, SHA-256 digests, and multipart states are persisted in an embedded RocksDB key-value store, decoupled from raw payload volumes.

Data Ingestion

Resumable Multipart Uploads

Upload multi-gigabyte files in parallel chunks with per-part retries, incremental checksum verification, and atomic server-side assembly.

Durability

Crash Durability Modes

Choose between strict synchronous disk sync (fsync per write) for guaranteed crash consistency or balanced OS writeback caching for peak throughput.

Security

Expiring Signed URLs

Cryptographically bound HMAC-SHA256 presigned URLs enable secure, delegated GET, PUT, and HEAD operations directly from client browsers without leaking credentials.

Access Control

Identity & Programmatic Keys

Role-based user management (admin, readwrite, readonly) with Argon2id password hashing and rotatable programmatic Access Key credentials.

Atomic Storage Lifecycle

Every mutating write follows a strict 5-stage staging and commit protocol to prevent partial or corrupted object exposure.

Staging

Payload bytes stream into an isolated temporary UUID v7 staging file (.staging/).

Hashing

Incremental SHA-256 and CRC32C digests are computed chunk-by-chunk in flight.

Disk Sync

Buffer is flushed and synced to physical storage (fsync in strict durability mode).

Metadata Commit

Object record, ETag, size, and checksum are atomically committed to RocksDB.

Promotion

Staging file is atomically promoted into the active /objects/ hierarchy and acknowledged 200 OK.

Zero RAM BloatPayloads are streamed directly without buffering whole files in memory.
Crash ConsistencyInterrupted uploads leave temporary files that are never exposed to readers.
Decoupled PlanesRocksDB stores only transactional metadata; payload bytes reside on storage volumes.

Dual Developer Interfaces

Interact programmatically via the TypeScript driver or administer instances directly from the terminal.

@liorans3/driverNode.js / Bun

TypeScript & JavaScript Driver

Strongly typed, zero-copy streaming client library supporting Node streams, Web streams, cursor pagination, and resumable multipart uploads.

// npm install @liorans3/driver
const client = new BastionClient("bastion://admin:pass@host:27118");
const bucket = client.bucket("media");

// High-level multipart upload
await bucket.uploadMultipart("video.mp4", "./video.mp4", {
concurrency: 4,
onProgress: (p) => console.log(`Progress: ${p.percent}%`),
});
@liorans3/cliBinary: liorans3

Command Line Interface

Administrative CLI featuring deterministic exit codes, local credential profiles, automated multipart transfers, and machine-readable JSON output.

# npm install -g @liorans3/cli@prealpha
# Upload large file with 4 parallel chunk workers
liorans3 multipart upload media video.mp4 ./video.mp4 --concurrency 4

# Query bucket objects in JSON mode for automation
liorans3 object ls media --json

Production Deployment

Deploy in minutes with Docker Compose, automatic Let's Encrypt TLS provisioning via Caddy, and persistent volumes.

docker-compose.yml
services:
bastion:
image: liorans3/liorans3:pre-alpha
container_name: bastion-server
restart: unless-stopped
expose:
- "27118"
environment:
- BASTION_ENV=production
- BASTION_HOST=0.0.0.0
- BASTION_PORT=27118
- BASTION_DATA_DIR=/data
- BASTION_ADMIN_PASSWORD=${BASTION_ADMIN_PASSWORD}
- BASTION_SIGNING_SECRET=${BASTION_SIGNING_SECRET}
- BASTION_DURABILITY=strict
volumes:
- bastion-data:/data

caddy:
image: caddy:2-alpine
restart: unless-stopped
ports:
- "80:80"
- "443:443"
environment:
- BASTION_DOMAIN=${BASTION_DOMAIN:-s3.example.com}
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy-data:/data

volumes:
bastion-data:
caddy-data:

Frequently Asked Questions

Quick answers to common questions about Lioran S3 architecture, licensing, and deployment.

Build with Lioran S3.

Start with the documentation, inspect the source code, or join the developer community.