# MultiMarkdown 6 is deprecated, and libMultiMarkdown is the part worth reading

> MultiMarkdown-6 is the C library and command line tool that implements MultiMarkdown syntax with smart quotes, footnotes, metadata and Critic Markup, and the repository now says plainly that it is deprecated in favour of MultiMarkdown-7. The trade is that the v6 C API is well documented and stable, while new work belongs in the successor project.

**fletcher/MultiMarkdown-6** — This project is now deprecated.  Please use MultiMarkdown-7 instead!

- Repository: https://github.com/fletcher/MultiMarkdown-6
- Website: https://github.com/fletcher/MultiMarkdown-7
- Stars: 680 · Forks: 93
- Language: C
- License: NOASSERTION
- Published: 2026-10-21 · Updated: 2026-10-21 · Language: en
- Canonical page: https://hysenlabs.com/projects/fletcher-multimarkdown-6

## The repository opens with a deprecation notice, and that is the first fact

The repository description is a single sentence: this project is now deprecated, please use MultiMarkdown-7 instead. The homepage points at the MultiMarkdown-7 repository, and the README's own header table gives the version as 6.8.0 with a date of 2026-07-29. That combination is unusual and worth parsing carefully. The source is still being touched, the default branch is develop, and the last push to the repository was on 2026-07-29, so this is a project that is receiving maintenance commits while formally being closed to new users. The library itself is libMultiMarkdown, authored by Fletcher T. Penney, and the copyright line in the header table reads 2016 to 2026. So the sensible way to read this repository is as the reference implementation of the MultiMarkdown format, useful for study and for maintaining existing dependencies, rather than as something to build a new product on.

## Building it is CMake driven, with a release and a debug target

The build is unusual in a good way: the entry point is a Makefile, but the Makefile does almost nothing except call CMake. The release target creates the build directory and runs cmake with CMAKE_BUILD_TYPE=Release, and there is a matching debug variant that runs the same build with CMAKE_BUILD_TYPE=Debug into a separate directory.```shell
	cmake -DCMAKE_BUILD_TYPE=Release ..
``` The README's build instructions are correspondingly short. You download from GitHub, then run make release or make debug, then change into the build directory and run make:```shell
	make release
	(OR)
	make debug

	cd build
	make

You can optionally test using the test suite:

	ctest
```@@C1@@ There are more targets in the Makefile than the README mentions, and they tell you what the project is used for. A shared target adds -DSHAREDBUILD=1 so the library is built as a shared object, an xcode target generates a project rather than a binary, a test target turns on CuTest unit testing with -DTEST=1, and a documentation target runs Doxygen. Two targets exist for cross-compiling to Windows from a Unix-like system with MinGW, one of which also produces a zip package.

## Three function families, and the choice depends on your data shape

The C API is organised around three variants of the primary functions, and the README explains the difference in one line each. The mmd_string family starts from source text in a C string. The mmd_d_string family starts from a DString, which is useful if you already use DStrings for your text. The mmd_engine family is useful when you are processing the same source multiple times. The string variants then fan out by what you want out.```c
	// Returned char * must be freed
	char * mmd_string_convert(const char * source, unsigned long extensions, short format, short language);

``` mmd_string_convert returns a char pointer to the converted text and the README says the returned char must be freed. mmd_string_convert_to_data returns a DString and is described as needing to be used for complex output formats such as EPUB, and mmd_string_convert_to_file writes results to a file, which the README says is used for complex formats requiring multiple documents, with EPUB given as the example. There is also a metadata API: mmd_string_has_metadata tells you whether the text has metadata and where it ends, mmd_string_metadata_keys returns the keys one per line, and mmd_string_metavalue_for_key extracts one value.

## Extension bits are the real configuration surface

Every conversion call takes three parameters, an extensions bitmask, a format and a language, and the extensions are where the behaviour actually lives. The parser_extensions enum in the README lists them as powers of two, so a caller ORs the ones it wants. EXT_COMPATIBILITY is Markdown compatibility mode, EXT_COMPLETE creates a complete document rather than a fragment, EXT_SNIPPET creates only a snippet, EXT_SMART enables smart quotes, EXT_NOTES enables footnotes, and EXT_PROCESS_HTML processes Markdown inside HTML, which is how you write HTML in a MultiMarkdown document. Two options are privacy or noise related: EXT_OBFUSCATE masks email addresses and EXT_RANDOM_FOOT uses random numbers for footnote links, with EXT_RANDOM_LABELS doing the same for header labels unless they are manually defined. There are also transclusion options, EXT_TRANSCLUDE to perform transclusions and the two parse options, EXT_PARSE_OPML and EXT_PARSE_ITMZ, which convert from OPML or from ITMZ, the latter being the iThoughts format, before the source text is processed at all.

## Critic Markup and transclusion are the features that set it apart

Two capabilities distinguish MultiMarkdown from a Markdown parser with extra syntax. The first is Critic Markup, and there are three extension bits for it: EXT_CRITIC enables the support, EXT_CRITIC_ACCEPT accepts all proposed changes, and EXT_CRITIC_REJECT rejects all. That is a document-review workflow, where a change is recorded as a proposal in the text and a later pass resolves it, which is a different model from editing the file directly. The second is transclusion, where a document includes the content of other files. The library exposes mmd_string_transclusion_manifest, which returns the list of all transcluded files and needs to know both the directory to search and the path of the source file, with the returned stack needing to be freed. The metadata API completes the picture, with mmd_string_update_metavalue_for_key inserting or replacing a metadata value and returning a new string. None of these three features has an equivalent in a plain Markdown parser, which is the practical reason to use this library rather than a general purpose one.

## The Xcode integration is six manual steps, and step three is the fragile one

Embedding the library in an Objective-C project is documented as a numbered procedure, and the README warns about exactly one hazard. You add the project as a git submodule, compile it with make xcode, then drag the generated build-xcode/MultiMarkdown.xcodeproj into your own project as a subproject, select the MultiMarkdown subproject and its libMultiMarkdown target, and in the Copy Files build phase choose Products Directory as the destination. You then select your root project and target, add libMultiMarkdown under Target Dependencies, and add libMultiMarkdown.framework/libMultiMarkdown and libcurl.tdb under Link Binary with Libraries. The warning is that if you move the project on disk or update the MultiMarkdown source files, you have to rerun the compile step. The demo code that follows is marked as untested by the README, and it shows the lifecycle the library expects: token_pool_init once per app lifecycle, the conversion call, then token_pool_drain and token_pool_free.

## A custom licence, no tagged releases, and where the documentation went

The licence is the one thing a user has to read directly, because the licence field in the repository metadata is a custom licence that GitHub cannot classify, and the README points at a LICENSE file. The releases are thin: the recent tags are 6.7.0 from 2023-06-11, 6.6.0 and 6.5.3 both from 2020-10-28, and the version in the header table is 6.8.0, which means the working tree is ahead of the newest tag. The default branch is develop rather than master, and the CI badges in the README cover both, with Travis CI configuration for master and for develop. The documentation is split across several directories. The QuickStart/ directory holds the guide the README points to for the differences from version 5, and it ships as example artefacts as well, including QuickStart.html, QuickStart.pdf, QuickStart.txt, QuickStart.epub and QuickStart.fodt, which is a compact way to see what a given output format looks like. DevelopmentNotes/ is where the testing information lives, and the syntax differences the README starts to describe sit in the Differences section, where the first item is that setext headers can consist of more than one line.

## Conclusion

MultiMarkdown 6 suits a project that already links libMultiMarkdown and needs to keep it building, and it suits a developer studying how the MultiMarkdown parser is put together, because the C API surface and the parser options are all still in the repository. It does not suit a new integration, since the repository description says the project is deprecated and points to MultiMarkdown-7, and it does not suit a user who wants the documented MultiMarkdown syntax reference, because the QuickStart guide and the syntax differences notes live here but the maintained documentation is with the successor. Before adopting, confirm your requirement is the v6 library rather than the MultiMarkdown format, and note that the last push to the repository was on 2026-07-29 with the newest tagged release 6.7.0 from 2023-06-11 and a custom licence that GitHub cannot classify.

## FAQ

### How do I build MultiMarkdown 6 from source?

Download from GitHub, then run `make release` for an optimised build or `make debug` for a debug one, change into the build directory and run make. You can optionally run the test suite with ctest. The Makefile delegates to CMake, so the release target runs cmake with CMAKE_BUILD_TYPE=Release.

### Is MultiMarkdown 6 deprecated?

Yes. The repository description says the project is now deprecated and asks you to use MultiMarkdown-7 instead, and the homepage points at the MultiMarkdown-7 repository. The last push to the repository was on 2026-07-29 and the header table gives the version as 6.8.0.

### Which output formats does libMultiMarkdown support?

The output_format enum in the README lists FORMAT_HTML, FORMAT_EPUB, FORMAT_LATEX, FORMAT_BEAMER, FORMAT_MEMOIR, FORMAT_FODT, FORMAT_ODT, FORMAT_TEXTBUNDLE, FORMAT_TEXTBUNDLE_COMPRESSED, FORMAT_OPML, FORMAT_ITMZ and FORMAT_MMD. Complex formats such as EPUB are produced with mmd_string_convert_to_data or mmd_string_convert_to_file rather than the plain convert call.

### How do I enable Critic Markup and smart quotes in libMultiMarkdown?

Both are extension bits passed in the extensions parameter. EXT_CRITIC enables Critic Markup support, EXT_CRITIC_ACCEPT accepts all proposed changes, EXT_CRITIC_REJECT rejects all, and EXT_SMART enables smart quotes. The language is a separate parameter with a smart_quotes_language enum covering English, Dutch, French, German, German with guillemets, Spanish and Swedish.

### What licence is MultiMarkdown 6 released under?

The licence field in the repository metadata is a custom licence that GitHub cannot classify, and the LICENSE file in the repository root is the authoritative text. The README's header table gives the copyright as 2016 to 2026 Fletcher T. Penney, and the newest tagged release is 6.7.0 from 2023-06-11.

## Sources

- [fletcher/MultiMarkdown-6 on GitHub](https://github.com/fletcher/MultiMarkdown-6)
- [Issues](https://github.com/fletcher/MultiMarkdown-6/issues)
- [Project website](https://github.com/fletcher/MultiMarkdown-7)
- [README](https://github.com/fletcher/MultiMarkdown-6/blob/develop/README.md)
- [Releases](https://github.com/fletcher/MultiMarkdown-6/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/fletcher-multimarkdown-6
