Streamdown Release Notes

Last updated: Mar 6, 2026

  • Mar 5, 2026
    • Date parsed from source:
      Mar 5, 2026
    • First seen by Releasebot:
      Mar 6, 2026
    Vercel logo

    Streamdown by Vercel

    Streamdown release features flexible code blocks and UI customization. Highlights include startLine for fenced code, customizable icons and themes, inlineCode styling, table action upgrades with fullscreen, direction and Tailwind prefix options, pluggable renderers, and animation lifecycle hooks for synchronized UI state.

    Minor Changes

    • 5edff75: Clarified Tailwind @source configuration for Streamdown and optional plugins.
      Updated documentation to keep the global @source for core streamdown only, move plugin @source guidance to plugin docs with examples, and add a caveat to include plugin entries only if installed.
    • 57cd3b5: Add support for custom starting line numbers in code blocks via the startLine meta option.
      Code blocks can now specify a starting line number in the meta string:
      const x = 1;
      
      This renders line numbers beginning at 10 instead of the default 1. The feature works by parsing the startLine=N value from the fenced-code meta string and applying counter-reset: line N-1 to the <code> element.
    • 57cd3b5: Add support for customizing icons via the icons prop on <Streamdown>.
      Users can override any subset of the built-in icons (copy, download, zoom, etc.) by passing a Partial<IconMap>:
      import { Streamdown, type IconMap } from "streamdown";
      <Streamdown icons={{ CheckIcon: MyCheckIcon }}>{content}</Streamdown>;
      Unspecified icons fall back to defaults.
    • 01d27e9: Add support for custom Shiki themes via a themes option on createCodePlugin, accepting a [light, dark] pair of bundled theme names or full theme registration objects.
    • 2cf559d: Add a virtual inlineCode key to the components prop, allowing inline code spans to be styled independently from fenced code blocks without manually detecting block vs. inline context.
    • 27c7b03: Export table action components (TableCopyDropdown, TableDownloadButton, TableDownloadDropdown) and utilities (extractTableDataFromElement, tableDataToCSV, tableDataToTSV, tableDataToMarkdown, escapeMarkdownTableCell, TableData), enabling custom table overrides to preserve copy/download interactivity.
    • fb76275: Add a fullscreen overlay for tables with Escape/backdrop-click to close and scroll locking, controlled via controls.table.fullscreen. Copy and download controls remain available in the fullscreen view.
    • b392fbe: Add literalTagContent prop that accepts an array of custom HTML tag names (e.g. ['mention']) whose children should be treated as plain text, escaping markdown metacharacters so user-supplied labels aren't interpreted as formatting.
    • c4c86fa: Add a dir prop that accepts "ltr", "rtl", or "auto". When set to "auto", each block's text direction is detected by scanning for the first strong Unicode character (Arabic, Hebrew, Thaana, etc.).
    • 00872f0: Add a prefix prop that prepends a namespace to all generated Tailwind utility classes (e.g. flex becomes tw:flex), enabling Tailwind v4's prefix() feature for projects that need to avoid class name collisions.
    • 401b901: Add support for custom renderers via plugins.renderers, allowing fenced code blocks with specific languages to be rendered by a custom component instead of the default CodeBlock.

    Patch Changes

    • f398611: Add onAnimationStart and onAnimationEnd callback props that fire when streaming animation begins and completes, useful for coordinating UI state with the animation lifecycle.
    • f2a7e51: Fix empty lines in syntax-highlighted code blocks collapsing into nothing by rendering a newline character for empty token rows, preserving whitespace when copying.
    • 9ba8511: fix: prevent ordered list animation retrigger during streaming
      When streaming content contains multiple ordered (or unordered) lists,
      the Marked lexer merges them into a single block. As each new item appears
      the block is re-processed through the rehype pipeline, re-creating all
      data-sd-animate spans. This caused already-visible characters to re-run
      their CSS entry animation.
      Two changes address the root cause:
      Per-block prevContentLength tracking – each Block component
      now keeps a useRef with the content length from its previous render.
      Before each render the animatePlugin.setPrevContentLength(n) method is
      called so the rehype plugin can detect which text-node positions were
      already rendered. Characters whose cumulative hast-text offset falls below
      the previous raw-content length receive --sd-duration:0ms, making them
      appear in their final state instantly rather than re-animating.
      Stable animatePlugin reference – the animatePlugin useMemo
      now uses value-based dependency comparison instead of reference equality
      for the animated option object. This prevents the plugin from being
      recreated on every parent re-render when the user passes an inline object
      literal (e.g. animated={{ animation: 'fadeIn' }}). A stable reference
      is required because the rehype processor cache uses the function name as
      its key and always returns the first cached closure; only the original
      config object is ever read by the processor.
    • 781178b: Add a granular controls prop that accepts a boolean to toggle all controls or an object with per-feature flags (code, table, mermaid) for fine-grained control over copy, download, fullscreen, and pan/zoom buttons.
    • e129f09: Add a translations prop for overriding all user-facing UI strings (copy/download button labels, modal text, image alt text, etc.), enabling full i18n support.
    • Updated dependencies [a725579]
    • [email protected]
    Original source Report a problem
  • Mar 5, 2026
    • Date parsed from source:
      Mar 5, 2026
    • First seen by Releasebot:
      Mar 6, 2026
    Vercel logo

    Streamdown by Vercel

    @streamdown/[email protected]

    Add support for custom Shiki themes in createCodePlugin with light/dark options.

    Minor Changes

    01d27e9: Add support for custom Shiki themes via a themes option on createCodePlugin, accepting a [light, dark] pair of bundled theme names or full theme registration objects.

    Original source Report a problem
  • All of your release notes in one feed

    Join Releasebot and get updates from Vercel and hundreds of other software products.

  • Mar 5, 2026
    • Date parsed from source:
      Mar 5, 2026
    • First seen by Releasebot:
      Mar 6, 2026
    Vercel logo

    Streamdown by Vercel

    Patch fixes emphasis completion handlers closing bold/italic markers inside inline code spans.

    Patch Changes

    a725579: Fix emphasis completion handlers incorrectly closing bold/italic/strikethrough markers that appear inside complete inline code spans (e.g. **bold no longer gets a stray ** appended outside the backties).

    Original source Report a problem
  • Feb 19, 2026
    • Date parsed from source:
      Feb 19, 2026
    • First seen by Releasebot:
      Feb 23, 2026
    Vercel logo

    Streamdown by Vercel

    New streaming aware code fence hook lets components show a loading state until blocks finish streaming, enabling deferred rendering. Code block header actions become sticky for easier copying, and there are fixes and enhancements including Markdown table copy, image placeholders, and Mermaid diagram updates.

    Minor Changes

    • 3657e42: Add useIsCodeFenceIncomplete hook for detecting incomplete code fences during streaming
      Custom components can now detect when the code fence in their block is still being streamed. This is useful for deferring expensive renders (syntax highlighting, Mermaid diagrams) until the code block is complete.

      import { useIsCodeFenceIncomplete } from "streamdown";
      const MyCodeBlock = ({ children }) => {
        const isIncomplete = useIsCodeFenceIncomplete();
        if (isIncomplete) {
          return <div>Loading code...</div>;
        }
        return (
          <pre>
            <code>{children}</code>
          </pre>
        );
      };
      

      The hook returns true when:

      • Streaming is active (isAnimating={true})
      • The component is in the last block being streamed
      • That block has an unclosed code fence
        The default code block component now uses this hook to set a data-incomplete attribute when incomplete, enabling CSS-based loading states.
    • 32fb079: fix: hide download button on broken images and display a custom "Image not available" message instead

    • d73d7bb: Make the action buttons in code block header sticky.
      Ensures copy buttons remain accessible for long code blocks.
      Improves usability when viewing large snippets.

    • 15645da: Move code block lazy loading to the highlighting layer so block shells render immediately with plain text content before syntax colors resolve. This improves visual stability and removes the spinner fallback for standard code blocks.

    Patch Changes

    • 0987479: fix: codeblock highlight flicker while streaming
    • 5d438ca: Add support for copying table data as Markdown in TableCopyDropdown.
      Introduces a Markdown copy option alongside existing formats.
      Allows users to quickly copy tables in valid Markdown format.
    • ce9b4c2: Fix syntax highlighting
    • ba03332: Redesign Mermaid diagram
    • 6e91867: fix nested same-tag HTML block parsing in parseMarkdownIntoBlocks
    • 7f9127b: Add normalizeHtmlIndentation prop to prevent indented HTML tags from being treated as code blocks
    • fdef60d: Bump rehype-harden to fix "can't access property "type", node is undefined"
    • 1abbf1e: Redesign table
    • fb9f97c: handle custom tags with blank lines in content

    Updated dependencies [6374fbf]
    [email protected]

    Original source Report a problem
  • Feb 19, 2026
    • Date parsed from source:
      Feb 19, 2026
    • First seen by Releasebot:
      Feb 23, 2026
    Vercel logo

    Streamdown by Vercel

    @streamdown/[email protected]

    Patch Changes

    • c597336: Use JS engine
    Original source Report a problem
  • Feb 19, 2026
    • Date parsed from source:
      Feb 19, 2026
    • First seen by Releasebot:
      Feb 23, 2026
    Vercel logo

    Streamdown by Vercel

    Patch Changes

    • 6374fbf: Fix stray asterisks stemming from mermaid diagrams
    Original source Report a problem
  • Feb 9, 2026
    • Date parsed from source:
      Feb 9, 2026
    • First seen by Releasebot:
      Feb 23, 2026
    Vercel logo

    Streamdown by Vercel

    New release brings built in animation in streamdown and a host of parser fixes. It tightens HTML escaping, improves LaTeX rendering, secures footnotes, code blocks, and links, and updates dependencies along with monorepo docs.

    Minor Changes

    • c1e1e66: Bake animate into streamdown as built-in animated prop

    Patch Changes

    • d5fe6d6: fix: properly handle HTML void elements in parse-blocks
    • 6bb03ca: fix: escape HTML when rehype-raw is omitted (#330)
    • a12de57: Custom tags in components
    • 83f043c: Fix: certain LaTeX syntaxes e.g. (...) are not rendering
    • aabb9ab: Fix $$ inside code blocks being treated as math delimiters
      Code blocks can contain $$ as shell syntax (e.g., pstree -p $$ for current process ID). The math block merging logic was incorrectly counting $$ inside code blocks, causing subsequent content to be merged as if it were part of a math block.
      Added tracking of previous token type to skip math merging when the previous block was a code block.
    • 9f72224: Fix footnote detection incorrectly matching regex character classes
      The footnote reference and definition patterns were too permissive, using [^]\s] which matches any character except ] and whitespace. This caused regex negated character classes like [^\s...] in code blocks to be incorrectly detected as footnotes, resulting in the entire document being returned as a single block.
      Updated the patterns to only match valid footnote identifiers (alphanumeric characters, underscores, and hyphens) using [\w-] instead.
    • 6b42a85: Remove CJS builds
    • aeadcd6: Fix single-line indented code blocks
    • 82bc4a6: Fix tel links being blocked by default
    • fd5533c: fix: Tables cause vertical scroll trap
    • e633ff7: Strip trailing newlines in code blocks
    • 6be5da8: Fix carets and dark code blocks on Tailwind v3
    • 573ece6: Add documentation for monorepos
    • 48756b5: Extend ReactMarkdown props
    • Updated dependencies [c347b53]
    • Updated dependencies [6b42a85]
    • Updated dependencies [4fffb9f]
    • Updated dependencies [3e6a77d]
    • [email protected]
    Original source Report a problem
  • Feb 9, 2026
    • Date parsed from source:
      Feb 9, 2026
    • First seen by Releasebot:
      Feb 23, 2026
    Vercel logo

    Streamdown by Vercel

    @streamdown/[email protected]

    Patch Changes

    • ac25c6b: Fix incorrect zoom-out icon SVG in Mermaid preview plugin.
    • 6b42a85: Remove CJS builds
    • a1e2fad: Patch upstream security vulnerability
    Original source Report a problem
  • Feb 9, 2026
    • Date parsed from source:
      Feb 9, 2026
    • First seen by Releasebot:
      Feb 23, 2026
    Vercel logo

    Streamdown by Vercel

    @streamdown/[email protected]

    Patch Changes

    • 6b42a85: Remove CJS builds
    Original source Report a problem
  • Feb 9, 2026
    • Date parsed from source:
      Feb 9, 2026
    • First seen by Releasebot:
      Feb 23, 2026
    Vercel logo

    Streamdown by Vercel

    @streamdown/[email protected]

    Patch Changes

    • c995fb7: Add bundled-language aliases for common JavaScript, TypeScript, and shell code fence labels.
    • 6b42a85: Remove CJS builds
    Original source Report a problem

Related products