arcave 0.1.0-alpha.5
arcave 0.1.0-alpha.5 was released on 2026-11-11. See what a compose project runs and which savepoint a rollback put there, look into one session, and name a safety snapshot by the rollback it was taken before.
warning
This is still an alpha. Commands, flags, output, config keys and the storage format may change between alpha releases with no migration path. Savepoints taken with alpha.4 may not be readable by alpha.5. Do not use it in production yet.
Breaking changes
arcave rollback --no-safety-snapshotreplaces--safety-snapshot=false. Both flags are plain switches now and take no value:--safety-snapshottakes a safety snapshot even underrollback.safety_snapshot: false,--no-safety-snapshottakes none, and the two cannot be passed together. Without either, the config decides.ARCAVE_COMPOSE_PROJECT_NAMEnames the compose project.ARCAVE_PROJECT_NAMEno longer does: it is only the config keyproject.name, the storage tenant, as everyARCAVE_<KEY>is. A shell that exports it keeps its tenant and now has to name the compose project with-por the new variable.- The MCP tools'
projectargument iscompose_project. savepoint remove --retain-recent 0deletes every savepoint of the compose project in the session the command works in, and so doesretain_recent: 0in the MCPsavepoint_removetool, which now takesnulltoo. Both used to be refused as no selector. Safety snapshots are untouched. Omitting the flag or the field, or sendingnull, still means no recency rule.session listnames the current session bycurrent_source, notcurrent. The JSON fieldcurrent: true|falseis gone; the current session carriescurrent_source, which says where it was named —{"source": "flag"},"env","pointer"or"default"— and is absent on every other. The same holds for the MCPsession_listtool. Each entry also gainssafety_snapshot_count, and the terminal table aCOMPOSE PROJECTScolumn, itsSTATUScolumn shown only under--all.savepoint removerefuses--retain-recent 0beside an id or name, and a negative--retain-for.0with ids was silently ignored and is now a selector conflict, as any other retention rule there is; the same holds forretain_recent: 0withrefsin the MCPsavepoint_removetool.--retain-for -1h(andretain_for: "-1h") used to delete everything and is now refused withretain-for must be zero or positive.--format autoprints text whenever stdout is a terminal. Before, it printed text only while the live tree was drawn, so--progress log,--log-format jsonor a redirected stderr turned the result into JSON on a terminal. A pipe or a file still gets JSON;--format jsonorARCAVE_FORMAT=jsonasks for it on a terminal.arcave tools generate-composenow has a text summary there too.- A safety snapshot has no name;
taken_before_rollback_tosays which rollback it was taken before. It was namedsafety-snapshot-<id of the rollback's target>, which read as the target and selected nothing. Now itsnameis""in every record (savepoint list,session show,rolled_back_to,removed, the MCP tools), and the newtaken_before_rollback_to: {"id", "name"}names that rollback's target as it was named then. InstatusJSON,deployment.savepoint.nameis absent for a safety snapshot, and the container labelio.arcave.deployment.savepoint-nameis"". On a terminal a safety snapshot lists asbefore rollback to <target> (safety), and rolling back to one printsRolled back to the state before rollback to <target> · <id> · <time>.
New
arcave status.arcave status -p <compose-project>shows what the Docker daemon runs for a compose project: the savepoint a rollback deployed, from which session and when, each replica's state, health and ports, the containers recreated outside arcave since, and a rollback in progress or interrupted. It takes no lock and writes nothing. Every rollback now labels the containers it builds withio.arcave.deployment.*, whichstatusreads, so it answers even after the savepoint is removed; the store only adds the savepoint's record, and a store it cannot read leaves the result partial (exit1), not failed. Every warning carries a stable code, explained inarcave status. The MCP server serves it as thestatustool.arcave session show [<session>]. One session's savepoints, every compose project's at once and newest first, safety snapshots among them and counted apart, and the session it was forked from by id and current name. It reads the store alone: no daemon, no lock, no-p.latestnames the newest session,currentthe one a command works in; both work insession create --fromtoo.session list,showandcurrentsay where the current session was named —--session,ARCAVE_SESSION,session set, or the default — and which session an override hides. The MCP server serves it as thesession_showtool.- A rollback names the leftover volumes it overwrote. Rolling back a compose project taken down overwrites the named volumes
compose downkept, and no safety snapshot holds what they held. The result now lists them inleftover_volumesand warns of each, first and severe, on the terminal, in JSON and in the MCP tool.
Changed
savepoint createno longer compares its capture with the latest savepoint's. It warned when a unit's capture changed since then; what a savepoint does not hold is in itsnot_covered, as before, and the capture no longer reads the previous savepoint's spec from the store.- Turning encryption on over an arcave project that holds data is refused by every command, reading or writing, and leaves the project as it was. Before, the first command marked it encrypted and what it held became unreadable. Start an encrypted store at an empty location, or move savepoints across by hand.
github.com/greenmaskio/storages0.5.0, withgolang.org/x/crypto0.59.0 andgolang.org/x/net0.62.0: seven published advisories in the SSH and HTTP/2 code the SFTP and Azure storage reach.pkg/sftp1.13.12 rejects malformed server replies.
Fixes
- A rollback, its revert and
savepoint createno longer fail on a compose project whose one-shot service — a migration, a seed — exits0while no other service waits on it withservice_completed_successfully. arcave now waits for the start itself: an exit0is ready, any other exit fails. - Under
encryption.enabled, a command that writes nothing —savepoint list,session list— no longer marks the store encrypted, and the newstatusnever does. Before, any command did, and every host without the key was then refused untilencryption.jsonwas deleted by hand. - On Docker Desktop, a bind mount is recorded with its host path again. Its VM path (
/host_mnt/…) reached the savepoint's spec,tools generate-composeand a replica a rollback rebuilt whenever another mount came before it. arcave rollbackto an id or a name no savepoint carries says so right away, instead of after waiting for the session lock.- The savepoint create and rollback titles print the full savepoint id. The first eight characters were the same for savepoints taken within about a minute and no selector accepted them.
- A failure to open a command's dependencies is no longer wrapped in
init dependencies:; the failed step names itself. - gc's
FREEDtotal prints the known part with a+when some deletion freed an unknown amount, asSIZEdoes, instead of?.
Good to know before you rely on it
- The labels a rollback puts on its containers are plain text in the Docker daemon, the session's and the savepoint's names included, under
encryption.enabledtoo: anyone who candocker inspectthe containers reads them. statuson another machine, or against another daemon, does not see a rollback interrupted on this one:.arcave/inflight.jsonis local, so it readsabsentordegradedthere, notrollback-pending.- On Podman, a rollback does not put back what Podman does not store:
sysctls, a fixedipv4_address,domainnameand a few more. A project withlinks:does not run on Podman at all. - A savepoint taken on Docker is not meant to be rolled back on Podman, or the other way round. arcave checks nothing, and such a rollback can fail after the project has stopped.
- A gc on another machine sharing the store doesn't see a rollback interrupted on this one, and may delete the safety snapshot its recovery needs. Recover first.
- Lose the encryption key and the store is lost. There is no recovery key.
- The services stop during every savepoint and rollback, for longer when the volumes are large.
- After a rollback, running
docker compose upby hand recreates the containers from your compose file, and the restored container files are lost. Volume data stays.arcave statusnames the containers recreated that way. - On a store shared by several machines, run
arcave gcwithout--dry-runonly while no other machine works in the same session. In rare cases two machines claiming the store lock at the same moment both believe they hold it, and gc could then delete data another machine's savepoint has just reused. - SFTP storage does not check the server's host key yet.
The full list is in Limitations.