---
title: Migrating to Atlasflow
description: Move an existing app from another platform to Atlasflow.
order: 50
---

Migrating to Atlasflow is mostly about making sure your app runs as a container that listens on the right port. Once that's true, deploying is the same as any other Atlasflow project.

## The universal checklist

No matter where you're coming from, every migration comes down to the same few steps:

1. **Containerize**: add a Dockerfile, or rely on [automatic builds](/docs/guides/supported-frameworks.md) if your stack is supported.
2. **Listen on port 3000**: bind to `0.0.0.0:3000`. See [Container requirements](/docs/guides/container-requirements.md).
3. **Respond on `GET /`**: the health check expects a 2xx response.
4. **Move your config to environment variables**: split values into [build and runtime](/docs/guides/environment-variables.md) scopes.
5. **Connect the repository**: create an Atlasflow [project](/docs/concepts/projects.md) from your GitHub repo.
6. **Point your domain**: add and verify a [custom domain](/docs/networking/custom-domains.md), then cut over DNS.

## Platform guides

- [Migrating from Railway](/docs/migrate/from-railway.md): Move a Railway service to Atlasflow.
- [Migrating from Render](/docs/migrate/from-render.md): Move a Render web service to Atlasflow.
- [Migrating from Heroku](/docs/migrate/from-heroku.md): Move a Heroku app to Atlasflow.
- [Migrating from Fly.io](/docs/migrate/from-fly.md): Move a Fly.io app to Atlasflow.
- [Migrating from Vercel](/docs/migrate/from-vercel.md): Move a containerized or server-rendered app from Vercel to Atlasflow.

## What's different about Atlasflow

| Topic   | Atlasflow approach                                                                                                   |
| ------- | -------------------------------------------------------------------------------------------------------------------- |
| Source  | GitHub App; deploys on push to your default branch.                                                                  |
| Builds  | Dockerfile, or [Railpack](/docs/guides/supported-frameworks.md) auto-detection.                                         |
| Port    | Fixed at **3000**; bind to `0.0.0.0`.                                                                                |
| Runtime | One container per deployment, isolated on a [microVM](/docs/concepts/how-it-works.md).                                  |
| Config  | Project settings plus [environment variables](/docs/guides/environment-variables.md); no platform-specific config file. |
| Domains | Verified via DNS; TLS is automatic. See [Custom domains](/docs/networking/custom-domains.md).                           |
| Pricing | Per-second [usage billing](/docs/billing/usage-and-credits.md) with included credits.                                   |

## Cutting over safely

Deploy on Atlasflow and test against the preview URL before changing DNS. When you're confident, point your domain at Atlasflow and verify it. Keep the old platform running until traffic has fully moved and you've confirmed everything works.

## Next steps

Pick your current platform from the list above, or start with [Getting started](/docs/getting-started.md) if you're ready to create a project.