Skip to content

Repository files navigation

ramo

gate

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.

30 seconds to a working bucket

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, usage

Credentials 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.

Install

git clone https://github.com/ramo-io/ramo-cli
cd ramo-cli && cargo build --release
./target/release/ramo --version

The 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.

The TUI

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.

Scripting

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.

Environment

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.

Developing

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.

License

Dual-licensed under Apache-2.0 or MIT, at your option.

About

Terminal client for Ramo object storage: trial signup, transfers, and a TUI browser

Resources

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages