doable.do

Migrating from Render

How to migrate a Render service to Doable

Render is a mature PaaS, managed Postgres, Redis, background workers, and cron all on one bill. Doable is leaner: container deploys with flat $0/$15/$39 pricing, external-DB attach instead of bundled databases, and BYO server support that's free at every tier.

Most Render services migrate without code changes. The decision points are how you handle databases and how many services you need running.

Step by step

  1. 1

    Export your Render env vars

    Render's CLI doesn't have a single bulk-export command, copy them out of the dashboard's env section into a local `.env` file.

  2. 2

    Install the Doable CLI and log in

    One-time setup.

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

    Create the Doable project

    Doable detects the runtime (Node, Python, static, Docker) the same way Render does.

    doable projects create
  4. 4

    Import env vars

    Encrypted at rest, injected at container start.

    doable env import .env.render
  5. 5

    Migrate your database (if applicable)

    For Render Postgres: `pg_dump` from Render, restore into Neon (or Supabase, Upstash), then `doable addon attach postgres <new-url>`. Doable attaches external DBs rather than provisioning its own.

  6. 6

    Deploy

    First deploy hits a cold cache. Subsequent deploys reuse layers.

    doable deploy
  7. 7

    For background workers: deploy as a separate project

    Render's "background worker" service type maps to a Doable project with no public port. Same pattern; just deploy your worker code as its own Doable project.

What carries over

Runtime detection mirrors Render's, Node, Python, Go, Ruby, Docker all auto-detected from standard files. Build commands inferred from `package.json` scripts (or your specified build command via `doable env set BUILD_CMD`).

Web services and background workers both work. Web services get a public URL with HTTPS; background workers run with no exposed port.

What's different

Databases: Render bundles Postgres + Redis on the same bill. Doable doesn't provision databases on its own infrastructure, you attach external providers (Neon, Supabase, Upstash) via `addon attach`. Trade-off: you split the bill, but you keep databases independent of your deploy platform.

Cron jobs: Render has a dedicated cron primitive. Doable doesn't, most users either run a long-lived container with `node-cron` / `APScheduler`, or use a managed external scheduler like Upstash QStash.

Persistent disks: Render supports persistent volumes for non-database stateful workloads. Doable doesn't expose persistent volumes for cloud projects (BYO servers can mount any local volume).

Pricing: flat $0/$15/$39 vs. Render's per-instance + per-bandwidth tiers. For predictable workloads Doable is usually cheaper.

FAQ

Will my Render web service work on Doable?

Yes for any standard runtime. The auto-detection is similar enough that most projects deploy without changes. If you have a custom build command set in Render's dashboard, replicate it in your `package.json` scripts or via a Dockerfile.

How do I replace Render cron jobs?

Two options: (a) run a long-lived container with `node-cron` (Node) or `APScheduler` (Python) that schedules work in-process, or (b) use a managed external scheduler like Upstash QStash or Trigger.dev that pings a public endpoint on your deployed app at the desired times.

What about Render Postgres?

Migrate to Neon, Supabase, or Upstash. `pg_dump` from Render's connection string, restore to the new provider, then `doable addon attach postgres <new-url>`. Most databases under a few GB migrate in 5–15 minutes.

Can I run a background worker on the Free tier?

Yes, background workers deploy as Doable projects with no public port. The Free tier covers one project, so a single worker counts as your free project. For web app + worker on the same plan, Starter ($15/month, 3 projects) is the next step up.

Try Doable free

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