Backward compatibility is permanent
Any repository written by any released version of Cloudstic remains readable by every later version, forever. There is no deprecation window and no expiry date on this guarantee. Support for old repository layouts may be refactored or made faster internally, but it is never removed, and it never changes behavior. Concretely, this meanslist, ls, check, cat, diff, and restore all keep working against a repository no matter how old it is. Writing to an old repository (backup, prune, forget) is also supported, and may upgrade parts of the repository’s on-disk format in place as a side effect.
You never need to run a migration command. Opening an old repository with a current build of Cloudstic just works.
Newer repositories, older builds
The reverse direction is not guaranteed: an older Cloudstic build is not guaranteed to fully understand a repository written by a newer one. Formats do change over time, and that’s expected. What Cloudstic guarantees instead is that this situation fails safely. An older build that encounters a repository format it doesn’t recognize will refuse to operate on it, rather than silently misreading it. If you try, you’ll see an error like:Why the gate matters: don’t confuse “unreadable” with “empty”
The reason Cloudstic refuses outright, instead of doing its best with what it can parse, is a specific and serious failure mode: treating an index that failed to load as if it were an empty index. An empty index legitimately means “nothing is referenced.” But a failed-to-load index means “we don’t know what’s referenced” — and those are very different statements. If a garbage collector (prune) ever confused the two, it would see “nothing is referenced” and delete everything, including live, healthy data it simply failed to read.
This isn’t hypothetical. An early Cloudstic release, pointed at a repository containing a data structure it couldn’t decode, reported 0 snapshots with no error — and running prune against it deleted the repository’s packfiles. That incident is why the version gate exists: any build that cannot fully understand a repository now refuses to touch it at all, rather than guessing.
How repositories actually get upgraded
There is no separate “migrate this repository” command, and no moment where a repository becomes “fully upgraded.” Upgrades happen in place and opportunistically, as a byproduct of normal write operations:- The first time a newer Cloudstic build runs
backup,prune, orforgetagainst an older repository, it may write some data in the newer format alongside data still in the old format. - Only the parts of the repository actually touched by that write get upgraded. Everything else stays as it was.
Summary
This is a deliberate design tradeoff: Cloudstic would rather stop you with a clear error than risk destroying your backups by guessing at a format it doesn’t fully understand.
See also
- Storage Model: how objects, packfiles, and indexes are laid out on disk
- cloudstic check: verify repository integrity