jay

Open-source object storage

Your own S3.
In one binary.

Jay stores your files behind the same S3 API your tools already speak — on your own server, with no database and nothing else to run. Start it in a minute, keep it for years.

Free and open source (MIT) · No database to set up · Linux and macOS

terminal
$ export AWS_ENDPOINT_URL=http://localhost:9000
$ aws s3 mb s3://photos
make_bucket: photos
$ aws s3 cp cat.jpg s3://photos/
upload: ./cat.jpg to s3://photos/cat.jpg

Your existing S3 tools work unchanged. Only the endpoint is new.

One store, four ways in. Every one of them reaches the same buckets.

Works with the tools you already use

How it works

From nothing to a stored file in about a minute.

No cluster to plan, no database to provision, no migrations. One container and a folder for your data.

  1. 1

    Start one container

    Give it a volume and two secrets. That is the whole setup.

    docker run … ghcr.io/ivangsm/jay
  2. 2

    Create a key

    Mint a key for your app and choose exactly what it is allowed to do.

    POST /_jay/tokens
  3. 3

    Point your S3 client at it

    Change the endpoint in your app or CLI. Everything else stays the same.

    --endpoint-url http://localhost:9000

Features

Everything you need from object storage. Nothing you have to babysit.

S3, without changing your code

Buckets, uploads, downloads, listings, multipart and presigned links all speak the S3 API. Point your app at a new endpoint and it keeps working.

Up to 5× faster from Go

Go services can use a lightweight binary protocol instead of HTTP. Same server, same files, a fraction of the overhead.

Or embed it as a library

Import Jay into your Go program and get the whole storage engine in-process. No network, no tokens, nothing to deploy.

Files that stay intact

Every object is checksummed on the way in and re-checked in the background. A crash mid-upload never leaves a half-written file behind.

Keys with exactly the access they need

Give each app or teammate its own key, limited to certain buckets, folders and actions. Share files with links that expire.

Nothing else to run

No database, no message queue, no cluster. Everything Jay knows lives in one folder you can copy, inspect and back up.

Performance

Fast over S3. Faster over its own protocol.

Reads go straight from disk to the network without passing through the program. And when the caller is Go, the native protocol drops HTTP and XML altogether — the busier the server, the bigger the gap.

See every benchmark and how to reproduce it →
Time per request, lower is better S3 API Native
Read a small file 2.1× faster
81.3 µs
38.9 µs
Look up a file’s details 2.2× faster
59.8 µs
27.0 µs
Small reads, 16 at once 5.2× faster
26.3 µs
5.0 µs

Measured on a 16-thread Ryzen 7 desktop.

Made for

Anywhere you would reach for S3.

Your app’s uploads

Avatars, attachments and documents, stored next to the app instead of on a third-party bill.

Build and CI caches

Fast, local artifact and cache storage that any S3-aware tool already knows how to use.

Media backends

Photos and video for a site or an image server, served with range reads straight from disk.

S3 for development and tests

A real S3 endpoint on your laptop and in CI, in one container that starts in seconds.

Why Jay

Small on purpose. Honest about it.

You own everything

Your files live on your disk, in a folder you can see. No per-request bill, no egress fees, no lock-in.

No silent surprises

If Jay does not support something, it says so with a clear error. It never pretends a request worked and quietly drops your data.

Know where it stops

One server, not a cluster: no replication or versioning. If you need those, Jay will tell you upfront instead of half-doing them.

Run your own S3 in about a minute.

One container, two secrets, a volume. Try it on your laptop today and move it to production when you are ready.