Push your Replit app to GitHub and EthioDeploy builds it on every push. Most apps need a port change and new env vars; apps that use Replit Auth or App Storage need more work.
Last updated
These are the defaults. Override any of them in Settings → Build.
Push it to GitHub from the Git pane: Tools → Git, initialize the repository if needed, connect your GitHub account, set the remote, then commit and push. Private GitHub repositories authenticate with a personal access token, not your password.
Or download it: in the file tree, open the three-dot menu and choose “Download as zip”, then push the folder to a new GitHub repository yourself. The zip includes uncommitted changes but not your Secrets, so copy those separately.
.replit, replit.nix and replit.md are only read by Replit. Leave them in the repo; we ignore them. If .replit has a [deployment]build or run command your app needs, copy it into the project's Build settings.
Check three things in package.json and your server code:
build script, if the app has a frontend to compile, and a start script that runs the production server, not the dev server.process.env.PORT and 0.0.0.0.REPLIT_DOMAINS, REPLIT_DEV_DOMAIN or REPL_ID. Replit sets these; we don't, so they're empty here. Replace them with your own variable, such as APP_URL.The rest is the same as any Node app. See the Node.js guide, or the Python guide for Python repls.
Replit's database is PostgreSQL, so it moves to an EthioDeploy Postgres addon without changing your queries. The addon sets DATABASE_URL, the same variable Replit uses.
pg_dumpworks. The development database can't be reached from outside Replit.pg_restore against DATABASE_URL from code running in your project.The older Replit key-value store (REPLIT_DB_URL) only works on Replit. Move that data into Postgres or a Redis addon.
@replit/object-storage) authenticates with the repl's own identity, so expect it to fail elsewhere. Move the files to an S3-compatible bucket such as Cloudflare R2. Replit only offers downloading files one at a time.<project-slug>.ethiodeploy.com. Every push to the default branch redeploys, and the old version keeps serving until the new one is healthy.Health check times out after a successful build
Cause: The server listens on a hardcoded port or on localhost.
Fix: Listen on process.env.PORT and 0.0.0.0, then push.
The app starts its dev server in production
Cause: The start script runs the dev command, or there is none and the run command lived in .replit.
Fix: Point start at the production server, or set a Start Command in Settings.
Links or redirects point at an empty host
Cause: The code builds URLs from REPLIT_DOMAINS or REPLIT_DEV_DOMAIN.
Fix: Read your own variable such as APP_URL and set it in Settings.
Sign-in fails
Cause: The app still uses Replit Auth.
Fix: Switch to an auth provider you control, such as Clerk.
Database queries fail with relation does not exist
Cause: The new Postgres addon is empty.
Fix: Run your migrations, then load your data.
Still stuck? Check the deployment's build log in the dashboard, or see Troubleshooting.
Can I keep building in Replit after moving?
Yes, if you push from Replit's Git pane. Every push to the default branch redeploys on EthioDeploy. Remove any use of Replit Auth or App Storage first, because those stop working outside Replit.
Does my Replit database come with me?
The data does, but not automatically. Dump the production database with pg_dump using the connection string from its Settings tab, then load it into an EthioDeploy Postgres addon. The development database can't be reached from outside Replit.
How does EthioDeploy pricing compare to Replit Deployments?
Replit charges per deployment: Autoscale is $2 a month plus compute and request fees, and Reserved VMs start at $15 a month, on top of a Core or Pro plan. EthioDeploy has a free plan, and Pro is a flat $10 a month with no compute or request fees.
Ready to deploy? Sign in with GitHub and pick your repo. No Dockerfile, no YAML.
See the full docs for custom domains, env vars, addons, and billing.