• Chat SDK adds table rendering and streaming markdown

    Chat SDK now renders tables natively across all platform adapters and converts markdown to each platform's native format during streaming.

    The Table() component is a new card element in Chat SDK that gives you a clean, composable API for rendering tables across every platform adapter. Pass in headers and rows, and Chat SDK handles the rest.

    import { Table } from "chat";
    await thread.post(
    Table({
    headers: ["Model", "Latency", "Cost"],
    rows: [
    ["claude-4.6-sonnet", "1.2s", "$0.003"],
    ["gpt-4.1", "0.9s", "$0.005"],
    ],
    })
    );

    The adapter layer converts the table to the best format each platform supports.

    Slack renders Block Kit table blocks, Teams and Discord use GFM markdown tables, Google Chat uses monospace text widgets, and Telegram converts tables to code blocks. GitHub and Linear already supported tables through their markdown pipelines and continue to work as before. Plain markdown tables (without Table()) are also converted through the same pipeline.

    Streaming markdown has also improved across the board. Slack's native streaming path now renders bold, italic, lists, and other formatting in real time as the response arrives, rather than resolving when the message is complete. All other platforms use the fallback streaming path, so streamed text now passes through each adapter's markdown-to-native conversion pipeline at each intermediate edit. Previously, these adapters received raw markdown strings, so users saw literal **bold** syntax until the final message.

    Adapters without platform-specific rendering now include improved defaults, so new formatting capabilities work across all platforms without requiring adapter-by-adapter updates.

    Update to the latest Chat SDK to get started, and view the documentation.

  • v0 API now supports custom MCP servers

    The v0 API now supports connecting to any custom MCP server. Teams can configure new servers programmatically by providing the necessary endpoint and authentication details.

    import { v0 } from "v0-sdk"
    const server = await v0.mcpServers.create({
    name: "Vercel",
    url: "https://mcp.vercel.com",
    })

    Once configured, you can make these custom servers available directly during a v0 chat session by referencing the server ID:

    import { v0 } from "v0-sdk"
    await v0.chats.create({
    message: "Build a heatmap of my team's Vercel deployments.",
    mcpServerIds: [server.id],
    })

    Visit the v0 API docs.

  • Skip unaffected builds for projects in Bun monorepos

    Skipping unaffected builds in monorepos now detects Bun lockfiles, extending the same compatibility already available for other package managers.

    When Vercel evaluates which projects to build, it reads lockfile changes to determine whether dependencies have changed. Teams using Bun can now rely on this detection to skip builds for projects that haven't changed, reducing unnecessary build time across monorepos.

    See the monorepo documentation to learn how skipping unaffected projects works.

  • Deployment step now 15% faster

    Builds on Vercel now deploy 1.2 seconds faster on average, with more complex projects seeing the biggest gains (up to 3.7 seconds).

    The improvement comes from optimizing how credentials are provisioned during the build process, eliminating a blocking step that previously added latency at the end of every build.

    Learn more in the builds documentation.

  • Vercel's CDN gets a new dashboard experience

    Vercel's CDN now has a new dashboard to give you a single place to track global traffic distribution and top-line CDN metrics, manage caching, and update routing rules. The new experience includes:

    • Overview: A live map of your project's global traffic distribution across Vercel Regions and top-level request volume and cache performance metrics.

    • Caches: A redesigned page for purging content across Vercel CDN's caching layers, which was previously under project settings.

    • Project-level Routing: A new project-level UI for updating routing rules, like setting response headers or rewriting to an external API, without triggering a new deployment.

    Learn more about Vercel's CDN or visit the CDN tab for your project to see the updates.

  • Vercel's CDN now supports updating routing rules without a new deployment

    You can now create and update routing rules within a project, such as setting response headers or rewrites to an external API, without building a new deployment.

    Project-level routing rules are available via the dashboard, API, CLI, and Vercel SDK and take effect instantly after you make and publish the change. Project-level routes run after bulk redirects and before your deployment config's routes.

    With this addition, Vercel's CDN now supports three routing mechanisms:

    • Routes defined in your deployment configuration (via vercel.json, vercel.ts, or next.config.js)

    • Bulk redirects

    • Project-level routes

    Project-level routes are available on all plans starting today. Read the documentation or go to the CDN tab in your project dashboard to get started.

  • Streamdown 2.4: More customization, accessibility and custom rendering

    Streamdown v2.4 introduces customization hooks, accessibility features, and user experience improvements for developers rendering markdown.

    Teams can now customize the appearance of their markdown output using several new properties. You can override the built-in icons by passing a specific component map to the icons prop.

    import { Streamdown, type IconMap } from "streamdown"
    <Streamdown
    icons={{ CheckIcon: MyCheckIcon }}
    >
    {content}
    </Streamdown>

    The createCodePlugin now accepts a themes option for light and dark Shiki themes, a startLine meta option for custom starting line numbers, and an inlineCode virtual component for styling inline code independently from blocks.

    import { createCodePlugin } from "streamdown"
    const codePlugin = createCodePlugin({
    themes: {
    light: "github-light",
    dark: "github-dark",
    },
    })

    Streamdown now supports internationalization and text direction. The dir prop automatically applies left-to-right or right-to-left formatting based on the first strong Unicode character, and the translations prop supports custom languages.

    <Streamdown
    dir="auto"
    translations={{ copy: "نسخ", copied: "تم النسخ" }}
    >
    {content}
    </Streamdown>

    Tables include a fullscreen overlay controlled via the controls prop, complete with scroll locking and Escape key support. Developers can hook into streaming events using the onAnimationStart and onAnimationEnd callbacks.

    This release fixes empty lines collapsing in syntax-highlighted blocks and prevents ordered lists from retriggering animations during streaming.

    For projects using Tailwind v4, the new prefix prop namespaces utility classes to avoid collisions.

    <Streamdown prefix="sd-">{content}</Streamdown>

    To get started, learn more.