---
title: Migrating from Heroku
description: Move a Heroku app to Atlasflow.
order: 2
---

Heroku builds with buildpacks and runs processes defined in a `Procfile`. Atlasflow builds a container image instead, either from a Dockerfile or via [automatic detection](/docs/guides/supported-frameworks.md).

## What maps over

| Heroku          | Atlasflow                                                                        |
| --------------- | -------------------------------------------------------------------------------- |
| Git push deploy | Push to your default branch                                                      |
| Buildpacks      | [Automatic builds](/docs/guides/supported-frameworks.md) (Railpack) or a Dockerfile |
| Config vars     | [Environment variables](/docs/guides/environment-variables.md)                      |
| `web` dyno      | Your container listening on port 3000                                            |
| Custom domains  | [Custom domains](/docs/networking/custom-domains.md)                                |

## Steps

1. **Create a project** from your GitHub repository.
2. **Replace the Procfile.** Heroku's `web` process becomes your container's start command. With a Dockerfile, put it in `CMD`. With automatic builds, your framework's standard start command is used.
3. **Set the port to 3000.** Heroku assigns a dynamic `$PORT`; Atlasflow expects **port 3000** bound to `0.0.0.0`. Update your app to listen on 3000.
4. **Recreate config vars** as [runtime variables](/docs/guides/environment-variables.md). Replace Heroku add-on URLs (such as a database) with your own connection strings.
5. **Respond on `/`.** Make sure `GET /` returns a 2xx status for the [health check](/docs/guides/container-requirements.md).
6. **Deploy, test the preview URL, then move your domain.**

## Things to know

- Each Heroku process type (worker, clock) becomes a separate Atlasflow [project](/docs/guides/monorepos.md) running that command.
- Atlasflow doesn't run release-phase commands or one-off dynos. Run migrations as part of your container start or as a separate job.
- Managed Postgres is [coming soon](/docs/products.md); use your own database until then.

## Next steps

- [Supported frameworks](/docs/guides/supported-frameworks.md): builds without a Procfile.
- [Environment variables](/docs/guides/environment-variables.md): move your config vars.
- [Container requirements](/docs/guides/container-requirements.md): port and health check.