TanStack Start
Install newt/ui in a TanStack Start app: the root route stylesheet, the alias, and the two commands.
Choose the brand hue, the radius and the font in newt/create, and it prints a preset code. Pass that code to init and the project comes out already wearing it.
pnpm dlx create-tsrouter-app@latestnpx create-tsrouter-app@latestyarn dlx create-tsrouter-app@latestbunx create-tsrouter-app@latestpnpm dlx newtui@latest init --preset <code>npx newtui@latest init --preset <code>yarn dlx newtui@latest init --preset <code>bunx newtui@latest init --preset <code>pnpm dlx newtui@latest add buttonnpx newtui@latest add buttonyarn dlx newtui@latest add buttonbunx newtui@latest add buttonTanStack Start has no scaffold template, so the project is created by its own tool first and init runs inside the result. It detects the framework, the bundler and the stylesheet on its own.
pnpm dlx create-tsrouter-app@latestnpx create-tsrouter-app@latestyarn dlx create-tsrouter-app@latestbunx create-tsrouter-app@latestpnpm dlx newtui@latest initnpx newtui@latest inityarn dlx newtui@latest initbunx newtui@latest initpnpm dlx newtui@latest add buttonnpx newtui@latest add buttonyarn dlx newtui@latest add buttonbunx newtui@latest add buttonCreate the app
npx create-tsrouter-app@latest my-app --template file-router --tailwindThe template already carries Tailwind v4 through the Vite plugin. An app made
without --tailwind needs tailwindcss and @tailwindcss/vite installed and
the plugin added to vite.config.ts.
Declare the alias twice
{
"compilerOptions": {
"paths": { "@/*": ["./src/*"] }
}
}import { fileURLToPath } from "node:url"
import { defineConfig } from "vite"
export default defineConfig({
resolve: {
alias: { "@": fileURLToPath(new URL("./src", import.meta.url)) },
},
})Run init
pnpm dlx newtui@latest initnpx newtui@latest inityarn dlx newtui@latest initbunx newtui@latest initThere is no --template for TanStack Start: the app is created by
create-tsrouter-app above, and init reads what it finds — React from the
dependencies, the stylesheet from src/styles.css.
Mark the root document
The root route owns the <body>, so .newt-root goes there:
import appCss from "../styles.css?url"
export const Route = createRootRoute({
head: () => ({ links: [{ rel: "stylesheet", href: appCss }] }),
component: () => (
<html lang="en">
<body className="newt-root">
<Outlet />
</body>
</html>
),
})Add a component
pnpm dlx newtui@latest add buttonnpx newtui@latest add buttonyarn dlx newtui@latest add buttonbunx newtui@latest add buttonimport { Button } from "@/components/ui/button"
export const Route = createFileRoute("/")({
component: () => <Button variant="primary">Send</Button>,
})Server rendering
Start renders on the server by default, so the same rule as Next applies: the
nine interactive components carry "use client". Answer yes to the React Server
Components question at init to keep those directives, no to have add strip
them.
What init writes
components.json the config, shared with shadcn
src/styles.css the --newt-* token block
src/lib/utils.ts cn()
src/components/ui/button.tsx add button
See Dark mode for the theme toggle, and RTL if the app has to run right to left.