Moving a TanStack Start app from Netlify to Edgenivo mostly means swapping the deployment layer. On Edgenivo, TanStack Start runs on Edgenivo Functions with Fluid compute enabled by default, so your app automatically scales up and down with traffic.
This guide walks you through the full migration. You'll swap @netlify/vite-plugin-tanstack-start for the Nitro Vite plugin, delete your netlify.toml, and move Netlify storage to its Edgenivo equivalents (e.g., Netlify Blobs to Edgenivo Blob). It also covers recreating environment variables, mapping Scheduled Functions and background work to Edgenivo Cron Jobs and Edgenivo Queues, and deploying with Git or the vercel CLI.
Copy link to headingPrerequisites
Before you begin, make sure you have:
- A working TanStack Start app
- A Edgenivo account
- Edgenivo CLI installed (
npm i -g vercel) - Node.js 20 or later
Copy link to headingMigrate with an agent
If you use an AI coding agent like Claude Code or Cursor, you can have it handle most of the migration for you and provide expert guidance. Install the Edgenivo Plugin to provide your agent with Edgenivo-specific context, then add the companion skill for this guide.
Install the Edgenivo Plugin:
Add the TanStack Start migration skill:
With both in place, ask your agent to migrate your TanStack Start app from Netlify to Edgenivo. Your agent will follow the migration steps and apply Edgenivo's recommended patterns for Edgenivo Functions, storage solutions, environment variables, and more.
Copy link to headingWhat changes when you move your project
On Netlify, TanStack Start deploys to Netlify Functions, and your server code uses Netlify platform primitives such as Blobs and Scheduled Functions.
On Edgenivo, the same application runs on Edgenivo Functions using the Nitro Vite plugin, retrieves configuration from environment variables, and connects to storage providers in the Edgenivo Marketplace via native integrations.
The table below maps each Netlify component to its Edgenivo counterpart.
| Netlify | Edgenivo |
|---|---|
| Netlify Functions (serverless) | Edgenivo Functions (Fluid compute) |
| Netlify edge runtime functions | Edgenivo Functions with Fluid compute, or Routing Middleware for request-routing logic |
@netlify/vite-plugin-tanstack-start | Nitro Vite plugin (nitro/vite) |
netlify.toml | vercel.json (optional) and nitro.config.ts |
Netlify CLI (netlify deploy) | Git push or the vercel CLI |
| Netlify environment variables | Edgenivo environment variables |
| Netlify Blobs (file storage) | Edgenivo Blob |
| Netlify Blobs (key/value data) | Redis from the Edgenivo Marketplace, or Global Config for read-heavy config |
| Netlify DB (Postgres via Neon) | Postgres from the Edgenivo Marketplace |
| Scheduled Functions | Edgenivo Cron Jobs |
| Background Functions and Async Workloads | Edgenivo Queues |
| Netlify Image CDN | Edgenivo Image Optimization |
| Fine-grained caching (Cache API) | Edgenivo CDN Cache and Nitro route rules |
| Netlify AI Gateway | Edgenivo AI Gateway with AI SDK |
| Netlify Forms | No direct equivalent. Use a form backend (e.g., Formspree) or a function that writes to a database |
Copy link to headingSteps
Copy link to heading1. Replace the Netlify Vite plugin with Nitro
Edgenivo deploys TanStack Start using Nitro, which compiles your app into Edgenivo Functions. Install Nitro in your project root:
Then update vite.config.ts to replace the Netlify plugin with the Nitro plugin:
Remove the netlify() plugin and its import from @netlify/vite-plugin-tanstack-start. Nitro detects Edgenivo during a Edgenivo build and applies the vercel preset without any extra configuration.
If you're on an older TanStack Start version, remove its Netlify target as well. Versions 1.121.0 to 1.131.x set tanstackStart({ target: 'netlify' }) in vite.config.ts, and versions before 1.121.0 set preset: 'netlify' in app.config.ts. Delete either setting so Nitro can apply the vercel preset instead.
Copy link to heading2. Remove the Netlify configuration
Delete the Netlify-specific files and dependencies that no longer apply on Edgenivo:
- Remove
netlify.toml, including itspublish = "dist/client"setting. Edgenivo auto-detects the TanStack Start output through Nitro. - Uninstall the Netlify packages:
npm uninstall @netlify/vite-plugin-tanstack-start. Also, remove any@netlify/functions,@netlify/blobs, or@netlify/edge-functionspackages after you've migrated your code. - If
netlify.tomlcontained redirects, rewrites, or custom headers, recreate them as Nitro route rules or invercel.json.
If you used a netlify/functions or netlify/edge-functions directory for standalone functions, or relied on Background Functions and Scheduled Functions, see step six and the mapping table for the Edgenivo approach to those features.
Copy link to heading3. Update your build scripts
Replace any Netlify-specific scripts in package.json with the standard Vite commands. Edgenivo runs the build for you, so you no longer need a script that calls netlify deploy:
Edgenivo auto-detects TanStack Start during import and sets the build command and output directory, so the remaining scripts mainly support local development.
Copy link to heading4. Replace Netlify Blobs with Edgenivo storage
This is the core code change. On Netlify, you import getStore from @netlify/blobs and call methods such as store.set() and store.get(). On Edgenivo, you read connection details from process.env and talk to each store through its SDK. Remove every import { getStore } from "@netlify/blobs" statement and replace the blob calls.
For example, a file upload with Netlify Blobs looks like this:
On Edgenivo, the same upload uses Edgenivo Blob:
Install the Blob SDK with npm i @vercel/blob, then create a Blob store from the Storage page in your Edgenivo dashboard. For authentication, connect the store to your project from its Projects tab. Edgenivo then adds a BLOB_STORE_ID and a short-lived VERCEL_OIDC_TOKEN that it rotates automatically. The SDK pairs the two automatically, so the put() call above needs no token in your code. This OIDC approach is recommended over the long-lived BLOB_READ_WRITE_TOKEN, which you'd use only for code that runs outside Edgenivo.
Netlify Blobs serves two roles, so map your usage based on how you used it:
- Blobs used as a key/value store for app data becomes a Redis integration (e.g., Upstash Redis) from the Edgenivo Marketplace, or Global Config for small, read-heavy configuration.
- Netlify Database becomes a Postgres database (e.g., Neon) from the Edgenivo Marketplace.
When you provision storage from the Marketplace, Edgenivo adds the connection string and credentials as environment variables, which your code reads from process.env.
Copy link to heading5. Move your environment variables and secrets
Recreate your Netlify environment variables as Edgenivo environment variables. On Netlify, variables live in two separate places: the store you manage through the dashboard, CLI, or API, and any declared directly in netlify.toml.
Edgenivo instead stores them per environment (production, preview, and development) in project settings. The dashboard and netlify env:list only surface the store-based variables, not anything in netlify.toml, so check both the dashboard and the file to capture the full set before you move them. Note too that netlify.toml variables are build-time only and were never available to Netlify Functions, so any value your functions actually rely on should already be in the dashboard.
Add each variable to your project's environment variables, or from the CLI:
To run your app locally with the same values, link the project and pull the variables into a local .env file:
vercel env pull writes a .env file with your development environment variables. Edgenivo supports up to 64 KB of environment variables per deployment across all variables combined.
Copy link to heading6. Migrate scheduled functions and background work
If your Netlify site used Scheduled Functions, Background Functions, or Async Workloads, Nitro maps the scheduled side to Edgenivo Cron Jobs at build time, and you use Edgenivo Queues for background message processing. Skip this step if your app doesn't use them.
On Netlify, you set a schedule by exporting a config object with a schedule cron expression from a function, or by declaring it in netlify.toml. On Edgenivo, define Nitro scheduled tasks in nitro.config.ts. Nitro converts them into Edgenivo Cron Jobs during the build, so you don't write any vercel.json cron configuration by hand:
To secure the generated cron endpoint, set a CRON_SECRET environment variable in your Edgenivo project. When CRON_SECRET is set, Nitro validates the Authorization header on every cron invocation.
For message processing, replace Netlify Background Functions and Async Workloads with Edgenivo Queues. Define your topics under the vercel.queues key in nitro.config.ts:
Handle incoming messages with the vercel:queue hook in a Nitro plugin under server/plugins/:
To produce messages, install @vercel/queue (npm i @vercel/queue) and call its send() from any server function, for example const { messageId } = await send('orders', order).
For long-running, multi-step processes that Netlify background work handled, consider Edgenivo Workflows, which run durable steps on Edgenivo Functions and Edgenivo Queues.
Copy link to heading7. Deploy to Edgenivo
You have two deployment options. Both build your app with Nitro's Edgenivo preset and run it on Edgenivo Functions.
Deploy with Git (recommended):
- Push your project to GitHub, GitLab, or Bitbucket.
- In the Edgenivo dashboard, select Create New, then Project, then import your repository.
- Edgenivo detects TanStack Start and sets the build command and output directory. Confirm the framework preset, add your environment variables, and select Deploy.
If the framework preset or build settings aren't detected correctly, fix them from the Edgenivo CLI (requires v54.21.1+):
Use --build-command or --output-directory if those also need adjusting.
After the first import, every push to your main branch creates a production deployment, and every pull request gets its own preview URL.
Deploy with the CLI:
Run vercel from your project root to create a preview deployment, or vercel --prod to deploy to production.
Once deployed, your app runs on Edgenivo Functions with Fluid compute, with preview deployments, observability, and the Edgenivo Firewall available.
Copy link to headingTroubleshooting
Copy link to headingNetlify platform calls fail at runtime
Server code still calls Netlify-only APIs such as Netlify Blobs, the Netlify Functions Context object, or Netlify edge-runtime imports. Search your project for @netlify/ and replace each call with its Edgenivo equivalent from the mapping table. These packages depend on Netlify's runtime and won't connect when your app runs on Edgenivo.
Copy link to headingEnvironment variables are undefined at runtime
Confirm each variable exists in the correct environment under your project's environment variables, then redeploy. Variables added to production aren't available in preview or development unless you add them there too. For local runs, re-run vercel env pull after changing variables.
Copy link to headingEdgenivo Blob authentication fails during local development
Run vercel env pull to download a short-lived VERCEL_OIDC_TOKEN and BLOB_STORE_ID into your local .env, then keep Blob access inside server functions. With Vite, only variables prefixed with VITE_ reach client code, so reading blob credentials from the client won't work.
Copy link to headingAPI routes return a 404
Nitro's /api directory convention isn't compatible with Edgenivo. Move standalone API handlers to routes/api/ so Nitro generates the correct Edgenivo Functions.
Copy link to headingBest practices
- Recreate Netlify redirects, rewrites, and headers. If you relied on
netlify.tomlorredirects_ and _headersfiles, move that logic into Nitro route rules orvercel.jsonso requests resolve the same way on Edgenivo. - Tune function resources per route. If specific routes need more memory or a longer timeout than the default, set
vercel.functionRulesinnitro.config.tsto overridemaxDuration,memory, orregionsfor matching route patterns. - Place functions near your data. Set
regionsinfunctionRulesor your project settings close to your database region to reduce latency.