NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #4173 most downloaded on npm
A very fast and versatile markdown toolchain. AST, React, React Native, SolidJS, Vue, Markdown, and HTML output available with full customization.
Last release 19 days ago
15 Sep 2026
Ships fairly regularly
a new release about every 3 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
11 years old
193 releases · first in 2015
fix an html perf regression edge case #234
fix an html perf regression edge case #234
#238 Fix overriding of props, thanks @mstruebing
#238 Fix overriding of props, thanks @mstruebing
ac97191bd857340efbd2840e0ffc5b7dd5cbdae3 ensure there's a key set for every output
ac97191bd857340efbd2840e0ffc5b7dd5cbdae3 ensure there's a key set for every output
One column per quarter.
a slew of regex optimizations; the library should be more performant now for blocks of text with several instances of bold/em/etc
a slew of regex optimizations; the library should be more performant now for blocks of text with several instances of bold/em/etc
Nothing published for this version
graceful fallback for missing footnotes
graceful fallback for missing footnotes (#227)
Actually fix support for React's various new object-based components like React.forwardRef
Actually fix support for React's various new object-based components like React.forwardRef
disable the babel-minify "flipComparisons" plugin which causes downstream issues with some minifiers like uglifyJS
disable the babel-minify "flipComparisons" plugin which causes downstream issues with some minifiers like uglifyJS
Nothing published for this version
fix #206 (horizontal rules not working after a list)
, etc.)fix #214 - Nested paragraphs not work correctly inside arbitrary html
fix #214 - Nested paragraphs not work correctly inside arbitrary html (#215)
Fix some overly aggressive newline trimming inside HTML blocks
Fix some overly aggressive newline trimming inside HTML blocks
3987668906f64ac1b08bbef9d52c443491ec9a72 fix false positive flagging of standalone autolinks as self-closing html (originally reported in #208)
3987668906f64ac1b08bbef9d52c443491ec9a72 fix false positive flagging of standalone autolinks as self-closing html (originally reported in #208)
Refactored some parts of the library to make block detection inside arbitrary HTML more reliable. Also tweaked a few detector regexes to avoid edge ca
Refactored some parts of the library to make block detection inside arbitrary HTML more reliable. Also tweaked a few detector regexes to avoid edge cases.
Thanks @cathayandy for the configurable slug function support! (see #199)
Thanks @cathayandy for the configurable slug function support! (see #199)
c1fe1ebb285dddfd8dbbad7e6ae2455c8aa7157b fix a perf issue in the new bold and emphasis regexes (see #190)
c1fe1ebb285dddfd8dbbad7e6ae2455c8aa7157b fix a perf issue in the new bold and emphasis regexes (see #190)
Nothing published for this version
Various improvements to inline syntax handling (strong, emphasis, strikethrough primarily.)
Various improvements to inline syntax handling (strong, emphasis, strikethrough primarily.)
b33d327 fix inline syntax outer-boundary false positive match 48ee7f1 ensure emphasis + bold regexes track the specific syntax used
This patch release revises some behavior for handling block syntax inside HTML in MD. It also documents the current "gotchas" in a more public place.
This patch release revises some behavior for handling block syntax inside HTML in MD. It also documents the current "gotchas" in a more public place.
a2b9bfe document the significant whitespace gotchas for arbitrary HTML 4ec60f2 fix regression where we were over-stripping whitespace d06b191 fix detection of fenced code blocks inside arbitrary HTML
Nothing published for this version
babb335 fix #181 (extra paragraph tags inside HTML in some cases) fcc93a0 fix for #180 (false positive HTML match)
👻
babb335 fix #181 (extra paragraph tags inside HTML in some cases) fcc93a0 fix for #180 (false positive HTML match)
799615e [internal] remove babel entry from package.json
799615e [internal] remove babel entry from package.json
[internal] e14fbcc switch to preset env from preset es2015
[internal] e14fbcc switch to preset env from preset es2015
085af2e handle nested HTML tags of the same type with attributes
085af2e handle nested HTML tags of the same type with attributes (#176)
0ab6780 adjust HTML capture regex (#175) aa0efcc pass along additional props supplied to the Markdown component (#174) b48fc50 don't process the insid
0ab6780 adjust HTML capture regex (#175) aa0efcc pass along additional props supplied to the Markdown component (#174) b48fc50 don't process the inside of style, script blocks (#173)
5d0a10f fix block-level syntax inference inside arbitrary HTML
5d0a10f fix block-level syntax inference inside arbitrary HTML (#169)
524ef02 drop react 0.14.x testing 5251d6e autotag headings with IDs (allows autogenerated TOCs to work) 4312e1d port tight list handling fix from simp
524ef02 drop react 0.14.x testing 5251d6e autotag headings with IDs (allows autogenerated TOCs to work) 4312e1d port tight list handling fix from simple-markdown (thanks!)
9769ace handle links with URLs in the link text
9769ace handle links with URLs in the link text (#164)
3191b49 Support spaces between equal sign for html attributes (#162) ・Thank you @Jonarod!
3191b49 Support spaces between equal sign for html attributes (#162) ・Thank you @Jonarod!
One new feature: the ability to supply a custom `createElement` function!
One new feature: the ability to supply a custom createElement function!
Otherwise, there are a few fixes around arbitrary HTML handling to avoid regex backtracking.
6b881ae adjust html regex to handle invalid HTML d36798c workaround for parsing block html inside arbitrary html ac20c7c Add createElement option (#152) ・Thank you @hugmanrique! 1e3b1d5 update the README ToC d0f5fe2 fix heading level ・Thank you @pravdomil! d5b4b12 minor changes in readme
5a5cac9 go back to using proper esm imports
5a5cac9 go back to using proper esm imports
178a961 add explainer for the attribute regex cbc776e handle JSX inside JSX interpolations abc5616 don't unquote interpolation values 97bef99 add info
178a961 add explainer for the attribute regex cbc776e handle JSX inside JSX interpolations abc5616 don't unquote interpolation values 97bef99 add info to README about interpolation restrictions and workarounds 9825590 handle JSX interpolations as strings 07bcf60 handle indentation for self-closing HTML/JSX 89978ba adjust the site a little
52564d39ce41060dc2d3a21678dc99ee0a40d704 fix extra table cell rendered for external pipe syntax
52564d39ce41060dc2d3a21678dc99ee0a40d704 fix extra table cell rendered for external pipe syntax (#139)
fix extra table cell rendered for external pipe syntax
add some more tests
handle content around the table better
a9e3b744773ea840b0fdfb0d84c905eacb5e7dbb fix #136 and optimize the block html regex
a9e3b744773ea840b0fdfb0d84c905eacb5e7dbb fix #136 and optimize the block html regex
2363c39e155e60c873d9115b27792cdd1073621d exclusively inline returns should be wrapped in a span, not p
2363c39e155e60c873d9115b27792cdd1073621d exclusively inline returns should be wrapped in a span, not p
1ccf119e025110b0e1949b61641ff62f28e43c66 handle empty input
2baf46a9d5cd6738d74727409d471de2451c33e2 add forceBlock and forceInline parsing options
By default, the compiler will try to make an intelligent guess
about the content passed and wrap it in a <div>, <p>, or
<span> as needed to satisfy the "inline"-ness of the markdown.
For instance, this string would be considered "inline":
Hello. _Beautiful_ day isn't it?
But this string would be considered "block" due to the existence of a header tag, which is a block-level HTML element:
# Whaddup?
However, if you really want all input strings to be treated
as "block" layout, simply pass options.forceBlock = true like this:
<Markdown options={{ forceBlock: true }}>
Hello there old chap!
</Markdown>
// or
compiler('Hello there old chap!', { forceBlock: true });
// renders
<p>Hello there old chap!</p>
The inverse is also available by passing options.forceInline = true:
<Markdown options={{ forceInline: true }}>
# You got it babe!
</Markdown>
// or
compiler('# You got it babe!', { forceInline: true });
// renders
<span># You got it babe!</span>
62c7aa6bc0dd092aa71e9b398a5bb5c32c28e8d8 tweak the table regex to handle the table syntax with pipes on both ends
62c7aa6bc0dd092aa71e9b398a5bb5c32c28e8d8 tweak the table regex to handle the table syntax with pipes on both ends
some more bundle size reductions - now 4.22kB DCE'd and gzipped
also added a section to the README on how to achieve that figure: https://github.com/probablyup/markdown-to-jsx#getting-the-smallest-possible-bundle-size
bef82a5fa3f84fddb16b423f95f4930dfcbcf8e3 fix handling of nested HTML tags of the same type (#130) - thanks for the report @michaelryancaputo
bef82a5fa3f84fddb16b423f95f4930dfcbcf8e3 fix handling of nested HTML tags of the same type (#130) - thanks for the report @michaelryancaputo
5cbb12f6c3521b388432e7d4a58476ef80d7e82a use the same heuristic as React to handle hyphenated attributes
5cbb12f6c3521b388432e7d4a58476ef80d7e82a use the same heuristic as React to handle hyphenated attributes (#128)
a391247be82c9de8e1ac3057af0cf270119f5daa add a simplified syntax for defining overrides on components alone (#127)
8e2b38067e963b971604a8ba546a0738fdabf3ca Fixes an edge case with an HTML regex being too greedy. Thanks @bathos!
8e2b38067e963b971604a8ba546a0738fdabf3ca Fixes an edge case with an HTML regex being too greedy. Thanks @bathos!
A minor release, patching various bugs. For those interested, we are now using the Daring Fireball markdown syntax document itself as one big test 😃
A minor release, patching various bugs. For those interested, we are now using the Daring Fireball markdown syntax document itself as one big test 😃
4d24c21811944b0ac9852f08677d3b5483dcb6b8 some style adjustments to the site
8385db1702546b94d468d049f029a967a5c8ea4a add the markdown syntax explainer itself as a test
6d81300f54328649afea8f14ab4850c4140e059d handle block HTML a bit more elegantly
fd2a62a11b4d914d5db44be758becfa08016f24a handle image & link references with a space
8689451e769104da790bbd87273882de0987a75f test all the various thematic break syntaxes
f174af1d2edf5fb54306d24895a989c21caa5209 handle consecutive headings with no padding newline
e.g.
# Hello world
## How are ya?
trim newlines for block-mode markdown, this fixes an extra layout div being added when it wasn't needed
trim newlines for block-mode markdown, this fixes an extra layout div being added when it wasn't needed
Fixed a bug with nested heterogenous lists, e.g.:
Fixed a bug with nested heterogenous lists, e.g.:
- foo
1. bar
- baz
Some small quality-of-life updates:
Some small quality-of-life updates:
#3 ended up yielding some size benefits - the library is now ~4.75kB
Forgot to drop an unused dependency - no code changes.
Forgot to drop an unused dependency - no code changes.
This package forked the very lightweight simple-markdown library and now uses its parsing infrastructure. On top of that core functionality, a bunch o
This package forked the very lightweight simple-markdown library and now uses its parsing infrastructure. On top of that core functionality, a bunch of improvements have been added:
All HTML is now supported natively and dangerouslySetInnerHTML is no longer used under any circumstances.
Package size is now just ~5kB gzipped, down from ~37kB.
Anything rendered via the Markdown component can be overridden now, even the wrapper, footnote footer, etc.
I've been working on this release for a while and it took a while to get all the regexes working to my satisfaction. There will probably be bugs, so PRs are welcome to add regression tests as needed and get things tightened up.
Thank you!
__deps: update to remark-parse@4__ (b534012) Drops the compiled bundle size by ~7kb.
deps: update to remark-parse@4 (b534012) Drops the compiled bundle size by ~7kb.
9c16391 fix: ignore HTML comments
9c16391 fix: ignore HTML comments
c652d53 feat: add details and summary to block tag list
c652d53 feat: add details and summary to block tag list
8cc45da fix: add separate target for transpiled code w/ preserved imports
8cc45da fix: add separate target for transpiled code w/ preserved imports
f23533d Replace prepublishOnly script with in-publish package
f23533d Replace prepublishOnly script with in-publish package (#105)
f0067eb fix: use package.json "files" instead of npmignore
f0067eb fix: use package.json "files" instead of npmignore
c66e0af fix: handle self-closing HTML inside inline HTML
c66e0af fix: handle self-closing HTML inside inline HTML (#103)
e932e59 chore: update website link & my personal name in the license 7daf814 chore: remove CHANGELOG d50ca74 deps: update codecov 5ac0b90 deps: update
e932e59 chore: update website link & my personal name in the license 7daf814 chore: remove CHANGELOG d50ca74 deps: update codecov 5ac0b90 deps: update to latest remark-parse and unified fb29ebe fix website to work with 5.x e1028e8 update jest 9614b14 add yarn 9239966 fix package.json links f6a3185 fix badges
76012ec Upgrade to React 15.5.4 (and use prop-types package) (props @ldabiralai!)
76012ec Upgrade to React 15.5.4 (and use prop-types package) (props @ldabiralai!)
62adf46 Refactor object.assign -> spread apply 706ef18 Do not mutate settings object (props @sapegin!) b0d1a73 Update my author info
62adf46 Refactor object.assign -> spread apply 706ef18 Do not mutate settings object (props @sapegin!) b0d1a73 Update my author info
Nothing published for this version
38efb41 [Breaking Change] Default export is now a React HOC 573021c Update Jest bf31694 chore(package): update autoprefixer-stylus to version 0.13.0 a…
See the README for updated usage instructions, here's a quick preview:
import Markdown from 'markdown-to-jsx';
import React from 'react';
import {render} from 'react-dom';
render((
<Markdown>
# Hello world!
</Markdown>
), document.body);
/*
renders:
<h1>Hello world!</h1>
*/
38efb41 [Breaking Change] Default export is now a React HOC 573021c Update Jest bf31694 chore(package): update autoprefixer-stylus to version 0.13.0 aef6471 chore(package): update jest-cli to version 17.0.0 b1088c0 chore(package): update babel-jest to version 17.0.0 8c0b7a5 chore(package): update autoprefixer-stylus to version 0.11.0 883d728 chore(package): update jest-cli to version 16.0.0 a504cc2 chore(package): update babel-jest to version 16.0.0
Nothing published for this version
Nothing published for this version
25f70a6 Allow overrides for GFM task list items & associated checkboxes 3395105 Override support for pre & code elements generated in astToJSX 4249c15
First release of 4.x :tada:
Rollup of 4.x changes:
25f70a6 Allow overrides for GFM task list items & associated checkboxes 3395105 Override support for pre & code elements generated in astToJSX 4249c15 Fix rendering of inline code tags -- thank you @sapegin! 2a00f5a [Experimental] Coalesce/parse nested inline tags f269a87 [pre 4.0] Drop second argument in function signature f50219b [Experimental] Begin parsing inline arbitrary HTML c381ddd Light refactor to pull some functions out of the main closure
Your coding agent can read these notes before it upgrades. Set up the MCP server →