blobhub-cli
The command line interface for BlobHub — the serverless platform for versioned blob
storage. blobhub authenticates against the platform, addresses your orgs, blobs and revisions, and works with
what those revisions contain, from a terminal or from CI.
How the CLI is organized
Everything that is not tied to a particular kind of blob — authentication and profiles, JSON output, error reporting — is shared:
blobhub login | logout | whoami | profile ls | profile use
Everything else is grouped by blob domain, which is the axis the platform itself extends along. Each domain adds its own command group and its own manifest types over one shared base:
blobhub workflow … # workflow blobs — the domain implemented today
workflow is the first domain and currently the most developed one. Its flagship capability — deploying a
revision's code from a real Python package rather than hand-editing it in the visual editor — is described below.
Further domains slot in as additional command groups without changing anything above this line.
Install
pipx install blobhub-cli
(or pip install blobhub-cli inside a virtualenv). Requires Python 3.12+; installs a blobhub binary.
Authenticate
blobhub login
Prompts for the API URL (defaults to https://api.blobhub.io/v1) and your API key, verifies it against the
platform, and stores it as a named profile under ~/.blobhub/credentials.yaml (0600, refused on load if
looser). Multiple profiles are supported:
blobhub profile ls # list stored profiles, marking the default
blobhub profile use staging # switch the default
blobhub login --profile staging --api-url https://api.staging.blobhub.io/v1
blobhub whoami # resolved identity, profile, URL, and key scope
For CI, skip the credentials file entirely — set BLOBHUB_API_KEY (and optionally BLOBHUB_API_URL,
BLOBHUB_PROFILE); the environment always wins over a stored profile, and a key from the environment alone
works with no credentials file present at all.
A manifest may name its blob bare (blob: checkout) instead of org-qualified. The org then comes from the global
--org option (blobhub --org acme-corp workflow deploy …) or from BLOBHUB_ORG; with neither, the bare name is
a manifest error naming all three ways to supply one.
The workflow domain
A workflow blob's revision holds definitions whose logic.code components normally have their code typed into
the browser, where it cannot be imported, unit-tested, linted, reviewed or version-controlled. The workflow
command group closes that gap: you keep the code as an ordinary Python package, and the CLI compiles it into the
flat, import-less namespace the platform's sandbox actually executes.
A worked example: deploying a workflow
Say your revision has one workflow definition, alias checkout_flow, with a logic.code component (id: c1)
whose code should come from a real Python package rather than being typed into the editor:
my-project/
├── manifest.yaml
├── definitions/
│ └── checkout_flow.json # the definition document — pulled from, or pushed to, the platform
└── pkg/
├── entry.py # entry_point
└── lib/
└── pricing.py # a local module entry.py imports
manifest.yaml:
type: workflow_blob_deployment
version: "1.0"
blob: acme-corp/checkout # <org>/<blob>, or a bare <blob> plus --org/BLOBHUB_ORG
revision: latest # or a pinned revision UUID
definitions:
- alias: checkout_flow
source: definitions/checkout_flow.json
category: workflow
components:
- id: c1
code:
base_path: pkg
entry_point: entry.py
First pull the current definition (skip this if you're starting a definition from scratch):
blobhub workflow pull -f manifest.yaml
Compile and deploy:
blobhub workflow deploy -f manifest.yaml
deploy builds every bound component locally (inlining local imports from pkg/, stripping sandbox-pre-bound
and allowlisted imports, rejecting anything else), uploads only the definitions whose serialized document
actually changed, and runs the platform's check_definition against each workflow definition it uploaded.
Re-running deploy with nothing changed uploads nothing and says so. --dry-run on every mutating command
prints the exact intended calls without performing them; --json emits a single machine-readable object instead
of the rendered output.
Other commands in the workflow group:
blobhub workflow diff -f manifest.yaml # report local/remote differences without writing or uploading
blobhub workflow build -f manifest.yaml # compile locally only, no network
blobhub workflow check -f manifest.yaml # re-run check_definition against what's already deployed
blobhub workflow push -f manifest.yaml # upload verbatim, without the compiler (rarely what you want)
If a code port was edited in the visual editor since the CLI last built it, build/deploy refuse to overwrite
it with REMOTE_EDIT (or UNMANAGED_CODE for hand-typed code the CLI never built) — pass --force to overwrite,
or reconcile by hand first. See docs/reference/error-codes.md for the full catalog of error and advisory codes,
what each one means, and how to resolve it.
License
MIT. See LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file blobhub_cli-0.1.0.tar.gz.
File metadata
- Download URL: blobhub_cli-0.1.0.tar.gz
- Upload date:
- Size: 79.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6b778e08f683930ef1a27c54f1f929c66db6d7b25c2100caa66ce04b842cd8c2
|
|
| MD5 |
27b1c55c41c9ea8a8d663b45a1014b0a
|
|
| BLAKE2b-256 |
88d5ef90258968508fd852a3824ff2ef63392ea16c91563398fe946ec93882f5
|
Provenance
The following attestation bundles were made for blobhub_cli-0.1.0.tar.gz:
Publisher:
publish.yml on blobhubio/blobhub-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
blobhub_cli-0.1.0.tar.gz -
Subject digest:
6b778e08f683930ef1a27c54f1f929c66db6d7b25c2100caa66ce04b842cd8c2 - Sigstore transparency entry: 2386932682
- Sigstore integration time:
-
Permalink:
blobhubio/blobhub-cli@a24633a342ee232b593f4c9cbfe785523220d5e3 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/blobhubio
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a24633a342ee232b593f4c9cbfe785523220d5e3 -
Trigger Event:
push
-
Statement type:
File details
Details for the file blobhub_cli-0.1.0-py3-none-any.whl.
File metadata
- Download URL: blobhub_cli-0.1.0-py3-none-any.whl
- Upload date:
- Size: 105.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fd8b92640976a4c3c143bb8a1cacd5a16a37422325914d91ef34b4eda715c231
|
|
| MD5 |
89f641635c5b2678cc43154d2fabbb62
|
|
| BLAKE2b-256 |
0da7ffcde93d05c1c94d6a50cf5495ffc1bd315a3bbfe039f5568338c42b09f7
|
Provenance
The following attestation bundles were made for blobhub_cli-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on blobhubio/blobhub-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
blobhub_cli-0.1.0-py3-none-any.whl -
Subject digest:
fd8b92640976a4c3c143bb8a1cacd5a16a37422325914d91ef34b4eda715c231 - Sigstore transparency entry: 2386932686
- Sigstore integration time:
-
Permalink:
blobhubio/blobhub-cli@a24633a342ee232b593f4c9cbfe785523220d5e3 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/blobhubio
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a24633a342ee232b593f4c9cbfe785523220d5e3 -
Trigger Event:
push
-
Statement type: