---
title: "How to deploy a TanStack Start app on Rock8Cloud"
description: "Deploy a full-stack TanStack Start app to Rock8Cloud - server-side rendered React on its own Node server. Connect your GitHub repo or start from the one-click blueprint, live in about two minutes."
seoTitle: "Deploy TanStack Start: SSR React hosting in one click"
seoDescription: "Deploy a TanStack Start app with SSR, server functions and TanStack Query to Rock8Cloud. One-click blueprint or your own repo, live URL in minutes."
tech: "TanStack Start"
icon: tanstack
category: fullstack
pubDate: 2026-09-29
image: /how-to/og/tanstack-start.png
imageAlt: "How to deploy TanStack Start on Rock8Cloud"
headerImage: true
heroImage:
  src: /how-to/tanstack-start-ui.webp
  alt: "The Driftwave demo landing page the TanStack Start blueprint deploys, with a hero headline and a morning digest card"
  width: 1918
  height: 890
exampleRepo: https://github.com/rock8-cloud/tanstack-start-blueprint
port: 3000
ctaTitle: "Ship your TanStack Start app."
ctaTitleHighlight: "Today."
ctaSubtitle: "Server-rendered React on its own Node server. Connect the repo, hit deploy, share the URL."
ctaIcons: [tanstack, react, typescript]
order: 6
steps:
  - name: "Select GitHub repository deployment"
    text: "In your Rock8Cloud project, choose GitHub repository deployment and connect your TanStack Start repo."
  - name: "Hit Deploy"
    text: "Rock8Cloud builds the image and serves your app at a live public URL. The container port is inferred from your Dockerfile's EXPOSE, 3000 for the TanStack Start Node server."
faq:
  - q: "Do I need a Dockerfile to deploy TanStack Start?"
    a: "Copy the example from this guide. It builds with Bun and runs the Nitro server output on Node. If it sets EXPOSE, Rock8Cloud infers the container port automatically."
  - q: "Is there a faster way to try it?"
    a: "Yes. The open-source TanStack Start blueprint clones to your GitHub account, builds, and goes live on our domain in one click. All you need is a GitHub sign-in. You can assign your own domain later."
  - q: "Is this for TanStack Start or TanStack Router?"
    a: "This guide targets TanStack Start, which renders on the server and runs server functions. A client-only TanStack Router SPA deploys like a static React app."
  - q: "How do I use environment variables?"
    a: "Read them at request time inside server functions or route handlers with process.env, not at module top level. The image is built without secrets and Rock8Cloud provides the environment at runtime. PORT is set by the platform."
  - q: "How do I add a database?"
    a: "Provision PostgreSQL in the same project and link its connection string to your service. Read it inside a server function so it never reaches the browser."
---

[TanStack Start](https://tanstack.com/start) renders React on the server and ships it as a self-contained Node server. On Rock8Cloud it runs in your own container. Connect your GitHub repo, hit deploy, and you get a live URL in about two minutes.

## Deploy your app

One step: select **GitHub repository** deployment, connect your repo, and hit **Deploy**. Rock8Cloud builds the container image and serves your app at a live URL, with build and runtime logs in your browser.

No Dockerfile in the repo? Copy the example below.



> **Pro tip:** Set `EXPOSE 3000` in your Dockerfile and Rock8Cloud infers the container port automatically - nothing else to configure.



**Example Dockerfile**



```dockerfile
# Build
FROM oven/bun:1.3.14 AS build
WORKDIR /app
COPY package.json bun.lock ./
RUN bun install --frozen-lockfile
COPY . .
RUN bun run build

# Run
FROM node:22-slim
WORKDIR /app
ENV NODE_ENV=production
ENV PORT=3000
COPY --from=build /app/.output ./.output
EXPOSE 3000
CMD ["node", ".output/server/index.mjs"]
```

Vite and Nitro emit the whole server to `.output`, so the runtime image needs nothing else. `PORT` is overridden by the platform and the server binds whatever it is given.

## Don't have an app?

One-click start from our open-source template - TanStack Start on React 19 with TanStack Query, Tailwind CSS v4 and shadcn/ui wired up. It's cloned to your GitHub, built, and put live on our domain. Or just browse it on GitHub and borrow what you need.



> **Pro tip:** You can assign your own domain to the app later.





[TanStack Start example](https://github.com/rock8-cloud/tanstack-start-blueprint)

[1-click clone & deploy](https://app.rock8.cloud/new-deployment?blueprint=tanstack-start&utm_source=howto&utm_medium=landing&utm_campaign=howto&utm_content=tanstack-start)



Or ask an agent instead of clicking. With Rock8Cloud [connected over MCP](/how-to/connect-claude), `deploy_blueprint` with the `tanstack-start` slug forks the same template into your GitHub account, creates the project with its service, and starts the first build. The template also ships a `.mcp.json`, so an agent opened in your clone can redeploy it with a single prompt.

The template's landing page is for Driftwave, a fictional product. Replace the copy in `src/content/landing.ts` and add routes under `src/routes/`.

## What you get

- A **live URL** on our domain - share it the moment the first build lands.
- **Deploy on push** - every push to your configured default branch rebuilds and ships automatically.
- A **preview URL per pull request** - review real builds, not screenshots.
- **Instant rollback** - one click back to any known-good build.

## Environment variables

Read configuration at request time inside server functions or route handlers (`process.env.MY_VAR`), not at module top level. The image is built without secrets, and Rock8Cloud provides the environment when the container starts. Anything read in a server function stays on the server and never reaches the browser.

## Need a database?

Server functions can talk to a database directly. Add [PostgreSQL](/how-to/provision-postgresql) or [Dragonfly](/how-to/provision-dragonfly) to the same project in one click and link its connection string to your service. Want auth and a separate API from day one? Start from the [Elysia + TanStack dashboard](/how-to/deploy-elysia-dashboard) instead.
