> ## Documentation Index
> Fetch the complete documentation index at: https://docs.instapods.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Git Deployment

> Connect a Git repository to your pod and deploy automatically on every push.

Deploy code to your pod by connecting a GitHub repository or any Git URL. Push to a branch and your code deploys automatically — with dependency installation, build commands, and deployment history.

<Tip>
  Starting fresh? You don't need to create the pod first. [`instapods deploy --repo <url>`](/cli/deploy) detects the stack, creates the pod, connects the repo, and runs the first build in one step — the same flow as the **From GitHub** option in the create-pod wizard and the "Deploy to InstaPods" button.
</Tip>

## Quick Start

```bash theme={null}
# Create a pod
instapods pods create my-api --preset nodejs -w

# Connect a GitHub repo and trigger the first deploy
instapods git connect my-api --repo https://github.com/you/my-api --deploy

# That's it. Push to main and it auto-deploys.
```

## Connecting a Repository

### GitHub Repository

<Tabs>
  <Tab title="CLI">
    ```bash theme={null}
    # Connect and deploy immediately
    instapods git connect my-app --repo https://github.com/you/repo --deploy

    # Connect to a specific branch
    instapods git connect my-app --repo https://github.com/you/repo --branch develop

    # Connect a private repo with a personal access token
    instapods git connect my-app \
      --repo https://github.com/you/private-repo \
      --auth-token ghp_your_token_here \
      --deploy
    ```
  </Tab>

  <Tab title="Dashboard">
    1. Go to your pod's **Git** tab
    2. Enter the repository URL (e.g., `https://github.com/you/repo`)
    3. Select the branch to deploy from (default: `main`)
    4. Click **Connect**
  </Tab>

  <Tab title="API">
    ```bash theme={null}
    curl -X POST https://app.instapods.com/api/pods/my-app/git \
      -H "Authorization: Bearer YOUR_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{
        "repo_url": "https://github.com/you/repo",
        "branch": "main",
        "auto_deploy": true
      }'
    ```
  </Tab>
</Tabs>

### Any Git URL

You can connect any publicly accessible Git repository:

```bash theme={null}
instapods git connect my-app --repo https://gitlab.com/you/repo
instapods git connect my-app --repo https://bitbucket.org/you/repo
```

For private repositories, provide an auth token:

```bash theme={null}
instapods git connect my-app \
  --repo https://gitlab.com/you/private-repo \
  --auth-token glpat-your_token_here
```

## Auto-Deploy on Push

When a repository is connected with auto-deploy enabled (the default), pushing to the configured branch triggers a deployment automatically.

For GitHub repositories, InstaPods sets up a webhook that fires on every push. For other Git providers, you can configure a webhook manually using the URL shown in the dashboard.

### How a Deploy Works

1. **Pull** — The latest code is pulled from the configured branch
2. **Install** — Dependencies are installed based on the preset (see below)
3. **Build** — Build commands run if configured
4. **Restart** — The application service restarts with the new code

The entire process typically takes 5-30 seconds depending on the size of your dependencies.

### Skip a Deploy

Add `[skip deploy]` to your commit message to push without triggering a deployment:

```bash theme={null}
git commit -m "update readme [skip deploy]"
git push
```

## Build Auto-Detection

InstaPods uses AI to analyze your project files and automatically determine the right install, build, and start commands for each deploy. This works for all presets and handles frameworks like Next.js, Vite, Django, Laravel, and more — without any configuration.

The AI inspects files like `package.json`, `requirements.txt`, `composer.json`, framework configs, and your directory structure. It detects:

* **Install commands** — `npm install`, `pip install -r requirements.txt`, `composer install`, etc.
* **Build commands** — `npm run build`, framework-specific builds
* **Start commands** — `node server.js`, `serve -s build`, `gunicorn app:app`, etc.
* **App port** — The port your app listens on

If AI detection is unavailable, InstaPods falls back to these defaults:

| Preset      | Install Command                   | Build Command                            |
| ----------- | --------------------------------- | ---------------------------------------- |
| **Node.js** | `npm install`                     | `npm run build` (if build script exists) |
| **Python**  | `pip install -r requirements.txt` | None                                     |
| **PHP**     | `composer install`                | None                                     |
| **Static**  | None                              | None                                     |

<Tip>
  The AI auto-detection handles SPAs and frameworks that need a custom start command (e.g., `serve -s build` for Vite, `node server.js` for Next.js standalone). You don't need to configure these manually.
</Tip>

### Custom Commands

Override the defaults with a custom build command:

<Tabs>
  <Tab title="CLI">
    ```bash theme={null}
    # Set a custom build command during connect
    instapods git connect my-app \
      --repo https://github.com/you/repo \
      --build-cmd "npm ci && npm run build"

    # Update the build command later
    instapods git connect my-app \
      --repo https://github.com/you/repo \
      --build-cmd "yarn install --frozen-lockfile && yarn build"
    ```
  </Tab>

  <Tab title="API">
    ```bash theme={null}
    curl -X PUT https://app.instapods.com/api/pods/my-app/git \
      -H "Authorization: Bearer YOUR_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{
        "build_command": "npm ci && npm run build",
        "auto_deploy": true
      }'
    ```
  </Tab>
</Tabs>

## Check Git Status

See the current git configuration and last deployment status:

<Tabs>
  <Tab title="CLI">
    ```bash theme={null}
    instapods git status my-app
    ```

    Output shows the connected repo, branch, auto-deploy setting, and latest deployment info.
  </Tab>

  <Tab title="API">
    ```bash theme={null}
    curl https://app.instapods.com/api/pods/my-app/git \
      -H "Authorization: Bearer YOUR_TOKEN"
    ```

    Returns `null` if no repository is connected.
  </Tab>
</Tabs>

## Manual Deploy

Trigger a deployment manually, even if auto-deploy is off:

<Tabs>
  <Tab title="CLI">
    ```bash theme={null}
    # Trigger and return immediately
    instapods git deploy my-app

    # Wait for the deploy to finish
    instapods git deploy my-app -w

    # Wait with custom timeout
    instapods git deploy my-app -w --timeout 300s
    ```
  </Tab>

  <Tab title="API">
    ```bash theme={null}
    curl -X POST https://app.instapods.com/api/pods/my-app/git/deploy \
      -H "Authorization: Bearer YOUR_TOKEN"
    ```
  </Tab>
</Tabs>

## Deployment History and Logs

Every deployment is recorded with its status, commit, and build output.

### View Deployments

<Tabs>
  <Tab title="CLI">
    ```bash theme={null}
    # Last 10 deployments (default)
    instapods git deployments my-app

    # Last 25 deployments
    instapods git deployments my-app -n 25
    ```
  </Tab>

  <Tab title="API">
    ```bash theme={null}
    curl "https://app.instapods.com/api/pods/my-app/git/deployments?limit=10" \
      -H "Authorization: Bearer YOUR_TOKEN"
    ```
  </Tab>
</Tabs>

### View Build Logs

<Tabs>
  <Tab title="CLI">
    ```bash theme={null}
    # Logs from the latest deployment
    instapods git logs my-app

    # Logs from a specific deployment
    instapods git logs my-app deploy_abc123
    ```
  </Tab>

  <Tab title="API">
    ```bash theme={null}
    curl https://app.instapods.com/api/pods/my-app/git/deployments/deploy_abc123 \
      -H "Authorization: Bearer YOUR_TOKEN"
    ```

    The response includes a `build_log` field with the full output.
  </Tab>
</Tabs>

## Rollback

Revert to a previous deployment:

<Tabs>
  <Tab title="CLI">
    ```bash theme={null}
    # Rollback to the previous deployment
    instapods git rollback my-app

    # Rollback to a specific deployment
    instapods git rollback my-app deploy_abc123

    # Skip confirmation and wait for completion
    instapods git rollback my-app -f -w
    ```
  </Tab>

  <Tab title="API">
    ```bash theme={null}
    curl -X POST https://app.instapods.com/api/pods/my-app/git/rollback \
      -H "Authorization: Bearer YOUR_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"deployment_id": "deploy_abc123"}'
    ```

    Omit `deployment_id` to roll back to the immediately previous deployment.
  </Tab>
</Tabs>

## GitHub Commit Status Checks

When deploying from a GitHub repository, InstaPods reports deployment status back to GitHub as commit status checks. You'll see a green checkmark (or red X) on your commits and pull requests.

This works automatically for public repositories. For private repositories, make sure the auth token you provided has `repo:status` scope.

## Disconnect

Remove the git connection from a pod:

<Tabs>
  <Tab title="CLI">
    ```bash theme={null}
    # With confirmation prompt
    instapods git disconnect my-app

    # Skip confirmation
    instapods git disconnect my-app -f
    ```
  </Tab>

  <Tab title="API">
    ```bash theme={null}
    curl -X DELETE https://app.instapods.com/api/pods/my-app/git \
      -H "Authorization: Bearer YOUR_TOKEN"
    ```
  </Tab>
</Tabs>

Disconnecting removes the webhook and git configuration. Your deployed code stays in the pod — nothing is deleted.

## Full Example

Deploy a Node.js API from GitHub with auto-deploy:

```bash theme={null}
# 1. Create the pod
instapods pods create my-api --preset nodejs --plan build -w

# 2. Set environment variables
instapods exec my-api -- "cat > /home/instapod/app/.env << 'EOF'
DATABASE_URL=postgres://instapod:secret@localhost:5432/instapod
NODE_ENV=production
EOF"

# 3. Install a database
instapods services add my-api -s postgresql -w

# 4. Connect the repo (triggers first deploy)
instapods git connect my-api --repo https://github.com/you/my-api --deploy

# 5. Check deployment status
instapods git status my-api

# From now on, every push to main auto-deploys.
# View deployment history anytime:
instapods git deployments my-api
```
