A lightning-fast, self-hosted web client for your S3-compatible endpoints. Stop wrestling with clunky cloud consoles and execute single-digit millisecond searches across hundreds of thousands of objects, right from your browser.
Every feature built into a single, self-contained Docker image. No plugins. No extensions.
Inspect Parquet schemas, browse CSV tables, render PDFs, view images, and syntax-highlight 30+ code formats — all inline, without downloading.
See all formats →| # | Column | Type |
|---|---|---|
| 1 | event_timestamp | TIMESTAMP |
| 2 | user_id | STRING |
| 3 | action | STRING |
| 4 | revenue | DOUBLE |
| 5 | geo_country | STRING |
Background crawling means you never wait for a folder to load. The FastAPI backend streams data to the React UI, achieving sub-3ms listing speeds on production buckets.
How it works →Your keys never leave your infrastructure. Share any object via password-protected, expirable URLs — no third-party services involved.
Security docs →Handle massive assets without the browser freezing. Sairo sustains 114 MB/s upload throughput and handles 528 requests/second under concurrent load.
Upload docs →Sairo indexes every object key with SQLite FTS5. No pagination. No loading spinners. Results in milliseconds.
Paginated prefix listing vs. pre-built FTS5 full-text index · Full benchmark results
Live S3 enumeration vs. indexed query · 3,400x faster · Install the CLI
Benchmarked via Docker on Apple Silicon. Production deployments on NVMe Linux hardware yield even higher throughput.
FTS5 Trigram · 134,707 objects · 38 TB
| Query | p50 | p95 |
|---|---|---|
parquet | 2.3ms | 4.1ms |
events | 2.4ms | 16.2ms |
analytics | 2.5ms | 3.4ms |
metadata | 2.4ms | 4.3ms |
2026 | 2.2ms | 22.0ms |
Fastest observed: 1.7ms
Single Uvicorn worker · Docker container
| Endpoint | p50 | p95 |
|---|---|---|
| /healthz | 2.1ms | 3.6ms |
| /api/buckets | 4.3ms | 5.8ms |
| /api/auth/me | 2.6ms | 5.3ms |
| Object listing | 2.2ms | 5.1ms |
| Presigned URL | 3.1ms | 5.6ms |
Upload + concurrent load benchmarks
| Metric | Result | |
|---|---|---|
| 50 MB upload | 436ms | 114 MB/s |
| 10 MB upload | 131ms | 76 MB/s |
| 5 concurrent | 236 | req/s |
| 10 concurrent | 333 | req/s |
| 25 concurrent | 528 | req/s |
Full methodology and raw data: benchmark/results/LATEST-RESULTS.md
No microservices. No message queues. No external databases.
FastAPI backend serves the React SPA as static files. No reverse proxy needed. Just docker run and go.
Every bucket gets a WAL-mode SQLite database. Object listings are instant, even at 134K+ objects per bucket.
Search docs →Background crawler indexes your storage using 4 threads per bucket. Configurable RECRAWL_INTERVAL keeps your index synced.
Secure JWT sessions with configurable durations, LDAP integration, OAuth providers, and TOTP two-factor authentication.
OAuth & LDAP →Built-in configurable API rate limiting protects your endpoints. Global throttle with per-route overrides.
Configure limits →Validated via pytest and npm test before every release. 25 E2E spec files covering every feature.
The Sairo CLI queries the same indexed backend as the web UI. Stop waiting for mc ls to enumerate millions of objects.
One command. One container. Every S3 provider.
docker run -d --name sairo -p 8000:8000 \
-e S3_ENDPOINT=https://s3.us-east-1.amazonaws.com \
-e S3_ACCESS_KEY=AKIA... \
-e S3_SECRET_KEY=wJal... \
-e ADMIN_PASS=choose-a-strong-password \
-v sairo-data:/data \
stephenjr002/sairo:latest docker run -d --name sairo -p 8000:8000 \
-e S3_ENDPOINT=http://minio:9000 \
-e S3_ACCESS_KEY=minioadmin \
-e S3_SECRET_KEY=minioadmin \
-e S3_PATH_STYLE=true \
-e ADMIN_PASS=choose-a-strong-password \
-v sairo-data:/data \
stephenjr002/sairo:latest docker run -d --name sairo -p 8000:8000 \
-e S3_ENDPOINT=https://<account-id>.r2.cloudflarestorage.com \
-e S3_ACCESS_KEY=your-r2-access-key \
-e S3_SECRET_KEY=your-r2-secret-key \
-e S3_PATH_STYLE=true \
-e ADMIN_PASS=choose-a-strong-password \
-v sairo-data:/data \
stephenjr002/sairo:latest docker run -d --name sairo -p 8000:8000 \
-e S3_ENDPOINT=https://s3.us-east-1.wasabisys.com \
-e S3_ACCESS_KEY=your-wasabi-key \
-e S3_SECRET_KEY=your-wasabi-secret \
-e ADMIN_PASS=choose-a-strong-password \
-v sairo-data:/data \
stephenjr002/sairo:latest
Then open http://localhost:8000 and log in. That's it.
Deploy the container and connect your first bucket today.