Changelog
Last updated: July 25, 2026
New CLI releases are published here automatically after their signed binaries go live.
All notable changes to rbox are recorded here. The format follows
Keep a Changelog, and versions map to the
v* git tags that trigger the CLI release build.
#[2.0.2] - 2026-09-02
2.0.2 is the "adopt the other machine's checkout without a fight" release. Every fix here was found and proven overnight on the founder fleet while landing four real repositories from one machine onto another.
Fixed
rbox git resolve <repo> take-theirsworks again on real repositories: the confirmation token no longer changes under you while the background sync is running, a repository with mixed-case branch names no longer refuses its own unchanged confirmation, and a repository that had never established a sync baseline is no longer blocked by stale bookkeeping from an earlier state of the same machine.- A repository with more than 256 branches can sync again (the per-branch bookkeeping limit is now 2,048).
rbox recoverrefuses to overwrite commits made on another machine — it only repairs history this machine authored, and says so.- Receivers no longer pause a repository as "local changes" when its index is simply pristine; the paused-repo list now shows real work only.
- "Repos waiting on you" entries for directories you have since ignored retire automatically (131 stale entries cleared on the founder desktop), including whole ignored trees.
rbox statusandrbox doctorwarn when one directory suddenly dominates what rbox is about to sync, and name the one-line ignore that skips it.- Pushes skip re-uploading the multi-megabyte ref index when the server already has it (up to 99% fewer bytes on edits and renames).
- Git ref cleanup after a sync runs as one git call per repository instead of one per branch (8× faster on branch-heavy repositories).
#[2.0.1] - 2026-09-01
2.0.1 makes rbox honest and safe around very large folders. If a huge
directory (a build tree, a browser checkout) is about to be synced, rbox now
refuses before spending time encrypting and uploading, names the directory,
and shows the one-line rbox ignore command that skips it — files stay on
disk. The workspace size limit was raised from 200,000 to 1,000,000 files,
and it now only applies when a machine tries to add past it: other machines
always accept and apply what was already synced, so a workspace can never get
stuck too big to repair itself.
Fixed
rbox ignore --purgenow actually removes everything your ignore rules cover, including files inside Git repositories, and its preview tells you exactly how many files would be removed and from where.- A machine receiving a very large cleanup no longer freezes retrying forever;
sync history problems now show an honest ⛔ status naming
rbox recover. rbox upgradeno longer prints an error line for every leftover daemon record from past test runs, and no longer claims an upgrade was installed when nothing changed.- The one-time cache rewrite that made every sync pause (tens of MB written for a one-file change) is gone — cache updates are now instant.
- Faster syncs on busy machines: pulls reuse work the background daemon already did instead of redoing it.
- Several small CLI fixes: destructive commands (
trash empty,key revoke,device revoke) now ask before acting (use--yesin scripts), file paths work from subdirectories, tab completion improvements, and honest wording when a recovery phrase is saved as a plain file.
#[2.0.0] - 2026-08-26
rbox 2.0 is the release where sync gets fast and honest. Everything rbox remembers about your folders now lives in a single SQLite database instead of a large JSON file it rewrote from scratch every few seconds — which is what made the old version slow. A typical "nothing changed" sync went from 7.4 to 1.5 seconds on the Linux workstation and from 6.6 to 2.7 seconds on the MacBook; the busiest machine in the fleet, with more than a hundred Git repositories, went from 44 seconds to 8.2 seconds to pick up a change. The rest of 2.0 is about being understandable while it works: the Git side of sync now explains what it is waiting on in plain English, offers a real way to resolve it, and the file watcher recovers on its own instead of quietly giving up.
Breaking changes
- Upgrading from 1.x works, and rbox repairs itself along the way. Run the
installer (or
rbox upgrade), restart rbox, and it converts each folder's bookkeeping on its own. It checks every folder BEFORE stopping anything, so an upgrade never takes sync down; a folder it genuinely cannot work out is left alone with sync still running elsewhere, and rbox printsrbox config regenerate— the command that actually fixes it. Your files are never part of this conversion: only rbox's own records change format. (#688, PR #774, design 276.)- There is no
rbox migratecommand and no conversion job to babysit — the upgrade does it in place. Starting fresh also works, if you prefer: install 2.0, run setup, point it at the same folder. - The sync manifest schema is still 4, as it was in 1.11.4. A handful of internal wire fields were renamed for clarity, and 2.0 accepts both the old and new names during the transition, so your machines can upgrade in any order. (PRs #804/#806.) What changed most is how each machine stores its own local record of what it has seen.
- There is no
- A 1.x machine that does get the new binary keeps syncing. Earlier 2.0
betas could leave background sync switched off after an upgrade, because a
1.x machine has synced folders but no folder-configuration file and the new
binary refused to start without one. rbox now writes that file from the
folders it can already see, decides each folder on its own, and leaves sync
running if something genuinely cannot be worked out — printing
rbox config regenerate, the command that actually fixes it. (#688, PR #774, design 276.) ~/.rbox/config.jsonis now the authority for which local folders rbox may sync, and for their safe sync options. Existing local bindings are preserved, but a machine that has bindings and no catalog must explicitly runrbox config regenerate— rbox will not guess after a missing or damaged catalog. Inspect withrbox config, admit a detached folder withrbox config add <path>, and fix a proven local folder move withrbox config repair <path>. (Design 231.)- The
nextpreview channel does not roll forward on its own. If you installed a 2.0 beta fromrbox.to/next/install.sh, that choice persists beside the installed binary; runrbox upgrade --channel latest(or the stable installer) once 2.0.0 is out, or you will sit on the last beta. - The
v2.0.0-beta.1throughv2.0.0-beta.4prereleases went only to the founder fleet'snextchannel. Their changes are folded into this section; there is nothing separate to read.
Added
Per-folder ignore paths in
~/.rbox/config.json(options.ignorePathson a folder entry) — machine-local excludes that never drive deletes on your other computers, applied live without a restart. Useful for keeping a giant build tree (say, a browser checkout) out of sync on one machine.Setup speaks "folders". The guided flow offers three plain choices — sync
~/rbox, sync another folder on this computer, or sync a folder from another machine — instead of asking about workspaces. (Design 230.)rbox statuscounts the conflict copies rbox saved for you and that are still sitting in the folder, so they are visible without hunting for*.conflict*files by hand. Also inrbox status --jsonasconflictCopies. A moved-aside folder counts as one thing to deal with, however many files it holds.Paused Git repos now explain themselves in plain English and can be resolved in bulk.
rbox git resolvegained a per-repo view, a--dry-runthat tells you honestly what it would and would not copy, and a batched--under <folder> keep-minethat shows you the count and requires you to confirm it (--yes --expect-repos <n>for scripts). Each paused repo is grouped under a short story — "you have uncommitted work here" and twelve others — rather than an internal reason code. (Design 273, #764.)A "conflict copies" reason for paused folders. When the only thing left to compare in a folder is copies rbox saved during an earlier conflict, sync says so — "only conflict-copies remain here, so the comparison was skipped" — instead of pausing without explanation.
RboxBar ships with every release, and
rbox upgrademanages it. The macOS menu bar app is published alongside the CLI binaries for each tag, and on macOSrbox upgradeinstalls, updates, and restarts it automatically (opt out withRBOX_NO_MENUBAR_APP=1). Installing through the CLI avoids macOS's unsigned-app first-launch friction entirely; only a zip downloaded in a browser still needs right-click → Open. (PR #801, design 282.)Every release tag now also creates a GitHub Releases entry with that version's changelog section. (#649.)
Changed
- rbox's local record of your folder now lives in SQLite instead of a JSON file. New folders are created that way from the first sync; the old JSON-writing code, its conversion job, and the commands that supervised it are gone. (Designs 262/266, ~19,000 lines deleted.)
- A machine that only receives (pull-only) now uses the live file watcher too, so it reacts to changes instead of waiting for the next scan. Pull-only now means exactly one thing — this machine does not publish. (Design 277, #477.)
- macOS folder scans use the native bulk directory walk by default; no environment opt-in. Capability, directory-probe, and per-directory fallback guards remain. On Linux the equivalent walk is about 5× faster than before.
- A degraded file watcher is now named outright by
rbox status, rather than showing up only as unexplained slowness. rbox doctor'smigrationcheck is now calledgenesis, matching what it actually checks.
Fixed
rbox git resolveearned its stripes the hard way. A resolve week on the development fleet fixed six distinct refusals: repos whose sync evidence predated their records now heal or explain themselves precisely (naming the branch and the mismatch instead of "may have partially applied"), a stale git commit-graph cache can no longer fail the completeness check, the safety boundary now recognizes its own bookkeeping, and a repo needing many housekeeping passes no longer gives up at eight — or spins forever. When a repo's copy is missing history only another computer can supply, status now says exactly that and names the one command that fixes it.Background sync no longer rings its own doorbell. A no-op push loop on Linux (roughly one cycle every 3 seconds, forever) came from the Git watcher reacting to rbox's own bookkeeping writes.
The publish/conflict storm is gone. One machine publishing empty sequences forever could make another machine lose every race and burn six full Git plans per attempt, pinning a CPU core for the better part of an hour. Permanent "pending" work is now distinguished from a transient unclear state, and the internal retry loop surrenders after a bounded window. (#683, #685, design 244.)
The file watcher recovers on its own. A burst of operating-system watch events used to blow a one-way fuse and leave the daemon scanning forever; overflow now counts 5-second episodes anchored at the first drop, and the watcher re-arms under a supervised witness check. (Designs 237, 277.)
A Git repo whose local copy rbox cannot verify no longer re-downloads the same history every few seconds. Repos in that state were downloading, unpacking, and re-checking unchanged history forever, slowing every other repo behind them. rbox now re-checks such a repo once an hour — and still immediately when you commit in it or another machine sends something new. (Design 278;
RBOX_GIT_CONNECTIVITY_SKIP=0restores the old behaviour.)Conflict copies no longer make a folder look permanently out of sync, and deleting the last conflict copy clears the hold on the same sync cycle instead of telling you to delete files rbox had just removed. An ignore rule that happens to match conflict-copy names (e.g.
*.conflict*) no longer pauses every folder it applies to. (Design 272, #659.)Leftover files from finished Git operations no longer strand other machines. Concluded
AUTO_MERGE,MERGE_MSG,REBASE_HEAD, and draft merge messages are recognised as finished and cleaned up by the next completed sync checkout; genuinely in-progress merges still wait, and linked-worktree problems now name the responsible worktree. (Design 236, #667 — enabled for everyone in 2.0.)The message for a paused Git repo is true. It no longer says rbox "couldn't finish downloading the other computer's version" when the download succeeded — it says rbox couldn't put that version in place here.
A paused merge on another machine used to cost about 9 seconds of every sync cycle on this one; rbox now remembers the stuck state instead of re-discovering it from scratch.
Mismatch pauses now name the specific paths that differ, instead of reporting that something, somewhere, disagreed.
rbox statusno longer intermittently reports "sync halted" on a perfectly healthy machine — a read-only health check was racing the live writer. (#765, design 276.)Files rbox had already been told to ignore no longer linger in the synced set, and a bare
node_modulesignore rule now matches at any depth, the same way.gitalways did.
Performance
- Sending a change is 4-5× faster. A "nothing changed" push went from 7.4s
to a 1.5s median on the Linux workstation and 6.6s to 2.7s on the MacBook.
(#661, design 277.)
- The push cycle was materializing rbox's entire state five times per cycle;
it now does so at most once (
RBOX_STATE_LOAD_CACHE=0restores the old behaviour). - A separate 51-second tail on content pushes was settlement waiting for the next scan tick; settlement now happens at each operation boundary (58.5s → 7.0s wall on the workstation).
- The push cycle was materializing rbox's entire state five times per cycle;
it now does so at most once (
- Receiving a change is dramatically faster on machines with many Git
repositories. The 100+-repo host went from 44s to 8.2s per pull.
- Zero-change saves compose a minimal packet instead of rewriting the whole
state (zero-change pull 13.3s → 3.6s;
RBOX_SAVE_NOOP_ELIDE). - Content-carrying saves write and verify only the entries that changed
(one-changed save ~2.8s → ~60ms; MacBook 1-blob receive 20.4s → 9.0s;
RBOX_SAVE_DELTA). - The internal Git lock ceremony was rewritten from an O(N²) journal to an
append-structured one with batched directory fsyncs (acquire 50.3s → 16.4s
at 2,292 locks), and then scoped to only the markers a given pull actually
authors — the busy host now takes zero locks on a steady pull, down from
1,882 (
RBOX_CAS_DELTA_LOCKS=0). (Designs 268, 279.) - Repos that are paused and unchanged skip their per-repo work entirely
(~3.5s → ~53ms per repo per cycle), including ones held by a base-composer
artifact (
RBOX_GIT_HELD_SKIP_COMPOSER). - Applying incoming Git work on the workstation went from 45.3s to 1.3s once checkout blockers were properly typed, and a repeatedly re-probed wedged repo went from ~2.5s to ~10ms per push.
- Zero-change saves compose a minimal packet instead of rewriting the whole
state (zero-change pull 13.3s → 3.6s;
- Sync status lines now attribute lock counts (
locks<N> blocked<M>) so durability work is distinguishable from real contention, and per-hop propagation timings can be traced end-to-end with exact sequence correlation.
Known limitations
Things we know about, judged safe to ship, and are telling you straight — each has an open issue:
- A Git repo whose sync journal rbox cannot read re-checks itself on a slow
cycle and stays paused rather than guessing;
rbox statusnames it. Resolution work is queued. (#775) - If you stop rbox while it is mid-write on a very busy machine, the stop can time out and force-quit after 60 seconds, occasionally leaving a stale lock file that pauses one repo until the next sync cycle clears it. (#672)
- A Git repo whose checkout is behind its synced branch can briefly show new file contents before Git itself catches up; rbox pauses the Git side rather than guess, and tells you. (#669)
- Commands that restore old versions (
rbox versions,rbox trash restore) currently read paths relative to the synced folder's root, not your current directory — run them from the folder root to be safe. (#516) rbox ignorewith a bare flag and no pattern currently does nothing useful and does not say so. Give it the pattern explicitly. (#518)- A Git repo with an enormous configuration (over 512 keys) cannot sync its config changes; everything else in that repo still syncs. (#702)
- Extra local files that were never part of sync (including rbox's own saved
*.conflict*copies) can keep one repo's background self-check permanently unsatisfied. It is a diagnostic annoyance, not a sync fault. (#659)
The
v2.0.0-beta.1–v2.0.0-beta.4prereleases shipped only to the founder fleet'snextchannel; their changes are folded into 2.0.0 above.v2.0.0-beta.3was tagged but never published.v2.0.0-beta.5was the release-pipeline dress rehearsal.
#[1.11.4] - 2026-07-31
Fixed
- A leftover file from a finished merge no longer blocks
rbox git resolve. When Git finishes a merge it can leave a draft commit-message file behind in the repository. rbox mistook that leftover for a merge still in progress, sorbox git resolve <repo> keep-minerefused with "a Git operation is in progress; finish or abort it, then run keep-mine again" — on a repository where Git itself reported nothing in progress and nothing to finish or abort. There was no way out, and one repository stayed stuck for a week. rbox now uses Git's own definition of an operation in progress, so these leftovers are ignored. A genuinely paused merge, rebase, cherry-pick, or revert still stops resolution, exactly as before, and the leftover files keep syncing between your computers.
#[1.11.3] - 2026-07-30
Fixed
- Resolving a paused Git repository now says which computer keeps what.
The
keep-mine/take-theirsexplanations used to talk about "yours" and "theirs" — confusing when every machine involved is yours. Every sentence now names the machines: "keep this computer's version (Your-Hostname) and publish it to your other computers" versus "use the version from your other computer and set aside this computer's Git changes." The command names are unchanged. Your hostname stays out of--jsonoutput and shareable reports.
#[1.11.2] - 2026-07-30
Fixed
- A brand-new git repository no longer drags its dependencies into sync.
If you ran
git initin a folder and had not committed anything yet, rbox could not read that repository's index, assumed every file in it might be tracked, and synced the whole folder —node_modules,venv,__pycache__, even.envfiles that rbox normally never uploads. Your ignore rules were correct; rbox was overriding them. It now recognises a repository with no commits as having nothing tracked, and your ignore rules apply normally. - A paused repository no longer wastes upload bandwidth. When rbox pauses
a repository's git bookkeeping (
rbox status --gitshows these), it was still packaging up that repository's history and uploading it on every sync cycle, then discarding it moments later — and the sync log saidcaptured 0, so nothing showed it was happening. On one machine that was roughly three uploads every four seconds for two days. rbox now uploads only after it has decided the work will actually be published. - A symlinked build folder is ignored like a real one. A symlink named
node_modules,dist,cdk.out,targetor similar was synced even though a real folder of that name would have been skipped. rbox statusnow tells you how much you are storing that your own ignore rules exclude, with the command to clean it up. Adding an ignore rule has always been forward-only — it stops future syncing but keeps what was already uploaded — and until now there was no way to see how much that was.
#[1.11.1] - 2026-07-28
Fixed
- Syncing a workspace with many Git repositories is dramatically faster,
especially on macOS. rbox was launching one small
githelper for every branch and tag while proving a repository's history was safe to accept — thousands of launches per sync on a busy repository, which macOS makes slow. It now asks the same questions in three launches. Syncs that took 90+ seconds on a Mac now complete in a few seconds.
Added
- Opt in to preview CLI releases without moving the stable fleet.
Install the preview channel with
curl -fsSL https://rbox.to/next/install.sh | sh, or switch an existing installation withrbox upgrade --channel next. The choice persists beside that installed binary;rbox upgrade --channel latestswitches back once stable has caught up, and the normal stable installer clears the preview choice.
#[1.11.0] - 2026-07-28
Added
rbox include— sync only the folders you include on this machine. A laptop that only needs one project no longer has to hold the whole workspace:rbox include add Personal/repo-Akeeps just that folder synced, andrbox track --workspace <id> --include Personal/repo-Ajoins a workspace already scoped that way (repeat--includefor more folders). A machine that syncs only some folders receives changes but never sends them, so a partial view can never overwrite the rest of the fleet — push code out of it with git. Folders are workspace-relative, and a folder cannot cut a git repository in half.rbox include removemoves that folder's files to the local trash, andrbox trash restoreundoes it.- rbox now protects your folder's sync records from a future upgrade. A
later version of rbox will store those records differently. From this release
on, rbox recognizes the newer format and stops rather than writing the older
format over it — so an older copy of rbox running somewhere on your machine
can no longer quietly undo an upgrade. If that ever happens,
rbox doctorsays so in plain English and points atrbox upgrade; it never tells you to delete anything. rbox also reserves a small amount of space inside the folder so a future upgrade cannot fail partway through for want of disk, and it refuses to touch that reserved space if anything it did not create is occupying it. rbox git republish <repo>— an operator lever for a Git pack chain that new machines cannot replay. When every fresh machine defers a repository with a "bundle verify failed for git pack link N" error, run this on the machine that publishes it: the next publish sends one self-contained bundle instead of another increment on the broken chain, and stranded machines recover on their next pull. Records an intent only — nothing is captured or uploaded until that publish — and is fully non-interactive (--json, exit 0/1).
#[1.10.2] - 2026-07-27
Fixed
- The sync scheduler can no longer spin. If the daemon's recovery probe ever outlives the condition it was armed for, the scheduler now retires it and parks the queue instead of re-selecting it in a tight loop. No released build exhibited the bug — it was found while investigating a runaway in unreleased development code — but the guard makes the daemon structurally immune to that whole class of hot loop.
#[1.10.1] - 2026-07-27
Changed
- A calmer help screen.
rbox --helpnow shows just the six commands of the everyday loop —status,sync,start,stop,doctor, and barerbox— with everything else one step away inrbox help --all. The full reference itself is easier to scan: one row per command (subcommands likekey …andtrash …fold into their parent), and flags now live only in each command's own--help. No command was removed or renamed.
#[1.10.0] - 2026-07-27
Added
rbox doctornow explains problems in plain English. Every finding says what is wrong, whether your data is safe, and the exact command to run — ordered by what to fix first. Outside a synced folder,rbox doctorandrbox statusnow show a summary of every workspace on the machine instead of an error, and newrbox status --all/rbox doctor --allflags give the machine-wide view from anywhere, backed by a durable local workspace registry.rbox doctor <path>now works positionally (--pathremains).- Small files upload in packs. Many small files are now coalesced into
bandwidth-sized objects before upload: ~6x fewer requests and up to 1.5x
faster on fast connections, with identical content and history.
RBOX_BLOB_PACK=0restores the previous per-file uploads.
Changed
- Encryption is dramatically faster. The fused in-memory encrypt path is
now the default (no more per-file temp files — up to 5x faster, biggest on
macOS), and the worker pool defaults to 4 workers after a cross-machine
sweep showed more workers actively slow encryption down.
RBOX_CRYPTO_FUSE=0restores the previous path. - Adopting a large existing folder no longer takes forever. The adoption journal now batches its safety writes (same crash guarantees, ~1000x less disk writing) — a 300k-file adoption drops from days to minutes.
Fixed
RBOX_HOMEnow isolates credentials as documented; previously a scratch environment silently used the real account credential.
Fixed
- Manifest delta commits now keep advisory file mtimes stable across machines,
preventing a daemon restart or full rescan from publishing a workspace-sized
delta when only a small number of files actually changed. Set
RBOX_MTIME_NORMALIZE=0to restore the previous behavior. rbox startnow recognizes and identifies an already-running background sync, including its version and witnessed mode, and calls out version mismatches. Dev-build versions with+metadata now parse correctly, restoring daemon witness reporting and graceful shutdown safety.- Removing a repository on another machine now prunes empty directory
skeletons without touching local Git or recovery data.
rbox doctorreports any retained repository residue and known quarantine directories; pass--residue-bytesto measure their size on disk.
Changed
rbox --helpnow shows the real command signatures. The default screen listed bare words (start,stop,sync), hiding the[PATH]argument that every one of those commands already accepts and makingstartread like a machine-wide switch. It now showsrbox sync [PATH],rbox start [PATH],rbox stop [PATH],rbox logs [PATH],rbox status [PATH], andrbox doctor [PATH], and is pared to the common loop.rbox help --allstill prints the full reference.rbox startno longer opens guided setup. Run outside a synced folder on a terminal, it used to launch the interactive front door — one command with two meanings. It now starts background sync for the workspace at[PATH]or the current directory, and otherwise fails with "Not inside a synced folder. Runrboxto get started, or pass the folder: rbox start <path>". Barerboxremains the setup front door.- Manifest publications now report whether they emitted a delta or snapshot, including encoded size (and delta operation count), in daemon logs and interactive push, pull, and sync diagnostics.
- Pulls stay fast after you clone or delete a repository inside your workspace. Cloning, publishing or removing a repo used to permanently drop every later pull back onto a full workspace scan (~5s each on a large workspace) until the daemon was restarted; rbox now re-aligns its ignore matcher when the workspace's repository set moves and returns to instant pulls on the very next sync.
- Live file watching now follows ignore-rule changes instead of continuing to filter events through the rules it started with. When such a change alters what the operating-system watcher itself can see, rbox says so in the log and falls back to scanning pulls until the next restart, rather than trusting a watcher that has gone partly blind.
- Every scan-path pull now records WHY it scanned (
pull local=scan skip=…), so a slow steady state can be attributed from the daemon log alone.
#[1.9.1] — 2026-07-25 — "worktrees come and go, sync keeps up"
Fixed
- Deleting a git branch now syncs like any other change. When you delete a
branch (or an agent tears down its worktree and branch), rbox first proves
the deletion is real — the branch is verifiably absent under a lock, on a
healthy ref database, with a receipt that this machine held exactly that
branch — and only then publishes it. Your other machines prune the branch
automatically. Previously this exact workflow could wedge a repository's git
sync permanently. Set
RBOX_GIT_ABSENCE_CAPTURE=0to restore the old behavior. - A linked worktree no longer stalls the whole repository. A branch checked
out in a worktree is held individually; every other branch and commit keeps
syncing past it, and the repeated re-checking that cost ~9s per cycle on
held repositories is gone. (
RBOX_GIT_OWNERSHIP_HELD_SKIP=0/RBOX_GIT_OWNERSHIP_NO_ESCALATE=0restore the old behavior.) - Squash-merged branches are recognized. A branch whose changes already
landed on another branch via squash-merge no longer forces holds onto
unrelated branches. (
RBOX_GIT_CONTENT_EQUIV=0restores ancestry-only.) rbox doctornow lists leftover linked worktrees — branch, full path, whether git considers them prunable, and whether they hold a synced branch. (Absolute paths stay on your machine; uploaded diagnostics carry a redacted summary.)- On macOS 26, stale-lock cleanup works again: Apple removed the system call rbox used to read process start times, which made lock owners unreadable and could park a repository behind locks nobody held.
- A crash at exactly the wrong moment after saving sync state can no longer lose both the newest save and its fallback (the save's directory entry is now flushed before the fallback marker is removed).
- Clearer statuses: a deleted branch mid-publish shows "finishing a branch deletion" (instead of "local commits changed here"), and an unreadable ref database is reported as exactly that instead of being treated as "no branches" — a failed read can never turn into a published deletion.
- On macOS, the daemon now recovers automatically after a clean full-tree scan
when a dropped-events watcher error would previously have degraded it to
periodic scans for the rest of the process. Set
RBOX_WATCHER_RETRUST=0to restore the previous behavior.
Known
- A branch that was already deleted while a repository was wedged on an older
version carries a stale possession receipt and won't publish its deletion by
itself. One-time fix: re-create the branch at its last-known commit, let one
sync complete, then delete it again.
rbox status --gitnames the affected branch.
#[1.9.0] — 2026-07-23 — "add a machine from the web"
Added
- Add a second machine from your dashboard — no pairing token, no recovery
phrase. Run
rbox loginon the new machine, approve it in the web dashboard, and it automatically receives your encryption keys from a machine that's already connected and online. If no machine is available to hand off the keys, it falls back to the pairing token / recovery phrase as before.
Fixed
- A newly-approved machine no longer gets stuck: the delivered key's lifetime is now aligned to the login window, so enrollment completes instead of being rejected as being outside the device-code window.
- Approving your first machine from the web now signs it in cleanly (and then guides you to set up encryption), instead of erroring that encryption isn't set up for the account yet.
#[1.8.0] — 2026-07-23 — "setup feels brand new"
Changed
- The interactive CLI has been rebuilt from the ground up. Every menu, question, and text prompt now runs on one owned component system: arrow-key menus with clear checkmarks, a live preview under the directory picker that always shows exactly which folder you're about to sync (with Tab completion), completed steps collapsing into tidy one-line receipts, and consistent key hints throughout.
- First run has a new face. rbox greets you with its wordmark, and
encryption setup is now one clear task — "Protect your files", two short
sentences, then pick where to save your recovery phrase: 1Password (via
its
opCLI, with the save verified), the macOS Keychain, a plain-text file, your clipboard — any combination (arrived in 1.7.26, now with the streamlined flow). The workspace step spells out its choices: create a new rbox workspace from a folder on this machine, or sync a workspace already in your rbox account. - Secret entry (your recovery phrase, pairing tokens) never echoes — not even as dots — and the receipt line says only "received".
Fixed
- Pressing Ctrl-C at any prompt now always exits cleanly (code 130) and restores your terminal — even if you catch a prompt the instant it appears.
- Fast typing, pasted keys, or a laggy SSH connection can no longer swallow keystrokes: keys that arrive bunched together are now handled one at a time, in order.
- Answering a yes/no question requires Enter again, so a stray keypress can no longer accept the next screen by accident.
Every release build now drives these prompts on real terminals across all three platforms — including secret-entry failure cases — before it can ship.
#[1.7.26] — 2026-07-23 — "name clashes can't stop sync, your phrase saves anywhere"
Added
- Save your recovery phrase where you actually keep secrets. First-run setup now shows checkboxes instead of a single yes/no: save to 1Password (when its CLI is installed, rbox creates the item in a vault you pick and verifies it landed correctly), the macOS Keychain, a plaintext file, your clipboard — any combination. If some saves fail, rbox lists exactly what succeeded and only continues with fewer copies after you explicitly agree. Interrupted setups resume without losing progress or creating duplicate 1Password items.
- Setup now explains the security model in plain words before asking: your files stay normal and usable on this computer; rbox encrypts the uploaded copy with this phrase so it stays private in the cloud — even from us; GitHub and other source control keep working; uncommitted work is protected too.
rbox statusandrbox key statusshow 1Password backups you've saved (reported as recorded — rbox doesn't reopen your vault to check them).
Fixed
- One ambiguously-named file can no longer stop sync. Two paths that
differ only by letter case (
README.mdvsreadme.md) used to block the entire sync cycle. rbox now keeps syncing everything else, holds back just the ambiguous names so one variant can never overwrite the other on a Mac, shows a plain warning inrbox status(your workspace stays healthy), and syncs the surviving file automatically once you rename or remove a variant — no manual re-sync needed.
#[1.7.25] — 2026-07-23 — "stops are safe, pairing is one command"
- Interrupted syncs can no longer strand your git repos. Every lock rbox takes is now journaled with proof of ownership before it exists, and recovery after a crash or kill cleans up exactly rbox's own locks — never a lock another tool created. Repos blocked by unknown locks surface an actionable notice instead of silently deferring.
rbox stopis now graceful. A stop waits for in-flight critical work to finish instead of force-killing it mid-operation (a second Ctrl-C or signal still escalates promptly), and stopping older daemons keeps the previous bounded behavior — upgrades never hang.- Pairing a second machine is one command.
rbox pairnow prints the completerbox connect <pairing-token>command to run on the new machine (presscto copy it); the token stays single-use and expires in ten minutes. The masked-prompt flow remains for those who prefer it. rbox key statusno longer claims your macOS Keychain backup is missing. The status probe misread a successful save; it now reports the saved recovery kit correctly.- Deleted worktree "ghost" deferrals now clear on their own, including on pull-only machines.
#[1.7.24] — 2026-07-22 — "the keychain save actually saves"
Fixed
rbox key savenow works on real Macs: the tool rbox uses to find your login Keychain was being called in a way modern macOS rejects, so every save failed with "Keychain resolution failed". Found live by the founder; fixed and verified against realsecurityoutput.- The recovery-phrase prompt now shows what you type (typing 24 words blind caused typos and silently truncated pastes) and tells you when a paste came through partial ("expected 24 words but got 10").
rbox key save < phrase-fileno longer reads empty input.
#[1.7.23] — 2026-07-22 — "your recovery key gets a home"
Added
- Your recovery key can now live in the macOS Keychain: after signing in,
rbox offers once to save it (no typing if this machine still has its
cached key; otherwise you type your phrase once and rbox checks it against
your account before saving).
rbox key recovercan restore your account directly from the Keychain on a fresh machine login. You can also export a recovery kit file withrbox key save. Uninstalling warns before removing the last copy of your key, wherever it lives.
Fixed
- Account setup can no longer lose your recovery phrase or half-create your account if anything crashes at the wrong moment: the phrase is safely staged on disk before rbox talks to the server, the server creates your account in one all-or-nothing step, and an interrupted setup resumes exactly where it left off the next time you run rbox. Wedged half-created accounts (from the old flow) now have a supported repair path.
Added
- macOS recovery-kit saves now use an explicit login Keychain item by default,
with validated
rbox key save, Keychain-first recovery, strict live status, and--kit-pathretained for deliberate plaintext export (design 179).
#[1.7.22] — 2026-07-22 — "upgrade finishes the job"
Fixed
rbox upgradenow finishes the job even when the binary is already current: if a running daemon is still on an older version (for example after the install script swapped the binary), upgrade restarts exactly those daemons — preserving pull-only — instead of saying "already up to date" and leaving them stale. Daemons already on the current version are left untouched, andrbox upgrade --checkstill never restarts anything.
#[1.7.21] — 2026-07-22 — "transient hiccups heal themselves"
Changed
- Stale "git busy" warnings clean themselves up: rbox now re-checks every recorded git-lock deferral before showing status and on a daemon cadence (including pull-only daemons), and clears the exact stale entry the moment the locks are gone — even for repos that have since disappeared from the workspace. Locks that sit unchanged for 30+ seconds with no known owner are labeled "stable Git locks without a known live owner" with a live lock count and age, instead of an eternal generic "git busy".
- A failed sync no longer waits for luck to retry: every halt now owns its own recovery schedule (exponential backoff, 2-minute cap) that pulls, re-checks, and clears itself the moment the cause is gone — an idle machine can't stay "halted" just because a push lost a race two hours ago. While a retry is scheduled, status says "retrying after conflict; next probe in Ns"; "halted" is reserved for real safety refusals, which still clear only when their own condition stops reproducing.
- Pull-only machines keep a standing push problem dormant instead of losing it, and wake it up only if you switch the daemon back to read-write.
#[1.7.20] — 2026-07-22 — "resolutions land when you confirm them"
Changed
- Confirmed
keep-minenow waits for the current sync cycle and publishes in the foreground under the same workspace lock — no more waiting for a future sync to act on your decision, and no more "snapshot changed, confirm again" loops from ordinary repo activity while you waited. A crashed confirm reconciles safely on the next push or pull. Local intents written by rbox <=1.7.18 are ignored and dropped on the next state save; restart any still-running older daemon before confirming with the new CLI. - Replica machines no longer re-publish unchanged synced state in a loop: a carried remote section now compares as unchanged. (This loop could flood the workspace with sequences and starve the machine you were actually working on.)
Added
- Daemon modes are durable:
rbox startresumes the mode the daemon last ran in (pull-only stays pull-only across restarts and upgrades), an explicit--read-writeflag is the inverse of--pull-only, and a mode change against a running daemon asks for a restart instead of silently recording a lie.
#[1.7.19] — 2026-07-21 — "status tells you what's actually wrong"
Added
rbox statusshows the running daemon's version next to the daemon line, and warns plainly when it differs from the CLI: "daemon is running v1.7.18 but this CLI is v1.7.19 — restart to finish the upgrade". A binary swap without a restart is no longer invisible.
Changed
- Brief sync holds no longer cry wolf: transient deferrals younger than
10 minutes (peer echoes that resolve themselves on the next push) are
hidden from human status output.
--jsonstill reports everything. - The conflict-snapshots line appears only when snapshots are actually prunable — a fully time-locked count you can't act on is noise.
Fixed
- The Bun ref-watch release/CI probe no longer fails when a starved CI runner can't generate watcher load: an unprovable test premise now retries with escalating pressure and reports "inconclusive" instead of masquerading as a real failure. Genuine watcher regressions under real load still fail hard. (This one flake cost three pipeline legs in a single day.)
#[1.7.18] — 2026-07-21 — "keep-mine works even when history is gone"
Fixed
keep-mineno longer gets permanently stuck when the old synced snapshot references commits that no longer exist anywhere (for example a squash-merged PR whose branch and worktree were deleted). If you explicitly confirmed discarding that branch in the preview, the unprovable lane is now accepted and its objects are still preserved. Staging-area and operation-state lanes keep the strict behavior — their contents can't be safely enumerated when unprovable.
#[1.7.17] — 2026-07-21 — "leftovers don't block you"
Fixed
keep-mineno longer refuses because of harmless leftover files from finished git operations (a staleORIG_HEADorREBASE_HEAD). Only a genuinely in-progress merge/rebase/cherry-pick blocks it — found live during the first real-world unwedge, which succeeded.
#[1.7.16] — 2026-07-21 — "your repo explains itself"
Added
rbox git resolve <repo> keep-mine— when rbox is holding an old synced snapshot your repo has moved past, keep-mine publishes YOUR local git state as the truth. It previews exactly what the old snapshot has that your repo doesn't (in plain English), asks for confirmation, and applies safely on the next sync — your files, branches, and history are never touched.- Held repositories now explain themselves:
rbox statussays why a repo is paused, reassures you the repo itself is healthy, and names the exact command to fix it.
Fixed
- Repositories held for sync-bookkeeping reasons no longer re-process at full cost on every sync — the skip that shipped in 1.7.15 now actually engages for the common held shapes (it never could before).
#[1.7.15] — 2026-07-21 — "stuck repos heal themselves"
Fixed
- A repository whose local git history moved ahead of its last-published state could livelock: every pull re-processed it at full cost (30s+ on large repos), forever, while its fresh state was never republished. rbox now proves when your local history fully contains the stale unapplied state and publishes yours — the repo heals itself in one sync cycle. Repos held for other reasons skip the expensive re-processing entirely between changes.
Added
- Conflict snapshot retention: old conflict-preservation refs are pruned once
their work is back in a branch (or after 90 days);
rbox statusnow showsconflict snapshots: N (M prunable). - Fleet phase telemetry (
sync_phase): pull/push phase timings now reach the dashboard, so a slow phase can never hide in local logs again. - Deeper timing detail in daemon logs: per-step git-apply attribution and push missing/commit chunk timings.
#[1.7.14] — 2026-07-21 — new repos sync fast too
Fixed
- Repositories created, cloned, or moved into the workspace while rbox is running now get the same seconds-fast commit sync as everything else (previously their commit-only changes waited for the periodic safety scan, up to a minute). rbox watches each repository's branch/tag surface directly on Linux; macOS already behaved this way.
- Repositories using git's experimental
reftableformat are now refused for git history sync with a clear message (previously their commits could silently stop syncing while files continued). Standard-format repositories are unaffected.
Added
- Sync-trigger telemetry so the fleet dashboard can chart how commits get
detected (instant signal vs periodic scan). Opt out with
RBOX_TELEMETRY=0.
#[1.7.13] — 2026-07-21 — commits sync in seconds
Changed
- Git commits now sync to your other machines in a few seconds instead of up
to a minute. rbox watches each repository's ref surface (branch tips, tags,
HEAD) directly, so a commit, amend, branch switch, or tag — even one that
changes no working-tree files — triggers an immediate sync instead of
waiting for the periodic safety scan. Repository contents under
.gitare still never synced as files.
Known limitation
- A repository created or cloned into the workspace after the daemon started falls back to the (now always ≤60s) safety scan for commit-only changes until the daemon restarts. A dedicated fix is in design (172B).
#[1.7.12] — 2026-07-20 — faster sync recovery
Fixed
- When a live change notification is missed, sync now catches up within seconds instead of waiting up to ~5 minutes for the periodic safety poll. During quiet periods rbox briefly asks the server whether it's behind and pulls immediately if so — so a small commit lands on your other machines promptly even if the real-time nudge didn't arrive.
Added
- Fleet sync-health telemetry so we can spot propagation slowdowns across the
fleet without asking for logs. Opt out with
RBOX_TELEMETRY=0.
#[1.7.11] — 2026-07-20 — locking survives a broken host-identity cache
Fixed
- Workspace locking no longer breaks when the on-disk host-identity ledger
(
~/.rbox/host-identity.json) can't be read or written. That file is only a boot-history cache used to sharpen stale-lock cleanup across reboots; a read failure (e.g. a filesystem that reports slightly different timestamps for the same file depending on how it's queried) used to make every lock-dependent operation report "unsupported" — which on some macOS setups abortedrbox setup's initial push with "capable state-lineage initialization failed (unsupported)". rbox now retries a transient read and, if the cache remains unreadable, proceeds using the machine's live identity with locking fully intact — only the cross-reboot stale-lock optimization is skipped.
#[1.7.10] — 2026-07-20 — setup works when locking is degraded, plus onboarding polish
Fixed
rbox setupno longer refuses when workspace locking can't be established (e.g. a hardened macOS where the identity probe can't run). It now warns and continues in the same legacy-unlocked mode every other command already uses, and the warning shows the real underlying error instead of a misleading "this filesystem does not support locking." The only thing given up is coordination against concurrent rbox processes on the same workspace.
Changed
- The recovery-phrase prompt (
rbox key recoverand setup recovery) is now a visible input — a 24-word phrase is long and paste-error-prone, and hiding it made a bad paste impossible to spot. Pairing tokens and genesis secrets stay masked. - Running bare
rboxinside a workspace while signed out now leads the menu with "Log in", which routes into the normalrbox loginflow.
#[1.7.9] — 2026-07-20 — recovery phrase & first-run encryption no longer crash
Fixed
- Entering your recovery phrase (
rbox key recoveror the setup wizard) and first-run encryption setup ("set up encryption on this machine") no longer cause rbox to silently exit with no message. The BIP39 checksum used an asynchronous WebCrypto call that, run as the final step of a one-shot command, could let the process end before it completed; it now uses a synchronous hash. If you upgraded and hit this on 1.7.8,rbox key recoverwith your phrase now works.
#[1.7.8] — 2026-07-20 — join a folder that's already ahead
Added
- Joining a workspace with a folder that already has content — repos that
are ahead of the fleet, extra files — now converges forward instead of
getting stuck. rbox retains your pre-join content, pulls the workspace
baseline, then overlays your files and commits back on top: ahead repos
fast-forward the whole fleet to your state, files you already had are
preserved, and anything genuinely diverged is kept safely aside and
reported (
rbox adopt status) rather than published. Your pre-join copies are retained until you clear them, so the whole join is reversible. rbox adopt status|resume|abort|clean— inspect, resume, roll back, or clear an in-progress or completed adoption.
Fixed
- A folder whose repos were ahead of the fleet previously parked on join with no automatic path forward (its newer commits never published and the working tree could show older content). It now converges forward.
#[1.7.7] — 2026-07-19 — branch switches follow both ways
Fixed
- Switching a repo back to a branch whose tip is an ancestor of your current
branch (for example
git switch mainafter working on a feature branch) now follows on every paired machine within one sync cycle. Previously the follower machine could be permanently stranded on the old branch with a perpetually dirtygit statusand a stuck "receiver-only commits" deferral, even though every commit was fully synced. Machines with genuinely local commits still defer safely torbox git resolve;RBOX_GIT_FOLLOW=0remains the containment switch and now has pinned semantics (it bypasses the follow pipeline entirely via the legacy apply path).
Added
- A two-machine
git-fftest-rig scenario now gates every release on the everyday git flows: commit fast-forward, branch creation with passive checkout-follow on the paired machine (in both author directions), and switch-back — 46 assertions of end-state including sync-record promotion.
#[1.7.6] — 2026-07-19 — faster scans, quieter cycles
Changed
- Layer A's directory-listing cache is now enabled by default for foreground
and daemon scans;
RBOX_SCAN_PRUNE=0is the single kill switch (=1remains accepted). It elides reusable directory enumeration while per-file stat and matcher work remain. Daemon safety scans prune only with a live, trusted watcher; untrusted or absent watchers retain full-tree coverage for recovery.
Fixed
- Successful macOS bulk directory listings now refresh Layer A cache entries, so bulk scanning and directory-listing reuse compose on subsequent scans.
- The daemon no longer rewrites its entire state file every cycle when nothing changed — a phantom-difference bug made steady-state syncing rewrite tens of megabytes every ~30 seconds on many-repo workspaces (and steadily grow the daemon's memory). True no-op cycles now write nothing.
#[1.7.5] — 2026-07-19 — a front door that knows you
Fixed
- Crash recovery no longer refuses to read a normal-sized state file on
machines with plenty of memory: the safety budget now scales with your
machine's RAM (quarter of physical memory, between 4 and 32 GiB) and
respects container memory limits. The refusal message now also explains
the
RBOX_RESET_PARSE_BUDGET_BYTESoverride.
Added
- The "which directory should rbox sync?" prompt is now a real picker: type to fuzzy-filter the current directory's folders, press Tab to complete into a subdirectory like shell completion, and plain Enter still takes the current directory instantly. Typing any path by hand (including one that doesn't exist yet) works exactly as before.
- Running bare
rboxin a workspace now offers everything you'd reach for: Sync now / Start background syncing (or Pause syncing while it's running), Set up a new workspace, Pair another device, View usage, View logs, Exit.
Fixed
- The bare-
rboxoverview no longer shows "plan unavailable" on a freshly set-up machine — it now fetches your email and plan once (quickly, and only when interactive) instead of waiting for a cache another command would have filled.
#[1.7.4] — 2026-07-19 — a first sync you can watch
Added
- Byte-based progress across the first sync: scanning shows the payload size as it grows, encrypting shows bytes done vs total, and uploading shows a live MB/s rate with an ETA once the rate settles. Progress percentages now track bytes, not file counts — 100k tiny files no longer skew the bar.
- After setup completes, rbox offers to set up another machine right away
(generates a pairing token on the spot). Pair more devices any time with
rbox pairon an already-paired machine. - Long steps reassure you after ~10 seconds ("initial encryption of many small files can take time") instead of looking hung.
Changed
- The "authorize this machine" menu leads with "Sign in via browser", and the duplicate "Approve a code" entry is gone (it was the same browser grant under a second name).
- Press
con the browser sign-in screen to copy the URL to your clipboard. - The setup workspace step shows the same "what is a workspace" definition as
rbox init. - Git history still uploading after setup is announced calmly ("Git history will continue uploading in the background.") — it's expected, not an error.
- Start-sync choices now read "Start background sync now and on machine boot" — nothing implies you need to reboot.
- The final setup screen shows your workspace name and this machine's hostname instead of internal ids.
- The gitignore choice now tells the truth about what each option does and
teaches the
!.envtrick: sync a secrets file between your machines, end-to-end encrypted, without ever committing it.
Fixed
- Debug telemetry (multipart instrumentation and the push summary line) no
longer prints mid-setup for release users; set
RBOX_DEBUG=1to see it.
#[1.7.3] — 2026-07-18 — a friendlier first run
Added
- Setup now explains what a workspace is right where you create or join one: a single repository, a folder of many repositories, or just a folder.
Changed
rbox startoutside a workspace opens the guided setup on a terminal so you can create or join one on the spot, instead of erroring out. Scripts and service managers still get the explicit "not inside a workspace" error.- Setup no longer asks for a "Project id" — one fewer confusing prompt when creating a workspace.
- Enabling autostart follows the rbox binary you actually run, so an install
outside
~/.rbox/bin(for example~/.local/bin) starts on login correctly. - Credential corruption is now preserved and reported instead of looking like a logout. Credentials use a versioned, atomically written format; malformed or future files are quarantined without overwriting prior evidence. rbox also refuses symlinked, non-regular, or unsafe credential paths and gives recovery guidance, while status and doctor remain available in a credential-degraded state.
#[1.7.2] — 2026-07-17 — faster releases, same gates
Internal
- Release builds now reuse the exact squash commit's successful main CI verdict instead of rerunning the same suite a third time. Immutable release uploads and verification run concurrently; signing, native smoke tests, rollback protection, and sequential channel activation remain unchanged.
#[1.7.1] — 2026-07-17 — your sync history stops eating your storage
Changed
- Every sync now stores a compressed snapshot of your workspace index
instead of a full raw copy — about 24× smaller. For active workspaces
this was the dominant storage cost: each sync stored a complete
multi-megabyte index even when almost nothing changed, and version
history kept every copy. New syncs write the compact format; existing
history is unaffected and remains fully readable. All supported rbox
versions (v1.1.0+) read both formats. Set
RBOX_MDE_SNAPSHOT=0to temporarily restore the old format if you run a pre-v1.1.0 device.
#[1.7.0] — 2026-07-17 — consent before reset, recovery at scale
Changed
- rbox never resets a workspace without showing you exactly what changes (design 138). Rebinding to a different remote stream now walks through an explicit two-stage consent: you confirm the specific workspace you're leaving and the specific one you're joining — identified by their remote ids, not just names — and the confirmation you gave is cryptographically tied to that exact pair. A stale or replayed confirmation is refused.
rbox trackand keyed setup refuse to silently adopt a mismatched stream. Where an old version might have proceeded, the CLI now stops and explains which workspace the directory actually belongs to. (Breaking change for scripts that relied on the silent path.)
Fixed
- Crash-safe reset and recovery. If the machine dies mid-reset, the next
start picks up from a journal that records what was authorized and how far
it got: quarantines resume instead of restarting, archives are copied (never
moved) until the restore is fully published, and a damaged journal halts the
daemon into a guided
rbox doctor reset-journalflow instead of guessing. - Corrupt or oversized state can no longer wedge the daemon. State reads are byte-bounded with a memory admission gate, and the daemon heals through an explicit halted → recovering → ready cycle with a three-way agreement check between boot, config, and state before serving.
- RboxBar finds the rbox binary when launched from Raycast or the Dock.
GUI launches don't inherit your shell PATH; the menu bar app now probes the
standard install location (
~/.rbox/bin/rbox) first.
Internal
- Git burn-in suite (design 141): fifteen live-rig cells covering submodules, LFS, Unicode/case-folding, shallow and partial clones, and in-progress merge/rebase/cherry-pick/bisect — 494 assertions, all green, with the two known engine gaps documented and pinned.
- Storage-truth measurement tooling (designs 142–144): read-only prod decomposition of account storage into active/history/reclaimable classes.
#[1.6.9] — 2026-07-17 — the wizard forgives your typos
Fixed
~/pathswork in the setup wizard (design 137). Typing~/projat the directory prompt now means your home directory instead of creating a literal folder named~. Unsupported forms like~user/…explain themselves and ask again.- A typo can no longer create a workspace you didn't want. The wizard shows the resolved absolute path before anything happens, asks before creating a directory that doesn't exist, and doesn't touch the server until the local side is confirmed and locked. If something fails after a workspace was created, you get its id and the exact way to resume — never a mystery orphan.
- Mistakes keep you in the wizard. Bad paths and malformed pairing tokens re-prompt (tokens are checked locally before any network call); a mistyped 24-word recovery phrase is caught offline; blank input navigates back; declining "create a new workspace anyway?" returns to the menu with your sign-in intact. A used-up token now says to mint a fresh one on your other machine.
Changed
- Clearer first-run copy: joining a workspace nobody has pushed to says "nothing was available to pull" instead of "0 pulled, 0 conflict(s)"; the workspace-id prompt says where to find the id; the sign-up prompt no longer doubles as a mystery masked-secret field; the approve screen always shows the full URL; the authorize menu points lost-device users at recovery.
- Releases are now gated by a deterministic TUI regression suite that drives the real wizard in containers — the six defects above are permanently guarded by it.
#[1.6.8] — 2026-07-16 — zombie branches rest in peace
Fixed
- Followers now prune stale side branches (design 130). When you squash-merge a PR
and delete the branch, every follower deletes its copy too — safely. Deletion is
gated by a publisher-authored tombstone chain plus a compare-and-swap provenance
check, so a branch with unpushed local commits, an active checkout, or any doubt at
all is left alone (with the reason logged). A deleted branch's proven tip stays
recoverable for 90 days under
refs/rbox-recovery/. This retires the "83 zombie branches" class of clutter without ever risking real work.
Changed
- Second-device setup answers its own questions (design 134, from real user
feedback). The setup wizard now says exactly where a pairing token comes from
(
rbox pairon an already-set-up machine — never the dashboard, because it carries your encryption key) and distinguishes it from the browser confirmation code (which authorizes but carries no encryption). Every successful login/pairing now points to the next step:rbox setup→ "Sync an existing workspace". The dashboard's link and CLI-login pages explain code-vs-token,/devicesgained an "Add another machine" card, and the dashboard links to the docs throughout.
#[1.6.7] — 2026-07-16 — a first sync you can predict
Changed
- Setup now respects
.gitignoreby default. The wizard's default choice skips gitignored untracked files, so your first sync is your source — lean and fast. The previous behavior lives on as a clearly-worded option: gitignored files sync too, end-to-end encrypted (rbox can never read them) — ideal for.envfiles, notes, and local state — with!re-includes in.rboxignoreand an ignore-mode toggle for changing your mind later. Existing workspaces and scripted setups are unchanged. rbox ignore --listnow tells the truth:.gitignorerules are labeled active or present-but-not-applied based on the workspace's actual setting.- Account creation leads with browser sign-up; docs corrected (
--purgeexists and is documented; the README's sync-scope claims now match reality); assorted first-run copy.
#[1.6.6] — 2026-07-16 — strands heal themselves, show-me shows up
Fixed
- ORIG_HEAD deferral self-heal (design 126): a follower stranded by a stale
ORIG_HEADbreadcrumb (the class that required manual replica surgery, twice) now adopts the incoming value automatically — but only when the repo is provably a pure replica (no local edits, index, commits, stash, or any in-progress git operation), and never without durably preserving the old value first (recovery refs underrefs/rbox-recovery/, capped).git-sync: adopted stale ORIG_HEAD breadcrumbin the daemon log marks each heal. rbox git resolve show-meis fast and talkative (design 128): ownership proofs are batched (~5 subprocesses instead of thousands on reflog-heavy repos — 30 minutes → seconds), progress goes to stderr, and human output caps at 50 local-only commits. JSON output and resolve safety data remain exhaustive.- Capture bundles no longer advertise internal
refs/rbox-*refs.
Server (already live)
- Fleet push alerts (design 127): drift >24h and reporting-stopped conditions page #rbox-alerts hourly, with incident dedup/resolve semantics.
#[1.6.5] — 2026-07-16 — the fleet phones home (design 120)
Added
- Product telemetry (design 120): the daemon now ships privacy-safe product-health samples to your rbox server — propagation lag (delivery→apply), first-publish timings, upload-lane wire vitals, crypto-pool capability, and safety events (mass-delete breaker, scan faults). Counts, timings, and fixed enums only; never paths, hashes, or free-form strings — enforced server-side by a hard validator.
- Fleet sync-state reporting: each daemon upserts its current git-plane position
(repos managed/deferred, oldest deferral age, reason classes) so a dashboard can catch a
stranded repo without touching the machine. Uses the exact projection
rbox git deferralsuses — the dashboard and the device can never disagree. RBOX_TELEMETRY=0disables all of it (checked at both enqueue and flush; telemetry goes to the operator's own worker, never a third party).
Fixed
- An invalid
x-rbox-versionheader can no longer blank a device's recorded binary version.
#[1.6.4] — 2026-07-15 — logs that rotate, deferrals you can see and fix
Added
- The menu bar now shows which repos are deferred and why (#285, design 124). Under the Git row: up to five repos with plain-language reasons and ages ("local commits · deferred 1h"), full paths on hover, "+N more" beyond five. A Copy Git fix brief button puts a self-contained, paste-anywhere brief on the clipboard — per-repo diagnosis, what clears on its own vs what needs a decision, and exact safe commands — readable by a human or an LLM. Unknown or forged deferral reasons can never be offered a resolve command.
rbox git deferrals— the same drilldown in the terminal: human list,--brief(the clipboard document), or--json(typed lane array, identical tostatus --json).
Changed
- Daemon logs rotate daily (#286, design 125).
daemon-YYYY-MM-DD.logfiles with 14-day retention (RBOX_LOG_RETENTION_DAYSto override) replace the forever-growingdaemon.log(44 MB after a week on the founder's Mac);daemon.logremains as a small crash sink with pointer records.rbox logsmerges both streams chronologically and--followsurvives midnight rollover and daemon restarts. - Sync perf lines went on a diet. The per-repo
repoMs=blob (one entry per repo, 101 on the founder's workspace) is capped at 8 worst-case exemplars plus p50/p95/max aggregates for queue, wall, and fresh-chain phases — the distribution signals perf work actually uses, at 3% of the bytes. Full detail returns underRBOX_DEBUG=1.
Fixed
- Test rig repaired (#286): login rot from v1.6.1's flag rework, container
git below the 2.46 symref floor, and zombie daemons under a
sleepPID 1 that wedged every subsequent sync (the image now runstini).
#[1.6.3] — 2026-07-15 — locks that survive reboots, upgrades that finish the job
Fixed
- A Mac reboot can no longer freeze sync behind its own stale lock (#282,
design 118). macOS's per-boot
kern.uuidmade a rebooted machine read its own pre-reboot lock as another host's — unbreakable by design — starving the founder's Mac for 26 hours. Lock identity now prefers the stable hardware UUID with an 8-boot alias ledger, and on a proven-local disk (the kernel's ownlocalmount flag, fail-closed) an unrecognized stale marker is probed and reaped like any dead local lock. Wire format unchanged — old and new binaries interoperate within a boot; downgrades stay safe. rbox git resolveworks and tells the truth (#282). A failed resolve used to leak its own lock marker (bricking every later attempt) and swallow the real error into a generic message. The break path now cleans up only what it provably owns (.reapfence included), and errors are typed —sync-busynames the daemon holding the mutex.- Sync starvation is loud (#282). Blocked >15 minutes by the same lock →
one durable warning, an explanation in
rbox statusandrbox doctor, and a counts-onlylockStarvedmetric. Retry spam is gone (250ms→30s abortable backoff; the incident wrote 341,824 identical log lines). - Old git is explained, not mysterious (#282). Doctor probes the actual
update-reftransaction capability: "checkout-follow needs git ≥ 2.46, found 2.43" instead of "unsupported git state".
Added
rbox upgradefinishes the job (#282). It now stops every running daemon and WAITS for exit (the old stop removed the pidfile without waiting — its own race), restarts them with settings preserved, andrbox statusflags daemon/CLI version skew.- RboxBar notifies once per new version and updates in one click (#283, design 121). macOS notification (persisted once-per-version, lazy permission ask) + "Update to <version>" menu action running the managed upgrade.
- Per-device CLI version tracking (#279, design 119). Every authed
request carries
x-rbox-version;rbox device listand the dashboard show each device's last-seen version — the compat dashboard for real customers. - Slack pings survive slow relays (#281, design 122). Signup/subscription
pings run post-response via
waitUntil(5s budget + retry; the first customer's signup ping died at the old inline 700ms), and failures self-report to #rbox-alerts (URL derived from the business webhook).
#[1.6.2] — 2026-07-14 — rbox knows your name
Added
- Identity banners show who you are, not your account id (#278, design
117). The untracked-dir menu, the setup skip-notice,
rbox account status, andrbox status's ACCOUNT section render "Signed in as [email protected] (github)" once the local profile cache has seen an account fetch (anyrbox statusfills it). Falls back to the account id when uncached — or permanently for CLI-only accounts with no web login. The cache (~/.rbox/account-profile.json) is non-secret, 0600, sanitized against terminal injection, keyed to the signed-in account, and cleared on logout.
Fixed
- New accounts get their email cached at first login (server). The provisioning path now seeds the email from the Clerk fetch it already makes; previously the address stayed unknown until the second web login (affecting new-device alert recipient resolution too).
#[1.6.1] — 2026-07-14 — bare rbox meets you where you are
Added
- Enrolled machines get a menu, not a mid-wizard jump (#277). Bare
rboxin an untracked directory used to dump already-enrolled users into the setup wizard at "Step 2 of 3" (step 1 silently skipped). It now offers: Track this directory / Sync an existing workspace / Nothing. The choice preselects the wizard's create-vs-join prompt, so the total number of prompts is unchanged. First-time machines still land directly in the wizard. - The front-door menu is daemon-aware: "Pause syncing" when the daemon is running, "Start syncing" when it isn't (previously always Pause).
Fixed
- Setup step numbers count only the steps that actually run: an enrolled
rbox setupshows "Step 1 of 2 · Workspace"; the authorized-but-unenrolled enrollment prompt gained its missing "Step 1 of 3 · Account" frame. - Copy: the contradictory "Continuing to your workspace." line is gone;
rbox pair's finish message describes the real menu path on the new machine; the bootstrap-secret prompt says blank = browser device-code sign-up.
#[1.6.0] — 2026-07-14 — the checkout follows you: git state reconciles across machines
Added
- Checkout-follows-sync (design 116, #273/#274/#276). Switch branches on one machine and machines with no local divergence follow automatically — branch, HEAD, index, stash — proven safe by a derived manifest-receipt oracle, a two-phase rollback-only checkout journal, and a pinned ref-update lock protocol. Kill switch: RBOX_GIT_FOLLOW=0.
- Per-ref worktree holds replace whole-section deferral (the bug that froze a Mac checkout for 3 days): a linked worktree holding a branch pins only that ref; identical-OID updates never defer at all.
- Drift is visible everywhere: per-repo git deferral age in rbox status (+ --json), the daemon line, the shell prompt, the macOS menu bar. "In sync" now means BOTH planes.
rbox git resolve <repo>: show-me + take-theirs (keep-mine next cycle).- Fresh-machine fix: git operations no longer fatal without a configured git identity (caught by CI's identity-less runners).
#[1.5.4] — 2026-07-13 — receipt draining actually engages: −19%% push wall
Fixed
- Upload-time receipt draining now runs in production (#275). E2eeRemote — the wrapper every real publish uses — never forwarded the receiptPort capability, so design 111 shipped default-on but inert (redeemOverlap=0 in the field). Forwarded + compile-time parity guard so wrapper/transport capability drift fails typecheck. Field-validated: commit-enclosed drain 8s→168ms, total push 39.2s→31.9s on an 8k-blob publish.
#[1.5.3] — 2026-07-13 — release unblocked: one release-env-only flaky grant test skipped (tracked)
#[1.5.2] — 2026-07-13 — the grant-suite fix actually ships this time (1.5.1 tagged without it — cwd slip)
#[1.5.1] — 2026-07-13 — release-gate test hygiene (v1.5.0 build never shipped)
Fixed
- Bounded teardown in the upload-grant suite: an unresolved gated fetch could hang the afterEach hook 10s in the single-process release build, poisoning the next test and failing the v1.5.0 gate. Same #264 class; 2s close bound.
#[1.5.0] — 2026-07-13 — blob packing: small-file uploads scale with bandwidth
Added
- Blob packing (design 114, #268/#271). Small ciphertext blobs pack into
bandwidth-sized R2 objects instead of one-object-per-blob: the small-file
lane stops being R2-operation-bound (~48.8 Mbps measured wall pre-packing)
and scales toward line rate like the multipart lane. Reader path +
server accounting ship ON (mixed packed/unpacked estates are permanent);
the pack WRITER is behind
RBOX_BLOB_PACKpending field validation gates. GC/fence correctness per the six-round adversarial review: epoch-bound candidacy, live-clock deletion stamps, durable swept tombstones, therbox_delete_fence_packtrigger, rollback floor (pre-1.5 binaries cannot read packs — reader-first rollout).
#[1.4.2] — 2026-07-13 — the crypto pool actually ships: Bun compile bug fixed, init exits clean
Fixed
- Release binaries now really run the crypto worker pool (#270). Bun 1.3.5
(the old release pin) ignored the text import attribute under
--compile: the embedded worker extracted as 0 bytes, silently disabling the pool (inline-crypto fallback) in EVERY release binary to date — and leaving a permanently ref'd handle that made one-shot commands (init, push) hang after finishing their work. Fixed via a loader-proof.txtbundle + a loud non-empty guard; release toolchain now pins Bun 1.3.14 (engines ^1.3.14). Expect faster fleet encryption — pooled crypto in a release build for the first time. - Compiled-binary regression test: a release-style binary must exit within a deadline after real crypto work (negative-control verified against the bug).
#[1.4.1] — 2026-07-13 — sweep verdict applied: fill-v2 stays, default records back to 32
Changed
- Default batch records: 32 (fill-v2 dispatch policy stays the default). The
flat-meadow matched-cell sweep passed fill-v2 at 32 records (−14.1% slot work)
but 64-record batches FAILED the cap gate (−7% — larger per-batch settles beat
the parallelism).
RBOX_BATCH_RECORDS=64remains available; the server cap stays 64 for re-evaluation. - Sweep harness: tolerate find SIGPIPE when the corpus exceeds the byte budget.
#[1.4.0] — 2026-07-13 — upload lane rebuilt: full batches, receipts drained in-flight; codebase modularized
Improved (live by default; founder ship-live call)
- Batches ship full (design 112). Upload batching defaults to the fill-v2
dispatch policy with 64-record batches (server cap raised in lockstep):
dispatch-on-full with quiet/absolute deadlines replaces the fixed 10ms timer
that shipped half-empty batches (measured 17.3/32 records, 148KB of an 8MiB
cap, ~733ms server settle paid 2,360× on a greenfield publish). Kill switch:
RBOX_BATCH_FILL=v1. Version-skew guard: machine-readabletoo_many_records400 + strictly-shrinking client latch. - Receipts drain during upload (design 111). Redemption receipts are
redeemed while blobs upload instead of accumulating into a post-upload tail
(37.4s measured on 49k receipts), with count+byte-bounded batches and a
session cap clamp. The commit-enclosed final drain remains the catch-all.
Kill switch:
RBOX_REDEEM_DRAIN=off. - First-publish observability: dispatch-reason telemetry, receipt
request/byte stats, commit-enclosed
finalDraintiming, repaired redemption/upload overlap accounting (interval-union), server-side redeem phase splits.
Changed
- Codebase modularized (design 113). Six 1,000–2,500-line engine files →
~24 owner-responsibility modules behind exact-surface barrels, with
docs/CODEMAP.mdas the navigation contract. Behavior-identical (proven per wave: rename/content-equivalence, single-instance state, cycle baseline, compiled crypto smoke, token-stream-identical comment sweep). Review archaeology moved from code comments to the design ledgers. - O(change) commit admission enforced (design 102). Prod validated 259/259 shadow agreements, then enforced: admission dropped 5,956ms → 213ms measured.
- Design 109 (auth-call storm) evaluated and parked on gate-0 evidence (~89ms/request pre-handler — batch fill was the real lever); design 110 (commit tail) pending its Phase-0 verdict from the evaluation sweep.
#[1.3.0] — 2026-07-13 — files-first first publish ON by default; init fixed for scripting
Added
- Files-first first publish is the default (design 108, #244/#247,
f2403834). A greenfieldrbox initnow publishes in two commits: files land first (the workspace is usable the moment "published → sequence 1" prints), then git history attaches as an ordinary second push. Genesis-only — existing workspaces are untouched. Field-validated on flat-meadow: two-phase publish, 409 abort latch, starvation fallback, and flag-off byte-identity all confirmed;timeToFilesSyncedbeat the full-publish wall by 107s even on a file-heavy corpus. Kill switch:RBOX_FILES_FIRST=0. FirstPublishStatsrenders on init — thefp filesSynced… authn… commit…line that exposed the next round of perf levers (designs 109–111).- Admin workspace purge (#248).
DELETE /v1/admin/workspace/:id[?dryRun=1](platform-secret gated) +scripts/ws-purge.tsdrain — junk/bench workspaces can finally be deleted server-side; blobs reclaim via the normal GC pipeline. Field-proven on three bench workspaces. - Upload/download concurrency knobs (#245).
RBOX_UPLOAD_SLOTS/RBOX_DOWNLOAD_SLOTS(legacy aliases honored), clamp [1,256], defaults byte-identical. The measured verdict: defaults stay 24/48 — the knee is at 48 slots and ≥64 collapses throughput 3x via per-batch RTT inflation.
Fixed
rbox init --newno longer clobbers the machine device identity (#246). Device-id resolution now prefers the enrolled E2EE keystore identity (--new-deviceescape hatch added);rbox doctorgained an O(1) check for dangling/mismatched binding ids. Field-verified on flat-meadow.rbox initexits cleanly in headless/scripted runs (#246). Ref'd crypto worker threads kept the event loop alive aftermain()returned; one-shot commands now tear the pool down on exit (the daemon keeps its pool).
#[1.2.0] — 2026-07-12 — the Mac gets fast: bulk scans, working fold evidence, field-proven trust recovery
Same-day follow-through on v1.1.0: everything that shipped dark yesterday is now field-verified and on, plus the macOS performance sprint.
Improved (measured on the live fleet)
- macOS scans: per-file stat eliminated (design 107, #241).
At that release, the Darwin opt-in preview walked directories with one
getattrlistbulksyscall instead of ~118klstats — warm full scan 5.5s → 3.1s bench, 3.9s pull-scan / 2.0–3.2s safety-scan live, with value-identical attributes (0 parity mismatches across the full corpus) and per-directory fallback on any FFI failure. - Manifest fold evidence works everywhere (design 84 r2+r3, #234/#238). Same-head pulls fetch ZERO blobs; multi-link pulls fetch only the new suffix; chronic git-repo deferral (linked-worktree branches) no longer suppresses evidence — receiver manifest reads are 0.4–1.5s fleet-wide (were 4.5s legacy / up to 21s broken-fold), and delta writes work on every host. Fold hot path: streaming canonical hash, each manifest verified exactly once per walk, memory bounded.
- Watcher trust recovery field-confirmed (design 104). The Mac's transient FSEvents drops now cycle suspect → re-trusted-behind-unpruned- scan instead of pinning full rescans at a 60s floor for the daemon's lifetime.
- Pruned safety scans (design 85 Layer A, #236).
RBOX_SCAN_PRUNE=1reuses ctime-keyed directory listings (~24% scan cut; readdir share); deep scans stay unpruned as the drift backstop; pruned scans can never testify for watcher re-trust.
Fixed
- GC Phase-1 lifecycle (#235/#237/#239): mark/purge are now cursored and fit D1's subrequest budget (previously: marks accumulated unboundedly — 230k stale rows — and purge threw mid-page while misreporting success); the fence probe is robust to any mark-table size (enforce falls back to full validation whenever the probe is skipped — never silently unfenced); operator drain tooling gained grace parity with the cron and honest failure reporting. Backlog drained: 228,962 stale marks, 35.3GB of accounting released.
Added
- Machine-readable design-102 soak gate (#232):
GET /v1/admin/delta-soak(platform secret) exposes divergence/fallback/admission AE aggregates. - Cross-host propagation analyzer (#240):
bun scripts/propagation-report.ts <originLog> <receiverLog>— first fleet numbers: publish→apply p50 16.7s over 233 events, zero staleness incidents.
#[1.1.0] — 2026-07-12 — manifest deltas, watcher trust recovery, self-draining GC
The performance program's second checkpoint, hours after v1.0.1.
Added (flag-gated, default off — staged per-host rollout with measurement)
- Manifest delta encoding (design 84, #231). The end of the constant
39–41MB manifest transfer: zstd snapshot envelopes (
RBOX_MDE_SNAPSHOT, measured 24× smaller), O(change) delta commits (RBOX_MDE_DELTA— a one-file change ships ~KB), and head-blob-only fast pulls (RBOX_MDE_FAST_PULL). Chain-verified reads with exact-list matching, a pin-as-parent repair transaction (rbox recover --repair-chain+ doctor check), fail-to-snapshot semantics on every delta trigger. Server chain acceptance is unconditional and additive — old clients are unaffected. - Watcher trust recovery (design 104, #229). With
RBOX_WATCHER_RETRUST=1, a transient macOS FSEvents overflow no longer permanently distrusts the watcher (which pinned full 116k-file rescans to a 60s floor — measured ~11% continuous I/O duty on the Mac). Transient drops now enter a suspect state that re-earns trust behind an unpruned safety scan, with a drop fuse preserving today's behavior under sustained failure.
Changed
- Scheduled GC purge enabled (#228). The founder-supervised drain completed (5,410 blobs / 4.29GB reclaimed); the daily fenced cron now drains the remaining candidates as they age past the 7-day grace.
Telemetry
- Multipart transfer decomposition (design 101 Phase 0, #230): per-part
walls/gaps/completion (client) + additive
serverTimingswith the whole-object verification reread isolated (server), plus a read-only multipart/staging orphan inventory for the platform operator. - First-publish stage decomposition (design 98 §5.1, #226) emitted on both the serialized and pipeline paths with one schema.
- Design 105 (merged design): the existing WebSocket notify channel is formalized; its reliability fixes (pong deadline, jittered backstop pull, session cap) are specified and sequenced for implementation next.
#[1.0.1] — 2026-07-12 — performance program checkpoint: instant preflights, fused crypto, full sync telemetry
The first checkpoint of the sync-performance program (designs 97–103). Two improvements are live by default or via fleet flags; the rest ship dark (flag-gated, default off) pending their measurement gates.
Improved
- Change-only blob preflight (design 103 Part B, #218). With
RBOX_PREFLIGHT_DELTA=1, a push checks only the blobs it introduced (plus any 422-recovery residue) instead of the whole workspace — measured 2.8–4.0s → 0.1s on a 114k-file workspace. Includes the fix that threads the server's unsatisfied-blob list through retry (previously dropped), a capped recovery accumulator with a chunked full-audit fallback, andRBOX_PREFLIGHT_FULL=1to force the full audit. - Instant rejection of stale commits (design 103 Part A, #218/#219). The server now 409s an already-stale commit in ~0.1s instead of ~6s of admission work, cutting conflict-retry storms (previously 12–42s of added wall).
- CLI usability fixes (#203).
rbox restoreis now trash-tier-backed (undoable); uninstall warns about the keystore; assorted audit fixes. - Torn-scan hardening (#205). Same-size edits with restored mtimes are re-hashed (ctime joins the fingerprint); mid-hash instability defers a file instead of publishing a torn read.
Added (flag-gated, default off — awaiting measurement gates)
- Fused crypto worker jobs (design 99, #224).
RBOX_CRYPTO_FUSE=1batches small-file encryption into byte-bounded in-memory jobs under a budget with a contention-bounding dispatch cap — 79.7% encrypt-wall reduction on the production path in rig A/B (95% CI [77.2%, 86.5%]), byte-identical ciphertext. Fleet first-publish gates pending. - Overlapped first-publish pipeline (design 98 Tier 1, #225).
RBOX_PUBLISH_PIPELINE=1overlaps encrypt → upload → receipt redemption with reservation-based disk backpressure, an error-latched receipt drainer, and a two-barrier abort protocol. Serialized remains the default until the Workload-B gates hold.
Telemetry (numbers-only; no file names or paths, ever)
- Server commit decomposition rendered in push lines (#207/#213):
srv/env/acct/ssc/cm/mir/rsptokens — this measurement attributed ~87% of commit-POST time to D1 ref admission and now feeds the design-102 shadow soak. - Join/apply decomposition (design 100 Phase 0, #223) and first-publish stage decomposition (design 98 §5.1, #226) — gate evidence is emitted by the binary, not hand-timed.
- Scan-site stats, per-dir probe, deep-scan drift audit (design 85 P0,
#208), with
RBOX_METRICSnow default-on (opt out:RBOX_METRICS=0; measured worst-case scan overhead ≤3%).
#[1.0.0] — 2026-07-10 — the correctness milestone
rbox reaches 1.0. The three correctness pillars are now field-proven fleet-wide: head authority (design 91) makes the commit chain un-forkable, manifest entry integrity (design 92) makes a push poison-proof and pulls self-healing, and git config sync (design 93) carries remotes and branch tracking with the repo. No functional changes over 0.9.18 — this release is the version bump that marks the milestone.
#[0.9.18] — 2026-07-10 — git config sync (design 93): remotes and tracking travel with the repo
Added
- Git config sync (design 93) (#192). A repo's remotes and branch-tracking
configuration now sync with its state — clone on a fresh machine and
git fetch/git push/git pullwork without re-adding remotes by hand. Config is embedded from a stability-bracketed snapshot at capture and applied through a locked, optimistic-CAS config transaction, so a concurrent editor or a mid-write power loss can never leave a partial config; the carry-base rule means a config that can't be represented is preserved byte-for-byte rather than stripped. Credential-bearing remote URLs are skipped (with a loud per-repo log).rbox statusgains aconfig:line. Host-identity resolution degrades safely to the legacy path where it can't be established.
Changed
- Per-repo git-sync lines collapse into one progress counter (#191).
rbox sync/rbox pullused to print one stderr line per repo during apply — alarming at scale and easy to misread as failures. The default now shows a single "git sync ran for N/total" counter; real conflicts/warnings still print immediately.--verboserestores the per-repo dump.rbox pairalso gains a single-keypress[c]token copy and corrected setup wording. - RboxBar shows total synced size instead of the sequence number (#190). The dropdown's secondary status line now reads a human-readable size (e.g. "15 GB") computed from the daemon's in-memory manifest, falling back to "seq N" for older daemons in a mixed-version fleet.
Fixed
- Design-93 rollout hardening (#193, #194). Config-sync wire bounds raised after field calibration (#193); the fingerprint cache is invalidated when those bounds change and invalid incoming config fields are ignored, and the config reader degrades rather than failing on unexpected input (#194).
#[0.9.17] — 2026-07-09 — download self-heal + CLI hygiene + calmer menu bar
Fixed
- A full join no longer hard-fails on a corrupted blob download (#187). Under
sustained high-concurrency load a large-body fetch could reassemble corrupt
bytes; content-addressing already caught it, but rbox aborted the whole sync
instead of re-fetching.
getBlobToFilenow bounded-retries on an integrity mismatch with backoff (the re-fetch lands as the pool drains into the reliable low-concurrency state), via a typedBlobDownloadIntegrityErrorthat logs the recovery; persistent corruption still fails loudly with no partial file left behind. rbox trackreuses your logged-in identity and forwards the workspace name (#186). Tracking a directory while logged in used to mint a fresh random device id (polluting local config and the server roster); resolution order is now--device> previous config > logged-in credential's device id > mint.
Changed
- RboxBar dropdown calmer and files-first (#185). A degraded state (no user action needed) drops the card for a dim one-line status; critical states keep the card and carry a per-reason remedy. File count becomes the primary datum, the footer shows daemon version and hostname, and a six-hour update check renders a dim "Update available" row that copies the install command. Daemon status gains additive fields (fileCount, daemonVersion, workspaceRoot) so old and new bars interoperate.
RBOX_APIendpoint overrides now warn loudly (#186), so a stray override can't silently point rbox at the wrong server.
#[0.9.16] — 2026-07-09 — manifest entry integrity (design 92): poison-proof push, self-healing size, fail-closed carry
Fixed
- Manifest entries can no longer be poisoned, and pulls self-heal (design 92) (#184). Encrypt verify-defers an entry whose bytes changed mid-capture rather than recording a mismatched address; a diff heals a stale entry size instead of trusting it; carry is fail-closed (a base entry that can't be verified is carried, never silently dropped); and apply verifies a blob before it displaces a local file. Field-gated after real zstd-gated poison findings. The simplification pass also removed a ~500k-lstat ancestor walk from a 123k-file pull.
- RboxBar finds its resource bundle when installed (#183), so the menu bar app renders correctly from an installed copy rather than only from the build tree.
#[0.9.15] — 2026-07-09 — self-clearing watcher-degraded status + native menu bar app
Added
- Native RboxBar menu bar app (design 88 UI) (#177). A SwiftUI
MenuBarExtraapp (macOS 14+) replaces the SwiftBar shell plugin, reading the same atomic daemon status files with no daemon round-trips. It mirrors the prompt-status verdict rules exactly (15s staleness, absent/corrupt → dead, graceful paused stays paused), reproduces the synced/syncing/attention states theme-aware for light and dark, uses a custom R-monogram icon with a state badge, and is multi-workspace aware.
Fixed
- A transient FSEvents drop no longer pins the status on "attention" until a daemon restart (#182). A dropped-events window is covered by a completed full/deep scan, which may now clear the watcher-degraded flag — guarded by an error-generation counter (no new watcher error since the scan began) and a live watcher (a periodic-scan fallback stays degraded). Found dogfooding RboxBar.
#[0.9.14] — 2026-07-09 — commit-fork recovery (rbox recover) + un-regressable head (design 91)
Added
rbox recover— a supported, one-command re-baseline when a workspace's local head pin has diverged from the server (reset the pin, re-verify the server chain, reconcile local files via keep-both, re-push local diffs). Replaces the need to hand-delete a keystore pin file. (The former phrase re-enrollment moved torbox key recover.)
Fixed
- The commit sequencer can no longer fork under a Durable Object restart
(design 91). The workspace head is DO-authoritative and fail-closed: a
missing head with evidence of prior life serves
repair_requiredinstead of reseeding from the best-effort D1 mirror (the reseed was what let a deploy-triggered DO restart re-issue an already-used sequence and fork the chain). Server-side same-sequence equivocation is now rejected. The server fix deployed with the priorapps/apipush; this release ships the clientrbox recovercompanion.
#[0.9.13] — 2026-07-08 — join/populate reliability (design-87 dogfood fixes)
Fixed
- Populate pulls can no longer hang silently on a lost blob completion. Request-level settlement tracking in the batch downloader, size-aware total deadlines on every blob fetch, and a stream-progress-aware stall watchdog: 90s of no progress logs the outstanding blobs and retries them (fail-silent duplicates — a failing retry never kills a request the primary may still deliver); persistent stalls fail loudly with a resume hint. Resume already re-fetched exactly the missing blobs.
- Keyed setup persists credentials (mode 600), so
--daemonjoins survive the invoking shell and reboots;rbox key materializeremains env-only. rbox statusand the prompt are honest during an initial populate: a versioned populate marker renders "initial sync in progress — N/M files" instead of claiming 120k phantom local changes with sync not running.
New env knobs (documented in docs/development.md):
RBOX_PULL_JOIN_WATCHDOG_MS, RBOX_PULL_JOIN_WATCHDOG_MAX_FIRINGS,
RBOX_NET_BLOB_MIN_TIMEOUT_MS, RBOX_NET_BLOB_MAX_TIMEOUT_MS.
#[0.9.12] — 2026-07-08 — ambient sync status (design 88)
Added
- Ambient sync status (design 88). The daemon maintains an atomic
daemon.status.jsonbeside its pidfile (5s heartbeat, ownership-gated, early-paused on graceful stop);rbox prompt-status [--json]reads it with staleness-as-death semantics (a killed daemon shows! deadwithin 15s); the zsh prompt's staleness window tightens 180s → 15s on the new heartbeat;contrib/swiftbar/rbox.5s.shships the macOS menu bar MVP with a Status / File / Progress dropdown, pause/resume, and log tail.
#[0.9.11] — 2026-07-08 — git-plan at O(change) (fingerprint cache) + phase-0 instrumentation
Fixed
- git-plan no longer spawns ~13 git subprocesses per unchanged repo
(design 83).
planGitSectionsconsumes thegit-divergence.jsonstat-fingerprint cache via a shared publish-grade v4 fingerprint (content-hashed HEAD/refs/small-index, ctime, 2s racy-clean margin, per-decision memoization) with a base-carry-only fast path and a baseless-worktree-pointer pre-skip. Measured on the real workspace: git-plan 24–43s → 4.0s (Mac) / 0.9s (wired Linux); daemon no-op tick 25–63s → 4.5–4.8s (Mac) / 1.5s (Linux); no-op CLI push 41s → 10.2s. Cache file v2 → v3 (old caches self-heal with one cold plan). - Git identity probes are side-effect-free.
git write-treerewrites the index file on every invocation; probes now run it against a temp index copy (GIT_INDEX_FILE), so rbox's plan/status probes no longer churn index files in tracked repos.
Added
- Commit/latest/scan sub-step instrumentation (designs 84/85 phase-0).
RBOX_METRICS=1phase lines now decompose commit (refresh/sidecar/encode/encrypt/upload/post + encBytes), latest (download/decrypt/parse), scan (readdir/stat/matcher/hash/sort + walked/ statted/hashed/cache-hit counts, cumulative across 409-retry rescans), and git-plan (fpHits/fpMisses/fpUntrusted/pointerPreSkips/spawnedRepos).
#[0.9.10] — 2026-07-08 — steady-state sync at O(change) (encrypt-cache reverse path index)
Fixed
- Steady-state pushes no longer pay an O(files × cache-entries) scan (design 82). The encrypt-address cache migrated every unchanged file's path with a full-cache scan — ~5.5 billion entry visits per push on a 116k-file workspace with a 47k-entry cache, 481s of a 700s push, invisible to phase timers. Path migration is now O(1) via a reverse path index (same on-disk format; legacy duplicate paths self-heal on load). Measured on the real workspace: Mac push with a 1-file change 204s → 54s, Linux 60s → 29s, no-op sync 43s, daemon publish cycle ~3.5 min → 25–63s.
Added
- Phase coverage for the formerly-invisible sync zone (design 82 §4).
New
state-load,git-plan,address(with cache hit/miss detail), andmissingphases inRBOX_METRICS=1reports — phase walls now account for 96–98.7% of push wall (was ~10–14%), so a regression like this can't hide again. Disabled reports are now a shared allocation-free singleton, so the no-op daemon tick stays free.
#[0.9.9] — 2026-07-08 — worker-pool crypto (real cores for blob encrypt/decrypt)
Added
- Worker-pool crypto (design 81). Blob encrypt and decrypt now run on a
pool of Bun workers (default
min(cores−2, 16), memory- and fd-aware;RBOX_CRYPTO_WORKERSoverrides,0disables). The pool is lazy — small syncs below 8 crypto jobs stay inline — keyed to the workspace key epoch, and idles out after 60s. Ciphertext output is byte-identical to the inline path. If workers can't start (e.g. a broken binary), rbox falls back to inline crypto andrbox doctor/rbox statussurface the degradation. Measured on a 32-core Linux host (105k-file first publish): wall 27.5 min → 10 min, encrypt phase 5.5x, join decrypt lane 10% → 1%, zero small-push regression, full-corpus byte diff clean.
#[0.9.8] — 2026-07-08 — batch slot defaults from the capstone curves
Changed
- Batch transport slot defaults raised: downloads 16→48, uploads 8→24.
Cloudflare Workers cap parallel subrequests per invocation (~6), so a
32-record batch settles in ~1s regardless of size — concurrent batch
requests are the linear throughput lever. Measured on the v0.9.7 capstone:
publish 83s→39s (8→24 put slots, A/B corpus, WiFi); full-corpus wired join
128s→84s (16→48 get slots; 64 is flat — the knee is 48).
RBOX_BATCH_SLOTS/RBOX_BATCH_PUT_SLOTSstill override.
Fixed
- Push lane timing no longer double-counts batched blobs
(
ownsUploadLaneTimingis now forwarded through the E2EE remote wrapper, and ownership is exclusive).
#[0.9.7] — 2026-07-08 — compress-before-encrypt + batched uploads
Added
- Compress-before-encrypt (design 79), default ON. Blob payloads are
zstd-level-3 compressed before AES-GCM when it pays (≥128 bytes and >5%
smaller; media/archives stay raw automatically) — measured 2.17x
byte-weighted across a real 6 GiB workspace, 4.9x on source-heavy corpora.
Key/nonce derive from the sha of the exact encrypted bytes (
payloadSha), so raw blobs stay bit-identical to 0.9.6 and nonce reuse is impossible by construction. Compressed manifests stampmanifestSchema: 4; older clients refuse them with one loud "upgrade rbox" error (validation now runs at the manifest decode boundary, covering pull, versions, and restore alike). Decompression is capped at each entry's declared size. Opt-out:RBOX_COMPRESS=0(new encryptions only). Upgrade all machines in a workspace (and restart daemons) before the first push from this version. - Batched blob uploads (design 80). Small ciphertexts ride
POST /v1/blob-batch/put— up to 32 per request, receipts-only, parallel R2 server-side with per-record results, receipts preserved viaPromise.allSettled. The client coalescer mirrors the download side (same-sha waiter coalescing, pull-first dispatch with a 10ms tail flush, single-PUT fallback on old servers / per-record failures); the upload pool scales to 512 when batching. Kills the measured ~125 blobs/s per-request upload floor. Kill switch:RBOX_BATCH_BLOBS=0.
Performance
- The design-79 A/B that motivated both features (17.5k files / 570 MB, WiFi): compression cut wire bytes 79% while walls stayed flat — proving small-blob transfer is request-bound, not byte-bound. Batching removes the request floor; compression then cuts the remaining bytes. Combined measurements land in the design docs after the release capstone.
#[0.9.6] — 2026-07-07 — batched downloads + parallel git materialization
Added
- Batched blob downloads (design 77 P1). Small encrypted blobs now ride
POST /v1/blob-batch/get— up to 32 per request under the §27 download grant (one verification, zero D1 on the happy path), streamed back as binary frames in completion order. The client coalescer fills batches pull-based from a supply-scaled download pool; large blobs keep the streaming single GET. A fresh join now issues ~3k requests where it issued ~93k. Kill switch:RBOX_BATCH_BLOBS=0. - Parallel git materialization. Pull-side git apply runs repos through a
bounded pool (
RBOX_GIT_APPLY_CONCURRENCY, default 6) over nesting-safe chains, with per-store locking for worktrees sharing a common git dir. Measured: the ~98-repo git phase of a fresh join dropped from ~85s serial to ~34s. - Push-side lane timing.
RBOX_LANE_TIMING=1now attributes push wall time to encrypt vs upload, mirroring the pull instrument.
Performance
- Fresh join of a 96k-file / 4.9 GiB workspace, measured end to end on the same hardware: 118s, vs ~200s before this release and ~30 minutes two days ago. Server-side (already live for all clients): grant-authenticated blob reads skip the per-request D1 queue entirely (§27 Amendment A).
#[0.9.5] — 2026-07-07 — index resolve-undo fix
Fixed
- Repos with old merge-conflict residue no longer defer forever on receivers. An index resolve-undo extension pointing at unreachable conflict blobs failed every receiver's post-apply fsck. Snapshots now strip it at capture, and apply clears it before fsck (existing stuck sections heal without a re-capture).
#[0.9.4] — 2026-07-07 — the performance sprint
Added
- Incremental git sync (design 53). Repos with a synced base ship
history increments instead of full bundles — measured 0.024% of the
full-bundle bytes per change. Default on;
git.incremental: falseopts a workspace out. The first chained capture moves the workspace to manifest schema 3 (older clients must upgrade — clean break). - Instant status (design 69 §3.4). With a live, settled daemon,
rbox statusanswers from the daemon's published counts in ~50ms (was ~8s on a 130k-file tree) — and falls back to the full scan on any trust-predicate miss, never to wrong output. - Live byte progress (design 73). Transfers render dual fractions
(
uploading 126,352/126,369 · 4.1/6.3 GiB); git capture shows cumulative bytes sent. Multi-GB uploads no longer look like hangs. - Pull instrumentation + faster fresh joins (design 74 Phase 0). The pull's git-apply tail is now measured per repo, and download concurrency defaults to 128 (recorded sweep: ~25% faster on big materializations).
- First-publish encrypt cache (design 75). Retrying a large first publish re-encrypts only what the server is actually missing, instead of the entire workspace.
- No more silent network wedges. Small control requests carry a 60s deadline with the established retry rules, and the daemon heartbeat advances on a timer, so a hung operation reads as visible staleness.
Changed
- Hourly server maintenance moved off the top of the hour (was correlating with transient commit 500s).
#[0.9.3] — 2026-07-07 — daemon hotfix
Fixed
- v0.9.2 daemons stopped pushing minutes after start ("E2EE required:
refusing to sync without an encryption key"): the new workspace-config
reload rebuilt the daemon's config from workspace.json, dropping the
runtime-attached encryption key material and credential remote override.
The reload now moves only the hot-reloadable setting. If you installed
0.9.2, upgrade and restart the daemon (
rbox upgrade && rbox stop && rbox start).
#[0.9.2] — 2026-07-06 — refs at scale: big workspaces can publish
Added
- Receipt redemption (design 71). Upload receipts are redeemed in batches before the commit, so the commit request stays tiny regardless of workspace size. Previously a cold first publish of a very large workspace (~123k files) sent a ~45 MiB receipts map into an 8 MiB request cap and could never publish.
- Per-commit ref cap raised 50k → 250k, enforced against the full accounted set (data refs + carriers) and backed by budget tests derived from the platform math. A workspace over the cap now gets an actionable error and an honest red "sync blocked" status (no false "will be retried") instead of a silent retry loop.
- Bare
rboxinside a workspace shows the status block plus a small action picker (Sync now / View logs / Pause) instead of the setup wizard; the status header now includes the installed version. - Local dev builds:
bun run dev:installcompiles arbox-devbinary (<version>-dev+<sha>) for release-free on-machine testing (docs/dev-loop.md).
Fixed
- 0.9.1 shipped without its own headline status-honesty changes — a stale-base squash silently reverted them post-merge. Restored: amber "will be retried" for transient failures, live first-publish progress in the git-sync line, fresh-active precedence in the prompt glyph.
- A file vanishing mid-push no longer aborts the whole push (constant on live trees with agents/builds churning); it defers like any churning file and the stable subset commits.
- Git capture failures name their real reason (repo-context / HEAD probes) instead of the generic "capture returned nothing".
- Recovery from very large missing-blob sets pages through honestly (bounded 422 responses carry the total; progress refunds the retry budget).
#[0.9.1] — 2026-07-06 — status honesty + capture fixes
Changed
rbox statusnever lies about liveness. A fresh active cycle leads with its live percentage; a standing failure renders in amber beneath it as "last attempt failed … — will be retried"; "sync halted" (red) is gone — a live daemon always retries. "git-sync: 0 repos synced" during a first publish now reports capture progress instead of implying idleness.
Fixed
- Case-drifted symbolic HEAD no longer permanently defers a repo's git capture (macOS case-insensitive checkouts: HEAD casing vs packed-refs casing). Capture normalizes to the ref store's casing; self-validation failures now report the real reason instead of "capture returned nothing."
#[0.9.0] — 2026-07-06 — worktree git-sync, live progress, network resilience, fast status
Born from a founder stress test: a first push over a 140-repo, 131k-file workspace, run as a real customer would.
Added
- Git-state sync for main clones with linked worktrees (design 68).
Primary repos using
git worktree(agent workflows, Conductor) now capture index/HEAD/stash via--single-worktree --all; applies defer whole-section when a ref collides with a branch checked out in a sibling worktree; in-tree scratch worktrees no longer re-upload the shared history once per worktree. - Live progress for the long sync phases. First pushes show
scanning… N filesandcapturing git state 3/140 — <repo>; the daemon feeds the same progress torbox statusand the zsh prompt glyph. - Network resilience on the sync path. Transient socket faults retry with bounded backoff (commit POSTs proven idempotent via the server's sequence CAS); stalled transfers time out (no-progress watchdog on downloads, size-scaled caps on uploads); network errors now say what dropped and that re-running is safe — raw runtime errors never reach the terminal.
- Resumable, hardened git-capture uploads. Capture stages under the
workspace's
.rbox/(immune to tmp reapers), sha-mismatch faults re-encrypt and retry like file blobs, GB-scale bundle uploads resume across attempts, and stale staging sweeps are pid-aware (a live capture is never swept).
Changed
rbox statusis ~11× faster on repo-heavy trees (design 69). 90s → ~8s warm on the stress-test workspace: status finally uses the on-disk hash cache, discovers repos during the one scan walk, pools the git probes, and skips unchanged repos entirely via a stat-only gitdir fingerprint cache (zero git subprocesses for a quiet repo).- Onboarding prompts tightened. Workspace naming is one prompt (ENTER
accepts the suggestion,
-skips); background-sync + autostart is one three-way select; first-push spinners explain the scan phase.
Fixed
- A transient network fault no longer discards an entire initial push.
- The 6GB-bundle capture failure mode (ciphertext truncated in
os.tmpdir()during long multipart uploads) is closed.
#[0.8.0] — 2026-07-04 — launch-readiness batch (designs 60-67)
Added
- Self-serve genesis (design 60). Cold accounts created via web signup or
device-code
rbox loginmint their first encryption keys withrbox key genesis;rbox setupruns it inline on the first machine. - Daemon autostart (design 61).
rbox autostart enable|disable|statusregisters a per-user login agent that restarts background sync after reboot or re-login. rbox usage+ quota UX (design 62). A dedicated command for plan limits vs current usage; typed402 quota_exceedederrors name the cap and next step.- Data export (design 65).
rbox exportdecrypts every workspace under your keys and writes a directory or.tar.gz.
Changed
- Team checkout disabled (design 63). Team is listed but not purchasable across the CLI, web, and pricing surfaces; the server rejects Team checkout intent before any Stripe call.
Security
- Abuse hardening (design 64). Rate limits on the anonymous edge (device-code start/poll, release, link/pair) plus a per-account durable-device cap.
#[0.7.1] — status probe elision
rbox statuselides the remote-head probe when the local daemon is live and attributable to the current workspace (design 59); JSON status fetches account usage separately.
#[0.7.0] — doctor, diagnostics, recovery kit
rbox doctor+ opt-in plaintext support-report upload (design 56).- Recovery kit:
--kit/--kit-pathwrite the 24-word phrase to a0600file, tracked byrbox key status(design 58). - Setup picker UX polish; dev-gated bootstrap
--plan.
#[0.6.8] — destructive-apply safety
- Local trash tier (
rbox trash list|restore|empty), type-flip healing, and a push-side mass-delete guard (design 50).
#[0.6.7] — rbox.yml revival + usage guide
- Scoped
rbox.ymldesign revival and the narrative usage guide; thedepsCLI group disabled/commented out (design 51).
#[0.6.6] — daemon IO priority
- Daemon disk-IO priority + idle safety-scan backoff (design 49).
#[0.6.5] — browser-optional login
- Browser-optional device-code login (design 47).
#[0.6.4] — zsh integration
- zsh shell integration: ambient sync status in the prompt + completions (design 46).
#[0.6.3] — status health
- Status health verdict, daemon activity sidecar, and live transfer percentages (design 45).
#[0.6.2] — rebind safety
- Rebind safety: stream-ownership stamp + mass-delete guard, closing the design-44 mass-delete incident.
#[0.6.1] — maintainability pass
- Behavior-preserving module splits across the engine, CLI, and API (antislop refactor pass).
#[0.6.0] — 2026-07-01 — nested-repo git sync
- Nested-repo git sync: per-repo GitSections, worktree materialization, all E2EE (design 43).
#[0.5.7] — 2026-07-01 — daemon rebind self-heal + dashboard rebuild
- Stale-daemon rebind detection, forensic sync logs, and ignoring
.gitpointer files (#42); setup sends the prompted workspace name on the create path (#40). - Batched the blob-check push preflight D1 reads (serial →
db.batch) (#39); customer dashboard rebuilt on Tailwind v4 + shadcn-svelte (#41).
#[0.5.6] — 2026-07-01 — bulletproof live-folder sync
- Snapshot-first encryption, safe against concurrent writes (#37); churning files now defer instead of aborting the whole push (#38).
#[0.5.5] — 2026-07-01 — setup names + live-folder resilience
rbox setupprompts for a workspace name (#35); push self-heals a live-folder TOCTOU (sha_mismatch) (#36).
#[0.5.4] — 2026-07-01 — interactive CLI revamp
@inquirerinteractive surfaces + pick-workspace-by-name (#34).
#[0.5.3] — 2026-07-01 — download grants (design 27 client)
- The client presents signed download grants on blob GET, taking D1 off the blob-GET hot path (#32).
#[0.5.2] — 2026-07-01 — workspace names + track picker
- Opt-in, server-visible workspace names in status, plus a pick-from-list for track-existing (#31, #33); admin cockpit gains the Analytics-Engine SQL read path (§25 Plane A) (#30).
#[0.5.1] — 2026-07-01 — verify every upload path
- Manifest signature is now verified on every upload path (#26).
#[0.5.0] — 2026-07-01 — watcher scale + global daemon logs
@parcel/watcherbackend: RSS 11 GB → 60 MB and no more dropped events (§41) (#24). Daemon logs/pid move under~/.rbox(#21), andrbox statusshows account/plan/link status (#19). arm-Mac + Linux only.
#[0.4.3] — 2026-07-01 — installer PATH + phase metrics
- Installer persists PATH; the daemon no longer spawns from the compiled-binary help menu (#16). Coarse client phase metrics (§35) (#17).
#[0.4.2] — 2026-06-30 — native log tail + observability
rbox logsbecomes a real native daemon log tail (#14). Self-serve account + data deletion (GDPR/CCPA, design 37) (#12); §32 observability — Slackpipes pings, Tail Worker, admin cockpit (#13); §33 per-account entitlement GC.
#[0.4.1] — 2026-06-30 — multi-device fix + security email
- Fixed the §31 admission-grant
notAfterthat bricked multi-device accounts (P0). New-device security emails via Cloudflare Email Service (#10, #11); §30 large-ref commit accounting lifts the 6002-ref cap.
#[0.4.0] — 2026-06-30 — version history + CLI redesign + device dashboard
- CLI redesign:
rbox start/setup,track/untrack, adepsgroup,--help, and dependency-drift notifications (#9). Device-management dashboard (§22) (#5).
#[0.3.2] — 2026-06-30 — CLI redesign groundwork
rbox --help/-hexit 0; the §29 CLI command redesign was finalized.
#[0.3.1] — 2026-06-30 — version history under E2EE
- Version history + restore under E2EE (design 12 §15); a device-management
dashboard (devices route + revoke + unlink); the CLI defaults to the prod API
(
api.rbox.to);rbox versions .lists the whole workspace.
#[0.3.0] — 2026-06-30 — git-sync under E2EE
- §28 git-sync under E2EE — git artifacts encrypted, default on. §24 blobRef sidecar makes the signed commit body O(1); upload/download concurrency raised to 64.
#[0.2.0] — 2026-06-30 — upload receipts (~6× faster sync)
- §23 upload-receipts (direct-write) cut sync time ~6×. Account linking
(design 21):
rbox account link/status/unlinkplus a dashboard "Link your CLI account" flow; §25 server observability streams per-op R2/D1/DO timing to Analytics Engine.
#[0.1.2] — 2026-06-29 — concurrency knee
- Default upload/download concurrency 16 → 32 (measured knee) + a bench harness.
#[0.1.1] — 2026-06-29 — sync perf + empty-file fix
- Concurrent blob upload/encrypt and download with push/pull progress; empty-file round-trip fixed; concurrent-push bugs found dogfooding a real repo. Dashboard redesign (#1).
#[0.1.0] — 2026-06-29 — first release: sync engine, control plane, CLI
- Initial rbox: a continuous daemon (watcher + live push), a streaming / multipart / resumable blob path, opt-in git-state sync, convergent E2EE blob encryption, version history + restore, reachability GC + retention, multi-tenant isolation, self-hosted device-token auth + machine pairing, plan/quota enforcement, Stripe billing (checkout/portal/webhook), and a Clerk-authenticated web dashboard.