How to deploy a static site from an AI agent
Run npx flypod ./dist from any coding agent to get a live URL back on stdout, with no account and no config. Covers the one-line deploy, teaching the agent to do it unprompted, and making the URL permanent.
To deploy a static site from an AI agent, have the agent run npx flypod ./dist
— it prints a live URL to stdout and needs no account, config, or API key.
Run npx flypod install skill once and the agents in that repo learn the
command themselves, so "deploy this" is enough.
The one command
npx flypod ./disthttps://a3f1c2d4e5b60789.flypod.pageThe URL is the only thing on stdout; the receipt goes to stderr. So an agent can capture it directly:
URL=$(npx flypod ./dist --quiet)Or parse structured output:
npx flypod ./dist --json | jq -r .urlflypod detects a non-TTY stdout and drops the animation on its own, so this works unchanged inside an agent's shell tool.
Teach the agent to do it without being told
npx flypod install skill writes the flypod Agent Skill into the repo:
npx flypod install skillIt writes the same skill to both directories agents read —
.claude/skills/flypod/ for Claude Code, and .agents/skills/flypod/ for
Codex, Cursor, Gemini CLI, and Copilot. Each contains a short SKILL.md the
agent loads when deploying comes up, plus reference docs it opens on demand: shipping updates to
the same URL, publishing Markdown, collecting comments on a preview, and
troubleshooting. Re-running it is safe. Add --global to install into your
home directory instead of the repo, --list to see the paths, or --dry-run
to preview; in a terminal it asks which agents to install for, and -y writes
every target without asking.
If you already manage your agent skills with
skills, install it that way instead:
npx skills add flypod-dev/flypod-skillBoth install the same files. See flypod install skill
for the full target list and flags.
Agents can also read these docs directly: /llms.txt for the index
and steering block, /llms-full.txt for the whole corpus, or
append .md to any docs URL for its raw Markdown.
Ship a change to the same URL
The first flypod in a folder creates the site. Every later flypod in the
same folder updates it: same URL, a new version. update is the explicit
spelling of the same thing:
npx flypod ./dist --quiet # the second time: updates the same site
npx flypod update ./dist --quiet # the same, said outrightflypod links the working directory to its site, so no ID is needed. The
--json receipt says which happened: action is "created" or "updated".
Only when the user asks for a separate site does the agent run
npx flypod --new; the earlier site stays live. It is safe
to run on every iteration of a loop: the version id is the content hash, so a
run with identical files reuses the version that already exists and adds nothing
to the site's history. Undo with flypod rollback.
Make the URL permanent
Anonymous deploys expire after 14 days. Deploying while logged in makes the site owned and permanent:
flypod login # opens a browser to approve this machine
npx flypod ./distFor a headless agent or a CI job, pass an existing session token instead of logging in:
# FLYPOD_TOKEN is read straight from the environment. Set it from your
# secret store; the CLI needs no login file and writes none.
npx flypod ./dist --quietflypod login also auto-claims every anonymous site the CLI remembers, so
nothing deployed earlier is lost.
Keeping the site, from an agent
The agent cannot open a browser, so it hands that one step to the person:
- The agent runs
flypod login --json(the receipt'snext.keep). It returns at once with a sign-in URL and a code. - The agent gives the person the URL and asks them to confirm the code.
- Nothing else. Once they have confirmed, the agent's next flypod command,
whatever it is (a deploy,
flypod list), finishes signing in and keeps every site on the machine, then runs signed in.
No polling loop is needed. To finish at once, flypod login --device-code <code> --json waits up to 25 seconds for the confirmation. See
Signing in from an agent.
Limits worth knowing
- Static only. HTML, CSS, browser JavaScript, images, and Markdown. No server-side code, functions, or databases.
- Size cap. 200 files / 10 MB per deploy on flypod.dev. The CLI checks
before uploading and fails with
too_large. - A folder of Markdown with no root
index.htmlis rendered into a docs site. See Render Markdown.