Agents & OrchestrationSûr8686/100
Solid Start (TanStack)
Solid bindings for TanStack Start: useServerFn hook, tanstackStart Vite plugin, StartClient, StartServer, Solid-specific setup, re-exports from @tanstack/start-client-core. Full project setup with Solid.
ou envoie-le directement à ton agent.
Installer dans ton projet
$ curl -fsSL https://arboristhree.xyz/cli/install-skill.mjs -o /tmp/arboris-install-skill.mjs && node /tmp/arboris-install-skill.mjs solid-start__tanstack-router__packages-solid-start-skills-7a3e0b08f808TanStack
TanStack/router
Contenu à copier
---
name: solid-start
description: >-
Solid bindings for TanStack Start: useServerFn hook, tanstackStart
Vite plugin, StartClient, StartServer, Solid-specific setup,
re-exports from @tanstack/start-client-core. Full project setup
with Solid.
metadata:
origin: TanStack
type: framework
library: tanstack-start
library_version: '1.166.2'
framework: solid
requires:
- start-core
sources:
- TanStack/router:packages/solid-start/src
- TanStack/router:docs/start/framework/solid/build-from-scratch.md
---
# Solid Start (`@tanstack/solid-start`)
This skill builds on start-core. Read `@tanstack/start-client-core#start-core` first for foundational concepts.
This skill covers the Solid-specific bindings, setup, and patterns for TanStack Start.
> **CRITICAL**: All code is ISOMORPHIC by default. Loaders run on BOTH server and client. Use `createServerFn` for server-only logic.
> **CRITICAL**: Do not confuse `@tanstack/solid-start` with SolidStart (`@solidjs/start`). They are completely different frameworks with different APIs.
> **CRITICAL**: Types are FULLY INFERRED. Never cast, never annotate inferred values.
## Package API Surface
`@tanstack/solid-start` re-exports everything from `@tanstack/start-client-core` plus:
- `useServerFn` — Solid hook for calling server functions from components
All core APIs (`createServerFn`, `createMiddleware`, `createStart`, `createIsomorphicFn`, `createServerOnlyFn`, `createClientOnlyFn`) are available from `@tanstack/solid-start`.
Server utilities (`getRequest`, `getRequestHeader`, `setResponseHeader`, `setCookie`, `getCookie`) are imported from `@tanstack/solid-start/server`.
## Full Project Setup
### 1. Install Dependencies
```bash
npm i @tanstack/solid-start @tanstack/solid-router solid-js
npm i -D vite vite-plugin-solid typescript
```
### 2. package.json
```json
{
"type": "module",
"scripts": {
"dev": "vite dev",
"build": "vite build",
"start": "node .output/server/index.mjs"
}
}
```
### 3. tsconfig.json
```json
{
"compilerOptions": {
"jsx": "preserve",
"jsxImportSource": "solid-js",
"moduleResolution": "Bundler",
"module": "ESNext",
"target": "ES2022",
"skipLibCheck": true,
"strictNullChecks": true
}
}
```
### 4. vite.config.ts
```ts
import { defineConfig } from 'vite'
import { tanstackStart } from '@tanstack/solid-start/plugin/vite'
import solidPlugin from 'vite-plugin-solid'
export default defineConfig({
plugins: [
tanstackStart(), // MUST come before solid plugin
solidPlugin({ ssr: true }),
],
})
```
### 5. Router Factory (src/router.tsx)
```tsx
import { createRouter } from '@tanstack/solid-router'
import { routeTree } from './routeTree.gen'
export function getRouter() {
const router = createRouter({
routeTree,
scrollRestoration: true,
})
return router
}
```
### 6. Root Route (src/routes/\_\_root.tsx)
```tsx
import {
Outlet,
createRootRoute,
HeadContent,
Scripts,
} from '@tanstack/solid-router'
import { HydrationScript } from 'solid-js/web'
import { Suspense } from 'solid-js'
export const Route = createRootRoute({
head: () => ({
meta: [
{ charSet: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
{ title: 'My TanStack Start App' },
],
}),
// shellComponent renders the HTML document shell (always SSR'd)
shellComponent: RootDocument,
})
function RootDocument(props: { children: any }) {
return (
<html>
<head>
<HydrationScript />
</head>
<body>
<HeadContent />
<Suspense>{props.children}</Suspense>
<Scripts />
</body>
</html>
)
}
```
### 7. Index Route (src/routes/index.tsx)
```tsx
import { createFileRoute } from '@tanstack/solid-router'
import { createServerFn } from '@tanstack/solid-start'
const getGreeting = createServerFn({ method: 'GET' }).handler(async () => {
return 'Hello from TanStack Start!'
})
export const Route = createFileRoute('/')({
loader: () => getGreeting(),
component: HomePage,
})
function HomePage() {
const greeting = Route.useLoaderData()
return <h1>{greeting()}</h1>
}
```
## useServerFn Hook
Use `useServerFn` to call server functions from Solid components with automatic redirect handling:
```tsx
import { createServerFn, useServerFn } from '@tanstack/solid-start'
import { createSignal } from 'solid-js'
const updatePost = createServerFn({ method: 'POST' })
.validator((data: { id: string; title: string }) => data)
.handler(async ({ data }) => {
await db.posts.update(data.id, { title: data.title })
return { success: true }
})
function EditPostForm(props: { postId: string }) {
const updatePostFn = useServerFn(updatePost)
const [title, setTitle] = createSignal('')
return (
<form
onSubmit={async (e) => {
e.preventDefault()
await updatePostFn({ data: { id: props.postId, title: title() } })
}}
>
<input value={title()} onInput={(e) => setTitle(e.target.value)} />
<button type="submit">Save</button>
</form>
)
}
```
Unlike the React version, `useServerFn` does NOT wrap the returned function in any memoization (no `useCallback` equivalent needed — Solid's `setup` runs once).
## Solid-Specific Components
All routing components from `@tanstack/solid-router` work in Start:
- `<Outlet>` — renders matched child route
- `<Link>` — type-safe navigation
- `<Navigate>` — declarative redirect
- `<HeadContent>` — renders head tags via `@solidjs/meta` (must be in `<body>` — uses portals to inject into `<head>`)
- `<Scripts>` — renders body scripts (must be in `<body>`)
- `<Await>` — renders deferred data with `<Suspense>`
- `<ClientOnly>` — renders children only after hydration
- `<CatchBoundary>` — error boundary wrapping `Solid.ErrorBoundary`
## Hooks Reference
All hooks from `@tanstack/solid-router` work in Start. Most return `Accessor<T>` — call the accessor to read:
- `useRouter()` — router instance (NOT an Accessor)
- `useRouterState()` — `Accessor<T>`, subscribe to router state
- `useNavigate()` — navigation function (NOT an Accessor)
- `useSearch({ from })` — `Accessor<T>`, validated search params
- `useParams({ from })` — `Accessor<T>`, path params
- `useLoaderData({ from })` — `Accessor<T>`, loader data
- `useMatch({ from })` — `Accessor<T>`, full route match
- `useRouteContext({ from })` — `Accessor<T>`, route context
- `Route.useLoaderData()` — `Accessor<T>`, typed loader data (preferred in route files)
- `Route.useSearch()` — `Accessor<T>`, typed search params (preferred in route files)
## Common Mistakes
### 1. CRITICAL: Importing from wrong package
```tsx
// WRONG — this is the SPA router, NOT Start
import { createServerFn } from '@tanstack/solid-router'
// CORRECT — server functions come from solid-start
import { createServerFn } from '@tanstack/solid-start'
// CORRECT — routing APIs come from solid-router (re-exported by Start too)
import { createFileRoute, Link } from '@tanstack/solid-router'
```
### 2. CRITICAL: Forgetting to call Accessor
Most hooks return `Accessor<T>`. Must call to read the value.
```tsx
// WRONG
const data = Route.useLoaderData()
return <h1>{data.message}</h1>
// CORRECT
const data = Route.useLoaderData()
return <h1>{data().message}</h1>
```
### 3. HIGH: Missing Scripts component
Without `<Scripts />` in the root route's `<body>`, client JavaScript doesn't load and the app won't hydrate.
### 4. HIGH: Solid plugin before Start plugin in Vite config
```ts
// WRONG
plugins: [solidPlugin(), tanstackStart()]
// CORRECT
plugins: [tanstackStart(), solidPlugin()]
```
## Cross-References
- `@tanstack/start-client-core#start-core` — core Start concepts
- `@tanstack/router-core#router-core` — routing fundamentals
- `@tanstack/solid-router#solid-router` — Solid Router hooks and componentsColle ce Markdown dans ton agent ou utilise les boutons ci-dessus pour l’écrire dans ton projet.
Ce que fait Solid Start (TanStack)
`useServerFn` — Solid hook for calling server functions from components
`<Outlet>` — renders matched child route
`<Link>` — type-safe navigation
`<Navigate>` — declarative redirect
Comment utiliser Solid Start (TanStack)
1
Copie le prompt
Un clic copie le prompt packagé (ou l'envoie à ton agent).
2
L'agent installe le skill
Il ajoute le SKILL.md et ses ressources à ton projet.
3
Activation automatique
Le skill s'active dès que le contexte correspond.
Déclencheurs pour Solid Start (TanStack)
Dis simplement à ton agent quelque chose comme :
Applique le skill solid-start__tanstack-router__packages-solid-start-skills-7a3e0b08f808 à cette tâche
Utilise solid-start__tanstack-router__packages-solid-start-skills-7a3e0b08f808 pour améliorer cette implémentation
Passe en revue ce sujet avec solid-start__tanstack-router__packages-solid-start-skills-7a3e0b08f808
Skills liés à Solid Start (TanStack)
Acceleration (Microsoft)
Compare synthetic acceleration options and clearly separate scenario value from forecast commitments.Account Overview (Microsoft)
Create a synthetic Acme account overview and identify evidence that merits seller attention.Acroform Writer (Microsoft)
Use this skill whenever the user wants values written INTO an existing PDF form that lives in the connected SharePoint knowledge source — filling out, completing, populating, or submitting a fillable PDF (application, intake sheet, contract, government form) from data they supply, a spreadsheet row, or the conversation. Triggers include "fill out the job application form", "complete the intake form for [person]", "populate our standard NDA template", and "make this ready to send / non-editable" (flatten). The source form should be found via knowledge search; only ask the user to upload it if knowledge search turns up nothing plausible. different task), and do NOT use it on scanned/image-only PDFs that have no real fillable fields — those need OCR or manual overlay instead, which this skill explicitly detects and reports rather than silently failing.