benchmarks #
tsv is a Rust toolchain for parsing and formatting TypeScript/JS, CSS, and Svelte (source code). Its formatter closely follows Prettier and borrows its architectural patterns, and we're grateful for the hard work of Prettier's contributors. After correctness, tsv prioritizes performance and efficiency: this page measures its speed and size on real-world code, and the conformance page compares parser coverage on edge-case test suites.
This page compares tsv to Prettier and the JS parsers it can replace (Svelte's and acorn-typescript), and to Oxc and Biome, similar tools with more features, configurable styles, and wider language support. It also measures rsvelte, yuku-parser, swc, dprint, Malva, markup_fmt, and PostCSS; Language support lays out what each parses and formats.
tldr #
tsv formats its three languages faster than Oxc and Biome in every in-process pairing here, and its CLI outpaces theirs using less memory in every shared scenario. Its artifacts are smaller than theirs too, except against oxc-parser's native build, since tsv publishes no native parse-only build yet.
Except in the CLI section, every timing here is in-process and one file at a time, isolating engine speed from multi-core parallelism. The corpus is 7,686 files of real-world code, the author's own plus framework source, third-party libraries, and widely benchmarked TypeScript (see Corpus), timed under Node v24.
- Formatting TypeScript, tsv is ~2.2x faster than Oxfmt (native-vs-native), ~37x faster than Prettier (native Rust vs Prettier's JS; ~26x as wasm), and ~7.7x faster than Biome (wasm-vs-wasm).
- Formatting Svelte, tsv is ~85x faster than Prettier (~58x as wasm) and ~10x faster than Biome (wasm-vs-wasm), and rsvelte currently has no in-process API.
- Formatting CSS, tsv is ~3.7x faster than Oxfmt (native-vs-native), ~114x faster than Prettier (~80x as wasm), and ~12x faster than Biome (wasm-vs-wasm).
- Parsing TypeScript to its default span-only AST (offsets only, like Oxc's), tsv is
natively ~1.5x faster than oxc-parser (see Parse speed) and
~2.4x slower than yuku-parser (~3.4x as
wasm). With
{locations: true}, which adds acorn's per-node line/columnloc, it is ~1.2x faster than acorn-typescript, the parser it can replace, and still ahead of Oxc and swc, whose ASTs carry none. - Parsing Svelte with
{locations: true}, whoselocis a superset of Svelte's own, tsv is ~2.0x faster than svelte/compiler (JS) and ~3.0x faster than rsvelte (native-vs-native); its default span-only AST is ~2.6x faster than svelte/compiler. - Parsing CSS runs the other way, largely because Svelte has a lower fidelity CSS AST which
tsv parses to more spec-faithful granularity: Svelte's own
parseCssis ~1.9x faster than tsv's default parse, and PostCSS ~1.7x faster (see Parse speed). Under Bun it flips: tsv's default parse leadsparseCssby ~1.2x, withparseCss~1.8x slower there than under Node. - End to end as a CLI, tsv formats the JSX-free subset of a real TypeScript repo ~1.5x faster than Oxfmt and ~3.9x faster than Biome (~2.6x and ~6.6x as the bare binary, without Node in front), using less memory than either. These are wall-clock ratios, so they include each tool's multi-file parallelism (see the CLI section).
- On a third-party Svelte corpus, tsv's CLI, again through its Node bin, is ~2.9x faster than rsvelte-fmt, another Rust Svelte formatter.
Language support #
Support matrix for Parsers and Formatters (bold is timed on this page, faded is supported but not timed):
| tool | TS/JS | JSX/TSX | CSS | SCSS/Less | Svelte | other |
|---|---|---|---|---|---|---|
| tsv | parses, timed; formats, timed | none | parses, timed; formats, timed | none | parses, timed; formats, timed | |
| Prettier | formats, timed | formats, not timed | formats, timed | formats, not timed | formats, via prettier-plugin-svelte, timed | JSON, YAML, Markdown, GraphQL, HTML, Vue, … |
| svelte/compiler, acorn-typescript | parses, timed | parses, with its jsx option, not timed | parses, timed | none | parses, timed | |
| Oxc | parses, timed; formats, timed | parses, not timed; formats, not timed | formats, timed | formats, not timed | formats, via the Prettier it bundles, opt-in, timed | JSON, TOML, YAML, GraphQL, Markdown; MDX, HTML, Vue, … via Prettier |
| Biome | formats, timed | formats, not timed | formats, timed | none | formats, experimental, behind a flag, timed | JSON, GraphQL, GritQL, HTML (opt-in), and experimental Vue, Astro |
| rsvelte | formats, with Oxc's formatters, not timed | formats, with Oxc's formatters, not timed | formats, with Oxc's formatters, not timed | formats, with Oxc's formatters, not timed | parses, timed; formats, timed | JSON, and the rest of what oxfmt formats with oxfmt installed |
| @dprint/typescript | formats, timed | formats, not timed | none | none | none | dprint's other plugins add JSON, Markdown, …; Malva and markup_fmt are listed below |
| Malva | none | none | formats, timed | formats, not timed | none | Sass |
| markup_fmt | none | none | none | none | formats, with dprint's TypeScript and Malva plugins, not timed | HTML, Vue, Astro, Angular, and template dialects (Jinja, Twig, Vento, …) |
| yuku-parser | parses, timed | parses, not timed | none | none | none | |
| swc | parses, timed | parses, not timed | none | none | none | Flow |
| PostCSS | none | none | parses, timed | parses, via a separate syntax package, not timed | none |
1 via prettier-plugin-svelte; 2 with its jsx option; 3 via the Prettier it bundles, opt-in; 4 experimental, behind a flag; 5 with Oxc's formatters; 6 with dprint's TypeScript and Malva plugins; 7 via a separate syntax package.
Format speed #
Each chart's ratios are relative to its highlighted row, and a negative ratio means that many times worse. Hover another row to compare against it instead.
Formatting 1,906 Svelte files
7 of 1,913 files (1.8% of the group's bytes) are left out of every row, because biome (wasm) fails them in this harness.
Formatting 5,697 TypeScript/JS files
3 of 5,700 files (<0.1% of the group's bytes) are left out of every row, because some rows fail them in this harness (per row, overlapping: oxfmt (node napi) 2, biome (wasm) 3).
Formatting 71 CSS files
2 of 73 files (8.0% of the group's bytes) are left out of every row, because biome (wasm) fails them in this harness.
Parse speed #
The parsers here don't return the same output, so each ratio compares different amounts of
work. They differ in how much position data each node carries (offsets only, or loc too), in how finely they break down CSS (parseCss and PostCSS
keep more of it coarse than tsv does), and in what they collect beyond the tree (Oxc also
gathers comments and module records). Each tool is compared against tsv's closest output,
and the notes cover what still differs.
tsv and oxc-parser, in its default
mode, share a mechanism: both serialize the AST to JSON in Rust and hand it to the JS
engine's JSON.parse, native and wasm alike. tsv is timed three ways:
tsv/tsv-wasmis what the parsers return by default: a span-only AST (start/endoffsets, noloc) of Oxc's kind. It is the closest comparison with oxc-parser but not an equal one: Oxc's AST also writes out default-valued fields tsv omits (optional: false,decorators: [],typeAnnotation: null), about a third more bytes, and its parse also collects comments and module records. Oxc also has an experimental raw-transfer mode, untimed here, that skips the JSON and may well beat tsv natively.+locationspasses{locations: true}: the same parse with aloc(line/column) object on every node, rebuilt in JS from the offsets. That is acorn's shape on TypeScript, and on Svelte and CSS a superset of what their reference parsers carry. On the TypeScript corpus it takes ~1.2x the time of the default.internalbuilds tsv's AST in Rust and stops: no serialization, nothing materialized in JS. These entries show raw engine speed. Their gap to the default entries is what serializing and handing off costs tsv, not a cross-tool comparison.
yuku-parser, a JS/TS parser written in Zig, emits the same span-only AST as Oxc, so it too
compares against tsv's default entries. It hands JS a compact binary buffer that decodes
into objects when its program is read, so the bench reads it to time the same
fully materialized result. swc's AST (a Module root with span offsets) matches neither of tsv's outputs.
Parsing 1,913 Svelte files
Parsing 5,697 TypeScript/JS files
3 of 5,700 files (<0.1% of the group's bytes) are left out of every row, because some rows fail them in this harness (per row, overlapping: acorn-typescript 3, oxc-parser (node napi) 2, oxc-parser (wasm) 2, yuku-parser (node napi) 2, yuku-parser (wasm) 2, swc (node napi) 3).
Parsing 73 CSS files
End-to-end CLI benchmark #
The numbers above time tsv's engine in-process, one file at a time. This section times the whole
CLI end to end, on real code, as you'd experience it from the command line: process spawn, file
discovery, I/O, and each tool's default multi-file parallelism, plus peak memory. It comes from
a fork of Oxc's own bench-formatter that adds tsv.
Upstream's other scenarios aren't shown: their corpora include JSX, which tsv doesn't parse, and
two also format a repo's other languages and embedded code, one sorting imports and Tailwind
classes too.
As in the charts above, each table's ratios are relative to its highlighted row: tsv via Node dispatcher where tsv faces other tools, and the bare tsv binary in the tsv-only table.
TypeScript repo: Outline repository (non-JSX JS/TS subset)
Every formatter scoped to the same JSX-free files, each at its default parallelism.
| formatter | time | time ratio | CPU ratio | peak RSS | RSS ratio |
|---|---|---|---|---|---|
| tsv | 45 ms | 1.69x | 1.09x | 20 MiB | 2.42x |
| tsv via Node dispatcher | 75 ms | 1.00x | 1.00x | 50 MiB | 1.00x |
| oxfmt | 116 ms | −1.54x | −1.96x | 226 MiB | −4.56x |
| biome | 296 ms | −3.92x | −5.67x | 148 MiB | −2.98x |
| prettier + oxc-parser | 6.8 s | −89.7x | −22.4x | 303 MiB | −6.11x |
| prettier | 8.2 s | −108.1x | −35.3x | 454 MiB | −9.15x |
Corpus: commit 8cf997c (2026-07-14), 1,648 files. Each time is the mean of 10 runs after 3 warmups.
Large single file: TypeScript compiler parser.ts (~540KB)
With one input, no formatter can parallelize across files, so wall-clock time comes nearer to engine speed plus startup. Startup is each tool’s own process and thread-pool setup, plus Node’s for every row but the bare tsv binary: a fixed cost that weighs most on the fastest rows.
| formatter | time | time ratio | CPU ratio | peak RSS | RSS ratio |
|---|---|---|---|---|---|
| tsv | 16 ms | 2.85x | 3.00x | 14 MiB | 3.65x |
| tsv via Node dispatcher | 46 ms | 1.00x | 1.00x | 49 MiB | 1.00x |
| oxfmt | 61 ms | −1.31x | −1.91x | 112 MiB | −2.26x |
| biome | 107 ms | −2.30x | −2.34x | 96 MiB | −1.94x |
| prettier + oxc-parser | 975 ms | −21.0x | −27.3x | 197 MiB | −3.98x |
| prettier | 1.6 s | −34.6x | −49.3x | 306 MiB | −6.18x |
Corpus: 539,588 bytes, sha256:dcddb577aa14, 1 file. Each time is the mean of 20 runs after 3 warmups.
Svelte corpus: third-party .svelte corpus (kit, svelte.dev, layerchart, svelte-ux, flowbite-svelte src/lib, svelte-maplibre, layercake)
Two Rust-native Svelte formatters head-to-head. rsvelte-fmt’s time includes the Oxfmt it launches for the file types it doesn’t format itself, which walks the corpus and finds none.
| formatter | time | time ratio | CPU ratio | peak RSS | RSS ratio |
|---|---|---|---|---|---|
| tsv | 25 ms | 2.20x | 1.15x | 12 MiB | 4.07x |
| tsv via Node dispatcher | 56 ms | 1.00x | 1.00x | 50 MiB | 1.00x |
| rsvelte-fmt | 163 ms | −2.92x | −5.15x | 153 MiB | −3.08x |
Corpus: fuzdev/corpora@63d1790 (collections tree 9b64dd2), snapshot ce81fe8 (2026-10-02), 1,091 files. Each time is the mean of 10 runs after 3 warmups.
tsv delivery paths: TypeScript compiler parser.ts (~540KB), through each tsv distribution
Every row is tsv, delivered three ways: the native binary; the same binary through @fuzdev/tsv’s Node dispatcher; and @fuzdev/tsv-wasm, tsv’s CLI reimplemented in JS over a wasm engine, the package for platforms without a prebuilt binary. The corpus is one file, so the gaps are launch and engine cost, not file parallelism. In time, tsv-wasm still finishes well ahead of both Prettier rows in the single-file table, but behind Oxfmt and Biome.
| formatter | time | time ratio | CPU ratio | peak RSS | RSS ratio |
|---|---|---|---|---|---|
| tsv | 16 ms | 1.00x | 1.00x | 14 MiB | 1.00x |
| tsv-npm-bun | 26 ms | −1.58x | −1.68x | 20 MiB | −1.50x |
| tsv via Node dispatcher | 47 ms | −2.85x | −2.99x | 50 MiB | −3.65x |
| tsv-wasm-bun | 96 ms | −5.84x | −33.5x | 127 MiB | −9.36x |
| tsv-wasm | 158 ms | −9.59x | −27.0x | 122 MiB | −8.99x |
Corpus: 539,588 bytes, sha256:dcddb577aa14, 1 file. Each time is the mean of 20 runs after 3 warmups.
This section ran on October 18, 2026, from its harness at 52a8def, on the same machine and Node
as the in-process runs (12 threads). The versions of the tools
both sections time are listed under Benchmarking details; its native tsv rows run the @fuzdev/tsv-linux-x64-gnu binary, and its wasm row @fuzdev/tsv-wasm 0.7.0.
Binary size #
The size of each tool's artifact, split by where it runs and grouped by what it does. Bars
and ratios are raw bytes; the gz beside each estimates the download. tsv-wasm, tsv (napi), and tsv (ffi) are tsv's full
builds: parser and formatter for Svelte, TypeScript/JS, and CSS in one artifact. The
format-only and parse-only builds are subsets of them.
In the browser: wasm and JS #
Full toolchain (parse + format)
Formatter
Parser
Native builds #
Full toolchain (parse + format)
Formatter
Parser
Cross-runtime #
The same harness runs under three JS runtimes: Node, Deno, and Bun. The in-process charts
above are the Node run, chosen as the default N-API host, not for speed. The native entry
differs by runtime: Node and Bun load tsv's N-API addon; Deno loads its C-ABI library (the (ffi) build), which shares the addon's code but crosses a different binding
boundary and is built differently. So a per-runtime delta on the same row comes from the JS
engine, the host's N-API implementation, or that binding and build, not from tsv's
algorithms.
Times are per sweep: one full pass over the group's timed file set, as in the charts above. Ratios
are relative to node, negative when slower. The other tools' native rows are their npm N-API addons under all three runtimes.
A ≈ marks a delta inside the two measurements' combined noise: read it as parity. The
check has two limits. Each side's noise is the spread of a row's few passes, each a fresh process,
which is a thin estimate, so an unmarked delta near it isn't necessarily an effect. And it can't
see variance between whole runs.
node24.14.1deno2.9.7bun1.4.2
Format Svelte
| implementation | node | deno | bun | deno vs node | bun vs node |
|---|---|---|---|---|---|
| prettier | 11,426 ms | 10,856 ms | 9,256 ms | 1.05x | 1.23x |
| tsv (native) | 135 ms | 134 ms | 133 ms | 1.00x | 1.02x |
| tsv-wasm | 196 ms | 223 ms | 193 ms | −1.14x | 1.02x |
| oxfmt (native) | 11,594 ms | 10,980 ms | 9,510 ms | 1.06x | 1.22x |
| biome (wasm) | 2,040 ms | 1,884 ms | 1,759 ms | 1.08x | 1.16x |
Format TypeScript/JS
| implementation | node | deno | bun | deno vs node | bun vs node |
|---|---|---|---|---|---|
| prettier | 27,593 ms | 25,079 ms | 25,893 ms | 1.10x | 1.07x |
| tsv (native) | 738 ms | 704 ms | 710 ms | 1.05x | 1.04x |
| tsv-wasm | 1,044 ms | 1,181 ms | 1,032 ms | −1.13x | 1.01x |
| oxfmt (native) | 1,617 ms | 1,612 ms | 1,588 ms | ≈1.00x | 1.02x |
| biome (wasm) | 8,047 ms | 8,267 ms | 7,287 ms | −1.03x | 1.10x |
| dprint (wasm) | 6,006 ms | 6,812 ms | 5,813 ms | −1.13x | 1.03x |
Format CSS
| implementation | node | deno | bun | deno vs node | bun vs node |
|---|---|---|---|---|---|
| prettier | 724 ms | 698 ms | 592 ms | 1.04x | 1.22x |
| tsv (native) | 6.4 ms | 5.7 ms | 5.6 ms | 1.11x | 1.14x |
| tsv-wasm | 9.0 ms | 10 ms | 7.6 ms | −1.13x | 1.18x |
| oxfmt (native) | 23 ms | 23 ms | 23 ms | 1.02x | 1.02x |
| biome (wasm) | 111 ms | 120 ms | 101 ms | −1.08x | 1.10x |
| malva (wasm) | 60 ms | 65 ms | 70 ms | −1.09x | −1.16x |
Parse Svelte
| implementation | node | deno | bun | deno vs node | bun vs node |
|---|---|---|---|---|---|
| svelte/compiler | 792 ms | 725 ms | 803 ms | 1.09x | ≈−1.01x |
| tsv (native) | 300 ms | 270 ms | 204 ms | 1.11x | 1.47x |
| tsv-wasm | 335 ms | 334 ms | 229 ms | 1.00x | 1.46x |
| tsv+locations (native) | 395 ms | 380 ms | 294 ms | 1.04x | 1.34x |
| tsv-wasm+locations | 429 ms | 445 ms | 321 ms | −1.04x | 1.34x |
| tsv internal (native) | 33 ms | 32 ms | 29 ms | 1.02x | 1.11x |
| tsv-wasm internal | 50 ms | 56 ms | 48 ms | −1.12x | 1.04x |
| rsvelte-parse (native) | 1,202 ms | 1,131 ms | 981 ms | 1.06x | 1.23x |
| rsvelte-parse skip-expr-loc (native) | 744 ms | 702 ms | 632 ms | 1.06x | 1.18x |
Parse TypeScript/JS
| implementation | node | deno | bun | deno vs node | bun vs node |
|---|---|---|---|---|---|
| acorn-typescript | 2,579 ms | 1,975 ms | 2,438 ms | 1.31x | 1.06x |
| tsv (native) | 1,702 ms | 1,458 ms | 1,108 ms | 1.17x | 1.54x |
| tsv-wasm | 1,836 ms | 1,779 ms | 1,166 ms | 1.03x | 1.57x |
| tsv+locations (native) | 2,075 ms | 1,863 ms | 1,505 ms | 1.11x | 1.38x |
| tsv-wasm+locations | 2,216 ms | 2,171 ms | 1,590 ms | 1.02x | 1.39x |
| tsv internal (native) | 180 ms | 166 ms | 150 ms | 1.08x | 1.20x |
| tsv-wasm internal | 262 ms | 299 ms | 242 ms | −1.14x | 1.09x |
| oxc-parser (native) | 2,524 ms | 2,266 ms | 1,559 ms | 1.11x | 1.62x |
| oxc-parser (wasm) | 2,651 ms | 2,509 ms | 1,950 ms | 1.06x | 1.36x |
| yuku-parser (native) | 698 ms | 810 ms | 587 ms | −1.16x | 1.19x |
| yuku-parser (wasm) | 541 ms | 676 ms | 448 ms | −1.25x | 1.21x |
| swc (native) | 3,360 ms ⚠ | 2,958 ms | 2,419 ms | 1.14x | 1.39x |
Parse CSS
| implementation | node | deno | bun | deno vs node | bun vs node |
|---|---|---|---|---|---|
| svelte/compiler | 13 ms | 13 ms | 24 ms | 1.03x | −1.82x |
| tsv (native) | 25 ms | 22 ms | 20 ms | 1.15x | 1.27x |
| tsv-wasm | 27 ms | 26 ms | 17 ms | ≈1.01x | 1.60x |
| tsv+locations (native) | 30 ms | 28 ms | 25 ms | 1.07x | 1.16x |
| tsv-wasm+locations | 31 ms | 32 ms | 22 ms | −1.05x | 1.42x |
| tsv internal (native) | 3.4 ms | 3.1 ms | 2.8 ms | 1.07x | 1.22x |
| tsv-wasm internal | 5.0 ms | 5.6 ms | 4.1 ms | −1.12x | 1.23x |
| postcss | 15 ms | 15 ms | 21 ms | 1.02x | −1.41x |
Benchmarking details #
Each row is the mean time per sweep, a pass over its group's timed file set. Within a group every tool is timed on the same files — the intersection of what every timed tool accepted, so a file one rejects drops out for everyone. The count above each chart is that intersection, and a chart that runs short of the corpus total says beneath it what was left out and which rows failed it.
These are warm numbers: every row runs warmup sweeps before it is timed, so a cold one-shot call pays more. Each native or wasm call also pays a string encode across the binding boundary, and a decode wherever it hands back text or JSON, which the JS tools skip.
Each row is timed in 3 passes, and each pass runs until it has both a few seconds of sweeps and at least 8 sweeps, so the slow rows stop at that floor in every pass. After outlier cleaning, rows keep from 19 to 4,155 timings across their passes. A steady reading over a few dozen sweeps is thinner evidence than one over hundreds, so the harness's check for unstable rows proves less for the slow rows, those that ran fewer than twice the floor's sweeps. Prettier, every format chart's default anchor, is among them in each format group:
- Format Svelte:
prettier,oxfmt,biome-wasm - Format TypeScript/JS: every row
- Format CSS:
prettier - Parse Svelte:
svelte/compiler,tsv-wasm,tsv+locations,tsv-wasm+locations,rsvelte-parse,rsvelte-parse-skip-expr-loc - Parse TypeScript/JS:
acorn-typescript,tsv,tsv-wasm,tsv+locations,tsv-wasm+locations,oxc-parser,oxc-parser-wasm,yuku-parser,yuku-parser-wasm,swc
Every pass of every row runs in a fresh process that loads that row's tool and nothing else, so no tool's code, garbage, or warmed-up state is shared with the next. Each pass takes a group's rows in a different order (forward, reversed, then rotated), so no row always runs right after the same one, and a row's number is the average of its passes. What no process boundary removes is the machine: nothing pins the process to a core or holds the laptop CPU's clock steady. Two fresh processes of the same row sat 1% apart at the median and 3% at the 95th percentile in this run, so a ratio inside that isn't a difference the run measured. A row whose passes sat 5% or more apart is flagged as unstable, and no row's timings shift more than 3% from the first half of a pass to its second.
One asymmetry isn't isolated. Oxfmt's programmatic format is async-only, so
each call's timing includes an N-API task dispatch and a promise resolution that tsv's sync
call doesn't pay. (Prettier's is async-only too, without the N-API hop.) Oxfmt's native work
may also run off the JS thread: still one file at a time, since each call is awaited before
the next, but not strictly one thread.
Corpus #
Every in-process timing on this page comes from 7,686 .svelte, .ts/.js, and .css files of
real-world code, vendored in the fuzdev/corpora@976ba90 snapshot so one clone reproduces it. They're the author's libraries, apps, and sites
(the fuz.dev ecosystem plus personal SvelteKit projects), and upstream framework source
(Svelte, SvelteKit, and the svelte.dev site), community Svelte libraries and tooling
(Flowbite Svelte's components, LayerChart, Layer Cake, Svelte UX, svelte-maplibre, and
Svelte's language tools), and TypeScript other formatter benchmarks compare on (TypeScript's
own parser, Storybook, and Continue). By bytes, code the author didn't write is
~57% of the Svelte, ~56% of the TypeScript/JS, and ~47% of the CSS.
- Test files count as real code and stay in. Fixture files (formatter test suites, and fixture subtrees inside the measured repos) are out: deliberately tricky edge cases measure conformance, not typical throughput, and the conformance page covers them.
- Standalone CSS files are rare in this ecosystem, so the CSS set adds the
<style>blocks of the corpus's Svelte components, concatenated per corpus collection — 25 of its 73 entries. Even so, CSS is the weakest sample, with just 48 standalone files. - Read every ratio here as "on this corpus", not as a universal figure.
By source
Each source links its upstream at the commit the snapshot vendored.
| source | commit | files | Svelte | TypeScript/JS | CSS |
|---|---|---|---|---|---|
| all sources | 7,686 | 1,913 | 5,700 | 73 | |
| fuzdev/zzz | c7f4d15 | 326 | 173 | 152 | 1 |
| fuzdev/fuz_app | 2f76810 | 695 | 33 | 661 | 1 |
| fuzdev/fuz_blog | f8a11c7 | 38 | 21 | 16 | 1 |
| fuzdev/fuz_code | 55de433 | 66 | 17 | 46 | 3 |
| fuzdev/fuz_css | cf9f4bf | 170 | 43 | 125 | 2 |
| fuzdev/fuz_docs | 3ad0d02 | 66 | 46 | 19 | 1 |
| fuzdev/fuz_repos | d043dee | 99 | 28 | 70 | 1 |
| fuzdev/fuz_mastodon | d44985a | 25 | 15 | 9 | 1 |
| fuzdev/fuz_template | 3f2464e | 18 | 10 | 7 | 1 |
| fuzdev/fuz_ui | 87809cb | 236 | 128 | 108 | 0 |
| fuzdev/fuz_util | 144fcfc | 147 | 8 | 138 | 1 |
| fuzdev/mdz | 9edec8e | 70 | 21 | 48 | 1 |
| fuzdev/gro | 777467f | 161 | 10 | 151 | 0 |
| fuzdev/svelte-docinfo | 48d7b62 | 119 | 22 | 96 | 1 |
| fuzdev/tsv.fuz.dev | d91025a | 33 | 17 | 15 | 1 |
| ryanatkn/ryanatkn.com | f299ca0 | 52 | 31 | 20 | 1 |
| ryanatkn/webdevladder.net | 7f1873a | 39 | 24 | 14 | 1 |
| ryanatkn/earbetter | 5d2ecd9 | 72 | 44 | 26 | 2 |
| ryanatkn/cosmicplayground | fa3efae | 217 | 131 | 84 | 2 |
| sveltejs/kit | b27c82f | 227 | 4 | 223 | 0 |
| sveltejs/svelte | 5ccdfe3 | 416 | 0 | 416 | 0 |
| sveltejs/svelte.dev apps/svelte.dev/src | 996bd63 | 145 | 60 | 85 | 0 |
| sveltejs/svelte.dev packages/repl/src | 996bd63 | 53 | 17 | 34 | 2 |
| sveltejs/svelte.dev packages/site-kit/src | 996bd63 | 70 | 26 | 33 | 11 |
| themesberg/flowbite-svelte | 85f20a0 | 359 | 183 | 176 | 0 |
| techniq/layerchart | ec05fb1 | 532 | 336 | 190 | 6 |
| mhkeller/layercake | e7b421e | 246 | 177 | 66 | 3 |
| techniq/svelte-ux | 11c79b8 | 299 | 198 | 100 | 1 |
| dimfeld/svelte-maplibre | 05dd0b2 | 149 | 90 | 57 | 2 |
| sveltejs/language-tools packages/language-server/src | dafb5f1 | 88 | 0 | 88 | 0 |
| sveltejs/language-tools packages/svelte2tsx/src | dafb5f1 | 68 | 0 | 68 | 0 |
| sveltejs/language-tools packages/typescript-plugin/src | dafb5f1 | 26 | 0 | 26 | 0 |
| sveltejs/language-tools packages/svelte-vscode/src | dafb5f1 | 26 | 0 | 26 | 0 |
| sveltejs/language-tools packages/svelte-check/src | dafb5f1 | 6 | 0 | 6 | 0 |
| sveltejs/language-tools packages/load-config/src | dafb5f1 | 1 | 0 | 1 | 0 |
| microsoft/TypeScript | 5be3346 | 1 | 0 | 1 | 0 |
| storybookjs/storybook code/core/src | 5073688 | 1,088 | 0 | 1,087 | 1 |
| storybookjs/storybook code/lib/cli-storybook/src | 5073688 | 111 | 0 | 111 | 0 |
| storybookjs/storybook code/lib/codemod/src | 5073688 | 11 | 0 | 11 | 0 |
| storybookjs/storybook code/lib/core-webpack/src | 5073688 | 12 | 0 | 12 | 0 |
| storybookjs/storybook code/lib/create-storybook/src | 5073688 | 75 | 0 | 75 | 0 |
| storybookjs/storybook code/lib/csf-plugin/src | 5073688 | 4 | 0 | 4 | 0 |
| storybookjs/storybook code/lib/eslint-plugin/src | 5073688 | 47 | 0 | 47 | 0 |
| storybookjs/storybook code/lib/react-dom-shim/src | 5073688 | 1 | 0 | 1 | 0 |
| continuedev/continue core | d0a3c0b | 602 | 0 | 602 | 0 |
| continuedev/continue extensions/cli | d0a3c0b | 349 | 0 | 349 | 0 |
| harvested <style> blocks | 25 | 0 | 0 | 25 |
tsv's numbers here are from builds without profile-guided optimization (PGO). PGO would make tsv faster but its binaries larger, and that size tradeoff has it on hold.