Run a live comparison
Download SiriusMarkdown Compare for macOS to run native Swift, Sirius WASM and Pele with one shared source, visible results and exportable timings. The historical native-library comparisons below have their own recorded dates and methodology.
How the tests were run
These results were visually reviewed on 23 September 2026. Each renderer received the same input, and its output was checked visually against the source. These tests assess correctness, not speed, and describe the library builds tested.
Math
The test used 138 expressions: 52 cases from the package's math corpus and 86 expressions from course and showcase documents. Five engines rendered all of them, for 690 renders in total.
| Engine | Correct | Partial | Wrong | Error / blank |
|---|---|---|---|---|
| SiriusMarkdown | 136 | 0 | 0 | 0 |
| Markdown |
106 | 3 | 27 | 0 |
| SwiftMath | 108 | 1 | 0 | 27 |
| iosMath | 123 | 4 | 0 | 9 |
| SwiftUIMath | 124 | 1 | 0 | 11 |
The table covers 136 valid expressions. Partial means incomplete or misplaced notation; wrong means an altered expression or commands printed as text; error / blank means no usable equation.
Two deliberately malformed inputs are counted separately. SiriusMarkdown preserves their source, the three math engines record errors, and MarkdownDisplayView produces malformed output.
In this comparison, SiriusMarkdown alone rendered ten expressions correctly, including softmax notation, arrays, and labeled braces.
Silent failures
MarkdownDisplayView reports success for all 138 expressions. When it can't handle a command, it prints the name as text: \begin{bmatrix} x_1 \\ x_2 \\ x_3 \end{bmatrix} comes out as [x1x2x3]matrix, and \operatorname{softmax} as operatornamesoftmax. SwiftUIMath draws nothing for eleven valid expressions it cannot handle.
Mermaid diagrams
The test put 24 diagrams through four Markdown renderers.
| Renderer | What it does with a ```mermaid block |
|---|---|
| SiriusMarkdown | draws the diagram |
| MarkdownUI | shows the source as a code block |
| Textual | shows the source as a code block |
| MarkdownDisplayView | shows the source as a code block |
In this test, SiriusMarkdown drew 19 of the 24 diagrams, preserved the source for three unsupported types, and declined two invalid inputs. Explore the diagram gallery for examples of the supported families.
Tables
Thirty tables were rendered by SiriusMarkdown, MarkdownUI, Textual, and MarkdownDisplayView. The differences include:
| Case | SiriusMarkdown | MarkdownUI | Textual | MarkdownDisplayView |
|---|---|---|---|---|
| Empty cells between values | keeps each value in its source column | keeps source columns | moves x from column b to a, and z from c to b | keeps source columns |
**heavy** in a cell |
bold | bold | bold | regular weight |
| Inline code in a cell | monospace | monospace | monospace | proportional glyphs |
\mathrm{CH_3COOH} in a cell |
CH₃COOH, typeset | $\mathrm{CH_3COOH}$ as text |
$\mathrm{CH_3COOH}$ as text |
the column is empty |
| Math inside a sentence in a cell | 4 CO₂, 6 NADH, 2 FADH₂ |
LaTeX source | LaTeX source | 4 , 6 NADH, 2 FADH₂, with the math dropped |
| 12 columns in a narrow column | full-width columns that scroll sideways | columns narrowed to fit | columns narrowed to fit | full-width columns |
| A 64-character hash in a cell | wraps onto two lines | one unbroken line | one unbroken line | five short lines |
| A long sentence in a cell | two lines | two lines in a wider table | two lines in a wider table | many short lines |
| An image that can't load | alt text | empty box and alt text | alt text |  as text |
Compared with a web view
A web view offers browser-based layout and styling. SiriusMarkdown uses native Apple text and view systems, with prepared layout, source-backed selection, and copy-as-Markdown. It does not require a web view for each message. This comparison did not benchmark web-view implementations.
What these tests don't cover
The results describe the examples and library builds tested. They do not measure speed, typographic quality, or every feature a library supports.
Render examples
Unedited captures show the same input in each renderer.

