On this page10 sections
To host a converted Framer site on Render or Railway, push the project to Git, create a web service from the repository, set the build command to npm ci && npm run build and the start command to npm start, and make sure the app listens on the port the platform gives it. Both platforms run long-lived Node.js processes, so they suit every Deframer target that needs a server: Next.js, TanStack Start, Astro and React Router. A static Vite export can go on Render's static sites instead.
Deframer is an independent tool and is not affiliated with, endorsed or sponsored by Framer, Render or Railway.
Why a Node.js platform
Vercel and Netlify are built around Next.js and static sites. Render and Railway are general platforms: they build your repository and keep a process running, much like a server you'd manage yourself, minus the server. That makes them a good fit for the targets whose production server is a plain Node.js command:
Target | Build | Start | Node.js | Listens on |
|---|---|---|---|---|
Next.js | | | 20.9 or later | |
TanStack Start | | | 22.18 or later | see srvx's docs |
Astro | | | 22.18 or later | |
React Router | | | 22.22 or later | |
The detail that trips people up: the Astro and React Router server.ts default to HOST=localhost. On a platform, the router sends traffic to the container's network interface, so set HOST=0.0.0.0. Both platforms set PORT for you.
If you're still choosing a framework, which framework to export Framer to compares them.
Step 1: Get the project
- Paste your published Framer site's address on deframer.co and pick the framework. Converting is free.
- Pick where assets live. "Assets in the project" puts images, fonts and videos in
public/, served by your app; the default keeps them on Framer's CDN. - Verify the site is yours with the meta tag shown, publish in Framer, and download. A verified download costs 1 credit (pricing). Downloads are for your own sites or sites whose owner has given permission.
- Run it locally once:
npm install
npm run build
npm start- Push it to GitHub or GitLab, including
package-lock.json.
Step 2: Pin the Node.js version
Both platforms pick a Node.js version from your project. The simplest way to pin it is the engines field in package.json:
{
"engines": { "node": ">=22.22" }
}Use the minimum from the table above for your target. Render also honours a NODE_VERSION environment variable or a .node-version file; Railway reads engines. Check each platform's current docs, since build systems change.
Deploying on Render
- In the Render dashboard, create a new Web Service and connect the repository.
- Runtime: Node.
- Build command:
npm ci && npm run build. - Start command:
npm start. - Environment variables:
NODE_ENV=productionHOST=0.0.0.0for Astro and React RouterFORMS_WEBHOOK_URLand anyFORMS_<NAME>_WEBHOOK_URLfrom.env.example
- Health check path:
/is fine for a marketing site. - Create the service. Render builds, starts it and gives you an
onrender.comaddress.
If you'd rather keep the setup in Git, a render.yaml blueprint does the same:
services:
- type: web
name: my-site
runtime: node
buildCommand: npm ci && npm run build
startCommand: npm start
envVars:
- key: NODE_ENV
value: production
- key: HOST
value: 0.0.0.0
- key: FORMS_WEBHOOK_URL
sync: falsesync: false makes Render ask for the value in the dashboard instead of storing it in the file.
A static Vite site on Render
For the Vite target, create a Static Site instead: build command npm ci && npm run build, publish directory dist. Add VITE_FORM_ENDPOINT as an environment variable if the site has forms; it's compiled into the build. Render has its own redirect and rewrite rules in the dashboard, and doesn't read _redirects; copy the site's redirects from public/_redirects into them. Each page is written as about.html for /about; check that Render serves clean URLs for your setup, and add rewrite rules if it doesn't.
Deploying on Railway
- Create a new project from your GitHub repository.
- Railway detects a Node.js app and runs
npm run buildandnpm startfrompackage.json. If it doesn't, set them in the service's settings. - Add variables:
NODE_ENV=production,HOST=0.0.0.0for Astro and React Router, and yourFORMS_…webhooks. - Under networking, generate a public domain to get a
railway.appaddress. - Deploy.
Railway sets PORT and routes the public domain to it. If the deploy succeeds but the site doesn't answer, the app is almost always listening on localhost or a hard-coded port; check the logs for the address it printed on start.
Test before you move the domain
On the platform's own address:
- Open every route in the README's routes table, including CMS pages and a URL that should 404.
- Check that a URL with the wrong trailing slash redirects the way it did on Framer.
- Test a few of your Framer redirects.
- Submit each form and confirm the webhook receives it.
Then update public/robots.txt, public/sitemap.xml, and for Next.js metadataBase in src/app/layout.tsx, if the domain changes.
Custom domain
Both platforms let you add a custom domain on the service and show the DNS records to create, usually a CNAME for www and an option for the apex that depends on your DNS provider. They issue HTTPS certificates once DNS resolves.
- Lower TTLs a day ahead.
- Add the domain on the platform.
- Change the records at your DNS provider.
- Wait for HTTPS, test, then remove the domain from Framer.
The full order, with rollback, is in moving a domain off Framer without downtime.
Practical notes
- Sleeping instances. Free or low tiers on some platforms stop idle services and start them on the next request, which makes the first visit slow. For a public marketing site, use a plan that keeps the service running. Check each platform's current plan terms.
- One instance is enough to start. A prerendered site is light. A single instance also keeps the project's in-memory form rate limit as one counter.
- Logs. Without a form webhook, submissions are logged by the server, so you'll find them in the platform's logs. Set a webhook before launch.
- Preview environments. Both platforms can create environments per pull request. Preview deployments for a converted Framer site covers a review workflow.
- Updates. When you republish in Framer, convert again, merge the new output in Git and push; the platform redeploys. See maintaining a converted site with Git.
Render, Railway or something else?
If you want | Consider |
|---|---|
Zero config for Next.js | Vercel or Netlify (deploy guide) |
A Node.js process without managing a server | Render or Railway |
Full control and a fixed monthly box | A VPS with Docker |
No server at all | The Vite target on a static host |
FAQ
Can I host a Framer site on Render or Railway?
Yes, once it's code. Convert the published site with Deframer to Next.js, TanStack Start, Astro or React Router, push it to Git, and create a web service with npm run build and npm start.
Why does my Astro or React Router deploy fail health checks?
The server is probably listening on localhost. Set HOST=0.0.0.0 so the platform's router can reach it. Both platforms set PORT for you.
Which Node.js version do I need?
20.9 or later for Next.js, 22.18 or later for TanStack Start and Astro, and 22.22 or later for React Router. Pin it with engines in package.json.
Do forms work?
Yes. Forms post to the project's own API routes, which forward submissions to the webhooks you set as environment variables.
Can I keep my images on Framer's CDN?
Yes, that's the default. Choose "Assets in the project" when converting if you want the platform to serve them instead.
