Awesome-omni-skill tanstack-start
TanStack Start full-stack React framework patterns. Use when working with file-based routing, API routes, server handlers, TanStack Router layouts, or integrating AI/MCP features in this codebase.
install
source · Clone the upstream repo
git clone https://github.com/diegosouzapw/awesome-omni-skill
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/development/tanstack-start" ~/.claude/skills/diegosouzapw-awesome-omni-skill-tanstack-start && rm -rf "$T"
manifest:
skills/development/tanstack-start/SKILL.mdsource content
TanStack Start
File-Based Routing
Routes live in
src/routes/. The route tree auto-generates to src/routeTree.gen.ts - commit this file (required for type-checking).
Route Types
- Root layout, wraps all routes__root.tsx
- Index route for a path segmentindex.tsx
- Layout route wrapping alldemo.tsx
children (usesdemo/*.tsx
)<Outlet />
- Child routes rendered inside parent layoutdemo/*.tsx
- Dynamic route segment$param.tsx
Layout Routes
Create
foo.tsx alongside foo/ directory to wrap child routes:
import { createFileRoute, Outlet } from '@tanstack/react-router' export const Route = createFileRoute('/foo')({ component: FooLayout, }) function FooLayout() { return ( <div> <Outlet /> </div> ) }
API Routes
Server handlers use
api.*.ts naming convention:
import { createFileRoute } from '@tanstack/react-router' export const Route = createFileRoute('/demo/api/example')({ server: { handlers: { POST: async ({ request }) => { const data = await request.json() return Response.json({ result: data }) }, }, }, })
AI Chat Integration
Client Side
Use
@ai-sdk/react with DefaultChatTransport:
import { useChat } from '@ai-sdk/react' import { DefaultChatTransport } from 'ai' const { messages, sendMessage } = useChat({ transport: new DefaultChatTransport({ api: '/demo/api/chat', }), })
Server Side
Use
streamText from ai package with OpenRouter provider:
import { convertToModelMessages, streamText } from 'ai' import { haiku } from '@/lib/openrouter' const result = await streamText({ model: haiku, messages: convertToModelMessages(messages), system: SYSTEM_PROMPT, tools, }) return result.toUIMessageStreamResponse()
OpenRouter Setup
Create provider singleton in
src/lib/openrouter.ts:
import { createOpenRouter } from '@openrouter/ai-sdk-provider' export const openrouter = createOpenRouter({ apiKey: process.env.OPENROUTER_API_KEY, }) export const haiku = openrouter('anthropic/claude-3.5-haiku')
MCP Server
Register tools with Zod schemas in route files:
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js' import z from 'zod' import { handleMcpRequest } from '@/utils/mcp-handler' const server = new McpServer({ name: 'my-server', version: '1.0.0' }) server.registerTool( 'toolName', { title: 'Tool Title', description: 'Tool description', inputSchema: { param: z.string().describe('Param description') }, }, ({ param }) => ({ content: [{ type: 'text', text: result }], }), ) export const Route = createFileRoute('/mcp')({ server: { handlers: { POST: async ({ request }) => handleMcpRequest(request, server), }, }, })
Path Aliases
@/* maps to ./src/* (configured in tsconfig.json).