Yet another markdown parser built for speed, Compliant to CommonMark specification markdown commonmark gfm markdown-flavors
0.4.2 Latest release released
95 23 2


Language Tag Build Status

Yet another markdown parser built for speed, written in Crystal, Compliant to CommonMark specification (v0.27). Copy from commonmark.js.


Add this to your application's shard.yml:

    github: icyleaf/markd

Quick start

require "markd"

markdown = <<-MD
# Hello Markd

> Yet another markdown parser built for speed, written in Crystal, Compliant to CommonMark specification.

html = Markd.to_html(markdown)

Also here are options to configure the parse and render.

options = true, safe: true)
Markd.to_html(markdown, options)


| Name | Type | Default value | Description | | ----------- | ------ | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | time | Bool | false | render parse cost time during read source, parse blocks, parse inline. | | smart | Bool | false | if true, straight quotes will be made curly,
-- will be changed to an en dash,
--- will be changed to an em dash, and
... will be changed to ellipses. | | source_pos | Bool | false | if true, source position information for block-level elements
will be rendered in the data-sourcepos attribute (for HTML) | | safe | Bool | false | if true, raw HTML will not be passed through to HTML output (it will be replaced by comments) | | prettyprint | Bool | false | if true, code tags generated by code blocks will have a prettyprint class added to them, to be used by Google code-prettify. | | gfm | Bool | false | Not supported for now | | toc | Bool | false | Not supported for now | | base_url | URI? | nil | if not nil, relative URLs of links are resolved against this URI. It act's like HTML's <base href="base_url"> in the context of a Markdown document. |


If you want to use a custom renderer, it can!

class CustomRenderer < Markd::Renderer

  def strong(node, entering)

  # more methods following in render.

options = true)
document = Markd::Parser.parse(markdown, options)
renderer =

html = renderer.render(document)


First of all, Markd is slower than Crystal Built-in Markdown which it is a lite version, only apply for generte Cystal documents (#4496, #4613).

Here is the result of a sample markdown file parse at MacBook Pro Retina 2015 (2.2 GHz):

Crystal Markdown   3.28k (305.29µs) (± 0.92%)       fastest
           Markd 305.36  (  3.27ms) (± 5.52%) 10.73× slower

Recently, I'm working to compare the other popular commonmark parser, the code is stored in benchmarks.


Markd is an open source, collaboratively funded project. If you run a business and are using Markd in a revenue-generating product, it would make business sense to sponsor Markd development. Individual users are also welcome to make a one time donation if Markd has helped you in your work or personal projects.

You can donate via Paypal.

How to Contribute

Your contributions are always welcome! Please submit a pull request or create an issue to add a new question, bug or feature to the list.

All Contributors are on the wall.

You may also like

  • halite - HTTP Requests Client with a chainable REST API, built-in sessions and middlewares.
  • totem - Load and parse a configuration file or string in JSON, YAML, dotenv formats.
  • poncho - A .env parser/loader improved for performance.
  • popcorn - Easy and Safe casting from one type to another.
  • fast-crystal - 💨 Writing Fast Crystal 😍 -- Collect Common Crystal idioms.


MIT License © icyleaf

  github: icyleaf/markd
  version: ~> 0.4.2
License MIT
Crystal >= 0.36.1, < 2.0.0


Dependencies 0

Development Dependencies 0

Last synced .
search fire star recently