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

# Quickstart

> Deploy your first application on Porter from sign-up to a live public URL, covering cloud account setup, cluster provisioning, and app creation

This guide walks you through deploying your first application on Porter, from creating an account to seeing your app live at a public URL.

## Prerequisites

Before you begin, make sure you have:

<AccordionGroup>
  <Accordion title="Cloud provider account" icon="cloud">
    An active account with **AWS**, **GCP**, or **Azure** with admin or owner permissions. Porter provisions infrastructure in your cloud account, so you'll need permissions to create resources like Kubernetes clusters, networking components, and IAM roles.
  </Accordion>

  <Accordion title="A deployable application" icon="code">
    Your application should:

    * Have a start command or Dockerfile
    * Be pushed to a GitHub repository (or have a container image in a registry)
  </Accordion>
</AccordionGroup>

***

## Step 1: Sign up and create a project

1. Navigate to [dashboard.porter.run](https://dashboard.porter.run) and create an account
2. Click **Create Project**
3. Enter a project name

<img src="https://mintcdn.com/porter/k87aZZFaLNfy9soJ/images/getting-started/step-1.webp?fit=max&auto=format&n=k87aZZFaLNfy9soJ&q=85&s=7dad48e19d577f8f93e05e65aaca149a" alt="Create project screen" width="3520" height="1920" data-path="images/getting-started/step-1.webp" />

<Info>
  Project names must be 1-25 characters, using only lowercase letters, numbers, and hyphens.
</Info>

***

## Step 2: Select your cloud provider

Choose the cloud provider where you want Porter to provision your infrastructure.

<img src="https://mintcdn.com/porter/k87aZZFaLNfy9soJ/images/getting-started/step-2.webp?fit=max&auto=format&n=k87aZZFaLNfy9soJ&q=85&s=5283ed0d828fda92ffe751b966e6b540" alt="Cloud provider selection" width="3520" height="1920" data-path="images/getting-started/step-2.webp" />

If you've previously connected a cloud account to Porter, you can reuse those credentials.

<img src="https://mintcdn.com/porter/k87aZZFaLNfy9soJ/images/getting-started/step-2-existing.webp?fit=max&auto=format&n=k87aZZFaLNfy9soJ&q=85&s=fcb323d5fa8ba03e0990ae73b7ff4f25" alt="Existing cloud accounts" width="3520" height="1920" data-path="images/getting-started/step-2-existing.webp" />

***

## Step 3: Set up your cluster

Porter provisions a Kubernetes cluster in your cloud account. The setup process varies by provider.

<Tabs>
  <Tab title="AWS">
    Porter uses AWS IAM role assumption to securely access your account without storing static credentials.

    <Steps>
      <Step title="Enter your AWS Account ID">
        Log into your [AWS Console](https://console.aws.amazon.com) and find your 12-digit Account ID in the top-right corner. Enter this ID in Porter.
      </Step>

      <Step title="Create the CloudFormation stack">
        Click **Grant Permissions**. Porter opens the AWS CloudFormation console to create a stack that provisions the `porter-manager` IAM role.

        <img src="https://mintcdn.com/porter/k87aZZFaLNfy9soJ/images/getting-started/step-3-aws-create-stack.webp?fit=max&auto=format&n=k87aZZFaLNfy9soJ&q=85&s=254f30b268ae7b8590f403f874e5aee1" alt="Create CloudFormation stack" width="3520" height="1920" data-path="images/getting-started/step-3-aws-create-stack.webp" />

        <Warning>
          If the popup is blocked, check your browser settings and allow popups from Porter.
        </Warning>

        Scroll to the bottom of the CloudFormation page, check the **I acknowledge that AWS CloudFormation might create IAM resources** box, and click **Create Stack**.

        <Info>
          The IAM role must remain in your AWS account for Porter to manage your infrastructure. Deleting it will prevent Porter from making changes.
        </Info>
      </Step>

      <Step title="Review costs">
        Porter displays estimated monthly costs for your infrastructure (\~\$225/month for AWS).

        <img src="https://mintcdn.com/porter/zqQS4FM4YSdp2anY/images/getting-started/step-3-aws-review-costs.webp?fit=max&auto=format&n=zqQS4FM4YSdp2anY&q=85&s=0034b2f3a25c1925f3b3b2ee6295f151" alt="AWS cost review" width="3520" height="1920" data-path="images/getting-started/step-3-aws-review-costs.webp" />

        These estimates are for the default cluster configuration. Actual costs vary based on usage, region, and any customizations you make.

        Review the cost breakdown and click **Accept** to continue.
      </Step>

      <Step title="Configure and provision">
        Porter pre-configures your cluster with sensible defaults:

        * **Cluster name**: Auto-generated based on your project
        * **Region**: Defaults to `us-east-1`
        * **Node groups**: Pre-configured with appropriate instance types

                  <img src="https://mintcdn.com/porter/k87aZZFaLNfy9soJ/images/getting-started/step-3-aws-configure-and-provision.webp?fit=max&auto=format&n=k87aZZFaLNfy9soJ&q=85&s=35f852e92362e6ae9e8b52aa707ebd2f" alt="AWS cluster configuration" width="3520" height="1920" data-path="images/getting-started/step-3-aws-configure-and-provision.webp" />

        <Accordion title="AWS resource quota limits">
          If AWS is limiting your account's resource quota, Porter will display a warning and offer to auto-request quota increases on your behalf. **Allow Porter to auto-request AWS quota** is enabled by default.

          <img src="https://mintcdn.com/porter/k87aZZFaLNfy9soJ/images/getting-started/step-3-aws-limiting-quota.webp?fit=max&auto=format&n=k87aZZFaLNfy9soJ&q=85&s=afca442903dd39ec7d8abdfdd1151c2e" alt="AWS quota limits" width="3520" height="1920" data-path="images/getting-started/step-3-aws-limiting-quota.webp" />

          Alternatively, you can manually request quota increases through the [AWS Service Quotas console](https://console.aws.amazon.com/servicequotas/).
        </Accordion>

        You can customize these settings or accept the defaults. Click **Provision** to start creating your infrastructure.

        <Warning>
          Provisioning takes approximately 30-45 minutes. You can close the browser and return later. Porter continues working in the background.
        </Warning>
      </Step>
    </Steps>
  </Tab>

  <Tab title="GCP">
    Porter connects to GCP using a service account. You only need to grant one IAM role and enable one API—Porter automatically provisions everything else.

    <Steps>
      <Step title="Enable required APIs">
        In your [GCP Console](https://console.cloud.google.com), navigate to **APIs & Services**, click **Enable APIs and Services**, and enable the following APIs:

        * **Cloud Resource Manager API** — required for Porter to manage IAM bindings
        * **Service Usage API** — required for Porter to enable all other APIs automatically

        Porter will automatically enable all other required APIs after you upload your credentials.
      </Step>

      <Step title="Create a service account">
        1. Navigate to **IAM & Admin** > **Service Accounts**
        2. Click **Create Service Account**
        3. Name your service account (e.g., `porter-manager`)
        4. Grant the **Resource Manager > Project IAM Admin** role
        5. Click **Done** to create the account
        6. Under **Actions**, select **Manage keys**
        7. Click **Add Key** > **Create new key** > **JSON**
        8. The JSON key file downloads automatically. Keep it safe
      </Step>

      <Step title="Upload the service account key">
        In Porter, click **Drop a GCP Service Account JSON here, or click to browse** and upload the JSON key file you downloaded.

        <img src="https://mintcdn.com/porter/zqQS4FM4YSdp2anY/images/getting-started/step-3-gcp-upload-json.webp?fit=max&auto=format&n=zqQS4FM4YSdp2anY&q=85&s=88b032188c0f0caee3714d770778423c" alt="Upload GCP service account key" width="3520" height="1920" data-path="images/getting-started/step-3-gcp-upload-json.webp" />

        Porter verifies the credentials and automatically provisions all required permissions and APIs. This takes about a minute.
      </Step>

      <Step title="Review costs">
        Porter displays estimated monthly costs for your infrastructure (\~\$253/month for GCP).

        <img src="https://mintcdn.com/porter/zqQS4FM4YSdp2anY/images/getting-started/step-3-gcp-review-costs.webp?fit=max&auto=format&n=zqQS4FM4YSdp2anY&q=85&s=273640ee2f266d9152aa586c2ce42b82" alt="GCP cost review" width="3520" height="1920" data-path="images/getting-started/step-3-gcp-review-costs.webp" />

        These estimates are for the default cluster configuration. Actual costs vary based on usage, region, and any customizations you make.

        Review the cost breakdown and click **Accept** to continue.
      </Step>

      <Step title="Configure and provision">
        Porter pre-configures your cluster with sensible defaults:

        * **Cluster name**: Auto-generated based on your project
        * **Region**: Defaults to `us-east1`
        * **Node groups**: Pre-configured with appropriate instance types

                  <img src="https://mintcdn.com/porter/zqQS4FM4YSdp2anY/images/getting-started/step-3-gcp-configure-and-provision.webp?fit=max&auto=format&n=zqQS4FM4YSdp2anY&q=85&s=423ddf8257fe2ddfabc9a6cb8aed76fe" alt="GCP cluster configuration" width="3520" height="1920" data-path="images/getting-started/step-3-gcp-configure-and-provision.webp" />

        You can customize these settings or accept the defaults. Click **Provision** to start creating your infrastructure.

        <Warning>
          Provisioning takes approximately 30-45 minutes. You can close the browser and return later. Porter continues working in the background.
        </Warning>
      </Step>
    </Steps>
  </Tab>

  <Tab title="Azure">
    Porter connects to Azure using a service principal with permissions to manage your infrastructure.

    <Steps>
      <Step title="Create a service principal">
        Before connecting Azure to Porter, you need to create a service principal. You can do this using our automated script or manually.

        <AccordionGroup>
          <Accordion title="Option 1: Automated setup (recommended)">
            If you have the Azure CLI installed and authenticated (`az login`), run our setup script:

            ```bash theme={null}
            # Download the setup script
            curl -O https://raw.githubusercontent.com/porter-dev/docs/main/scripts/setup-azure-porter.sh

            # Make it executable
            chmod +x setup-azure-porter.sh

            # Run the script (optionally provide subscription ID)
            ./setup-azure-porter.sh [your-subscription-id]
            ```

            The script creates the required role, service principal, and grants necessary permissions. Copy the output credentials for the next step.
          </Accordion>

          <Accordion title="Option 2: Manual setup">
            For manual setup, follow the detailed instructions in our [Azure provisioning guide](/cloud-accounts/connecting-a-cloud-account#option-2-manual-setup). You'll need to:

            1. Enable required Azure resource providers
            2. Create a custom IAM role
            3. Create a service principal
            4. Grant Microsoft Graph API permissions
          </Accordion>
        </AccordionGroup>
      </Step>

      <Step title="Enter your credentials">
        In Porter, enter the following values from your service principal:

        | Field                       | Description                                |
        | --------------------------- | ------------------------------------------ |
        | **Subscription ID**         | Your Azure subscription ID                 |
        | **Application (Client) ID** | The `appId` from your service principal    |
        | **Client Secret**           | The `password` from your service principal |
        | **Tenant ID**               | The `tenant` from your service principal   |

        <img src="https://mintcdn.com/porter/zqQS4FM4YSdp2anY/images/getting-started/step-3-azure-permissions.webp?fit=max&auto=format&n=zqQS4FM4YSdp2anY&q=85&s=765990cc626eccb949fdf7fb16000e08" alt="Azure credentials entry" width="3520" height="1920" data-path="images/getting-started/step-3-azure-permissions.webp" />

        Porter verifies the credentials immediately when you submit.
      </Step>

      <Step title="Review costs">
        Porter displays estimated monthly costs for your infrastructure (\~\$165/month for Azure).

        <img src="https://mintcdn.com/porter/zqQS4FM4YSdp2anY/images/getting-started/step-3-azure-review-costs.webp?fit=max&auto=format&n=zqQS4FM4YSdp2anY&q=85&s=b6ccab15509235e0d5a135f37899e158" alt="Azure cost review" width="3520" height="1920" data-path="images/getting-started/step-3-azure-review-costs.webp" />

        These estimates are for the default cluster configuration. Actual costs vary based on usage, region, and any customizations you make.

        Review the cost breakdown and click **Accept** to continue.
      </Step>

      <Step title="Configure and provision">
        Porter pre-configures your cluster with sensible defaults:

        * **Cluster name**: Auto-generated based on your project
        * **Region**: Defaults to `eastus`
        * **Node groups**: Pre-configured with appropriate instance types

                  <img src="https://mintcdn.com/porter/zqQS4FM4YSdp2anY/images/getting-started/step-3-azure-configure-and-provision.webp?fit=max&auto=format&n=zqQS4FM4YSdp2anY&q=85&s=3b86d29a120333252c5f24c98389be09" alt="Azure cluster configuration" width="3520" height="1920" data-path="images/getting-started/step-3-azure-configure-and-provision.webp" />

        You can customize these settings or accept the defaults. Click **Provision** to start creating your infrastructure.

        <Warning>
          Provisioning takes approximately 30-45 minutes. You can close the browser and return later. Porter continues working in the background.
        </Warning>
      </Step>
    </Steps>
  </Tab>
</Tabs>

***

## Step 4: Create your first application

Once your cluster is ready, you'll see the Porter dashboard. Click **Create Application** to deploy your code.

<Tabs>
  <Tab title="Deploy from a GitHub repository">
    Porter builds your application from source code and sets up automated deployments on every push.

    <Steps>
      <Step title="Connect GitHub">
        If this is your first deployment, you'll need to connect your GitHub account:

        <img src="https://mintcdn.com/porter/rTf4JWBYOzQjpLlM/images/deploy/v2/github-source-selection.webp?fit=max&auto=format&n=rTf4JWBYOzQjpLlM&q=85&s=8e3422acb973ae6ac09684a1c235c515" alt="Source selection screen" width="1780" height="285" data-path="images/deploy/v2/github-source-selection.webp" />

        1. Click **Connect repositories**
        2. Authorize the Porter GitHub App
        3. Choose which repositories Porter can access (all repositories or select specific ones)

        Porter needs read access to detect your code structure and write access to create the deployment workflow.
      </Step>

      <Step title="Select your repository">
        1. Choose the repository containing your application
        2. Select the branch to deploy (defaults to `main` or `master`)

                   <img src="https://mintcdn.com/porter/rTf4JWBYOzQjpLlM/images/deploy/v2/github-repo-branch-selector.webp?fit=max&auto=format&n=rTf4JWBYOzQjpLlM&q=85&s=be7df38a829e255c46f3bbbdc5a22be4" alt="GitHub repository and branch selector" width="1780" height="282" data-path="images/deploy/v2/github-repo-branch-selector.webp" />
      </Step>

      <Step title="Review detected applications">
        Porter scans your repository and automatically detects:

        * Frameworks and languages (Node.js, Python, Go, etc.)
        * Dockerfiles
        * Service types (web servers, workers, etc.)

                  <img src="https://mintcdn.com/porter/rTf4JWBYOzQjpLlM/images/deploy/v2/detected-apps-list.webp?fit=max&auto=format&n=rTf4JWBYOzQjpLlM&q=85&s=59a2e5204cea9415f5e938f925bdd3f8" alt="Detected applications list" width="1780" height="971" data-path="images/deploy/v2/detected-apps-list.webp" />

        You'll see a card for each detected application showing the app name, detected framework, and repository path.

        <Info>
          For monorepos with multiple services, Porter detects each application separately. A Node.js API in `/api` and a React frontend in `/web` appear as distinct applications. If some services are already deployed on your cluster, Porter hides them by default so you can focus on new applications. Expand the **previously deployed** section to view or re-add them.
        </Info>
      </Step>

      <Step title="Configure your application (optional)">
        Click the **gear icon** on any application card to customize:

        <img src="https://mintcdn.com/porter/rTf4JWBYOzQjpLlM/images/deploy/v2/app-card-settings-button.webp?fit=max&auto=format&n=rTf4JWBYOzQjpLlM&q=85&s=5107323040904d8b0883253be5543f2b" alt="Settings button on application card" width="1780" height="284" data-path="images/deploy/v2/app-card-settings-button.webp" />

        * **Build method**: Docker (using your Dockerfile) or Buildpacks (automatic)
        * **Start command**: The command to run your application
        * **Port**: The port your application listens on

        For most applications, Porter's detected defaults work without changes.
      </Step>

      <Step title="Deploy">
        Click **Deploy** to start your deployment.
      </Step>

      <Step title="Merge the GitHub Actions PR">
        <Warning>
          This step is critical. Your application won't be available until you merge the PR.
        </Warning>

        Porter creates a pull request in your repository containing a GitHub Actions workflow file at `.github/workflows/porter.yml`. This workflow handles building and deploying your application on every push.

        After clicking Deploy, you'll see:

        * A **toast notification** with a "View PR" button that links directly to the pull request
        * A **warning banner** on your app's page with a "Merge PR" link

                  <img src="https://mintcdn.com/porter/zqQS4FM4YSdp2anY/images/getting-started/step-4-github-merge-pr-banner.webp?fit=max&auto=format&n=zqQS4FM4YSdp2anY&q=85&s=4bffbb23739d82aa2f299dec7fdef078" alt="Merge PR banner" width="1700" height="1200" data-path="images/getting-started/step-4-github-merge-pr-banner.webp" />

        Click either link to open the pull request on GitHub, then merge it. After merging, click **Refresh** on the banner to update the status. GitHub Actions triggers automatically and your first deployment begins.

        <Accordion title="What's in the workflow file?">
          The workflow Porter creates looks like this:

          ```yaml theme={null}
          on:
            push:
              branches:
                - main
          name: Deploy to Porter
          jobs:
            porter-deploy:
              runs-on: ubuntu-latest
              steps:
                - uses: actions/checkout@v4
                - uses: porter-dev/setup-porter@v0.1.0
                - run: porter apply
                  env:
                    PORTER_TOKEN: ${{ secrets.PORTER_APP_... }}
          ```
        </Accordion>
      </Step>
    </Steps>
  </Tab>

  <Tab title="Deploy from a Docker registry">
    This approach works well when you have an existing CI/CD pipeline or are deploying third-party images.

    <Steps>
      <Step title="Select container registry">
        From the Create Application screen, click **Or, deploy from a container registry** in the top right.

        <img src="https://mintcdn.com/porter/rTf4JWBYOzQjpLlM/images/deploy/v2/github-deploy-registry-link.webp?fit=max&auto=format&n=rTf4JWBYOzQjpLlM&q=85&s=37df4e84d1bd2590e3852cf088e0e0df" alt="Container registry link" width="1779" height="295" data-path="images/deploy/v2/github-deploy-registry-link.webp" />
      </Step>

      <Step title="Specify your image">
        Enter your image details:

        * **Image repository**: The full path to your image
          * Docker Hub: `docker.io/username/image` or `username/image`
          * Amazon ECR: `123456789.dkr.ecr.us-east-1.amazonaws.com/my-app`
          * Google Artifact Registry: `us-docker.pkg.dev/project-id/repo/image`
          * Azure Container Registry: `myregistry.azurecr.io/my-app`
        * **Tag**: The version to deploy (e.g., `latest`, `v1.2.3`, or a commit SHA)

                  <img src="https://mintcdn.com/porter/rTf4JWBYOzQjpLlM/images/deploy/v2/container-registry-inputs.webp?fit=max&auto=format&n=rTf4JWBYOzQjpLlM&q=85&s=28c5589b7595d388641c72cea952d344" alt="Container registry inputs" width="1780" height="286" data-path="images/deploy/v2/container-registry-inputs.webp" />
      </Step>

      <Step title="Configure your application">
        Porter creates an application configuration with sensible defaults. Since Porter can't inspect your pre-built image, you'll need to specify:

        * **Port**: The port your container listens on (for web services)
        * **Start command**: Override the image's default CMD if needed

        Click the **gear icon** to adjust resources (CPU, RAM, instances) if the defaults don't fit your needs.
      </Step>

      <Step title="Deploy">
        Click **Deploy** to pull your image and start running it.

        <Info>
          To update your application later, push a new image tag and use the Porter CLI:

          ```bash theme={null}
          porter app update-tag APP_NAME --tag NEW_TAG
          ```
        </Info>
      </Step>
    </Steps>
  </Tab>

  <Tab title="Deploy from the CLI">
    Use the Porter CLI to deploy your application with a `porter.yaml` configuration file.

    <Steps>
      <Step title="Install the CLI">
        Install the Porter CLI using Homebrew (Mac) or the install script (Mac/Linux):

        ```bash theme={null}
        # Mac (Homebrew)
        brew install porter-dev/porter/porter

        # Mac/Linux (script)
        /bin/bash -c "$(curl -fsSL https://install.porter.run)"
        ```

        See [CLI Installation](/cli/installation) for more details.
      </Step>

      <Step title="Login and configure">
        Authenticate with Porter and select your project/cluster:

        ```bash theme={null}
        porter auth login
        ```

        This opens your browser to complete authentication and automatically configures your default project and cluster. See [CLI Basic Usage](/cli/basic-usage) for more details.
      </Step>

      <Step title="Create a porter.yaml file">
        Create a `porter.yaml` file in your repository root:

        ```yaml theme={null}
        version: v2
        name: my-app

        build:
          method: docker
          dockerfile: ./Dockerfile

        services:
          - name: web
            type: web
            run: npm start
            port: 3000
            cpuCores: 0.5
            ramMegabytes: 512
        ```

        This is the simplest initial configuration. See the [porter.yaml reference](/applications/configuration-as-code/reference) for all available options.
      </Step>

      <Step title="Deploy your application">
        Run `porter apply` to build and deploy:

        ```bash theme={null}
        porter apply -f porter.yaml
        ```

        Porter builds your container image and deploys it to your cluster.

        See [`porter apply` reference](/standard/cli/command-reference/porter-apply) for all available flags.
      </Step>
    </Steps>
  </Tab>
</Tabs>

***

## Step 5: View your running application

Return to the Porter dashboard to monitor your deployment:

1. Click on your application to view deployment progress
2. Watch the build logs as Porter builds your container image
3. Monitor the deployment as Porter starts your application

Once the deployment completes, your application status changes to **Running**.

### Access your application

Porter automatically provisions a public URL for your application at `*.onporter.run`. Click the URL in your dashboard to visit your deployed application.

<img src="https://mintcdn.com/porter/zqQS4FM4YSdp2anY/images/getting-started/step-5-deployed.webp?fit=max&auto=format&n=zqQS4FM4YSdp2anY&q=85&s=8c0155ef198a20c446c792f517858064" alt="Deployed application" width="1672" height="1170" data-path="images/getting-started/step-5-deployed.webp" />

<Check>
  Congratulations! Your application is now live and will automatically redeploy whenever you push to your selected branch.
</Check>

***

## Next steps

Now that your application is running, explore these guides to customize your deployment:

<CardGroup cols={2}>
  <Card title="Custom domains" icon="globe" href="/applications/configure/custom-domains">
    Connect your own domain name to your application.
  </Card>

  <Card title="Environment groups" icon="key" href="/applications/configure/environment-groups">
    Configure secrets and environment variables for your app.
  </Card>

  <Card title="Autoscaling" icon="chart-line" href="/applications/configure/autoscaling">
    Scale your application automatically based on traffic.
  </Card>

  <Card title="Types of services" icon="cubes" href="/applications/deploy/types-of-services">
    Add workers, jobs, and configure service settings.
  </Card>
</CardGroup>
