unkey.app domain.
To have Unkey build and deploy on every push instead, see Deploy from GitHub.
Before you start, make sure that:
- The image is pullable without credentials.
- Your container listens on the port in the
PORTenvironment variable, which is 8080 by default. - The reference has a tag (
ghcr.io/acme/api:v1.2.3) or a digest (ghcr.io/acme/api@sha256:...). A reference with neither pullslatestat deploy time.
You need a Compute plan before you can deploy. If you don’t have one yet, the dashboard asks you to pick one the first time you try (the dialog is titled Choose a Compute plan), and the CLI rejects the deployment until you do. Only a workspace admin can pick a plan. See Compute plans for what each plan includes.
- Dashboard
- CLI
Create a project
Open Projects in the dashboard and choose Create project. Enter a Project Name, and Unkey fills in a Slug from it. You’ll use the slug to refer to the project in the API and the CLI. You can change it, as long as it’s unique in your workspace and isn’t
default.The dashboard then opens the new-app flow. To add an app to a project later, open the project and choose Create app.Pick the image
On Deploy a new app, pick Container image. Enter the Image reference and choose Continue to create the app, named after the last part of the image path (with 
-2, -3, and so on if the project already has an app by that name).
Check app configuration
The default configuration is enough to run most images without changes:
Build and scaling settings you save here apply to both the production and preview . The port can be changed for each environment individually later by navigating to App settings > Environments, selecting the environment, and clicking Configure on the Runtime card.Leaving before you deploy asks you to discard the app.
- Build: the image reference. An image app has no build step, and you can’t connect a repository to it later.
- Scaling: 0.25 vCPU, 256 MiB of memory, and one instance in
us-east-1. See Runtime settings. - Environment variables: mark secrets as sensitive to make them write-only. See Environment variables.

Deploy
Choose Deploy. The dashboard deploys the image to production and opens the deployment page. The deployment moves through
pending, starting, building, deploying, network (shown as Assigning Domains), and finalizing to ready. The building step has nothing to build, so it’s short. If another deployment in the workspace is running, it waits its turn.At ready the app is live. For project payments, app api, and workspace acme, production answers on payments-api-acme.unkey.app (or payments-acme.unkey.app if the app slug is default). The deployment page lists every domain.If the deployment ends failed, the page shows the failed step and an error code. Deployments lists the codes and how to fix them.Ship a new version
Push a new image to your registry. Then open the app’s Deployments page and choose Create deployment. Pick the Environment and enter the Image Reference, or pick an image you deployed before.A production deployment that reaches
ready becomes the live deployment and the production domains move to it, unless the app is rolled back. A preview deployment gets its own domains.Next steps
Production and preview
Promote a deployment, roll back, and redeploy.
Deploy from GitHub
Let Unkey build and deploy on every push instead.
Instances and autoscaling
What the runtime defaults mean. Change them on Runtime settings.
Environment variables
Give the image its configuration and secrets.
Add API key authentication later
When you want the gateway in front of this app to check API keys before requests reach it, create a keyspace and keys in API Management, then attach a key-auth policy to the environment. Nothing in this guide depends on it.