markdown-it

A fast, pluggable CommonMark-compliant Markdown parser and renderer for JavaScript, safe by default.

Library
npm
v15.0.2
21,945 stars
MIT License

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum. How we score it →
78 /100 Good
Development Activity 92
Maintenance 52
Community 68
Maturity 60
Momentum 40

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation. How we score it →
86 /100 Excellent
Architecture 92
Code Quality 90
Innovation 85
Learning Curve 78

markdown-it is a Markdown parser for JavaScript that fully implements the CommonMark specification while adding practical extensions like GitHub-flavored tables, strikethrough, URL autolinking, and typographic replacements. It compiles Markdown into a token stream rather than a traditional AST, which keeps the core fast and makes every stage of parsing and rendering independently overridable.

Rather than baking in every feature, markdown-it exposes a rule-based architecture with three chained parsers (core, block, inline) that plugins can extend via .use(). This has produced one of the largest Markdown plugin ecosystems in the JS world, covering footnotes, definition lists, emoji, custom containers, and more, while the parser itself stays secure by default — it disables raw HTML and blocks dangerous URL schemes unless you explicitly opt in.

What You Get

  • A 100% CommonMark-compliant core parser, verified against the official spec test suite on every change
  • Built-in GFM-style extensions: tables, strikethrough, and optional linkify/typographer replacements
  • A rule-based Ruler API (.before(), .after(), .push(), .enable(), .disable()) for inserting, replacing, or toggling parse rules without forking
  • Three ready-made presets (default, commonmark, zero) as configuration starting points
  • Safe-by-default output — raw HTML and dangerous URL schemes (javascript:, vbscript:, file:) are blocked unless explicitly enabled
  • One of the largest third-party plugin ecosystems of any JS Markdown parser (footnotes, definition lists, emoji, custom containers, subscript/superscript, and more)

Common Use Cases

  • Rendering user- or CMS-authored Markdown to HTML on a server or in a static site generator
  • Building a documentation or blogging platform that needs custom Markdown syntax via plugins
  • Adding a live Markdown preview/editor to a web app, using renderInline for single-line contexts
  • Post-processing rendered links or code blocks (e.g. syntax highlighting, target="_blank", custom embeds) by overriding specific renderer rules

Under The Hood

Architecture — markdown-it compiles Markdown into a flat token stream instead of a nested AST, then hands that stream to a separate Renderer. Parsing runs through three chained rule pipelines defined in lib/parser_core.mjs, lib/parser_block.mjs, and lib/parser_inline.mjs: core rules (lib/rules_core/*, e.g. normalize.mjs, block.mjs, inline.mjs, linkify.mjs, replacements.mjs) drive the top-level sequence, block rules (lib/rules_block/* — heading.mjs, list.mjs, table.mjs, fence.mjs, blockquote.mjs, etc.) turn lines into paired open/close block tokens, and inline rules (lib/rules_inline/* — emphasis.mjs, link.mjs, image.mjs, autolink.mjs, strikethrough.mjs) fill each inline-container token’s children array. Each pipeline gets its own independent state object (state_core.mjs, state_block.mjs, state_inline.mjs), which is what lets rules stay decoupled and individually enable/disable-able. Renderer (lib/renderer.mjs) then walks the token array and dispatches each token to a function keyed by token type in renderer.rules, so consumers can override single token types (e.g. link_open) without touching the parser.

Tech Stack — Pure JavaScript (ESM, .mjs throughout, with a generated dist/index.cjs.js for CJS consumers), zero build step required to run the library itself. Runtime dependencies are narrowly scoped utility packages by the same authors/ecosystem: linkify-it (URL autodetection), mdurl (URL parsing/encoding), entities (HTML entity handling), punycode.js (IDN hostname encoding), uc.micro (Unicode category tables), and argparse (only for the bin/markdown-it.mjs CLI). Dev tooling is eslint with neostandard, c8 for coverage, vite for building the browser bundle, and Node’s built-in node --test runner — no third-party test framework dependency.

Code Quality — Testing is unusually rigorous for a parser library: test/cmspec/commonmark.test.mjs runs the full upstream CommonMark specification conformance suite, test/markdown-it/ covers the public API (markdown-it.test.mjs), the Ruler extension mechanism (ruler.test.mjs), the Token class (token.test.mjs), miscellaneous edge cases (misc.test.mjs), and there’s a dedicated pathological.test.mjs plus support/track-ref-pathological.mjs that specifically hunts for catastrophic-backtracking/ReDoS-style inputs — a strong signal of security-conscious maintenance given the library parses untrusted user input by design. test/build/build.test.mjs verifies the built distributable actually works. Source files use consistent JSDoc-style comments describing each public method’s signature (visible directly in lib/index.mjs and lib/token.mjs), and eslint.config.mjs enforces neostandard style project-wide.

API Design — The primary surface is small and idiomatic: markdownit([preset], [options]) constructs an instance, .render(str) / .renderInline(str) produce output, and .use(plugin, ...opts) chains plugin installation in a fluent style. Extensibility is handled through Ruler.before/after/push (lib/ruler.mjs), letting plugin authors insert or replace individual rules by name in any of the three chains without forking the library, and .enable()/.disable() toggle built-in rules on/off per instance. Three built-in presets (default, commonmark, zero) cover the common configuration starting points. Security defaults (HTML disabled, dangerous URL schemes blocked per docs/safety.md) are opt-out rather than opt-in, which lowers the chance of an integrator accidentally shipping an XSS hole. This rule-based extension model is the reason the package has one of the largest third-party plugin ecosystems (footnotes, definition lists, emoji, containers, etc.) of any JS Markdown parser.

Used by 52 apps in this directory

TypeScript
72%
AGPL 3.0

APITable

Databases · Low Code Platforms

15,623

API-first collaborative spreadsheet-database platform that auto-generates REST APIs and lets teams build internal tools, CRMs, and dashboards without code.

View details
71
Repo Health
77
Technical
60
Dependency
Built with
TypeScript 72%
Java 22%
Updated 3 weeks ago
Vue
43%
MIT

Alexandrie

Collaboration · Knowledge Management · Note Taking

2,777

The open-source, offline-first Notion, Obsidian & Confluence alternative with multi-tenant teams, OIDC/SSO, and one-command Docker deployment.

View details
86
Repo Health
73
Technical
74
Dependency
Built with
Vue 43%
TypeScript 41%
Go 13%
Updated 1 weeks ago
TypeScript
54%
MIT

Anarlog

AI Assistants · Note Taking · Productivity

9,404

Anarlog is an open-source, local-first AI meeting notetaker that records, transcribes, and summarizes meetings entirely on your device — no cloud lock-in, no mandatory account, and every note saved as a plain markdown file you own forever.

View details
86
Repo Health
77
Technical
68
Dependency
Built with
TypeScript 54%
Rust 34%
Updated 5 days ago
JavaScript
95%
MIT

AnythingLLM

AI Assistants · Automation · Developer Tools

66,533

The all-in-one AI platform for private document chat, no-code agents, and local LLMs with zero setup friction.

View details
90
Repo Health
78
Technical
64
Dependency
Built with
JavaScript 95%
Updated 1 weeks ago
TypeScript
100%
AGPL 3.0

BaseBuddy

CMS

7

A self-hosted content editor for existing Postgres or Supabase schemas — maps the tables you already have into a WordPress-like TipTap editor instead of requiring you to reshape your database around a CMS.

View details
31
Repo Health
64
Technical
73
Dependency
Built with
TypeScript 100%
Updated 1 months ago
Python
68%
Other

Baserow

Databases · No Code Platforms

6,012

Open-source no-code platform to build databases, apps, automations, and AI agents — self-hosted or cloud, with full data ownership.

View details
89
Repo Health
84
Technical
68
Dependency
Built with
Python 68%
JavaScript 16%
Vue 11%
Updated 6 days ago
Go
92%
AGPL 3.0

BillionMail

Marketing

15,695

Self-hosted email server and marketing platform that gives you unlimited sending, full deliverability control, and AI-assisted campaigns without monthly fees.

View details
52
Repo Health
74
Technical
70
Dependency
Built with
Go 92%
Updated 3 months ago
TypeScript
100%
MIT

Botpress

AI Assistants · AI Development · Customer Support

14,924

The open-source hub for building and deploying LLM-powered AI agents with TypeScript-first tooling, 40+ integrations, and a revolutionary code-execution agent framework.

View details
94
Repo Health
82
Technical
64
Dependency
Built with
TypeScript 100%
Updated 1 weeks ago
Go
49%
MIT

Bytebase

Devops

14,512

An open-source database CI/CD and DevSecOps platform — schema migration review, GitOps-driven changes, data masking, and access control across MySQL, PostgreSQL, Oracle, Snowflake, MongoDB, and more.

View details
92
Repo Health
73
Technical
68
Dependency
Built with
Go 49%
TypeScript 42%
Updated 5 days ago

Join founders buildingwith open source

Opinionated takes, migration guides, cost-saving tips, and insights from the open source ecosystem.

Subscribe on Substack
Join 750+ subscribers