A command line for S3 and R2, built for you and your AI agent

blob0 ships a blob0 CLI with ls, put, get, mv, cp, rm, find and share — dry-run, JSON output and Keychain-stored credentials, plus an official Agent Skill for Claude Code, Codex and Cursor. Works with Cloudflare R2, S3, B2, Wasabi and MinIO.

Run everyday object-storage work from Terminal or let an AI agent call the same local executable. The CLI uses the profiles and credentials you already set up in Blob0.

Quick start

Install Blob0, connect a storage profile in the desktop app, then copy the CLI executable path from Settings → CLI & Skills.

  1. Download Blob0 and open it once on your Mac.
  2. In Settings → CLI & Skills, use the copy button next to the CLI path. Paste that exact path into Terminal or your agent’s shell command.
  3. Connect and save a profile in Blob0. Storage commands need that profile’s credentials in macOS Keychain and a valid license or active trial.
  4. Use the active profile, or pass --profile NAME_OR_ID to choose another saved profile.
Optional zsh alias (replace the path with the copied value)
alias blob0='/absolute/path/copied/from/Settings'
blob0 profiles

For a shorter command, you can add an alias to your shell configuration or create a symlink in a directory already on PATH. Keep the copied executable path in quotes if it contains spaces.

Command cheat sheet

CommandWhat it does
profilesList saved connection profiles and the active profile. It does not print access keys.
ls [PREFIX] [-r] [--limit N]List objects under a prefix. Results include all pages; -r lists descendants flat.
stat KEYShow metadata for one object.
find [QUERY] [PREFIX] [--glob GLOB] [--min-size SIZE] [--max-size SIZE] [--older-than AGE] [--newer-than AGE] [--sort size|date|name] [--limit N]Search names or full-key globs, filter by size or age, sort, and limit results.
usage [PREFIX]Summarize object count and bytes under a prefix.
cat KEY [--force]Write the object bytes to stdout. Objects over 64 MiB need --force.
put SRC... DEST [-r]Upload local files or folders. A directory needs -r; --content-type can override the inferred type.
get KEY... DEST [-r]Download one or more objects. Recursive downloads create directories and reject unsafe paths.
mv SRC DST [-r]Move an object or replace a prefix recursively; the source is deleted after a successful copy.
cp SRC DST [-r]Copy an object or replace a prefix recursively within the selected bucket.
rm KEY... [-r]Delete exact keys or a prefix. Prefix deletion needs -r and is permanent.
mkdir PREFIXCreate a zero-byte folder marker.
share KEY [--expiry SECONDS] [--upload | --public]Create a presigned download link, an upload link, or a configured public-domain URL.
sync listList configured sync folders. Running a sync is available in the desktop app only.
skills list | print NAME | export DIRList, print, or export the bundled Agent Skill.

Use the global --profile NAME_OR_ID option before a command to select a saved connection. put, get, mv, and cp accept --dry-run, --no-clobber, and --concurrency N (default 4, range 1–32); rm accepts --dry-run.

Output formats and exit codes

A dry-run batch item is marked planned and does not count as a completed upload
{
  "ok": true,
  "dryRun": true,
  "total": 1,
  "succeeded": 0,
  "skipped": 0,
  "failed": 0,
  "bytes": 0,
  "items": [
    { "src": "./report.csv", "dst": "reports/report.csv", "size": 2048, "status": "planned" }
  ]
}
Errors are written to stderr; check the exit code
{"error":{"kind":"...","message":"...","code":null}}

0  success (skips are allowed)
1  other, I/O, or cancelled
2  command usage
3–9 not_found, auth, license, config, network, s3, conflict
10 a multi-item batch contains failures

Commands return JSON on stdout, including batch summaries with per-item status. cat writes raw bytes, and skills print writes Markdown. Help and version use the CLI parser’s plain text. Command errors go to stderr as JSON. Failed items inside a multi-item batch stay in stdout items; exit code 10 means you should inspect those items for failures.

Safe workflow

Use --dry-run to inspect the planned work before a write. It checks listings or object metadata and does not write object data. Review the planned keys and destinations, then run the command without --dry-run when you are ready.

--dry-run

For put, get, mv, cp, and rm, show planned items without performing the write or deletion.

--no-clobber

Do not overwrite an existing destination. In a batch, existing items are skipped; a non-recursive single-object operation reports an existing destination as a conflict.

Recursive operations

Use -r only after checking the prefix and the full set of affected keys. A slash-less recursive rm key can match both that exact object and the KEY/ prefix.

find and prefixes

find filters the matching keys; it does not narrow a later prefix-wide mv or rm. Review every object in a prefix before running a recursive operation.

Example: profile archive is configured for the media-archive bucket. find shows age matches; ls shows the full prefix.
blob0 --profile archive find "" exports/ --older-than 90d --sort date
blob0 --profile archive ls exports/ -r
Preview first, inspect the planned keys, then repeat the reviewed command to delete
blob0 ls tmp/ -r
blob0 rm tmp/ -r --dry-run
# Review every item with status "planned"
blob0 rm tmp/ -r

Deletion is permanent. Recursive deletion of the bucket root (empty key or /) is refused unless you pass --yes-really-delete-everything. Even with that acknowledgement, preview the root operation first and verify the bucket selected by your profile.

Root deletion requires the explicit guard on both the preview and the run
blob0 rm "" -r --dry-run --yes-really-delete-everything
# Only after reviewing the complete plan:
blob0 rm "" -r --yes-really-delete-everything

AWS CLI S3 mapping

Blob0 operates on the bucket in the selected profile, so pass object keys and prefixes instead of s3://bucket/ URIs. These commands cover common file operations; Blob0 is not a drop-in replacement for the full AWS CLI.

AWS CLI S3Blob0 CLI
aws s3 ls s3://bucket/logs/blob0 ls logs/
aws s3 cp ./report.csv s3://bucket/reports/blob0 put ./report.csv reports/
aws s3 cp s3://bucket/reports/report.csv ./blob0 get reports/report.csv ./
aws s3 mv s3://bucket/a.csv s3://bucket/archive/a.csvblob0 mv a.csv archive/a.csv
aws s3 cp s3://bucket/a.csv s3://bucket/archive/a.csvblob0 cp a.csv archive/a.csv
aws s3 cp ./dir/ s3://bucket/path/ --recursiveblob0 put -r ./dir/ path/
aws s3 cp s3://bucket/path/ ./ --recursiveblob0 get -r path/ ./
aws s3 cp ./report.csv s3://bucket/reports/ --dryrunblob0 put ./report.csv reports/ --dry-run
aws s3 rm s3://bucket/tmp/ --recursive --dryrunblob0 rm tmp/ -r --dry-run
aws s3 presign s3://bucket/keyblob0 share key --expiry 3600
aws s3 sync ...Sync runs in the Blob0 desktop app. blob0 sync list only reads saved sync-folder configuration; it does not run a sync or report live status.

The desktop app does not live-refresh its file list after a separate CLI process changes the bucket. Refresh or revisit the prefix in Blob0 to load the latest listing.

Choosing between Blob0, s5cmd, and rclone

These mature open-source tools serve different workflows. s5cmd describes itself as a parallel S3 and local-filesystem tool; rclone provides commands across many cloud-storage backends, including sync and mount workflows.

Blob0

A macOS desktop client with a focused local CLI. The GUI and CLI use the same saved profiles and Keychain credentials; an official Skill explains the commands to supported agents.

s5cmd

An open-source, S3-focused command-line tool with parallel object and local-file operations. Consider it for large batches and shell automation.

rclone

An open-source command-line tool for many storage backends, with broader transfer, sync, and mount workflows. Consider it for cross-provider scripts and server-side jobs.

Blob0’s CLI does not implement s5cmd’s or rclone’s full command sets, mount support, or general-purpose sync. Keep the tool that fits your automation and scale; Blob0’s distinction is that its Mac GUI, CLI, profile, and Keychain access share one local setup. Actual performance depends on the Mac, network, and storage provider.

Upload to R2 and share a link

The same commands work with Cloudflare R2 or another configured S3-compatible profile. The destination is a key prefix inside the profile’s bucket.

Preview and upload a folder, then create a one-day presigned download link
blob0 put -r ./photos media/ --dry-run
blob0 put -r ./photos media/ --no-clobber
blob0 share media/photos/cover.jpg --expiry 86400

Presigned share expiry is clamped to 1 second through 7 days; the default is 1 hour. --upload creates a presigned upload URL. --public uses the profile’s configured public base URL, which is not an expiring presigned link. Treat presigned URLs as bearer credentials: anyone holding one can use it while the signature and storage permissions remain valid.

Give an AI agent the Blob0 Skill

The bundled official Skill is a SKILL.md instruction file. Export it from Settings → CLI & Skills, or use the CLI commands below. Choose the Skill directory used by Claude Code, Codex, or Cursor; Blob0 exports the file but does not configure the agent for you.

Inspect or export the bundled skill; export creates DIR/blob0/SKILL.md
blob0 skills list
blob0 skills print blob0
blob0 skills export ~/.claude/skills

Opening lines of the bundled SKILL.md

---
name: blob0
description: Operate a Cloudflare R2 or any S3-compatible bucket with the blob0 CLI. Use to browse, upload files or folders, download, organize, share, audit, or safely clean up the user's storage.
---

# blob0 CLI

Use the desktop binary (path in Settings → CLI & Skills), with a configured
profile and valid license/trial. Credentials stay in the OS keychain.

The Skill teaches an agent how to use the local CLI. The agent still needs shell access to the Mac and the same configured Blob0 profile, credentials, and license or active trial as a person running commands.

CLI, not an MCP server

Blob0 provides a local executable that a person or agent can run through Terminal or a shell tool. The Skill is workflow guidance for that executable. Agents can reuse their existing shell access, parse JSON output and per-item batch status, and check process exit codes. Blob0 does not currently expose MCP tools; this integration needs no separate server process or MCP configuration. An agent that cannot run local shell commands cannot use this CLI integration.

Credential security

Access keys are stored in macOS Keychain. The CLI reads the selected profile’s secret when it connects; profile listings contain connection metadata, not the access key or secret. Do not paste credentials into command arguments or persistently log presigned URLs.

Supported providers

Use the profile you configured in Blob0 for Cloudflare R2, Amazon S3, Backblaze B2, Wasabi, MinIO, Alibaba Cloud OSS, Tencent Cloud COS, or another S3-compatible endpoint. Provider-specific API compatibility and endpoint settings still apply.

FAQ

Does the CLI need the Blob0 app?

The desktop app provides the installed executable, saved profile, and Keychain credentials. Open Blob0 to set those up first; a storage command also requires a valid license or active trial.

Can I use this instead of the AWS CLI?

Use it for the listed object and file operations against the bucket in a Blob0 profile. It does not provide the AWS CLI’s full service, IAM, bucket-administration, or sync command set.

Can an AI agent upload or delete files?

An agent with local shell access can run the same commands. Give it the official Skill and authorize its actions carefully; use --dry-run to review plans before writes or deletions.

Does --dry-run change anything in storage?

No object writes or deletes are performed. The CLI may list or inspect object metadata to build the plan, so it still makes read requests.

Can I run a configured sync from Terminal?

No. blob0 sync list reads configured folders only, and its lastStatus is unavailable. Start and monitor syncs in the Blob0 desktop app.

Will Blob0 refresh after a CLI upload?

No live refresh is triggered by a separate CLI process. Refresh or revisit the affected prefix in the desktop app to load the current listing.

Start with Blob0

Download the macOS app, connect an existing bucket, then copy the CLI path from Settings → CLI & Skills.