Hosting is the process of deploying your application to the internet so that users can access it. This is a critical part of any web development project, ensuring your application is available to the world. TanStack Start supports Vite and Rsbuild, giving you flexible build outputs for different hosting providers and runtimes.
TanStack Start is designed to work with any hosting provider, so if you already have a hosting provider in mind, you can deploy your application there using the full-stack APIs provided by TanStack Start.
However, since hosting is one of the most crucial aspects of your application's performance, reliability, and scalability, we recommend using one of our Official Hosting Partners: Cloudflare, Netlify, or Railway.
Once you've chosen a deployment target, you can follow the deployment guidelines below to deploy your TanStack Start application to the hosting provider of your choice:
cloudflare-workers: Deploy to Cloudflare Workers
netlify: Deploy to Netlify
railway: Deploy to Railway
nitro: Deploy using Nitro
vercel: Deploy to Vercel
node-server: Deploy to a Node.js server
bun: Deploy to a Bun server
appwrite-sites: Deploy to Appwrite Sites
... and more to come!
When deploying to Cloudflare Workers, you'll need to complete a few extra steps before your users can start using your app. The official Cloudflare Workers setup currently uses Vite through @cloudflare/vite-plugin.
Install @cloudflare/vite-plugin and wrangler
pnpm add -D @cloudflare/vite-plugin wranglerAdd the Cloudflare plugin to your vite.config.ts file
// vite.config.ts
import { defineConfig } from 'vite'
import { tanstackStart } from '@tanstack/solid-start/plugin/vite'
import { cloudflare } from '@cloudflare/vite-plugin'
import viteSolid({ ssr: true }) from 'vite-plugin-solid'
export default defineConfig({
plugins: [
cloudflare({ viteEnvironment: { name: 'ssr' } }),
tanstackStart(),
viteSolid({ ssr: true })(),
],
})Add a wrangler.jsonc config file
{
"$schema": "node_modules/wrangler/config-schema.json",
"name": "tanstack-start-app",
"compatibility_date": "2025-09-02",
"compatibility_flags": ["nodejs_compat"],
"main": "@tanstack/solid-start/server-entry"
}Modify the scripts in your package.json file
{
"scripts": {
"dev": "vite dev",
"build": "vite build && tsc --noEmit",
// ============ š remove this line ============
"start": "node .output/server/index.mjs",
// ============ š add these lines ============
"preview": "vite preview",
"deploy": "npm run build && wrangler deploy",
"cf-typegen": "wrangler types"
}
}Login with Wrangler to authenticate with your Cloudflare account.
npx wrangler loginor if using pnpm:
pnpm dlx wrangler loginTo check current user use wrangler whoami.
Deploy
pnpm run deployDeploy your application to Cloudflare Workers using their one-click deployment process, and you're ready to go!
A full TanStack Start example for Cloudflare Workers is available here.
The official Netlify setup currently uses Vite through @netlify/vite-plugin-tanstack-start, which configures your build for Netlify deployment and provides full Netlify production platform emulation in local dev:
npm install --save-dev @netlify/vite-plugin-tanstack-start
# or...
pnpm add --save-dev @netlify/vite-plugin-tanstack-start
# or yarn, bun, etc.// vite.config.ts
import { defineConfig } from 'vite'
import { tanstackStart } from '@tanstack/solid-start/plugin/vite'
import netlify from '@netlify/vite-plugin-tanstack-start' // ā add this
import viteSolid({ ssr: true }) from 'vite-plugin-solid'
export default defineConfig({
plugins: [
tanstackStart(),
netlify(), // ā add this (anywhere in the array is fine)
viteSolid({ ssr: true })(),
],
})Finally, use Netlify CLI to deploy your app:
npx netlify deployIf this is a new Netlify project, you'll be prompted to initialize it and build settings will be automatically configured for you.
For more detailed documentation, check out the full TanStack Start on Netlify docs.
Alternatively, if you prefer manual configuration, you can add a netlify.toml file to your project root:
[build]
command = "vite build"
publish = "dist/client"
[dev]
command = "vite dev"
port = 3000Or you can set the above settings directly in the Netlify app.
Netlify also supports other deployment methods, such as continuous deployment from a git repo hosted on GitHub, GitLab, or others, starting from a template, deploying or importing from an AI code generation tool, and more.
Railway provides instant deployments with zero configuration. Follow the Nitro deployment instructions, then deploy to Railway:
Push your code to a GitHub repository
Connect your repository to Railway at railway.com
Railway will automatically detect your build settings and deploy your application
Railway automatically provides:
Automatic deployments on every push to your repository
Built-in databases (Postgres, MySQL, Redis, MongoDB)
Preview environments for pull requests
Automatic HTTPS and custom domains
For more details, see Railway's documentation.
Nitro is an agnostic layer that allows you to deploy TanStack Start applications to a wide range of hostings.
ā ļø The nitro/vite plugin natively integrates with Vite Environments API as the underlying build tool for TanStack Start. It is still under active development and receives regular updates. Please report any issues you encounter with reproduction so they can be investigated.
Install nitro:
npm install nitroAdd the nitro/vite plugin to your vite.config.ts file:
import { tanstackStart } from '@tanstack/solid-start/plugin/vite'
import { defineConfig } from 'vite'
import { nitro } from 'nitro/vite'
import viteSolid({ ssr: true }) from 'vite-plugin-solid'
export default defineConfig({
plugins: [tanstackStart(), nitro(), viteSolid({ ssr: true })()],
})If you're deploying to Node.js with Nitro (which uses srvx under the hood), you can get a ~5% throughput improvement by replacing the global Response constructor with srvx's optimized FastResponse.
First, install srvx:
npm install srvxThen add this to your server entry point (src/server.ts):
import { FastResponse } from 'srvx'
globalThis.Response = FastResponseThis works because srvx's FastResponse includes an optimized _toNodeResponse() path that avoids the overhead of the standard Web Response to Node.js conversion. This optimization only applies to Node.js deployments using Nitro/h3/srvx.
Follow the Nitro deployment instructions. Deploy your application to Vercel using their one-click deployment process, and you're ready to go!
Use the Node.js deployment shape that matches your build tool.
Follow the Nitro deployment instructions. Use the node command to start your application from the server from the build output files.
Ensure build and start npm scripts are present in your package.json file:
"build": "vite build",
"start": "node .output/server/index.mjs"An Rsbuild production build emits client assets in dist/client and a server bundle in dist/server/index.js. The server bundle exports a fetch-style Start server entry:
type ServerEntry = {
fetch(request: Request): Response | Promise<Response>
}To run it on Node.js, serve dist/client as static assets and forward all other requests to the server entry's fetch handler. srvx is one way to do that:
npm install srvx "build": "rsbuild build",
"start": "srvx --prod -s dist/client dist/server/index.js"Express or any other custom Node.js server works too, as long as it serves the client assets and calls the server entry's fetch handler for dynamic requests.
If your server entry is emitted as dist/server/server.js, use that path instead of dist/server/index.js.
Then you can run the following command to build your application:
npm run buildYou can start your application by running:
npm run startImportant
Currently, the Bun specific deployment guidelines only work with Solid 1.x. If you are using an older Solid version, please refer to the Node.js deployment guidelines.
Make sure that your solid-js package is set to a supported version in your package.json file. If not, run the following command to upgrade the packages:
bun install solid-js@latestFor Vite builds, follow the Nitro deployment instructions. Depending on how you invoke the build, you might need to set the 'bun' preset in the Nitro configuration:
// vite.config.ts
import { tanstackStart } from '@tanstack/solid-start/plugin/vite'
import { defineConfig } from 'vite'
import { nitro } from 'nitro/vite'
import viteSolid({ ssr: true }) from 'vite-plugin-solid'
export default defineConfig({
plugins: [tanstackStart(), nitro({ preset: 'bun' }), viteSolid({ ssr: true })()],
})Alternatively, you can use a custom server implementation that leverages Bun's native APIs.
We provide a reference implementation that demonstrates one approach to building a production-ready Bun server. This example uses Bun-native functions for optimal performance and includes features like intelligent asset preloading and memory management.
This is a starting point - feel free to adapt it to your needs or simplify it for your use case.
What this example demonstrates:
Serving static assets using Bun's native file handling
Hybrid loading strategy (preload small files, serve large files on-demand)
Optional features like ETag support and Gzip compression
Production-ready caching headers
Quick Setup:
Copy the server.ts file from the example repository to your project root (or use it as inspiration for your own implementation)
Build your application:
bun run buildStart the server:
bun run server.tsConfiguration (Optional):
The reference server implementation includes several optional configuration options via environment variables. You can use these as-is, modify them, or remove features you don't need:
# Basic usage - just works out of the box
bun run server.ts
# Common configurations
PORT=8080 bun run server.ts # Custom port
ASSET_PRELOAD_VERBOSE_LOGGING=true bun run server.ts # See what's happeningAvailable Environment Variables:
| Variable | Description | Default |
|---|---|---|
| PORT | Server port | 3000 |
| ASSET_PRELOAD_MAX_SIZE | Maximum file size to preload into memory (bytes) | 5242880 (5MB) |
| ASSET_PRELOAD_INCLUDE_PATTERNS | Comma-separated glob patterns for files to include | All files |
| ASSET_PRELOAD_EXCLUDE_PATTERNS | Comma-separated glob patterns for files to exclude | None |
| ASSET_PRELOAD_VERBOSE_LOGGING | Enable detailed logging | false |
| ASSET_PRELOAD_ENABLE_ETAG | Enable ETag generation | true |
| ASSET_PRELOAD_ENABLE_GZIP | Enable Gzip compression | true |
| ASSET_PRELOAD_GZIP_MIN_SIZE | Minimum file size for Gzip (bytes) | 1024 (1KB) |
| ASSET_PRELOAD_GZIP_MIME_TYPES | MIME types eligible for Gzip | text/,application/javascript,application/json,application/xml,image/svg+xml |
# Optimize for minimal memory usage
ASSET_PRELOAD_MAX_SIZE=1048576 bun run server.ts
# Preload only critical assets
ASSET_PRELOAD_INCLUDE_PATTERNS="*.js,*.css" \
ASSET_PRELOAD_EXCLUDE_PATTERNS="*.map,vendor-*" \
bun run server.ts
# Disable optional features
ASSET_PRELOAD_ENABLE_ETAG=false \
ASSET_PRELOAD_ENABLE_GZIP=false \
bun run server.ts
# Custom Gzip configuration
ASSET_PRELOAD_GZIP_MIN_SIZE=2048 \
ASSET_PRELOAD_GZIP_MIME_TYPES="text/,application/javascript,application/json" \
bun run server.tsExample Output:
š¦ Loading static assets from ./dist/client...
Max preload size: 5.00 MB
š Preloaded into memory:
/assets/index-a1b2c3d4.js 45.23 kB ā gzip: 15.83 kB
/assets/index-e5f6g7h8.css 12.45 kB ā gzip: 4.36 kB
š¾ Served on-demand:
/assets/vendor-i9j0k1l2.js 245.67 kB ā gzip: 86.98 kB
ā
Preloaded 2 files (57.68 KB) into memory
š Server running at http://localhost:3000For a complete working example, check out the TanStack Start + Bun example in this repository.
When deploying to Appwrite Sites, you'll need to complete a few steps:
Create a TanStack Start app (or use an existing one)
npx @tanstack/cli@latest createPush your project to a GitHub repository
Create a GitHub repository and push your code.
Create an Appwrite project
Head to Appwrite Cloud and sign up if you haven't already, then create your first project.
Deploy your site
In your Appwrite project, navigate to the Sites page from the sidebar. Click on the Create site, select Connect a repository, connect your GitHub account and select your repository.
Select the production branch and root directory
Verify TanStack Start is selected as the framework
Confirm the build settings:
Add any required environment variables
Click Deploy
After successful deployment, click the Visit site button to see your deployed application.