CLI
forks
storage forks lists every fork on the selected adapter. Human mode prints one name per line; JSON mode emits the full ForkInfo[] ({ name, fromSnapshot?, createdAt }):
storage forks
# experiment-a
# experiment-b
storage forks | jq '.[] | { name, fromSnapshot }'
# { "name": "experiment-a", "fromSnapshot": "snap-0193abc1234567890abcdef" }
# { "name": "experiment-b", "fromSnapshot": null }
fromSnapshot is set when the fork was seeded from a captured snapshot; null/undefined when seeded from the parent’s live state.
Flags
--adapter <name>(required, or setSTORAGE_ADAPTER).--json/--no-json— force JSON or human output.
Create and remove
The write surface lives under storage fork (singular):
storage fork create experiment-a # seeded from base
storage fork create experiment-a --from-snapshot snap-0193abc1234 # seeded from a snapshot
storage fork rm experiment-a # delete (idempotent)
fork rm is a no-op when the name doesn’t exist.
Scoping reads and writes
Every object command — both reads (ls, stat, cat, sign) and writes (cp, mv, rm) — accepts --fork <name> to redirect into a fork:
storage ls photos/ --fork experiment-a
storage cp ./image.jpg storage://image.jpg --fork experiment-a
storage rm storage://image.jpg --fork experiment-a
--fork composes with --snapshot — see Composing with --fork on the snapshots page.