Streamdown Updates & Release Notes
25 updates curated from 1 source by the Releasebot Team. Last updated: Sep 30, 2026
- Sep 30, 2026
- Date parsed from source:Sep 30, 2026
- First seen by Releasebot:Sep 30, 2026
Streamdown by Vercel
Streamdown improves streaming performance and polish with faster code block, table, and Mermaid rendering, better caret and scroll handling, bounded highlight caching, new fallback and portal props, improved copy hooks, and a slate of bug fixes for math, images, lists, and links.
This release is mostly about streaming speed, plus a few new props and a lot of fixes.
Performance
- Code blocks now highlight only the new lines as they stream, instead of the whole block on every update
- Blocks that are already parsed get reused while a document streams, and only block tokens are lexed
- Code and table auto-scroll runs once per frame instead of on every chunk
- Showing and hiding the caret no longer restyles the whole document, which used to cost tens of ms per toggle on long streams
- The code highlight cache now has a size limit (LRU), so memory stays bounded in long sessions
- Mermaid diagrams render one at a time while their fence streams, so a growing diagram no longer holds up the stream
New
- fallbackComponent: a fallback renderer for tags in allowedTags or HTML tags that have no entry in components
- disableAutolinkProtocols: turn off GFM autolinking for specific protocols (e.g. ["mailto"])
- portal: set the container used by Mermaid and table fullscreen and the link safety modal
- defaultComponents is now exported, so you can build overrides on top of the built-in renderers
- onCopy / onError now work on the default code and Mermaid copy buttons
- Incomplete images show a loading skeleton while they stream instead of disappearing
Fixes
- Mermaid diagrams auto-fit their container and text is readable again
- A < inside math (e.g. $$ \sum_{j<k} $$) no longer cuts off the rest of the message
- Code block buttons can be clicked inside nested scroll containers
- Tables copied or downloaded as Markdown keep literal HTML tags and entities
- Loose list items no longer get extra spacing from a wrapping <p>
- CJK: bare URLs after fullwidth punctuation are linkified again
remend 1.4.0
- New single-pass scanner that follows CommonMark for code fences and spans: handles ~~~, fences in quotes and lists, CRLF, and multi-backtick spans
- Fixes slow (quadratic) healing on input full of delimiters
- Identifiers like snake__case no longer create false emphasis
- Healing is now idempotent
Heads up
- @streamdown/[email protected] moves to Shiki v4 and now needs Node 20 or newer
- marked is now on v18
Below, you can find the detailed changes.
Minor Changes
6b14de4: Add a disableAutolinkProtocols prop to <Streamdown> for disabling GFM autolinking of specific URL protocols (e.g. mailto).
<Streamdown disableAutolinkProtocols={["mailto"]}> {"Contact us at [email protected]"} </Streamdown>Bare emails and bare URLs whose protocol matches the list (case-insensitive, "mailto" and "mailto:" are equivalent) are unwrapped back to plain text. Explicit markdown links (text) are left as links, including when the label reconstructs the URL (e.g. [email protected]). When the prop is omitted, autolinking behavior is completely unchanged.
Closes #607.
b1965bb: feat: add fallbackComponent prop for missing map entries / allowedTags
Adds a new fallbackComponent prop to <Streamdown>. When provided, it is used as a fallback renderer for any HTML tag or allowed custom tag that does not have an explicit entry in the components map:
<Streamdown allowedTags={{ mention: ["user_id"] }} fallbackComponent={({ node, children, ...props }) => createElement(node!.tagName, props, children) } > {markdown} </Streamdown>fallbackComponent applies to custom tags declared via allowedTags (with no explicit component entry) and to standard HTML tags absent from the built-in component set (e.g. <span>, <em>, <div>, <br>). Built-in and explicit components entries always win — this is not a full unstyled mode.
Refs #543
Patch Changes
b651249: Give animated word spans a style object instead of a CSS string, so rendering skips parsing a style declaration for every word on every update. createAnimatePlugin still writes CSS strings.
b651249: Check whether a stream only appended text by comparing a slice of the new input with the previous one instead of calling startsWith, which compared the whole document character by character on every update.
b651249: Hide the caret after a table or an unfinished code fence by marking the last element instead of changing the container's class and style. Each toggle used to restyle the whole document, which cost tens of milliseconds per flip on long streams.
c971f42: Wire onCopy and onError through default code and Mermaid copy controls via controls.code.copy and controls.mermaid.copy.
4ec5639: Bound the code highlight cache. Results of streaming code blocks are no longer cached (each is superseded by the next update), and finished code blocks are kept in a least-recently-used cache bounded by their size (tokens, lines and characters) and by a limit of 5,000 results. Lookups compare the full code, so blocks that differ only in the middle no longer share tokens. A code block also ignores highlight results for code it has already moved past.
16e7e65: Export defaultComponents so custom components overrides can compose Streamdown's built-in renderers (styles, data-streamdown, link safety, code/mermaid/table behavior) instead of reimplementing them.
163c63b: fix(code-block): use absolute positioning for action buttons to fix click events in nested scroll containers
Switches the code block action button wrapper from position: sticky to position: absolute (with position: relative on the container) so that hit-testing works correctly in layouts with multiple nested overflow: auto scroll containers. Previously, the sticky + pointer-events-none/auto pattern caused browsers to mis-route click events to the code block wrapper rather than the buttons when the component was embedded in 2+ nested scroll containers.
e0ce123: Incomplete images during streaming now render a loading placeholder instead of being removed entirely. Incomplete images (e.g. are replaced with by remend, and the streamdown ImageComponent renders an animated skeleton for this special URL. This mirrors the existing behavior for incomplete links (streamdown:incomplete-link). The streamdown protocol is allowlisted for img[src] in the default sanitize schema so the sentinel survives rehype-sanitize + rehype-harden.
e7a23ef: Render Mermaid diagrams one at a time while their code fence streams, pausing after each render for as long as it took, so a growing diagram no longer holds up the stream. Once the fence closes or the stream stops, the final diagram renders without a pause.
b651249: Pin streaming code blocks and tables to the bottom once per frame instead of on every update, avoiding a forced layout per streamed chunk.
5504e50: Preserve literal HTML tags and character entities when copying or downloading tables as Markdown.
5b26c28: Speed up block parsing by lexing only block tokens and reusing already parsed blocks while a document streams.
18dcb20: Add a top-level portal prop for configuring the container used by Mermaid fullscreen, table fullscreen, and the built-in link safety modal.
fdf4e33: Fix Mermaid diagrams so text is readable and diagrams auto-fit container.
Normalize SVG to remove responsive shrinking
Extract intrinsic size from viewBox
Add width-and-height auto-fit in PanZoom
Preserve user zoom/pan after initial fit
Add tests for SVG utilities and auto-fit behavior53812cf: fix: unwrap a single paragraph child inside list items
Loose list items from the markdown pipeline are often wrapped in a <p>. MemoLi now detects that sole paragraph child (including the memoized paragraph component) and renders its contents directly, so list items stay visually tight. Also updates the list animation retrigger test to match the unwrapped markup.
Fixes #475
a155a9e: Update marked from ^17.0.1 to ^18.0.11.
marked v18 no longer folds a block token's trailing blank line(s) into its own raw; that whitespace now surfaces as a separate space token immediately following the block (e.g. after html, heading, and table tokens). This changed the token stream shape that parseMarkdownIntoBlocks consumes, causing a dangling space token after a closed custom-tag HTML block to be emitted as its own standalone block. parseMarkdownIntoBlocks now folds a space token into the preceding block instead of pushing it as a new one, restoring v17-identical block boundaries and counts. The lossless token.raw concatenation invariant is preserved.
Updated dependencies [cf0ac1c]
Updated dependencies [e0ce123]
Updated dependencies [fdd1351]
- Sep 30, 2026
- Date parsed from source:Sep 30, 2026
- First seen by Releasebot:Sep 30, 2026
Streamdown by Vercel
@streamdown/[email protected]
Streamdown ships a patch update that upgrades dependencies.
All of your release notes in one feed
Join Releasebot and get updates from Vercel and hundreds of other software products.
- Sep 30, 2026
- Date parsed from source:Sep 30, 2026
- First seen by Releasebot:Sep 30, 2026
Streamdown by Vercel
@streamdown/[email protected]
Streamdown fixes and upgrades dependencies in this patch release.
- Sep 30, 2026
- Date parsed from source:Sep 30, 2026
- First seen by Releasebot:Sep 30, 2026
Streamdown by Vercel
@streamdown/[email protected]
Streamdown upgrades Shiki to v4, raises the Node.js 20 requirement for @streamdown/code, and improves streamed code highlighting with smarter tokenization and a bounded highlight cache.
Major Changes
db6fefc: Upgrade Shiki to v4. Node.js 20 or newer is now required when using @streamdown/code.
Patch Changes
0ea9e64: Tokenize only the new lines of a code block while it streams instead of re-tokenizing the whole block on every update.
4ec5639: Bound the code highlight cache. Results of streaming code blocks are no longer cached (each is superseded by the next update), and finished code blocks are kept in a least-recently-used cache bounded by their size (tokens, lines and characters) and by a limit of 5,000 results. Lookups compare the full code, so blocks that differ only in the middle no longer share tokens. A code block also ignores highlight results for code it has already moved past.
Original source - Sep 30, 2026
- Date parsed from source:Sep 30, 2026
- First seen by Releasebot:Sep 30, 2026
Streamdown by Vercel
@streamdown/[email protected]
Streamdown fixes bare URL re-linking after CJK punctuation in GFM autolink literals.
Patch Changes
8cb3bc7: Re-linkify bare URLs that follow CJK punctuation when splitting GFM autolink literals (e.g. URLs separated by fullwidth semicolons).
Original source Similar to Streamdown with recent updates:
- Claude Code updates464 release notes · Latest Oct 6, 2026
- ChatGPT updates230 release notes · Latest Oct 2, 2026
- OpenAI Models updates49 release notes · Latest Aug 18, 2026
- Gemini updates432 release notes · Latest Oct 2, 2026
- Gemini API updates143 release notes · Latest Sep 22, 2026
- Claude updates151 release notes · Latest Oct 1, 2026
- Sep 30, 2026
- Date parsed from source:Sep 30, 2026
- First seen by Releasebot:Sep 30, 2026
Streamdown by Vercel
Streamdown improves streaming Markdown healing with faster CommonMark-aware code and fence detection, better underscore handling, and idempotent fixes. It also keeps math safe from incomplete HTML tag stripping and now shows loading placeholders for incomplete images instead of dropping them.
Minor Changes
fdd1351: Rework code-region detection and double-underscore counting.
A shared single-pass scanner now classifies fences and inline code spans, replacing the per-character rescans that made healing quadratic on delimiter-heavy input. Fence and span detection follows CommonMark, so ~~~ fences, fences inside block quotes and list items, CRLF line endings, and multi-backtick spans are all recognized, and content inside code is never healed as prose.
Double underscores are counted per maximal run with flanking rules, so identifiers containing __ (like snake__case) no longer invent or swallow emphasis closers.
Healing is now idempotent. Healed output re-heals to itself, and text-only link mode resolves every unmatched bracket in one call.
Patch Changes
cf0ac1c: Stop the incomplete-HTML-tag handler from truncating math expressions.
handleIncompleteHtmlTag guarded against code blocks but not math, so an ordinary comparison inside math — $$ I = \sum_{j<k} p_j $$ — matched the incomplete-tag pattern and deleted everything from the < to the end of the string. The trailing $$ was then auto-closed by the katex handler, so KaTeX rendered a parse error and the rest of the message never reached the DOM.
The handler now skips candidates inside math blocks ($, $$, (, [), matching the guard the emphasis handlers already had. Because the pattern is leftmost-matching, it also walks forward to later candidates instead of bailing out, so a genuine incomplete tag after a math expression is still stripped.
e0ce123: Incomplete images during streaming now render a loading placeholder instead of being removed entirely. Incomplete images (e.g. are replaced with by remend, and the streamdown ImageComponent renders an animated skeleton for this special URL. This mirrors the existing behavior for incomplete links (streamdown:incomplete-link). The streamdown protocol is allowlisted for img[src] in the default sanitize schema so the sentinel survives rehype-sanitize + rehype-harden.
Original source - Aug 24, 2026
- Date parsed from source:Aug 24, 2026
- First seen by Releasebot:Aug 24, 2026
Streamdown by Vercel
Streamdown ships smoother streaming rendering, with animated text, inline code, and block behavior refined for better sync and stability. It also adds customizable download filenames, max-height controls, CSV separator options, and broad accessibility and fullscreen fixes for tables, Mermaid, code blocks, and links.
Minor Changes
49bd143: fix(animate): serialize streaming animation across blocks
Word stagger now runs on a shared wall-clock timeline so sibling sections no longer fade in on top of each other during streaming. Related cleanup: trailing spaces stay inside animated spans (no early link underlines), animate wrappers drop when streaming ends, already-seen text stays steady under StrictMode, and un-animated streaming is no longer deferred behind a starvable transition.
Inspired by #493, #531, and #536.
Fixes #482
Fixes #535
Fixes #550
Fixes #570
b734cbf: - Add custom download filenames for code, table, and mermaid via the controls prop
Configure downloads with download: { filename: "customName" } while keeping boolean true/false to show or hide
Preserve automatic file-extension mapping based on language or export format
Remove the codeDownload prop in favor of the unified controls API
5faa6fa: Add codeBlockMaxHeight and tableMaxHeight props with streaming auto-scroll
4436b56: - Add controls.table.csvSeparator ("," | ";" | "\t" | "auto") for table copy and download CSV
Reuse tableDataToCSV separator handling, including locale-aware "auto" mode
Improve CSV escaping to respect the selected separator for Excel compatibility
Patch Changes
6ec3c48: fix(animate): animate inline code during streaming
Skip the animate visitor on pre (and svg/math/annotation) only — not bare code. Fenced/highlighted blocks stay un-split via their pre ancestor; inline backtick spans now get the same per-word fade-in as surrounding prose.
Fixes #594
725e390: Forward rest props through block code. The code component spread its rest props on the inline branch and dropped them on the block branch, so an attribute a consumer put on a fenced code element never reached the DOM. CodeBlockBody now takes part in that comparison, so a forwarded attribute updates instead of keeping the value it first rendered with.
7e82400: Fix dir="auto" in static mode to detect text direction per semantic block (instead of once for the whole document), keep code LTR, and use content-majority direction for mixed-script prose.
fb5d7b9: Serialize Mermaid SVGs before download so HTML-style tags render as valid SVG markup.
fe38e75: Added accessibility improvements for code block controls by adding aria labels to copy/download buttons and announcing copy success state for screen readers.
b25dbdb: fix(custom-tags): render Markdown inside custom tags with multiline content
Adds a preprocessing step (preprocessCustomTags) that normalizes multiline custom tags into a blank-line-sandwiched HTML block so CommonMark interrupts the raw-HTML block and parses the nested content as Markdown, with parseMarkdownIntoBlocks re-merging the interrupted open/content/close tokens so streaming still treats the whole custom tag as one block. Previously, when a custom tag contained multiline content (e.g. <ai-thinking> bold</ai-thinking>), CommonMark treated the block as raw HTML, stripping Markdown formatting. Tags listed in literalTagContent are excluded from re-parsing.
Closes #478
26a8440: Fix doubled user-content- prefix on footnote ids
Footnote list items were rendered with id="user-content-user-content-fn-1" because both remark-rehype and rehype-sanitize default their clobberPrefix to user-content-, so the prefix was applied twice. Disabled clobberPrefix on rehype-sanitize so remark-rehype remains the single, consistent prefixer of both footnote ids and backref hrefs — restoring working footnote navigation.
f7d1fb5: fix(table): add data-streamdown="table-wrapper" to fullscreen portal so copy/download dropdowns can find the table
f0a726b: Add aria-hidden="true" to decorative SVG icon components so screen readers rely on parent button labels instead of unlabeled icons.
2ed2faa: Allow remend's streamdown: incomplete-link sentinel through the default sanitize schema so streamed incomplete links render as pending instead of harden [blocked].
8fffa9d: Render the link safety modal through a portal to document.body so it is no longer nested inside the paragraph's <p> element. This fixes the React hydration error "In HTML, <div> cannot be a descendant of <p>" that occurred when a link with link safety enabled appeared inside a paragraph.
2733922: fix(mermaid): add aria-hidden to decorative SVG icons in mermaid toolbar buttons
Mermaid toolbar buttons (download, fullscreen, pan/zoom controls) already have accessible titles/labels, but the inline SVG icons were exposed to the accessibility tree causing "Content with images must be labeled" warnings. Added aria-hidden={true} to all decorative icon elements in download-button, fullscreen-button, and pan-zoom components.
Fixes #485
8d36719: fix(deps): remove mermaid as a hard runtime dependency
This patch replaces the type import with a local structural type for MermaidConfig so no type-level coupling to the mermaid package remains in the distributed typings. Users who want fully-typed mermaid config can still import type { MermaidConfig } from 'mermaid' themselves; the structural type is compatible.
Fixes #501
ea02609: Fix: shikiTheme prop priority chain is now fully reachable.
Previously, shikiTheme had a default value in the props destructuring (= defaultShikiTheme), making the plugins?.code?.getThemes() fallback unreachable in both orderings. The fix removes the destructuring default and moves it to the end of the nullish coalescing chain, so all three levels are reachable:
Explicit shikiTheme prop (highest priority)
Code plugin's getThemes() (second priority)
Built-in defaultShikiTheme (final fallback)
9813dd6: Fix type declarations requiring a shiki install.
BundledLanguage, BundledTheme, and ThemeRegistrationAny are now defined locally and re-exported from streamdown, so consumers can type-check without installing shiki. Runtime highlighting remains in @streamdown/code, which still depends on shiki.
d893759: Fix mermaid fullscreen overlay accessibility and add stable selector
Add data-streamdown="mermaid-fullscreen" to fullscreen overlay for stable CSS targeting
Update fullscreen overlay semantics to match table fullscreen behavior
Change role from button to dialog
Add aria-modal="true" for correct screen reader modal behavior
Improve accessibility consistency between mermaid and table fullscreen overlays
79c8575: fix issue with list markers, task-list checkboxes, images, and hr animations
a1a7142: feat: add image control options (controls.image) to disable hover overlay and download button on images
Add image to the controls prop, matching existing code, table, and mermaid patterns:
controls={{ image: false }} hides the hover overlay and download button
controls={{ image: { download: false } }} keeps the hover overlay but hides the download button
b250038: Fix accessibility warnings for Mermaid toolbar icon buttons:
Add aria-hidden="true" to all decorative SVG icons to hide them from screen readers
Add aria-label attributes to all icon-only buttons for proper screen reader announcements
Add translation keys (zoomIn, zoomOut, resetView) for zoom controls
89c6877: Re-render memoized markdown components when their rendered output changes. The comparators compared source position, so a replacement of the same length — occupying the same lines and columns — was treated as unchanged and the component kept rendering the previous text.
e7bdf57: fix(mermaid): render the download and copy controls inside the Mermaid fullscreen portal so they're reachable when the diagram is expanded
8f02c09: Fix table copy and download actions not working in fullscreen mode.
Support table lookup inside the fullscreen portal container.
Restore copy and download functionality for fullscreen tables.
Keep existing inline table controls behavior unchanged.
f46cd3c: - Fixed table copy losing line breaks inside cells containing <br> elements.
Preserved multiline content during table data extraction.
Improved copied Markdown, CSV, and TSV output consistency for multiline cells.
Added coverage for <br> handling in table extraction.
dc3f1d2: - Fix code block line wrapping when line numbers are disabled.
Ensure code block lines are rendered as block elements regardless of the lineNumbers setting.
Prevent multiple code lines from collapsing into a single visual line when lineNumbers={false}.
Updated dependencies [a99d675]
Updated dependencies [9f96409]
Updated dependencies [8093f2a]
Updated dependencies [57c3089]
Original source - Aug 24, 2026
- Date parsed from source:Aug 24, 2026
- First seen by Releasebot:Aug 24, 2026
Streamdown by Vercel
Streamdown fixes iOS Safari crashes, preserves italic emphasis and protected LaTeX math, and speeds up code-block scanning with a new linear-time lookup for much faster handling of large blocks.
Patch Changes
a99d675: Fix crash on iOS 16.0-16.2 / Safari < 16.3 by removing the lookbehind assertion from the single-tilde escape pattern (#519).
JSCore on those versions doesn't support lookbehind ((?<=...)) and throws a SyntaxError while the module is being evaluated, before any user code runs, so there is no way to catch it. The preceding word character is now captured and written back in the replacement instead.
9f96409: Preserve complete italic emphasis when a closing asterisk is followed by word text.
8093f2a: Treat LaTeX paren and bracket math as protected math contexts during emphasis completion.
57c3089: Fix quadratic code-block scanning. isInsideCodeBlock now builds a linear-time position lookup (cached per text) instead of rescanning the whole prefix on every call, so handlers that probe many positions no longer degrade quadratically. Repairing an unclosed, bracket-heavy 58k-character code block drops from ~915ms to ~0.4ms per call.
Original source - Mar 17, 2026
- Date parsed from source:Mar 17, 2026
- First seen by Releasebot:Mar 17, 2026
Streamdown by Vercel
Streamdown releases a suite of updates improving code blocks, rendering, and CSV export. Highlights include a lineNumbers option, meta prop for CustomRendererProps, staggered streaming animations, horizontal scrolling for long code blocks, reduced re-renders, UTF-8 BOM for CSVs, and UI tweaks for dropdowns and tokens.
Minor Changes
d6666b6: Add lineNumbers prop to disable line numbers in code blocks
d4ec6c0: Add meta prop to CustomRendererProps. Custom renderers now receive the raw metastring from the code fence (everything after the language identifier, e.g. ```rust {1} title="foo" → meta = '{1} title="foo"'). The prop is optional (meta?: string) and is undefined when no metastring is present. Existing custom renderers are unaffected.
Patch Changes
ac8d839: Add staggered animation-delay to streaming word/character animations so new content cascades in sequentially instead of all animating simultaneously. Configurable via the new stagger option (default 40ms). Set stagger: 0 to restore the previous behavior.
add5374: Enable horizontal scrolling on code blocks so long lines are accessible instead of being clipped by overflow-hidden.
75845c0: Fix unnecessary re-renders of code blocks during streaming updates.
Problem: In streaming mode, when new content arrives (e.g. a paragraph is appended), completed code blocks that haven't changed were still re-rendering. This happened because the Streamdown component used inline object literals as default parameter values for linkSafety ({ enabled: true }). Every time children changed and Streamdown re-rendered, these inline defaults created new references, which caused the contextValue useMemo to recompute a new StreamdownContext object. Since React propagates context changes through memo boundaries, any context consumer inside a memoized Block (such as CodeBlock) would re-render even though the block's own props were unchanged.
Fix: Extract the inline default values for linkSafety into module-level constants (defaultLinkSafetyConfig). This ensures referential stability across renders, so contextValue only recomputes when the actual values change — not just because children updated.
8b1c262: fix: prepend UTF-8 BOM to CSV downloads for Excel compatibility
save() now prepends \uFEFF for text/csv string content so Excel on
Windows detects UTF-8 encoding instead of falling back to ANSI.TableDownloadButton refactored to use save() instead of inline Blob
creation, ensuring the public API also gets the BOM fix.b105c64: Fix custom tag content being prematurely split when content follows the opening tag on the same line and contains double newlines (\n\n). The preprocessor now ensures proper HTML block structure so the parser treats the entire tag as a single unit.
9e6f991: Increase dropdown z-index for table copy and download menus to prevent clipping by surrounding elements.
9c18748: docs: document required CSS custom properties (shadcn/ui design tokens) in README
7b62e9a: Replace Tailwind v4-only :last: and :first: variant syntax with [&>:last-child]: and [&>:first-child]: arbitrary variants for compatibility with both Tailwind CSS v3 and v4. Fixes caret rendering on every line instead of only the last child in v3.
Updated dependencies [e50b0c4]
Updated dependencies [716a5f0]
- Mar 17, 2026
- Date parsed from source:Mar 17, 2026
- First seen by Releasebot:Mar 17, 2026
Streamdown by Vercel
@streamdown/[email protected]
Streamdown releases a patch that falls back to plain text highlighting when code block language IDs are unknown or truncated, preventing errors.
Patch Changes
651873d: Fall back to plain text highlighting when the code block language identifier is unknown or truncated mid-stream, preventing Shiki from throwing on unsupported language names.
Original source - Mar 17, 2026
- Date parsed from source:Mar 17, 2026
- First seen by Releasebot:Mar 17, 2026
Streamdown by Vercel
@streamdown/[email protected]
Streamdown releases patch updates to remark-cjk-friendly packages, confirms Node.js ≥18, no breaking changes from v2.0.0, and adds package.json import in v2.0.1.
Patch Changes
6f1ea07: Updated remark-cjk-friendly and remark-cjk-friendly-gfm-strikethrough from v1.x to v2.x. The only breaking change in v2.0.0 is dropping Node.js 16 support, which Streamdown has already dropped (requires Node.js ≥18), so there is no actual impact. The actual code is identical to the latest v1.x release (v2.0.1 only added the ability to import package.json).
Original source - Mar 17, 2026
- Date parsed from source:Mar 17, 2026
- First seen by Releasebot:Mar 17, 2026
Streamdown by Vercel
Streamdown releases opt-in inline KaTeX with inlineKatex, fixes streaming closing $, and enables singleTilde by default to prevent false strikethroughs.
Minor Changes
e50b0c4: Add opt-in inline KaTeX completion ($formula → $formula$) via a new inlineKatex option that defaults to false to avoid ambiguity with currency symbols. Also fixes block KaTeX completion when streaming produces a partial closing $.
716a5f0: Escape single ~ between word characters to prevent false strikethrough rendering (e.g. 20~25°C no longer renders as strikethrough). Adds a new singleTilde option (enabled by default) that can be disabled via { singleTilde: false }.
- Mar 5, 2026
- Date parsed from source:Mar 5, 2026
- First seen by Releasebot:Mar 6, 2026
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:
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.const x = 1; - 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]
- Mar 5, 2026
- Date parsed from source:Mar 5, 2026
- First seen by Releasebot:Mar 6, 2026
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 - Mar 5, 2026
- Date parsed from source:Mar 5, 2026
- First seen by Releasebot:Mar 6, 2026
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.
Original source**boldno longer gets a stray ** appended outside the backties).
Curated by the Releasebot team
Releasebot is an aggregator of official product update announcements from hundreds of software vendors and thousands of sources.
Our editorial process involves the manual review and audit of release notes procured with the help of automated systems.