CSL bibliography styles (breaking change)
Quarkdown's internal bibliography management is now powered by CSL (Citation Style Language).
-
A curated selection of citation styles from the CSL Style Repository is now supported. The
styleparameter now accepts a CSL style identifier (e.g.ieee,apa,chicago-author-date,nature). The default style is nowieee.Breaking change:
plainandieeetrstyles do not exist anymore, and have been replaced byieee. -
Along with BibTeX (
.bib) files, the following file formats are now accepted:- CSL JSON (
.json) - YAML (
.yaml/.yml) - EndNote (
.enl) - RIS (
.ris)
- CSL JSON (
-
Rendered bibliography entries are now localized to the document locale, set via
.doclang.
.cite now accepts a comma-separated list of keys (e.g. .cite {einstein, hawking}) to produce a single combined citation label, whose format depends on the active citation style (e.g. [1], [2] for IEEE, (Einstein, 1905; Hawking, 1988) for APA).
Captions for all supported elements now accept inline formatting (including inline function calls), rather than plain text.

.pageformat now supports scoping formats to specific pages in paged documents via two combinable parameters:
side(leftorright): restricts formatting to recto or verso pages, enabling mirrored margins and other asymmetric layouts.pages(e.g.2..5): restricts formatting to an inclusive range of page indices.
.pageformat size:{A4}
.pageformat side:{left} margin:{2cm 3cm 2cm 1cm}
.pageformat side:{right} margin:{2cm 1cm 2cm 3cm}.pageformat pages:{1..3} borderbottom:{4px}New syntax: Tight function calls
Inline function calls can now be wrapped in curly braces to delimit them from surrounding content, without relying on whitespace.
abc{.uppercase {def}}ghiThe new .heading function creates headings with granular control over their behavior, unlike standard Markdown headings (#, ##, ...).
It allows explicit control over numbering (numbered), table of contents indexing (indexed), page breaks (breakpage), depth, and reference ID (ref).
The new .pagebreak function provides an explicit way to insert a page break as an alternative to the <<< syntax.
The new .filetree function renders a visual file tree from a Markdown list.
.filetree
- src
- main.ts
- ...
- README.mdBold entries (**name**) are highlighted with a distinct background color, useful for drawing attention to specific items.
.filetree
- src
- **main.ts**
- utils.ts
- README.mdBoth .tableofcontents and .bibliography now accept the following optional parameters to control the heading that precedes them:
breakpage: controls whether the heading triggers an automatic page break.headingdepth: the depth of the heading (1-6).numberheading: controls whether the heading is numbered in the document hierarchy.indexheading: when enabled, the heading is included in the document's own table of contents.
The .text function now accepts a script parameter with sub and sup values for subscript and superscript text.
The includeunnumbered parameter has been removed, in favor of the more granular heading configuration previously mentioned.
Now all indexable headings are included in the ToC by default, regardless of their numbering.
When an explicit margin is applied to a .container, it now suppresses the margins of its direct children, for a more intuitive and flexible layout configuration.
.fullspan, used to create a block spanning over multiple columns in a multi-column layout, is now shorthand for .container fullspan:{yes}.
The multi-column layout via .pageformat columns:{N} is no longer experimental, and now works reliably across all document types.
Infinite recursion in function calls is now detected and reported as a clear error.
On Linux systems where the Java AWT Desktop API does not support the BROWSE action (e.g., Wayland), --browser default now falls back to xdg-open automatically.
Additionally, --browser xdg is now a supported named choice for the --browser CLI option.
Thanks @szy1840!
When editing long paged documents with live preview, the scroll position could sometimes be restored only partially because of long paged.js load times. The swap now reliably waits for the content to be fully loaded.
Fixed an issue that caused Mermaid diagrams in paged documents to cause subsequent content to overflow instead of being pushed to the next page.
Fixed an issue that caused tree traversal-dependent features, such as cross-references, to not work in titles of .box and .collapse, and in block quote attributions.
The lexer has been optimized to reduce regex builds to a minimum, resulting in significantly improved performance for large documents.
Thanks to our sponsors! 🎉
@vitto4
1.14.1 - 2026-03-06
A backslash (\) in a numbering format string now escapes the next character, treating it as a fixed symbol. For example, \1 produces a literal 1 instead of a decimal counter.
Fixed an IPv6-related issue that caused connections to Quarkdown's server to time out on Windows. Please also update to the latest version of the VS Code extension to v1.1.2 or later.
Fixed an issue that caused a line like .sum {1} {2} .sum {3} {4} to be incorrectly lexed as two block function calls rather than a single paragraph with two inline function calls.
The lexer no longer restarts its regex search from scratch when a function call advances the scan position, resulting in slightly improved performance, especially for documents with many function calls.
1.14.0 - 2026-02-19
This version is the biggest release to date, with a large number of new features and improvements, and a new official wiki, written in Quarkdown, that fully replaces the GitHub wiki for a better experience.
Going forward, next minor releases will be smaller and more frequent.
docs is the fourth document type available in Quarkdown, alongside plain, paged and slides. It is designed for technical documentation, wikis and knowledge bases.
It derives from plain, and adds a customizable navigation sidebar, a ToC sidebar, a header, accurate client-side search, and next/previous page navigation buttons.
You can see it in action in the new official wiki! To get started with a new docs document, you can rely on quarkdown create as usual.
Inspired by Astro, this new theme combination is the one used in the new wiki for improved readability and modern look.
GitHub's alert syntax is now supported, making it easier to migrate from other tools:
> [!NOTE]
> This is a noteNote that Quarkdown's original syntax is still supported and recommended, especially for English documents:
> Note: This is a noteLinks to Quarkdown subdocuments now support anchors, to link to specific sections:
[Page](page.qd#section)The .formatpagenumber {format} function overrides the page numbering format from the current page onward. It accepts the same format specifiers as .numbering, and applies to both page counters and table of contents.
.pagemargin {topcenter}
.currentpage
# First page
.formatpagenumber {i}
# Second page
# Third pageThanks @OverSamu!
The .grid function now accepts hgap and vgap parameters to customize the horizontal and vertical gaps between grid items. gap still works as a shorthand for both.
Thanks @OverSamu!
When invoking a native function from the stdlib, none is now supported by nullable parameters, and converted to null.
Before:
.function {rectangle}
width height background?:
.if {.background::isnone}
.container width:{.width} height:{.height}
.ifnot {.background::isnone}
.container width:{.width} height:{.height} background:{.background}After:
.function {rectangle}
width height background?:
.container width:{.width} height:{.height} background:{.background}The new .icon {name} function relies on Bootstrap Icons to display pixel-perfect icons in your documents.
Quarkdown is on .icon {github}Quarkdown can now render to plain text (.txt) via --render plaintext.
This has no particular use case. It was needed to implement the docs search feature in the first place.
The new .pathtoroot {granularity?} function returns the relative path from the current source file to the parent directory of:
- the root document, if
granularityisproject(default) - the subdocument, if
granularityissubdocument
The .css function now applies !important automatically at the end of each rule.
The navigation sidebar, visible in plain and paged documents on web view, is now easier to navigate, with all entries visible at once, and more accessible for screen readers.
Additionally, its generation is now performed at compile time rather than runtime, providing major performance improvements for large documents.
--no-subdoc-collisions was removed in favor of --subdoc-naming <strategy>, which is a flexible way to choose how subdocument output files are named:
file-name(default): each subdocument output file is named after its source filedocument-name: each subdocument output file is named after its.docnamevaluecollision-proof: former--no-subdoc-collisions
The quarkdown create command is now more intuitive, for a smoother onboarding experience.
.include {library} now also includes top-level Markdown content from the library, just like .include {file.qd} does for regular files.
Page content border (.pageformat bordercolor) is now supported in plain documents, and refined for slides documents, especially in PDF output.
Code blocks using the diff language now have improved and clearer styling for added and removed lines.
Live preview has undergone major performance improvements and increased reliability, especially in combination with the new VS Code extension update.
Live reloading not being performed when editing subdocuments has also been fixed.
Linking to subdocuments from files included via .include from a different directory now correctly resolves the subdocument path.
The following snippet used to cause an unresolved reference error for y:
.function {a}
x:
.x
.function {b}
y:
.a
.y
.b {hello}Fixed an issue that caused no spacing to be present between two paragraphs if a floating element was in-between, via .float.
Table of contents are no longer empty if no level 1 headings are present, or if all are decorative.
Table cells now correctly apply the same line spacing as paragraphs and lists.
Shout out to our sponsors! 🎉
@vitto4
@serkonda7

