Ramo is zero-egress object storage for AI training data: $5/TB/month flat, $0 egress (we don't charge to read data out), on an S3-compatible API and hardware we own. This repository is ramo, its terminal client: create a free trial bucket and start moving data in under a minute.
ramo signup my-demo # anonymous; 1 GB free for 365 days
ramo put model.ckpt # upload
ramo ls # canonical listing
ramo # the TUI: browse, upload, usageCredentials land in ~/.config/ramo/credentials, written 0600; when the
directory has to be created it is made 0700, and one that already exists
keeps the permissions its owner chose. The file is shared with the ramo.sh
helper and documented at https://docs.ramo.io/trial. Already ran the trial from an agent? The TUI
picks those credentials up as-is. The RAMO_ENDPOINT, RAMO_BUCKET,
RAMO_ACCESS_KEY, RAMO_SECRET_KEY quartet overrides the file when all four
are set; a partial quartet falls through to the file rather than half-loading.
git clone https://github.com/ramo-io/ramo-cli
cd ramo-cli && cargo build --release
./target/release/ramo --versionThe repository pins Rust 1.97.1 in rust-toolchain.toml, so rustup installs
and selects it for you; the MSRV is 1.85, which is what a consumer building
ramo-core against their own toolchain needs. On Linux libcurl is vendored and
linked statically, so no libcurl package is needed: the build wants a C
compiler and the OpenSSL development files instead (Debian or Ubuntu:
build-essential, libssl-dev, pkg-config, Fedora: gcc, openssl-devel).
macOS links the libcurl the system already ships, and needs only the Xcode
command line tools.
ramo with no arguments. With no credentials on the machine it opens on
signup: Enter creates a trial, n names it first.
Files browses the bucket one prefix level at a time: u uploads, d
downloads, x deletes (after a confirm), r reloads, Enter opens a prefix,
Backspace goes back up. One operation runs at a time, by construction:
uploads, downloads, and deletes share a single slot, so starting one while
another is in flight is refused rather than queued.
Usage is the trial's numbers: bytes used, object count, days to expiry, the quota bar, and a per-prefix breakdown of where the gigabyte went.
Shift+Tab switches sections, t cycles the theme, ? lists every key that is
live on the screen underneath it, and q or Ctrl+C quits. Command keys are
case-insensitive; Ctrl+C works from every screen and overlay, including a
half-typed prompt. The help modal and the footer hints are generated from the
same table that dispatches the keys, so they cannot drift from what the keys
actually do.
Every verb is scriptable. Exit code 0 on success, 1 on operation errors, 2 on usage or setup errors. Payload goes to stdout and every diagnostic to stderr, so a listing pipes cleanly even when something goes wrong.
ramo signup [name] [--force] [--json]
ramo put <file> [key]
ramo get <key> [dest]
ramo ls [--json]
ramo rm <key>
ramo usage [--json]
put uploads in a single PUT, so a file has to be 5 GiB or smaller; anything
larger is refused before a byte goes over the wire, because multipart upload
is not implemented. On the free trial's public route, single uploads cap at
100 MB until multipart lands; aws-cli multiparts under it automatically.
ls --json and usage --json emit stable JSON; the plain ls is the
canonical listing format, byte-identical with the one ramo.sh prints. With
bring-your-own keys there is no trial quota to report, so the ls header
stops after the total instead of inventing one.
usage reports the trial's own counters, so it needs credentials from a
signup rather than bring-your-own S3 keys; every other verb works with either.
| Variable | Effect |
|---|---|
RAMO_ENDPOINT, RAMO_BUCKET, RAMO_ACCESS_KEY, RAMO_SECRET_KEY |
The quartet above. All four override the credentials file; a partial set is ignored. |
RAMO_CRED_FILE |
Use this path instead of ~/.config/ramo/credentials. |
RAMO_API |
Portal base URL for signup and usage. Defaults to https://api.ramo.io. |
RAMO_FORCE |
1 is the same as passing --force to signup: overwrite an existing credentials file. |
RAMO_NO_MOUSE |
1 starts the TUI without mouse capture, so the terminal keeps its own selection and copy-paste. Every clickable pill has a key. |
The S3 surface underneath is plain SigV4 (path-style, us-east-1), signed
in-process with no AWS SDK, so the tooling you already run works against the
same bucket:
. ~/.config/ramo/credentials
AWS_ACCESS_KEY_ID=$RAMO_ACCESS_KEY \
AWS_SECRET_ACCESS_KEY=$RAMO_SECRET_KEY \
AWS_DEFAULT_REGION=us-east-1 \
aws s3 cp 00417.tar "s3://$RAMO_BUCKET/" --endpoint-url "$RAMO_ENDPOINT"Reading it back out costs nothing, into any cloud. Same story with rclone, boto3, or any S3 SDK. The agent-facing contract is at https://ramo.io/skill.md.
scripts/gate before every commit: fmt, clippy at -D warnings, and the
workspace tests. The workflow, commit rules, and binding engineering rulings
are in CONTRIBUTING.md and docs/RULINGS.md.
What comes next is in ROADMAP.md.
Dual-licensed under Apache-2.0 or MIT, at your option.