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
| Flag | Description |
|---|---|
--json | Emit a single JSON object (see below). Includes the tokens. |
-q, --quiet | Print the URL on stdout. Nothing else. |
-h, --help | Print usage and exit. |
-v, --version | Print the CLI version and exit. |
Examples
Deploy the auto-detected build directory:
flypodhttps://k3p9x2.flypod.devDeploy an explicit directory:
flypod ./distMachine-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
warningslists problems that survived the deploy. Each has acodeand afix_recipenaming the change to make. A deploy can succeed and still be broken for visitors, so checkwarnings.lengthbefore you treat the URL as good.healedlists what flypod fixed for you —spa-fallbackmeans it recognised a single-page app and unknown paths now serveindex.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 noclaim_tokenkey, an anonymous one has noowner_account_idkey. expires_atis epoch milliseconds on anonymous deploys, andnullwhen the site is owned.- Use
--quietin 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, andclaim_tokendiffer.
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.