doable.do

Migrating from Netlify

How to migrate a Netlify site to Doable

Netlify's build-minute and bandwidth metering can spike unexpectedly on traffic surges. Doable runs your site as a standard container with flat per-month pricing, $0 for one project, $15 for three, $39 for ten. Most Netlify sites move over with one command.

If your Netlify site uses Functions, you'll typically replace them with a small backend (one Node or Python container). Doable runs containers with no per-request timeout, so workloads that hit Netlify's 10–26 second function cap work normally.

Step by step

  1. 1

    Export your Netlify env vars

    Save them locally. Doable will import in one command.

    netlify env:list --plain > .env.netlify
  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 static-site builds (`dist/`, `build/`, `out/`) and serves them from a minimal nginx container.

    doable projects create
  4. 4

    Import env vars

    Encrypted at rest with AES-256-GCM, injected at container start.

    doable env import .env.netlify
  5. 5

    Deploy

    Doable runs your build command (auto-detected from `package.json` scripts) and serves the output directory.

    doable deploy
  6. 6

    Cut DNS over

    CNAME for subdomains, A record for apex, the connect command returns the right value. Let's Encrypt issues HTTPS within a minute.

    doable domain connect <hostname>

What carries over without changes

Static-site frameworks: Astro, Eleventy, Hugo, Jekyll, Gatsby, Next.js (static export), Vite, plain HTML. Doable detects the build output and serves it from nginx. Build-command detection reads `package.json` scripts the same way Netlify does.

Build-time env vars work the same. `NETLIFY_*` vars don't carry over (they were Netlify-specific) but generic `VITE_*` / `NEXT_PUBLIC_*` etc. work as expected.

What's different

Netlify Functions: replace with a real backend. Deploy a separate Doable project, Node Express, Python FastAPI, or any container, for your API endpoints. The container has no per-request timeout, so workloads that hit Netlify's 10–26s cap (long uploads, large file processing, websockets) work normally.

Netlify Forms: use a third-party form handler (Formspree, Basin, Tally) and post to it from your static frontend. We don't bundle a form-handling layer.

Netlify Identity: use Auth0, Clerk, Supabase Auth, or Firebase Auth depending on your stack. Same migration shape as moving any auth provider.

Pricing: flat $0/$15/$39/month. No per-build-minute, no per-GB-bandwidth, no per-function-invocation.

FAQ

Can Doable host static sites as well as Netlify?

Yes, for the actual file-serving, both use HTTP/2 with gzip + brotli compression. Netlify's CDN has more edge locations (so first-byte latency might be marginally lower in some regions); for most sites the difference isn't measurable.

How do I replace Netlify Functions on Doable?

Deploy a small backend as a separate Doable project, typically a Node or Python container with your API routes. Point your frontend at the API's URL via an env var. The backend container runs continuously, so cold-start delays disappear.

What about Netlify Edge Functions?

Doable doesn't run V8 isolates, Edge Functions don't carry over directly. In practice most "edge" functions can be replaced with regular API routes; the latency difference is small for most workloads.

Will my deploy previews still work?

Doable supports anonymous preview deploys (`doable preview`) and GitHub App-triggered deploys for branches. Simpler than Netlify's comment bot, but covers the same use case.

Try Doable free

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