Skip to main content

CLI reference

Every command accepts -h / --help.

Global options​

These go before the command: freepod --verbose deploy.

OptionDescription
--verboseshow extra detail
--quietsuppress progress and diagnostics; results and errors still appear
--timeout SECONDShow long to wait for the current operation before giving up (defaults: login 300s, build 1800s, rollout 600s)
--versionShow the version and exit.

freepod bucket​

freepod bucket [OPTIONS] COMMAND [ARGS]...

Your app's object storage bucket.

bucket status shows the bucket, its S3 endpoint and credentials, and how much of its limits it uses. The other commands work with its objects directly, from this machine. Mark the bucket's side of a path with a leading colon; : alone is the bucket's root:

freepod bucket ls -l :uploads
freepod bucket cp ./assets :public upload a directory
freepod bucket cp :exports/report.csv . download one object
freepod bucket link :exports/report.csv a URL to share

Your running app already has the same credentials in its environment (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_ENDPOINT_URL, and S3_BUCKET).

freepod bucket cat​

freepod bucket cat [OPTIONS] PATHS...

Write objects to stdout, exactly as stored.

Several objects are written one after another, in the order given.

freepod bucket cp​

freepod bucket cp [OPTIONS] SOURCE DESTINATION

Copy files or objects between here and the bucket, or within it.

Mark the bucket's side with a leading colon; the marked side decides the direction. A directory or prefix is copied recursively, with no flag:

freepod bucket cp photo.jpg :images/ to images/photo.jpg
freepod bucket cp photo.jpg :cover.jpg to exactly cover.jpg
freepod bucket cp ./site :public a whole tree
freepod bucket cp :public ./backup and back
freepod bucket cp :public :public-old within the bucket

Existing files and objects are overwritten. Keys that would land outside the destination are skipped and reported.

freepod bucket link [OPTIONS] PATH

Print a presigned URL for one object.

Anyone holding the URL can download the object (or, with --put, upload to the key, as in curl -T file URL) until it expires, with no other credentials. The URL is the only output.

OptionDescription
--puta URL that uploads to the key, instead of downloading it
--expires DURATIONhow long the URL works: a number with s, m, h or d; at most 7d [default: 1h]

freepod bucket ls​

freepod bucket ls [OPTIONS] [PATH]

List a prefix of the bucket, or the root when no path is given.

Sub-prefixes are shown with a trailing /. The leading colon is optional: the path is always the bucket's.

OptionDescription
-lshow each object's size and last-modified time
-rlist every object under the prefix, recursively

freepod bucket mv​

freepod bucket mv [OPTIONS] SOURCE DESTINATION

Move files or objects: copy them, then delete each source.

Takes the same paths as cp. A source is deleted only after its copy has completed; one that could not be copied is kept and reported. Within the bucket, nothing is downloaded.

freepod bucket rm​

freepod bucket rm [OPTIONS] PATHS...

Delete objects, or with -r everything under a prefix.

There is no undo: the bucket keeps no previous versions. The leading colon is optional; local files are never touched.

OptionDescription
-rdelete everything under a prefix

freepod bucket status​

freepod bucket status [OPTIONS]

Show this deployment's bucket, endpoint, credentials and usage.

The secret key is masked unless --show-secret is given.

OptionDescription
--show-secretprint the secret key instead of masking it

freepod builds​

freepod builds [OPTIONS]

List this project's builds, most recent first.

The build the deployment is currently running is marked with *. --verbose shows image references in full.

OptionDescription
--limit Nhow many builds to show (default: 20)
--allshow every build, ignoring --limit

freepod cp​

freepod cp [OPTIONS] SOURCE DESTINATION

Copy a file or directory between here and this deployment.

Mark the deployment's side with a leading colon; the other side is local, and which one is marked decides the direction:

freepod cp report.csv :/app/report.csv copy in
freepod cp :/app/out.log ./out.log copy out
freepod cp ./assets :/app/assets a whole tree, no flag needed

A relative remote path means what it means in freepod shell. Directories carry their structure and their files' modes; owners and timestamps are not preserved. Directories are always copied recursively. Nothing has to be installed in your image for this to work.

freepod db​

freepod db [OPTIONS] COMMAND [ARGS]...

Your app's PostgreSQL database.

db status shows the database and role name, the password, and storage usage. db shell opens an interactive psql session. db proxy forwards a local port to the database and prints a connection URL for it.

Your running app already has the connection details in its environment (DATABASE_URL, PG*). The database is not reachable from this machine directly; db shell and db proxy connect over SSH.

freepod db proxy​

freepod db proxy [OPTIONS]

Forward a local port to the database and print a connection URL.

The tunnel runs in the foreground until you press Ctrl+C. The URL points at the local end of the tunnel, so any client on this machine can use it. It is the only output on stdout.

OptionDescription
--port PORTthe local port to listen on (default: 5432, or a free port if that one is in use)

freepod db shell​

freepod db shell [OPTIONS]

Open an interactive psql session in this deployment's database.

psql runs on the platform, so no PostgreSQL client is needed on this machine, and the session works even when your app is down. Exits with psql's exit code.

freepod db status​

freepod db status [OPTIONS]

Show this deployment's database, role, password and storage usage.

The password is masked unless --show-password is given.

OptionDescription
--show-passwordprint the password instead of masking it

freepod delete​

freepod delete [OPTIONS]

Delete this project's deployment and everything it stores.

Asks for confirmation first, then waits until the deletion has finished; the hostname cannot be reused before then.

.freepod.json keeps its settings, so a later freepod deploy creates a new deployment under the same hostname.

OptionDescription
-y, --yesskip the confirmation prompt (required when not run from a terminal)
--no-waitreturn once the deletion has started instead of waiting for it to finish

freepod deploy​

freepod deploy [OPTIONS]

Build the current project and release it to its deployment.

Uploads the project directory, builds an image from it and releases it. The first deploy also creates the deployment, which shows a placeholder page until the first build is live. Settings are checked before anything is uploaded, so most mistakes are reported in seconds rather than after a build.

The live address is the only output on stdout; build output and progress go to stderr, so URL=$(freepod deploy) captures the address.

OptionDescription
--recreatecreate a new deployment instead of updating the current one, which keeps running
--no-gitignorealso upload files that .gitignore excludes
--no-buildredeploy the current image without building, e.g. to apply staged vars

freepod init​

freepod init [OPTIONS]

Set up the current directory as a Freepod project.

Asks for the project's settings, such as its hostname, and writes them to .freepod.json, which is meant to be committed. Nothing is deployed until you run freepod deploy.

OptionDescription
--forceoverwrite an existing .freepod.json; its deployment keeps running but is no longer linked to this project

freepod key​

freepod key [OPTIONS] COMMAND [ARGS]...

Register the SSH public keys that identify you to the platform.

shell, cp, db shell and db proxy connect over SSH and need a registered key. A key belongs to your account and works for every deployment you own. Removing a key revokes its access.

Registering a key also makes it the one this machine uses, so connections offer exactly that key.

freepod key add​

freepod key add [OPTIONS] [PATH]

Register a public key, generating one if no PATH is given.

With no PATH, generates an Ed25519 key in freepod's configuration directory (not ~/.ssh) and registers it. With a PATH, registers that public key file. Either way, the key becomes the one this machine uses.

Naming a key that is already registered makes it this machine's key without registering it again.

OptionDescription
--label TEXTthe name key list shows (default: the key's comment)

freepod key list​

freepod key list [OPTIONS]

List the keys registered on your account.

The key this machine uses is marked with *.

freepod key rm​

freepod key rm [OPTIONS] FINGERPRINT

Revoke a key by the fingerprint freepod key list shows.

Works for keys this machine does not hold, such as one on a lost laptop.

freepod log​

freepod log [OPTIONS]

Print this project's application output.

Application output goes to stdout and freepod's own messages to stderr, so freepod log > app.log captures only your app's output.

With -f the stream stays open, including across redeploys.

OptionDescription
-f, --followkeep the stream open and print lines as they arrive
-n, --tail LINEShow many recent lines to show first (default: set by the platform)
-r, --release NUMBERpin to one release by its number, including one that failed and was rolled back
-t, --timestampsprefix each line with the time the platform recorded for it

freepod login​

freepod login [OPTIONS]

Sign in to Freepod and store the credential on this machine.

Opens a browser when one is available; otherwise prints a URL to open on any device.

OptionDescription
--loopbacksign in through a browser on this machine
--devicesign in by opening a URL on any device, for machines without a browser
--forcesign in again even if a stored credential is valid

freepod logout​

freepod logout [OPTIONS]

Remove the stored credential from this machine.

The credential stays valid until it expires or is revoked from your account settings.

freepod releases​

freepod releases [OPTIONS]

List this project's releases, most recent first.

A release is one rollout of the deployment: a new build, changed vars, or changed settings. The release currently running is marked with *, and its number is what freepod log -r takes. --verbose shows image references in full.

OptionDescription
--limit Nhow many releases to show (default: 20)
--allshow every release, ignoring --limit

freepod shell​

freepod shell [OPTIONS] [COMMAND]...

Open a shell in the app's container, or run COMMAND in it.

With no COMMAND the session runs on your own terminal and stays until you leave it. This is the command for a deployment that is up but misbehaving — the container is reachable even when the app inside it is not.

With a COMMAND it runs there and exits, the way ssh host COMMAND does: the words are joined and interpreted by the container's own shell, so quote a pipeline as one argument to keep it whole. Its input and output are this terminal's, so freepod shell cat app.log > local.log works.

Either way the exit code is the remote side's, with one ambiguity ssh itself has: 255 is also what ssh reports for its own failures.

OptionDescription
-t, --ttyallocate a terminal for COMMAND — for a full-screen program such as top or an editor, which needs one to draw

freepod skill​

freepod skill [OPTIONS] COMMAND [ARGS]...

Install the deployment instructions for your coding agents.

The skill is a SKILL.md file that tells a coding agent what an app needs to run on Freepod and how to deploy it with this CLI. It ships with the CLI, so it always matches the installed version.

freepod skill install​

freepod skill install [OPTIONS]

Install the skill where your coding agents will find it.

With no options, installs for every supported agent whose configuration directory exists on this machine. --agent and --all choose agents explicitly; --dest writes the file to an exact path.

Existing copies are replaced. Every other freepod command also keeps installed copies current and installs for newly detected agents, unless FREEPOD_NO_SKILL=1 is set. The installed paths are printed to stdout, one per line.

OptionDescription
--agent NAMEinstall for this agent whether or not it is detected; repeatable
--allinstall for every supported agent
--projectinstall into this directory's per-agent skill folders rather than the home directory
--dest PATHwrite SKILL.md to this exact path instead, for an agent not listed

freepod skill show​

freepod skill show [OPTIONS]

Print the packaged skill to stdout.

Use it for an agent install does not support, or to read the skill before installing it.

freepod var​

freepod var [OPTIONS] COMMAND [ARGS]...

Manage your app's environment variables.

Setting or removing a var redeploys the app so the change takes effect; --stage saves the change for the next deploy instead.

A var set with --secret is write-only: it is listed with its value hidden, and no command can print it back.

freepod var get​

freepod var get [OPTIONS] KEY

Print one var's value.

Fails for a secret var, whose value cannot be read back.

freepod var list​

freepod var list [OPTIONS]

List this deployment's vars.

The --json output can be piped back into freepod var set -f -. Secrets appear without a value, and an entry without a value leaves that var unchanged.

OptionDescription
--jsonprint the vars as JSON

freepod var rm​

freepod var rm [OPTIONS] KEYS...

Remove vars and redeploy.

Removing a var that is not set succeeds and changes nothing.

OptionDescription
--stagesave the removal without redeploying

freepod var set​

freepod var set [OPTIONS] [ASSIGNMENTS]...

Set vars and redeploy so they take effect.

Accepts KEY=VALUE pairs, a bare KEY to be prompted for without echo, or -f FILE. Several vars in one command are applied in one redeploy.

--stage saves them without redeploying, which also works while a deploy is in progress. freepod deploy --no-build applies staged vars.

OptionDescription
--secretstore these vars write-only
-f, --file FILEread vars from FILE: KEY=VALUE lines, or JSON as printed by var list --json; '-' reads stdin
--stagesave the vars without redeploying

freepod whoami​

freepod whoami [OPTIONS]

Show the account you are signed in as.