Skip to main content
The deploy command is a one-shot workflow that creates a pod (if it doesn’t exist), syncs your local code, installs dependencies, and reloads the app service. You can also deploy straight from a GitHub repo with --repo — no local files needed.

Basic Usage

What Happens

  1. Pod check — If the pod doesn’t exist, it’s created (and the CLI waits for it to be running)
  2. File sync — Local directory is uploaded to the pod’s app root, skipping unchanged files and anything excluded (see Which files get uploaded)
  3. Reload — Dependencies are installed, the app is rebuilt where the preset has a build step, the app service is restarted and health-checked (skip with --no-reload)
If the pod already exists, the command skips creation and goes straight to syncing.
Not sure whether you want deploy, pods reload or pods restart? See Deploy, Reload, Restart.

Which files get uploaded

deploy uploads a file only if it differs from the copy already on the pod, and skips it entirely if it matches either of these:
  • One of the --exclude patterns. The defaults are node_modules, vendor, .git, .env, __pycache__, .DS_Store, .venv, venv, .next, .instapods-build-hash. Passing --exclude replaces that list rather than adding to it.
  • A pattern in the .gitignore of the directory you are deploying. This happens by default, whether or not the directory is a git repository, and only that top-level .gitignore is read.
Pass --no-gitignore to ignore the .gitignore and sync everything except the --exclude patterns. Pass --force to re-upload every file instead of only the changed ones.
.env is on the default exclude list, so your local .env is not uploaded. Set those values with instapods env set instead. The same applies to a build directory listed in your .gitignore (dist/, build/, .next/): if you meant to ship built files, deploy that directory directly with --local ./dist.

Deploy from a GitHub repo

Point deploy at a GitHub repository instead of local files. InstaPods detects the stack from the repo, creates the pod, attaches the repo, and builds & runs it. Every push after that redeploys automatically (with build logs and rollback, like git deploy).
With --repo the CLI skips local file sync: it detects the preset from the repo’s root files (same rules as below), creates the pod, then follows the first build to completion. Public repos work out of the box; private repos need a GitHub account connected in the dashboard. If the stack can’t be detected, pass --preset.

Flags

What --no-build skips, per preset

On nodejs, InstaPods already skips the build automatically when your source tree hasn’t changed since the last one - that is the build skipped (unchanged) line in the deploy output. You rarely need --no-build.

Preset Auto-Detection

If --preset is omitted, the CLI scans your local directory for signature files: The first match wins, top to bottom. The order matters for repos that carry more than one marker: a Laravel or WordPress app ships a package.json to build its front-end assets but is still PHP, and a Go service with a JavaScript front-end in the same repo is still Go. Pass --preset to override.

Examples

Reload is on by default — it auto-installs dependencies from package.json or requirements.txt before restarting the service. Use --no-reload to skip this step if you only want to sync files.