Skip to content

Cross-platform

Off macOS the port computes with its own math functions, written in Rust and compiled into the program, so the result should not depend on the operating system, the CPU or the browser. CI checks it on every push: each platform below renders every corpus input and the gallery samples, and the check fails unless all of them write the same bytes. The drawings on this page are those platforms' files, all drawn by your browser, so one renderer and one set of fonts: any difference you could see would be a difference in the files.

Every platform wrote byte-identical output: 2,591 corpus inputs and 30 samples

From this CI run at commit 7e789f5.

PlatformToolchainCorpus inputs equal to Linux x86-64Samples
Linux x86-64rustc 1.99.1 (58cf8f9c3 2026-10-13)2,591 / 2,59130 / 30
Linux arm64rustc 1.99.1 (58cf8f9c3 2026-10-13)2,591 / 2,59130 / 30
Windows x86-64rustc 1.99.1 (58cf8f9c3 2026-10-13)2,591 / 2,59130 / 30
macOS arm64 (portable-math)rustc 1.99.1 (58cf8f9c3 2026-10-13)2,591 / 2,59130 / 30
WebAssembly (Node.js)Node.js v22.23.32,591 / 2,59130 / 30

A corpus input counts as equal when the hash of its -Tsvg output (every graph in the file) is the same; a sample, when the whole SVG file is. macOS appears with --features graphviz-pure-core/portable-math: by default the macOS build uses Apple's libm, to match C on macOS byte for byte (why).

Compare two platforms

Comparing…
Linux x86-64 output, cyan plateWindows x86-64 output, magenta plate

A onlyB onlyboth: in register

Every sample, every platform

Select a row to load it into the viewer. Each cell is that platform's file, with the start of its SHA-256.

Sample
Linux x86-64
Linux arm64
Windows x86-64
macOS arm64 (portable-math)
WebAssembly (Node.js)
Finite-state machine, Linux x86-64
76704f31d5
Finite-state machine, Linux arm64
76704f31d5
Finite-state machine, Windows x86-64
76704f31d5
Finite-state machine, macOS arm64 (portable-math)
76704f31d5
Finite-state machine, WebAssembly (Node.js)
76704f31d5
Clusters, Linux x86-64
3f59e604ba
Clusters, Linux arm64
3f59e604ba
Clusters, Windows x86-64
3f59e604ba
Clusters, macOS arm64 (portable-math)
3f59e604ba
Clusters, WebAssembly (Node.js)
3f59e604ba
Unix family tree, Linux x86-64
256e5c5621
Unix family tree, Linux arm64
256e5c5621
Unix family tree, Windows x86-64
256e5c5621
Unix family tree, macOS arm64 (portable-math)
256e5c5621
Unix family tree, WebAssembly (Node.js)
256e5c5621
Record ports, Linux x86-64
1a2b744ef4
Record ports, Linux arm64
1a2b744ef4
Record ports, Windows x86-64
1a2b744ef4
Record ports, macOS arm64 (portable-math)
1a2b744ef4
Record ports, WebAssembly (Node.js)
1a2b744ef4
HTML-like tables, Linux x86-64
76683d32b7
HTML-like tables, Linux arm64
76683d32b7
HTML-like tables, Windows x86-64
76683d32b7
HTML-like tables, macOS arm64 (portable-math)
76683d32b7
HTML-like tables, WebAssembly (Node.js)
76683d32b7
Orthogonal routing in clusters, Linux x86-64
2c7ebee57c
Orthogonal routing in clusters, Linux arm64
2c7ebee57c
Orthogonal routing in clusters, Windows x86-64
2c7ebee57c
Orthogonal routing in clusters, macOS arm64 (portable-math)
2c7ebee57c
Orthogonal routing in clusters, WebAssembly (Node.js)
2c7ebee57c
Orthogonal switch network, Linux x86-64
92c21cbf31
Orthogonal switch network, Linux arm64
92c21cbf31
Orthogonal switch network, Windows x86-64
92c21cbf31
Orthogonal switch network, macOS arm64 (portable-math)
92c21cbf31
Orthogonal switch network, WebAssembly (Node.js)
92c21cbf31
Concentrated edges, Linux x86-64
7917de2f30
Concentrated edges, Linux arm64
7917de2f30
Concentrated edges, Windows x86-64
7917de2f30
Concentrated edges, macOS arm64 (portable-math)
7917de2f30
Concentrated edges, WebAssembly (Node.js)
7917de2f30
Polyline edges, Linux x86-64
6aeb9bedf2
Polyline edges, Linux arm64
6aeb9bedf2
Polyline edges, Windows x86-64
6aeb9bedf2
Polyline edges, macOS arm64 (portable-math)
6aeb9bedf2
Polyline edges, WebAssembly (Node.js)
6aeb9bedf2
Curved edges, Linux x86-64
f9f71a6b9d
Curved edges, Linux arm64
f9f71a6b9d
Curved edges, Windows x86-64
f9f71a6b9d
Curved edges, macOS arm64 (portable-math)
f9f71a6b9d
Curved edges, WebAssembly (Node.js)
f9f71a6b9d
Every arrowhead, Linux x86-64
c1c67a7131
Every arrowhead, Linux arm64
c1c67a7131
Every arrowhead, Windows x86-64
c1c67a7131
Every arrowhead, macOS arm64 (portable-math)
c1c67a7131
Every arrowhead, WebAssembly (Node.js)
c1c67a7131
Colours and fonts, Linux x86-64
21b65113fa
Colours and fonts, Linux arm64
21b65113fa
Colours and fonts, Windows x86-64
21b65113fa
Colours and fonts, macOS arm64 (portable-math)
21b65113fa
Colours and fonts, WebAssembly (Node.js)
21b65113fa
Radial gradients, Linux x86-64
1ed20b81cc
Radial gradients, Linux arm64
1ed20b81cc
Radial gradients, Windows x86-64
1ed20b81cc
Radial gradients, macOS arm64 (portable-math)
1ed20b81cc
Radial gradients, WebAssembly (Node.js)
1ed20b81cc
External labels, Linux x86-64
a7030033b1
External labels, Linux arm64
a7030033b1
External labels, Windows x86-64
a7030033b1
External labels, macOS arm64 (portable-math)
a7030033b1
External labels, WebAssembly (Node.js)
a7030033b1
Edges between clusters, Linux x86-64
c37ea615d0
Edges between clusters, Linux arm64
c37ea615d0
Edges between clusters, Windows x86-64
c37ea615d0
Edges between clusters, macOS arm64 (portable-math)
c37ea615d0
Edges between clusters, WebAssembly (Node.js)
c37ea615d0
Node shapes, Linux x86-64
9e00e699a5
Node shapes, Linux arm64
9e00e699a5
Node shapes, Windows x86-64
9e00e699a5
Node shapes, macOS arm64 (portable-math)
9e00e699a5
Node shapes, WebAssembly (Node.js)
9e00e699a5
UTF-8 labels, Linux x86-64
21496a1dcf
UTF-8 labels, Linux arm64
21496a1dcf
UTF-8 labels, Windows x86-64
21496a1dcf
UTF-8 labels, macOS arm64 (portable-math)
21496a1dcf
UTF-8 labels, WebAssembly (Node.js)
21496a1dcf
Heawood graph, Linux x86-64
7cc34e3b88
Heawood graph, Linux arm64
7cc34e3b88
Heawood graph, Windows x86-64
7cc34e3b88
Heawood graph, macOS arm64 (portable-math)
7cc34e3b88
Heawood graph, WebAssembly (Node.js)
7cc34e3b88
Process graph, Linux x86-64
1c03567b1e
Process graph, Linux arm64
1c03567b1e
Process graph, Windows x86-64
1c03567b1e
Process graph, macOS arm64 (portable-math)
1c03567b1e
Process graph, WebAssembly (Node.js)
1c03567b1e
fdp with clusters, Linux x86-64
faa5c1ef47
fdp with clusters, Linux arm64
faa5c1ef47
fdp with clusters, Windows x86-64
faa5c1ef47
fdp with clusters, macOS arm64 (portable-math)
faa5c1ef47
fdp with clusters, WebAssembly (Node.js)
faa5c1ef47
fdp on nested clusters, Linux x86-64
159fb030a2
fdp on nested clusters, Linux arm64
159fb030a2
fdp on nested clusters, Windows x86-64
159fb030a2
fdp on nested clusters, macOS arm64 (portable-math)
159fb030a2
fdp on nested clusters, WebAssembly (Node.js)
159fb030a2
sfdp spring smoothing, Linux x86-64
23fa2a69ef
sfdp spring smoothing, Linux arm64
23fa2a69ef
sfdp spring smoothing, Windows x86-64
23fa2a69ef
sfdp spring smoothing, macOS arm64 (portable-math)
23fa2a69ef
sfdp spring smoothing, WebAssembly (Node.js)
23fa2a69ef
sfdp switch network, Linux x86-64
c6cff0844b
sfdp switch network, Linux arm64
c6cff0844b
sfdp switch network, Windows x86-64
c6cff0844b
sfdp switch network, macOS arm64 (portable-math)
c6cff0844b
sfdp switch network, WebAssembly (Node.js)
c6cff0844b
sfdp Unix tree, Linux x86-64
c44b70426f
sfdp Unix tree, Linux arm64
c44b70426f
sfdp Unix tree, Windows x86-64
c44b70426f
sfdp Unix tree, macOS arm64 (portable-math)
c44b70426f
sfdp Unix tree, WebAssembly (Node.js)
c44b70426f
Circular Heawood, Linux x86-64
982f00e667
Circular Heawood, Linux arm64
982f00e667
Circular Heawood, Windows x86-64
982f00e667
Circular Heawood, macOS arm64 (portable-math)
982f00e667
Circular Heawood, WebAssembly (Node.js)
982f00e667
Circular state machine, Linux x86-64
975be16873
Circular state machine, Linux arm64
975be16873
Circular state machine, Windows x86-64
975be16873
Circular state machine, macOS arm64 (portable-math)
975be16873
Circular state machine, WebAssembly (Node.js)
975be16873
Radial Unix tree, Linux x86-64
a2c679cb31
Radial Unix tree, Linux arm64
a2c679cb31
Radial Unix tree, Windows x86-64
a2c679cb31
Radial Unix tree, macOS arm64 (portable-math)
a2c679cb31
Radial Unix tree, WebAssembly (Node.js)
a2c679cb31
osage cluster packing, Linux x86-64
57569817ad
osage cluster packing, Linux arm64
57569817ad
osage cluster packing, Windows x86-64
57569817ad
osage cluster packing, macOS arm64 (portable-math)
57569817ad
osage cluster packing, WebAssembly (Node.js)
57569817ad
patchwork treemap, Linux x86-64
e3ad12e8c1
patchwork treemap, Linux arm64
e3ad12e8c1
patchwork treemap, Windows x86-64
e3ad12e8c1
patchwork treemap, macOS arm64 (portable-math)
e3ad12e8c1
patchwork treemap, WebAssembly (Node.js)
e3ad12e8c1
Unix tree as treemap, Linux x86-64
78f8c59b47
Unix tree as treemap, Linux arm64
78f8c59b47
Unix tree as treemap, Windows x86-64
78f8c59b47
Unix tree as treemap, macOS arm64 (portable-math)
78f8c59b47
Unix tree as treemap, WebAssembly (Node.js)
78f8c59b47

How this is made

  • .github/workflows/cross-platform.yml runs scripts/cross-platform-render.sh on GitHub's Linux x86-64, Linux arm64, Windows and macOS runners, and scripts/cross-platform-wasm.mjs with the WASM package under Node.js.
  • scripts/cross-platform-compare.py compares every platform's corpus hashes and sample files, fails the run on any difference, and writes the data for this page.
  • Test inputs are checked out byte for byte on every platform (.gitattributes), since Windows would otherwise convert their line endings.