TANSTACK

TANSTACK · Launch Video Breakdown: Hook, Pacing & Motion Design

30 seconds of spinners is not great UX. @tanstack/ai now streams structured output straight into useChat. Pass a Zod schema, get a typed `partial` and `final` for free. Blog post link below

Creative ToolsLaunchMay 14, 2026@tan_stack
0:00 · The Hook · The Problem: 30s of Nothing
0:00 / 0:00

Scene-by-scene timeline & spoken transcript

  1. The Hook

    The Problem: 30s of Nothing

    “(No spoken dialogue — silent video with a subtle, pulsing background glow.)”

    On screen
    @TANSTACK/AI 30s of nothing. Structured output, blocking. Spinner only.
    Camera
    Static, centered framing on a loading spinner and text.
    Motion
    Subtle pulsing glow behind text, animated loading spinner arc.
  2. Problem Agitation

    The Old Shape: Blocking API Calls

    “(No spoken dialogue — silent video with a subtle, pulsing background glow.)”

    On screen
    The old shape. chat({ outputSchema }) awaits the full result. // server const person = await chat({ adapter: openaiText("gpt-5.2"), messages, outputSchema: PersonSchema, }) AWAITING... waiting on full response 0.5s name age email
    Camera
    Static, top-down view of a code editor and a form UI.
    Motion
    Progressive timer animation, form fields remain empty until full response.
  3. Product Reveal

    The Solution: Add stream: true

    “(No spoken dialogue — silent video with a subtle, pulsing background glow.)”

    On screen
    Add stream: true. Server unblocks. The form starts filling in. // server const stream = chat({ adapter: openaiText("gpt-5.2"), messages, outputSchema: PersonSchema, stream: true, }) return toServerSentEventsResponse(stream) AWAITING... name age email
    Camera
    Static, top-down view of a code editor and a form UI.
    Motion
    Text appears character-by-character in form fields, simulating real-time streaming. 'AWAITING...' changes to 'STREAMING...'.
  4. Feature Teaser

    Simplified Client-Side with useChat

    “(No spoken dialogue — silent video with a subtle, pulsing background glow.)”

    On screen
    Pass it to useChat. Glue code deletes itself. Typed partial + final from the hook. // onChunk + useState + parsePartialJSON glue_ const [partial, setPartial] = useState({}) const [final, setFinal] = useState(null) let raw = "" useChat({ onChunk: (chunk) => { if (chunk.type === "TEXT_MESSAGE_CONTENT") setPartial(parsePartialJSON(raw += chunk.delta)) else if (chunk.name === "structured-output-complete") setFinal(chunk.value.object as Person) }}) // client - that's it. const { partial, final } = useChat({ connection: fetchServerSentEvents("/api/extract"), outputSchema: PersonSchema, }) STREAMING... name "John Doe" age 30 email "john@example.com"
    Camera
    Static, top-down view of a code editor and a form UI.
    Motion
    Code lines animate out, revealing a simpler client-side implementation. Form fields continue to stream data.
  5. Call to Action

    One Schema. End to End.

    “(No spoken dialogue — silent video with a subtle, pulsing background glow.)”

    On screen
    STREAMING STRUCTURED OUTPUT One schema. End to end. @tanstack/ai @tanstack/ai-react const { partial, final } = useChat({ outputSchema: PersonSchema, }) tanstack.com/ai
    Camera
    Static, centered framing on key message and call to action.
    Motion
    Text and code snippets fade in, followed by a call-to-action button. Subtle background glow persists.

Related Creative Tools Product Launches

Explore all Creative Tools launches →
Claude
Hook 9.264.5M
ClaudeCreative Tools

Anthropic Labs launches Claude Design, which turns conversation into prototypes, slides and one-pagers, powered by Claude Opus 4.7.

@claudeai
Google
Hook 9.218.8M
GoogleCreative Tools

A vibe design partner with an AI-native canvas for turning ideas into UI.

@stitchbygoogle
Claude
Hook 8.97.5M
ClaudeCreative Tools

Your work tools in Claude are now available on mobile. Explore Figma designs, create Canva slides, check Amplitude dashboards, all from your phone. Give it a try:

@claudeai