pylon binary covers every operator task: the dev loop, deploys, secrets, logs, db, data, domains, deployments, members, and project health. Anything you do from the Stack0 Cloud dashboard, you can do from the CLI and pipe to other shell tools.
Install + sign in
PYLON_CLOUD_URL overrides the default https://www.pylonsync.com for staging or self-hosted Stack0 Cloud installs.
Project context
Most commands target a single project. Resolution order (first match wins):--project <slug>flag on the commandPYLON_PROJECTenv var.pylon/projectfile in cwd or any ancestor (written bypylon projects use)- Interactive picker (TTY only)
Create
pylon projects create <slug> provisions a project on Stack0 Cloud without the
dashboard. It creates the project in your org, waits for the machine to start
(usually under a minute; --db postgres adds a managed-database provision first),
pins the slug as your local context, and prints the live https://<slug>.stack0.app URL.
--json the final line is a single machine-readable object
({"ok":true,"slug":"my-app","status":"running","url":"https://my-app.stack0.app",...}),
so agents and scripts can chain directly into pylon deploy.
Test
pylon test runs each test file with Bun against an in-memory Pylon. It exits non-zero on failure, so it fits into CI. pylon test:security is a separate probe that calls a running app and reports auth/policy holes. See the Testing guide for the unit, component, and HTTP patterns.
Audit
pylon audit checks a running app for search and page-quality problems. Run it before you finish a public site.
Sitemap lines, else /sitemap.xml). Without a sitemap, it uses the static routes in pylon.manifest.json. Without those, it uses the links on the home page.
It checks each page for these problems:
- An HTTP status of 400 or more.
- A missing, duplicate, too short, or too long
<title>. - A missing, duplicate, too short, or too long meta description.
- No
<h1>, or more than one. - A missing, relative, or duplicate canonical link.
- No
langon<html>, and no viewport meta tag. - No
og:title,og:description, orog:image. Theog:imageURL must return 200 with an image content type. - Images without an
altattribute. - JSON-LD that does not parse. The home page must have JSON-LD with an Organization or LocalBusiness (or a subtype such as Restaurant).
- Internal links that return 404 or another error.
noindexon a page that the sitemap lists.
Sitemap line), the sitemap XML, and pages that the app links to but the sitemap leaves out.
When Chrome or Chromium and Node.js 22.19 or newer are present, the audit runs Lighthouse 13.5.0 for performance and accessibility, through bun x. It finds Chrome from CHROME_PATH, then chromium or google-chrome on PATH. Without Chrome or Node.js, the report says so and the other checks still run. pylon dev adds dev-only scripts to each page. For performance numbers that match production, audit pylon start or the deployed URL.
Each problem has a one-line fix. The exit code is 1 when there are errors and 0 when there are only warnings. It is 69 when nothing answers at the URL.
Deploy
pylon deploy (no flag) runs the hosted deploy. The other targets write IaaS config files to ./deploy/.
What the hosted deploy uploads
pylon deploy uploads the project directory, at most 50 MB, minus:
- whatever
.gitignoreand.pylonignorefiles in the project ignore. Both use gitignore syntax, including nested files,**, and!negation. Put paths you commit but do not ship (videos, design files, agent worktrees) in.pylonignore. Rules above the project directory and your global git excludes do not apply. - always, whatever the ignore files say:
.git,node_modules,.pylon, build output next to its manifest (targetbesideCargo.toml;dist,build,.next,.turbo,.vercel,.cachebesidepackage.json),.envand every.env.*except*.example, and.DS_Store/Thumbs.db.
pylon.manifest.json and the app’s shard modules ship even when ignored.
Secrets
syncSecretsToFly immediately so the running machine sees the new value within ~10s (no redeploy required).
Logs
kind: unavailable (machine stopped, framework predates the tail endpoint, etc.) — backs off to 30s until the surface comes back.
Database
Copy a SQLite app to Postgres
pylon db copy copies all of a SQLite app’s data into an empty Postgres database. It runs on the files, so it needs no login.
- the entity rows, with encrypted fields as they are stored
- the auth state, jobs, workflow runs, CRDT documents and the change log
- the search index, which it fills on Postgres
--to defaults to DATABASE_URL. --manifest defaults to pylon.manifest.json. The copy refuses a database that already has rows. It reads the SQLite files and does not change them.
To copy when the server starts, set PYLON_IMPORT_FROM_SQLITE=/data/pylon.db together with a Postgres DATABASE_URL. The server copies the data before it accepts requests. If the copy fails, the server does not start, and it writes the error to _pylon_sqlite_import_failures. Later starts find the finished copy and skip it.
Data browser
Domains
pylon-<slug>.fly.dev hostname is always available regardless.
Deployments
Members
owner, admin, member.
Status
Jobs
/admin/jobs on the project’s machine through Stack0 Cloud. Owner / admin only. A cron that stopped writing shows up here as a failed row with its function name and error.
JSON mode
Every command accepts--json and emits parseable output for scripts: