Skip to main content

freepod

Take a local project directory to a running deployment on freepod.eu.

pip install freepod || uv tool install freepod
cd myapp
freepod login      # sign in through the browser
freepod init       # choose a hostname for this project
freepod deploy     # https://myapp.freepod.eu

deploy packs the working tree, uploads it, builds a container image on the platform and releases it. By the time the command returns, the app is live on its own hostname over HTTPS. Ship a new version by running it again.

There is no Dockerfile to write and nothing to configure: Railpack detects the stack — Node, Python, Go, Java, PHP, Ruby, Rust and more — and builds an image from your source as it is.

What you need

  • A Freepod account. freepod login opens the sign-in page, which is also where you can register.
  • Python 3.9 or newer, for the CLI itself. The project you deploy can be in any language Railpack supports.
  • An app that listens on $PORT. The platform assigns the port and passes it in the environment, so bind 0.0.0.0:$PORT (process.env.PORT, os.environ["PORT"], …) rather than a fixed number. An app that picks its own port receives no traffic.

Commands

Command What it does
freepod login Sign in, and remember the credential.
freepod init Set the current directory up as a project: choose a hostname, write .freepod.json.
freepod deploy Pack, build and release the current project.
freepod var Read and change the environment your application runs with.
freepod log Stream your application's pod output.
freepod builds List your builds, most recent first.
freepod releases List this project's rollouts, most recent first; the live one is marked.
freepod delete Delete this project's deployment.
freepod whoami Report who you are signed in as.
freepod logout Forget the stored credential.
freepod key Register the SSH public keys that identify you to the platform.
freepod db Report this deployment's database: name, role, password (masked), and quota state.
freepod skill Install deployment instructions for your coding agents.

freepod --help and freepod <command> --help cover the flags.

Database

freepod db status reports this deployment's database: which database and role it is, the password that owns it, and how much of the allowance is used. The password is masked by default — pass --show-password to print it.

The command prints no address and no connection URL, and offers no flag that prints one. The database is reachable only from inside the cluster, so a host or a postgresql:// URL here would connect from nowhere this machine can stand. The host, port and the one URL that will actually work belong to freepod db proxy, which is the command that establishes a tunnel and composes its own URL around its local address.

If the project records a deployment whose product offers no relational storage, the command says so plainly and exits successfully — the question was answered, not failed.

SSH keys

freepod key add registers an SSH public key on your account. SSH is used as transport for commands including freepod db and freepod shell.

Hostnames

init asks for one. A bare name becomes a subdomain of the platform: myapp is served at myapp.freepod.eu. To use a domain of your own, point a CNAME at freepod.eu first, then give init the full name. Certificates are issued and renewed for you either way.

Persistence

Deployments have no persistent disks or volumes. Whatever the app writes to its own filesystem is gone when it restarts, and at every release.

Instead, each pod has its own private S3-compatible bucket for object storage. Use with any aws-s3 client. S3_BUCKET, BUCKET_NAME and AWS_* environment variables and access keys are already set.

Each deployment also gets its own PostgreSQL database. Nothing to set up: DATABASE_URL and the usual PG* variables are already in the environment, so any ORM or psql connects as-is.

freepod db status shows the database name, role, password, and quota usage.

Environment variables

Inject environment variables in to your pod.

freepod var set LOG_LEVEL=debug        # sets it and rolls the deployment
freepod var set ADMIN_TOKEN --secret   # prompts without echo; write-only
freepod var list
freepod var rm LOG_LEVEL

Setting a var rolls the deployment, because that is what makes it take effect. Several in one command produce one rollout. --stage records them for your next deploy instead, and freepod deploy --no-build applies staged vars without rebuilding your entire project.

A var marked --secret is write-only: the platform never returns it, so var list shows its key with the value hidden and nothing can print it back.

.freepod.json

init writes it, and it is meant to be committed. It records the hostname you chose and which deployment this directory belongs to, so the next deploy — yours, a coworker's, or CI's — updates that same app instead of creating a second one. To change a value, edit the file; the next deploy applies it.

What gets uploaded

The working tree, minus .git/, anything your .gitignore excludes, and the usual build output (node_modules/, .venv/, __pycache__/, dist/, …). A .freepodignore file — same syntax as .gitignore, and applied last — keeps out anything else the build does not need.

Re-including a file follows git's rules, with one wrinkle worth knowing: the negation has to name the path (!node_modules/patched.js; a bare !patched.js does nothing), and nothing beneath a directory you excluded yourself can come back. Exclude build/* rather than build/ if you need an exception.

Output

The address is the only thing deploy writes to stdout. The build log, the progress bar and every status line go to stderr:

URL=$(freepod deploy)

Deploying with a coding agent

Install the freepod skill:

freepod skill install

Then just prompt:

Build a URL shortener for freepod and deploy it to links.freepod.eu

Supported: Claude Code, Codex, OpenCode, Amp, Gemini CLI


Deployments are listed and managed at freepod.eu. Source and issues: github.com/erikvanzijst/freepod.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

freepod-0.8.1.tar.gz (158.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

freepod-0.8.1-py3-none-any.whl (103.4 kB view details)

Uploaded Python 3

File details

Details for the file freepod-0.8.1.tar.gz.

File metadata

  • Download URL: freepod-0.8.1.tar.gz
  • Upload date:
  • Size: 158.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for freepod-0.8.1.tar.gz
Algorithm Hash digest
SHA256 ac09a68d70e9fc20f329cb0c71b562ea5694589d99f6596a8af3a4082de676f8
MD5 eb4be5332bbfce89f948c1bae97738b8
BLAKE2b-256 ac09461805d5fc3cd0ac19c04d2867eeb31970b992cefc36d94e11377daf5de0

See more details on using hashes here.

Provenance

The following attestation bundles were made for freepod-0.8.1.tar.gz:

Publisher: publish-cli.yml on erikvanzijst/freepod

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file freepod-0.8.1-py3-none-any.whl.

File metadata

  • Download URL: freepod-0.8.1-py3-none-any.whl
  • Upload date:
  • Size: 103.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for freepod-0.8.1-py3-none-any.whl
Algorithm Hash digest
SHA256 5d528a8e792ec8301a10388e14e9371c53064c7e1311c0fb015e4b879dfb03c2
MD5 fc87fa401c4cba39ea263fcb0b78ca8c
BLAKE2b-256 7e9255dc515c03c8e2f9de3d17aab2efc0688a78afc9f14e0882eb36b88695fb

See more details on using hashes here.

Provenance

The following attestation bundles were made for freepod-0.8.1-py3-none-any.whl:

Publisher: publish-cli.yml on erikvanzijst/freepod

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.11.1

2 files

0.11.0

2 files

0.10.0

2 files

0.9.2

2 files

0.9.1

2 files

0.9.0

2 files

0.8.2

2 files

This release

0.8.1 This release

2 files

0.8.0

2 files

0.7.0

2 files

0.6.1

2 files

0.6.0

2 files

0.5.0

2 files

0.4.0

2 files

0.3.1

2 files

0.3.0

2 files

0.2.1

2 files

0.2.0

2 files

0.1.2

2 files

0.1.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page