Skip to content
flypod
CLI reference

flypod [path]

Deploy a directory or single file to a public flypod URL; owned and permanent when logged in, otherwise anonymous with a 14-day TTL.

The default command deploys a directory or single file. Logged in, the deploy is owned and permanent. Anonymous, it lives 14 days; running flypod login later automatically claims every anonymous site this CLI remembers, so you don't need to track tokens to make a deploy permanent.

Synopsis

flypod [path]

With no path, flypod auto-detects the first of these directories that contains an index.html:

dist/
build/
out/
.output/public
.vercel/output/static
public/
_site/

The URL prints to stdout. The banner and hints print to stderr. In a non-TTY context, animation is stripped automatically. On success, flypod saves a folder-to-site link so flypod update knows where to ship next.

The deploy output shows no token. The site's manage_token is saved to projects.json (mode 0600) keyed by the folder you deployed from, which is how update, rollback, and versions work with no arguments. flypod token reveals it if you ever need the plaintext.

Flags

FlagDescription
--jsonEmit a single JSON object (see below). Includes the tokens.
-q, --quietPrint the URL on stdout. Nothing else.
-h, --helpPrint usage and exit.
-v, --versionPrint the CLI version and exit.

Examples

Deploy the auto-detected build directory:

flypod
https://k3p9x2.flypod.dev

Deploy an explicit directory:

flypod ./dist

Machine-readable output:

flypod ./dist --json
{
  "ok": true,
  "url": "https://k3p9x2.flypod.dev",
  "site_id": "k3p9x2",
  "version_id": "v_8f1a",
  "expires_at": null,
  "manage_token": "fk_...",
  "owner_account_id": "acc_...",
  "source": "dist",
  "files": 12,
  "bytes": 48213,
  "elapsed_ms": 742,
  "healed": ["spa-fallback"],
  "warnings": []
}

An anonymous deploy carries claim_token and an expires_at instead:

{
  "ok": true,
  "url": "https://k3p9x2.flypod.dev",
  "site_id": "k3p9x2",
  "version_id": "v_8f1a",
  "expires_at": 1781308800000,
  "manage_token": "fk_...",
  "claim_token": "fk_...",
  "source": "dist",
  "files": 12,
  "bytes": 48213,
  "elapsed_ms": 742,
  "healed": [],
  "warnings": [
    {
      "code": "not-spa",
      "fix_recipe": "Your index.html includes scripts but contains visible body content, so SPA client-side routing fallback is disabled. …"
    }
  ]
}

Notes

  • warnings lists problems that survived the deploy. Each has a code and a fix_recipe naming the change to make. A deploy can succeed and still be broken for visitors, so check warnings.length before you treat the URL as good. healed lists what flypod fixed for you — spa-fallback means it recognised a single-page app and unknown paths now serve index.html. Both arrays are always present, so no guard is needed.
  • Keys that don't apply are omitted, not set to null: an owned deploy has no claim_token key, an anonymous one has no owner_account_id key.
  • expires_at is epoch milliseconds on anonymous deploys, and null when the site is owned.
  • Use --quiet in scripts to capture the URL cleanly. It prints the URL on stdout and nothing else — no token.
  • To make an anonymous deploy permanent later, just run flypod login — it claims every anonymous site this CLI remembers, in one step.
  • See Tokens and ownership for how account sessions, manage_token, and claim_token differ.

Authenticate first with flypod login to get permanent, owned deploys from the start.

If flypod cannot write the folder link — a read-only or ephemeral FLYPOD_CONFIG_DIR, the classic CI container — it says so loudly and prints the manage_token, because at that point you are the only possible holder of it. Under -q that same case emits the token on stderr. This is the one moment the token belongs on screen.

On this page