Export & the escape hatch
No lock-in is a stated product principle, so leaving has first-class API support. Two doors are always open:
Door one: it’s git
Every repo — including every fleet repo your agents created — is a standard git remote:
git clone https://x:$TOKEN@api.weft.sh/acme/session-8412.git
Whatever you clone is verified history; our CI gates every serving change on
git fsck --full --strict of the produced clone.
Door two: bundles
For bulk moves or archives, export server-side bundles:
# start the export (async)
curl -X POST …/repos/session-8412/export -H "Authorization: Bearer $TOKEN"
# → { "job": "01jm…", "state": "queued" }
# poll, then download
curl …/repos/session-8412/export/01jm…
curl -OJ …/repos/session-8412/export/01jm…/download
The artifact is a plain git bundle — clone it with nothing but git,
anywhere:
git clone session-8412.bundle restored/
Bundles are built from a freshly materialized, fsck-verified copy of the layout, so an export is also an integrity check.
The whole org at once
curl -X POST https://api.weft.sh/v1/orgs/acme/export \
-H "Authorization: Bearer $ADMIN_TOKEN"
starts one export job per active repo and returns all job ids. Point a script at the job list and you have a complete, standard-format copy of everything — which is exactly the position we want you negotiating renewals from.