diff --git a/changelog.txt b/changelog.txt
@@ -1,3 +1,88 @@
+[0.23.0]
+
+ * Check for NULL pointer in _scan_at (#81).
+ * Python 3.5 compatibility: don't require HTMLParseError (Zhiming Wang).
+ HTMLParseError was removed in Python 3.5. Since it could never be thrown
+ in Python 3.5+, we simply define a placeholder when HTMLParseError
+ cannot be imported.
+ * Set `convert_charrefs=False` in `normalize.py` (#83). This defeats the
+ new default as of python 3.5, and allows the script to work with python
+ 3.5.
+ * `Makefile.nmake`: be more robust when cmake is missing. Previously,
+ when cmake was missing, the build dir would be created anyway, and
+ subsequent attempts (even with cmake) would fail, because cmake would
+ not be run. Depending on `build/CMakeFiles` is more robust -- this won't
+ be created unless cmake is run. Partially addresses #85.
+ * Fixed DOCTYPE in xml output.
+ * commonmark.c: fix `size_t` to `int`. This fixes an MSVC warning
+ "conversion from 'size_t' to 'int', possible loss of data" (Kevin Wojniak).
+ * Correct string length in `cmark_parse_document` example (Lee Jeffery).
+ * Fix non-ASCII end-of-line character check (andyuhnak).
+ * Fix "declaration shadows a local variable" (Kevin Wojniak).
+ * Install static library (jgm/CommonMark#381).
+ * Fix warnings about dropping const qualifier (Kevin Wojniak).
+ * Use full (unabbreviated) versions of constants (`CMARK_...`).
+ * Removed outdated targets from Makefile.
+ * Removed need for sudo in `make bench`.
+ * [API change] Added `CUSTOM_BLOCK` and `CUSTOM_INLINE` node types.
+ They are never generated by the parser, and do not correspond
+ to CommonMark elements. They are designed to be inserted by
+ filters that postprocess the AST. For example, a filter might
+ convert specially marked code blocks to svg diagrams in HTML
+ and tikz diagrams in LaTeX, passing these through to the renderer
+ as a `CUSTOM_BLOCK`. These nodes can have children, but they
+ also have literal text to be printed by the renderer "on enter"
+ and "on exit." Added `cmark_node_get_on_enter`,
+ `cmark_node_set_on_enter`, `cmark_node_get_on_exit`,
+ `cmark_node_set_on_exit` to API.
+ * Improved benchmark. Use longer test, since `time` has limited resolution.
+ * Removed `bench.h` and timing calls in `main.c`.
+ * Updated API docs; getters return empty strings if not set
+ rather than NULL, as previously documented.
+ * Added api_tests for custom nodes.
+ * Commonmark renderer: ensure html blocks surrounded by blanks.
+ Otherwise we get failures of roundtrip tests.
+ * Made roundtrip test part of the test suite run by cmake.
+ * xml renderer - Added xmlns attribute to document node (jgm/CommonMark#87).
+ * [API change] Rename `CMARK_NODE_HEADER` -> `CMARK_NODE_HEADING`.
+ Note that for backwards compatibility, we have defined aliases:
+ `CMARK_NODE_HEADER` = `CMARK_NODE_HEADING`,
+ `cmark_node_get_header_level` = `cmark_node_get_heading_level`, and
+ `cmark_node_set_header_level` = `cmark_node_set_heading_level`.
+ * [API change] Rename `CMARK_NODE_HRULE` -> `CMARK_NODE_THEMATIC_BREAK`.
+ Defined the former as the latter for backwards compatibility.
+ * Separate parsing and rendering opts in `cmark.h` (#88).
+ This change also changes some of these constants' numerical values,
+ but nothing should change in the API if you use the constants
+ themselves. It should now be clear in the man page which
+ options affect parsing and which affect rendering.
+ * Regenerate `scanners.c` using re2c 0.15.3.
+ * Adjusted scanner for link url. This fixes a heap buffer overflow (#82).
+ * Added version number (1.0) to XML namespace. We don't guarantee
+ stability in this until 1.0 is actually released, however.
+ * Removed obsolete `TIMER` macro.
+ * LaTeX renderer - better handling of internal links.
+ Now we render `[foo](#bar)` as `\protect\hyperlink{bar}{foo}`.
+ * Make `LIB_INSTALL_DIR` configurable (Mathieu Bridon, #79).
+ * Removed out-of-date luajit wrapper.
+ * Use `input`, not `parser->curline` to determine last line length.
+ * Small optimizations in `_scan_at`.
+ * [API change] Rename `NODE_HTML` -> `NODE_HTML_BLOCK`,
+ `NODE_INLINE_HTML` -> `NODE_HTML_INLINE`. Define aliases
+ so the old names still work, for backwards compatibility.
+ * Replaced hard-coded 4 with `TAB_STOP`.
+ * Have `make format` reformat api tests as well.
+ * Added api tests for man, latex, commonmark, and xml renderers (#51).
+ * render.c: added `begin_content` field. This is like `begin_line` except
+ that it doesn't trigger production of the prefix. So it can be set
+ after an initial prefix (say `> `) is printed by the renderer, and
+ consulted in determining whether to escape content that has a special
+ meaning at the beginning of a line. Used in the commonmark renderer.
+ * Commonmark renderer: ensure that literal characters get escaped
+ when they're at the beginning of a block, e.g. `> \- foo`.
+ * Don't allow space between link text and link label in a reference link
+ (spec change).
+
[0.22.0]
* Removed `pre` from blocktags scanner. `pre` is handled separately