doable.do

Migrating from Heroku

How to migrate a Heroku app to Doable

Heroku's free tier shutdown left a lot of small apps stranded on paid plans they barely use. Doable's auto-detection is similar to Heroku's buildpacks, most Heroku apps deploy without modification, on a flat $0–$39/month plan.

If your app has a `Procfile`, a `requirements.txt`, or a `package.json` with a `start` script, the migration is mechanical.

Step by step

  1. 1

    Export your env vars from Heroku

    Save them to a local file. We'll import this into Doable in one command.

    heroku config -a <your-app> --shell > .env.heroku
  2. 2

    Install the Doable CLI

    And log in.

    npm install -g doable-cli && doable login
  3. 3

    Create the Doable project

    From your project directory. Doable detects the runtime the same way Heroku does.

    doable projects create
  4. 4

    Import env vars

    Bulk-import from the file you exported. Each var is encrypted at rest with AES-256-GCM.

    doable env import .env.heroku
  5. 5

    Migrate your database (if applicable)

    For Heroku Postgres: run `pg_dump` from Heroku, restore into Neon (or Supabase, Upstash, etc.), then `doable addon attach postgres <new-url>`. Doable doesn't provision Postgres on its own infrastructure but attaches any external URL.

  6. 6

    Deploy

    First deploy takes a minute or two. Subsequent deploys hit the build cache and are faster.

    doable deploy
  7. 7

    Update DNS

    If you have a custom domain, point its CNAME at `cname.doable.do` and run `doable domain connect <hostname>`.

What carries over without changes

Procfile-based start commands work the same way Heroku ran them. `web: gunicorn app:app` becomes the container's entrypoint. `worker: python worker.py` runs as a separate Doable project (deploy worker code without a public port).

Buildpack detection, Heroku reads `requirements.txt` for Python, `package.json` for Node, etc. Doable's detector recognises the same files. Most projects work without a Dockerfile.

What's different

No add-on marketplace. Doable doesn't provision databases or services. You attach external providers (Neon for Postgres, Upstash for Redis, etc.) via `doable addon attach`. The advantage: those services run on accounts independent of your deploy platform.

Pricing: Doable Starter at $15/month covers 3 projects with no metered dyno hours, no per-app billing. Pro at $39/month is 10 projects. Heroku Eco/Basic dynos add up faster for multi-app teams.

Background workers: same shape as Heroku, deploy a separate project with no public port. The container runs continuously and processes jobs.

FAQ

How long does a Heroku-to-Doable migration take?

For most small apps, under 30 minutes including DNS propagation. The actual code changes are usually zero, Heroku's buildpack-detected runtimes (Node, Python, Ruby, Go, static) all work as Doable auto-detected runtimes.

What about Heroku Postgres?

Migrate to Neon, Supabase, or Upstash, all have free tiers that beat Heroku Postgres on price for small apps. `pg_dump` from Heroku, restore to the new provider, then `doable addon attach postgres <new-url>`. Total time is usually 5–15 minutes for databases under a few GB.

Will my dyno-hour-based scaling work?

Doable doesn't autoscale yet, each deploy runs a single container. For most apps that's enough; for traffic spikes, our roadmap includes horizontal scaling on Pro. If you need autoscaling today, deploy to BYO and run a small orchestrator on top, or stay on Heroku for that specific app.

Can I roll back if something breaks?

Yes, Doable keeps the previous deploy's artifact and `doable rollback` switches traffic back to it instantly without rebuilding. The dashboard also shows a list of every deploy with rollback buttons.

Try Doable free

No credit card. Deploy your first project in under a minute.