Skip to content
flypod
Guides

Update & rollback

Ship a new version to a site, list its history, and roll back. The day-to-day loop, with no IDs to remember.

After the first deploy, you rarely type a site ID again. flypod links the current folder to its site, so the loop is: edit → update → check → roll back.

Ship a change

Edit your files, then push a new version to the same site:

flypod update
  ✓ Updated · version 8f1a0c2e is live

  https://a3f1c2d4e5b60789.flypod.page

  undo      flypod rollback  puts the previous version back
  expires   19 Oct 2026      in 14 days
  keep it   flypod login     free · removes the expiry

The new version is uploaded and goes live immediately. Each version is immutable. Plain flypod in the same folder does the same thing; to make a separate site from this folder instead, run flypod --new.

Versions are content-addressed: the version id is the hash of the files. Re-running flypod update with byte-for-byte identical content gives you back the same version id and adds nothing to the history. The bytes are still uploaded, and the CLI reports the version as live rather than printing a "no changes" message.

List history

flypod versions

Output is newest-first, with the live version marked:

  8f1a0c2e44b7d913  18 Jun 2026 14:22 UTC  ● live
  7c0d19e2a4b35f18  17 Jun 2026 09:11 UTC
  5a92c3d1e07b4a66  15 Jun 2026 18:40 UTC

Piped, the same list is tab-separated rows on stdout (version id, timestamp, and live on the live one), with the expiry date on stderr.

Versions that are not live are kept for 7 days, then deleted. The live version is never collected, however old it is, but you can only roll back to a version from the last week.

Roll back

With no argument, flypod rolls back to the previous version:

flypod rollback
  ✓ Rolled back · version 7c0d19e2 is live

  https://a3f1c2d4e5b60789.flypod.page

To target an exact version, pass its id or an unambiguous prefix:

flypod rollback 7c0d19e2a4b35f18
flypod rollback 7c0d

With no argument, flypod refuses to roll back if the site has only one version, or if the live version is already the oldest (no_such_version). Passing an id also works in the other direction: it makes a newer version live again after a rollback. A prefix that matches more than one version is a usage error; pass a longer one.

Multiple projects

If a folder isn't linked, or you're targeting a different site, pass --site:

flypod update --site a3f1c2d4e5b60789
flypod versions --site a3f1c2d4e5b60789
flypod rollback --site a3f1c2d4e5b60789

For an anonymous site on a machine that doesn't remember it, authorize the action with that deploy's manage_token — reveal it with flypod token on the machine that does:

flypod update --site a3f1c2d4e5b60789 --token <manage_token>
flypod rollback --site a3f1c2d4e5b60789 --token <manage_token>

--token needs --site here: a machine that doesn't remember the site has no folder link to find it by.

On your own machine you need none of this: the token is already stored with the folder link. And if the site is yours, flypod login on the second machine beats moving a token around.

If flypod update gets a 404 (the linked site no longer exists), flypod drops the stale folder link and fails with site_gone, telling you to run flypod to deploy fresh. A 401 or 403 fails with unauthorized; pass --token or log in. In a folder with no link and no --site, the commands fail with no_site before doing anything.

JSON & quiet

update, versions, and rollback all accept --json. update also accepts -q/--quiet (the URL on stdout, nothing else). When stdout is not a terminal, update and rollback print the URL on stdout anyway.

flypod update --json
flypod versions --json
flypod rollback --json
  • update returns site_id, version_id, url, expires_at, healed, warnings and next, the same shape as a first deploy.
  • versions returns live_version_id, versions (each with version_id and created_at in epoch ms), expires_at, and timeline.
  • rollback returns site_id, live_version_id and url.

Version history for visitors

flypod rollback changes the site for everyone. To let reviewers look at earlier versions without changing what is live, turn on the timeline:

flypod update --timeline        # ship a change and turn it on
flypod versions --timeline      # turn it on without deploying
flypod versions --no-timeline   # turn it off again

With it on, the site's pages show a History chip that opens earlier versions, each version is served at its own address (https://<site>--<version>.flypod.page), and https://<site>.flypod.page/_flypod/history compares two side by side. The --json output adds timeline: true and a history_url, and each entry in flypod versions --json gets a url. It is off by default because it makes replaced versions public; the live site is served the same either way. flypod ./dist --timeline turns it on at the first deploy. --history and --no-history are accepted as aliases.

Flags

CommandFlags
flypod update [path]--site <id>, --token <manage_token>, --timeline, --no-timeline, --json, --verbose, -q
flypod versions--site <id>, --token <manage_token>, --timeline, --no-timeline, --json
flypod rollback [version]--site <id>, --token <manage_token>, --json

Next steps

On this page