Netlify nailed the static-site developer experience: connect a repo, get atomic deploys and a global CDN. If you're migrating, it's usually because you also need first-class backend containers, managed databases, and unified pricing in one platform. This guide maps Netlify concepts to PandaStack and walks the cutover.
Feature mapping
| Netlify | PandaStack | Notes |
|---|---|---|
| Static site deploys | Static site | Auto-detected framework + build |
netlify.toml build config | Build settings (UI + auto-detect) | Manual translation |
Redirects (_redirects) | Routing / SPA fallback | Re-express rules |
| Environment variables | Env vars | Set per service |
| Netlify Functions | Edge functions / container app | Depends on the function |
| Forms / Identity / large media | Bring your own | No 1:1 mapping |
| Custom domains + SSL | Custom domains + automatic SSL | Auto-issued |
The static-site and env-var parts are quick. Functions and Netlify-specific add-ons (Forms, Identity) need a plan.
Step 1: Connect the repo and deploy the static site
PandaStack auto-detects most frameworks — React/Vite, Next (export), Astro, Gatsby, Eleventy, VitePress, Hugo, plain HTML — and runs the build in a pandastack.ai microVM.
- 1Connect your Git repo in the dashboard.
- 2Verify the detected build command and publish directory.
- 3If you used a non-default package manager, set the install command (npm/yarn/pnpm/bun are supported).
Translate your netlify.toml build block by hand. For example:
# netlify.toml
[build]
command = "npm run build"
publish = "dist"becomes a build command of npm run build and an output directory of dist in the PandaStack settings.
Step 2: Re-express redirects
Netlify's _redirects / [[redirects]] rules are platform-specific. The most common one is the SPA catch-all:
# Netlify _redirects
/* /index.html 200On PandaStack, enable single-page-app fallback so unknown routes serve index.html. For genuine HTTP redirects (301/302) and proxy rewrites, re-express them in your routing configuration. Audit every rule — proxy rewrites to external APIs especially, since those change how requests flow.
Step 3: Migrate environment variables
Export your Netlify env vars (Site settings → Environment) and recreate them in PandaStack per service. Two reminders:
- Build-time vs runtime. Static-site env vars are usually inlined at build time (e.g.
VITE_*,NEXT_PUBLIC_*). Setting them only at runtime won't help a static build — they must be present when the build runs. - Don't commit secrets. Keep them in the dashboard, not the repo.
Step 4: Handle Netlify Functions
Triage each function:
- Lightweight HTTP handlers → PandaStack edge functions (Node.js, Python, Go).
- Anything stateful, long-running, or framework-based → a container app.
Netlify Functions have a specific handler signature (exports.handler = async (event, context) => {...}). You'll adapt that to your target runtime's request/response shape. If you have many small functions, consider consolidating them into a single small container running a minimal HTTP framework — fewer moving parts, easier local development.
Step 5: Add a database (if you didn't have one)
A frequent reason to leave a static-first host is needing a real backend. On PandaStack you can provision a managed PostgreSQL, MySQL, MongoDB, or Redis, and when you attach it to a container app the DATABASE_URL is injected automatically. Your frontend keeps deploying as a static site; your new backend container talks to the database.
Step 6: Features without a 1:1 mapping
Be upfront about these:
- Netlify Forms — replace with a small form-handler edge function or container endpoint writing to your database.
- Netlify Identity — replace with your own auth (container app or third-party integration).
- Large Media / image CDN — use object storage plus your own transform step.
These are the items that turn a half-day migration into a two-day one. Scope them explicitly.
Step 7: Cutover
- 1Deploy on a PandaStack staging domain and click through the site.
- 2Verify redirects, 404 handling, and any function endpoints.
- 3Confirm build-time env vars produced the right output (check the rendered HTML/JS).
- 4Switch DNS; automatic SSL provisions for your custom domain.
- 5Keep the Netlify deploy live briefly as a fallback.
What you keep, what you gain
You keep git-push deploys, atomic-style deployments with rollbacks and deploy history, a CDN-backed static experience, custom domains, and automatic SSL. You gain the ability to run real backend containers, managed databases auto-wired into your app, cronjobs, server-side metrics and analytics (no client SDK), and one bill for the whole stack.
Netlify remains excellent at what it does — particularly its build plugin ecosystem and preview deploys. If your app is purely static and you rely heavily on Netlify-specific add-ons, weigh the move carefully. If you're growing into a backend, consolidation is the win.
References
- [Netlify redirects and rewrites](https://docs.netlify.com/routing/redirects/)
- [Netlify build configuration (
netlify.toml)](https://docs.netlify.com/configure-builds/file-based-configuration/) - [Netlify Functions](https://docs.netlify.com/functions/overview/)
- [Vite env variables](https://vitejs.dev/guide/env-and-mode.html)
- [Let's Encrypt (automatic SSL)](https://letsencrypt.org/how-it-works/)
---
PandaStack's free tier includes 5 static sites, 5 web services, a database, and edge functions — enough to migrate and validate before you flip DNS. Connect your repo at [dashboard.pandastack.io](https://dashboard.pandastack.io).