# Deploy from a ZIP

Source: /docs/getting-started/deploy-from-zip

For code that is not in a GitHub repository, upload it as a ZIP. The rest is the same: check it is ready, then deploy.

## Before you start [#before-you-start]

Your project needs a `Dockerfile` in its root and a server that listens on the port the platform provides — see [what runs here](/docs/getting-started/what-runs-here). Zip the project **without** `node_modules`, `.git` or build output. The archive limit is **100 MB**.

## Steps [#steps]

### Start a new app [#start-a-new-app]

In the dashboard, open **New app**. Under **import source**, choose the **ZIP upload** tab.

### Upload the archive [#upload-the-archive]

Drag a ZIP onto **Drag & drop a ZIP file or click to browse**, or click to pick one. When it finishes you see **Ready** with the file name.

### Name it and pick a subdomain [#name-it-and-pick-a-subdomain]

Give the app a name and, optionally, a **Subdomain**. Leave it blank for a generated one. This is the app's live address.

### Answer the "is this already live?" question [#answer-the-is-this-already-live-question]

Before the first deploy the platform asks whether this app is **already running somewhere, with real users or data**. For a new app, answer **No, it's new**. If it is already live, read [database migrations](/docs/concepts/database-migrations) first.

### Run the readiness scan [#run-the-readiness-scan]

**Run scan** to verify the archive can build and run. On **Action required**, fix the issues — edit your project and **Re-upload ZIP**, or apply the fix prompt with your coding agent — then re-scan. See [readiness and fixes](/docs/concepts/readiness-and-fixes).

### Deploy [#deploy]

Press **DEPLOY**. When the pipeline finishes you see **Your app is live** with the **URL**.

## Updating a ZIP app later [#updating-a-zip-app-later]

A ZIP app has no branch, so a plain deploy re-ships the archive the platform already holds. To ship new code, use **Re-upload & Deploy**: it replaces the source and deploys in one step.

## What can go wrong [#what-can-go-wrong]

* **"File exceeds the 100 MB limit."** — Trim the archive. Exclude `node_modules`, `.git` and build output; the platform rebuilds dependencies for you.
* **"The uploaded file is not a valid ZIP archive."** — Re-create the archive as a real ZIP and upload again.
* **"Import expired or not found. Upload the ZIP again."** — An upload link is short-lived. Re-upload.
* **"This app isn't ZIP-based — update its repository instead."** — This app was created from GitHub. Push to its branch instead of uploading a ZIP.
* **"Run a readiness scan before deploying" / "Fix scan findings before deploying"** — Run or clear the readiness scan first.

Every deploy-path error, with its fix, is on the [troubleshooting](/docs/troubleshooting) page.