Repository navigation
0.11.0 - 2026-09-26
Beebeeb CLI 0.11.0 — bb share works again, and scripts stop getting lied to
The headline fix in this release is bb share: it could not create a single share on v0.10.0
because it sent the wrapped file key in a format the server no longer accepted. It now mints
shares in the same end-to-end-encrypted wire format the web app uses, so a link made by bb
opens correctly in the web viewer. Alongside that P0, every command that used to read EOF from a
non-interactive stdin and quietly do nothing (or silently overwrite a file) now fails loudly with
a distinct, documented exit code — and a sweep of billing, auth-error, help-text, README, and
FUSE-mount correctness issues found along the way is included. 48 commits since v0.10.0
(2026-09-24).
What's New
- [P0]
bb shareworks again — every share is end-to-end encrypted, in the web's wire
format. It previously sentwrapped_file_keyas a JSON blob under an HKDF-derived key; the
server (since a prior change) requires standard base64 of a raw AEAD blob, and the web viewer
unwrapsnonce(12) || ciphertextunder the raw client keyK_c— so everybb sharecall
failed outright, and--no-double-encryptwas rejected by the server.bb sharenow wraps the
file key exactly like the web app (encrypt_chunk_rawunder rawK_c), mints the share token
client-side, and sendsowner_wrapped_key/owner_wrapped_tokensobb sharescan rebuild the
link later;--no-double-encryptis hidden and returns a clear error instead of a server
rejection. Pinned by a known-answer test against an independent AES-GCM reference. (75918a1) - Non-interactive runs fail loudly with dedicated exit codes, instead of silently doing
nothing. With stdin not a terminal (cron, CI, a pipe), several commands used to read EOF from
a confirmation prompt, print a success-looking line, and exit0having done nothing. Exit
codes are now0success ·1any other error (unchanged) ·2a prompt was needed but stdin
isn't a terminal ·3a one-shot run finished with failed or unresolved items:bb push <name>on an existing name: exit 2, "already exists — pass --replace or
--keep-both" (previously printed "skip" and exited 0).bb rm <target>without-f: exit 2, "refusing to trash without -f in non-interactive
mode", nothing trashed (previously printed "cancelled" and exited 0).-f/--json/--quiet
are unchanged.bb unsharewith no id: exit 2, pointed atbb shares(previously crashed with a raw
"failed to enable raw mode" terminal error).bb sync --oncewith a failed upload or an unresolved conflict: summary reads
! incomplete · N failed · M ⚡and exits 3 with the counts (--jsoncarriesok/failed);
previously printed✓ syncedand exited 0. Dry runs and the continuous watch loop are
unaffected. (aec35c7)
bb pullnever silently overwrites a local file again.bb pull note.txtover a local
note.txtused to print✓ note.txt, exit 0, and replace the file's content with no prompt, no
flag, and no backup. The output path is now checked before any bytes download, for both
single-file and--zipoutput:-f/--forceoverwrites (unchanged atomic
.tmp+ rename); a rich terminal with a real tty on stdin gets ay/Nprompt (default no); every
non-interactive run (--json,--quiet, piped stdin) refuses with a non-zero exit naming
--forceand-o <path>; a directory at the output path is always an error. Recursive folder
pulls into an existing directory are not guarded yet. (de3c8c4)bb shareaccepts vault paths and short IDs, not just full UUIDs — the same resolver
bb pulluses. Previouslybb share note.txtorbb share 4c53f27ffailed with "invalid file
id (expected UUID)", even thoughbb lsonly ever prints the 8-character short ID. (024dc3d)
Bug Fixes / Hardening
bb push/bb syncon a folder no longer abort the whole folder when one file fails (e.g. a
zero-byte file the server used to reject): the rest of the folder still uploads, each failure is
printed with its relative path, the summary showsN failed,--jsongains
total_failed/failed[{path,error}], and the command exits 1 naming which files failed.
Sub-folder-creation errors still abort, since children would otherwise land in the wrong folder.
(65372dc)- Auth, session, and connection errors read like English instead of raw codes or reqwest's error
chain: a generic 401 now says "Your session expired or was revoked. Runbb loginto sign in
again."; a connect failure says "Can't reach<api origin>— check your connection or--api".
bb whoami/bb statusexit 1 when logged out or when the server rejects the session, instead of
printing placeholder plan data ("user unknown, plan Free — 5 GB") for a session that no longer
works. (e4ba5de) bb share --passphraseno longer claims to wrap chunk keys with Argon2id — it doesn't; the
passphrase is sent to the server as a checked gate on access, and the file's encryption never
depends on it. Output and--helptext corrected. (8d7852d,36a36f1)bb mounton release binaries (which ship without thefusefeature — no FUSE asset has ever
been published) now says plainly that this build can't mount, points atbb webdav(ships in
every release) and the source-build route, and exits 1 — instead of walking users through
installing macFUSE/libfuse3 for a feature this binary can never use.mount/unmountare
hidden from--helpon these builds; source builds with--features fuseare unchanged.
(f884b4b)bb --help's footer now links pages that actually resolve (github.com/beebeeb-io/cli,
beebeeb.io/security) instead of two 404s (beebeeb.io/cli,beebeeb.io/fingerprints— the
CLI has no fingerprint feature); the README no longer claimsbb --helpshows every flag and
points atbb <command> --helpinstead. (d965504)bb --helplists every top-level command again —2fa,sessions,passkey,billing,
account,request, andunmounthad silently dropped out of the hand-written help screen; the
"+ ..." overflow line is now computed from the actual clap command tree so this can't recur
silently. (aa62be4)- Billing sweep (task 1547, four confirmed findings):
bb billing showshows a distinct
Trial: ends <date> · no card on fileline instead of the same price/renewal pair as an
actively-billed account;bb billing portaluses the Mollie-era payment-method-update route
instead of a Stripe-only alias that 400s "stripe not configured" on every current account; API
error responses now surface the server's humanmessagefield instead of only the bare error
code (~20 error types were previously invisible to CLI users);bb whoami/bb quota/bb push
read quota straight from the server'squota_bytesinstead of reconstructing a "bonus" from a
bonus_bytesfield the API never actually returns. (31bb2dc,07a5b5b) - README links the stable
beebeeb.io/download/cliredirect alongside the GitHub releases page.
(22aac96) - Release pipeline hardening: the
RELEASE_NOTES.mdgate now runs as the first step of the tag
workflow, before anything is built or the GitHub Release is created — a missing or stale file
can no longer ship a release with cargo-dist's auto-generated changelog body. The Scoop manifest
bump now opens a PR againstmaininstead of pushing directly to it, which used to fail closed
on the protected branch and could take the whole publish job down with it. (91619cf,
23f32ab)
Verification
cargo build --release— succeeds;./target/release/bb --versionprintsbb 0.11.0.cargo test --all-targets— 8 binaries, all green:test result: ok. 250 passed; 0 failed; 2 ignored(main lib+bin suite) plus6 passed(auth_errors),4 passed(ecdh_compat),
3 passed(mount_availability),6 passed(non_interactive),5 passed
(pull_overwrite),1 passed(share_resolves_like_pull),4 passed(zero_byte_files) —
279 passed, 0 failed total.cargo clippy --all-targets -- -D warnings— clean.cargo fmt -- --check— clean.dist plan(cargo-dist 0.31.0, matching the pinned CI version) — plansv0.11.0across all 5
targets (macOS aarch64/x86_64, Linux musl aarch64/x86_64, Windows msvc) plus the shell
installer and Homebrew formula.- The release artifacts are built by the tag-triggered cargo-dist workflow; the installer and
Homebrew formula are published from those builds.
Install / Update
curl -fsSL https://get.beebeeb.io | sh # macOS / Linux
brew upgrade beebeeb-io/tap/bb # macOS, Homebrew
scoop update bb # Windows, Scoop
macOS and Linux installs (shell installer or Homebrew) also self-update on next run via the
built-in OTA updater. Windows installs do not self-update yet — run scoop update bb to get
0.11.0.
Scripts and CI pipelines that call bb non-interactively should check the new exit codes (2
for "needed a prompt", 3 for "finished incomplete") if they only handled 0/1 before —
see "What's New" above.
Full changelog: v0.10.0...v0.11.0