benchmarks #
tsv is a Rust toolchain for parsing and formatting TypeScript/JS, CSS, and Svelte. 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 3,580 files of real-world code, the author's own and Svelte's (see Corpus), timed under Node v24.
- Formatting TypeScript, tsv is ~2.2x faster than Oxfmt (native-vs-native), ~36x faster than Prettier (native Rust vs Prettier's JS; ~26x as wasm), and ~7.6x faster than Biome (wasm-vs-wasm).
- Formatting Svelte, tsv is ~79x faster than Prettier (~55x as wasm) and ~10x faster than Biome (wasm-vs-wasm).
- Formatting CSS, tsv is ~3.6x faster than Oxfmt (native-vs-native), ~111x faster than Prettier (~78x 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.3x 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 ~1.8x faster than svelte/compiler (JS) and ~3.1x faster than rsvelte (native-vs-native); its default span-only AST is ~2.4x faster than svelte/compiler. - Parsing CSS runs the other way: Svelte's own
parseCss, whose AST tsv reproduces, is ~1.9x faster than tsv's default parse, and PostCSS ~1.6x faster (see Parse speed). Under Bun it flips: tsv's default parse leadsparseCssby ~1.3x, withparseCss~1.9x slower there than under Node. - End to end as a CLI, tsv formats the JSX-free subset of a real TypeScript repo ~1.6x faster than Oxfmt and ~4.0x faster than Biome (~2.7x and ~6.8x 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 ~3.0x 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 923 Svelte files
6 of 929 files (3.5% of the group's bytes) are left out of every row, because biome (wasm) fails them in this harness.
Formatting 2,593 TypeScript/JS files
3 of 2,596 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 54 CSS files
1 of 55 files (9.9% of the group's bytes) is left out of every row, because biome (wasm) fails it in this harness.
Parse speed #
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 929 Svelte files
Parsing 2,593 TypeScript/JS files
3 of 2,596 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 55 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 | 44 ms | 1.70x | 1.09x | 20 MiB | 2.42x |
| tsv via Node dispatcher | 74 ms | 1.00x | 1.00x | 49 MiB | 1.00x |
| oxfmt | 117 ms | −1.57x | −1.97x | 227 MiB | −4.60x |
| biome | 298 ms | −4.00x | −5.83x | 145 MiB | −2.94x |
| prettier + oxc-parser | 6.9 s | −92.5x | −23.1x | 304 MiB | −6.16x |
| prettier | 8.4 s | −112.6x | −36.8x | 453 MiB | −9.17x |
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.82x | 2.97x | 13 MiB | 3.70x |
| tsv via Node dispatcher | 46 ms | 1.00x | 1.00x | 50 MiB | 1.00x |
| oxfmt | 61 ms | −1.32x | −1.92x | 112 MiB | −2.26x |
| biome | 107 ms | −2.33x | −2.36x | 96 MiB | −1.94x |
| prettier + oxc-parser | 976 ms | −21.1x | −27.5x | 196 MiB | −3.97x |
| prettier | 1.6 s | −34.8x | −49.7x | 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.23x | 1.15x | 12 MiB | 4.12x |
| tsv via Node dispatcher | 56 ms | 1.00x | 1.00x | 50 MiB | 1.00x |
| rsvelte-fmt | 165 ms | −2.96x | −5.31x | 155 MiB | −3.13x |
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 | 17 ms | 1.00x | 1.00x | 13 MiB | 1.00x |
| tsv via Node dispatcher | 47 ms | −2.86x | −3.01x | 49 MiB | −3.69x |
| tsv-wasm | 158 ms | −9.55x | −27.3x | 122 MiB | −9.09x |
Corpus: 539,588 bytes, sha256:dcddb577aa14, 1 file. Each time is the mean of 20 runs after 3 warmups.
This section ran on October 7, 2026, from its harness at 453198a, 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.6.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 | 5,378 ms | 5,044 ms | 4,271 ms ⚠ | 1.07x | 1.26x |
| tsv (native) | 68 ms | 67 ms | 66 ms | 1.01x | 1.02x |
| tsv-wasm | 97 ms | 108 ms | 95 ms | −1.12x | 1.02x |
| oxfmt (native) | 5,352 ms | 5,099 ms | 4,402 ms | 1.05x | 1.22x |
| biome (wasm) | 998 ms | 929 ms | 860 ms | 1.07x | 1.16x |
Format TypeScript/JS
| implementation | node | deno | bun | deno vs node | bun vs node |
|---|---|---|---|---|---|
| prettier | 14,485 ms | 13,355 ms ⚠ | 14,224 ms ⚠ | 1.08x | 1.02x |
| tsv (native) | 398 ms | 380 ms | 377 ms | 1.05x | 1.06x |
| tsv-wasm | 556 ms | 628 ms | 543 ms | −1.13x | 1.02x |
| oxfmt (native) | 866 ms | 846 ms | 830 ms | ≈1.02x | 1.04x |
| biome (wasm) | 4,230 ms | 4,387 ms | 3,876 ms | −1.04x | 1.09x |
| dprint (wasm) | 3,312 ms | 3,728 ms | 3,205 ms | −1.13x | 1.03x |
Format CSS
| implementation | node | deno | bun | deno vs node | bun vs node |
|---|---|---|---|---|---|
| prettier | 572 ms | 550 ms | 467 ms | 1.04x | 1.22x |
| tsv (native) | 5.2 ms | 4.6 ms | 4.6 ms | 1.13x | 1.12x |
| tsv-wasm | 7.3 ms | 8.3 ms | 6.3 ms | −1.14x | 1.17x |
| oxfmt (native) | 19 ms | 18 ms | 18 ms | 1.03x | 1.04x |
| biome (wasm) | 87 ms | 95 ms | 81 ms | −1.09x | 1.07x |
| malva (wasm) | 47 ms | 51 ms | 56 ms | −1.09x | −1.19x |
Parse Svelte
| implementation | node | deno | bun | deno vs node | bun vs node |
|---|---|---|---|---|---|
| svelte/compiler | 349 ms | 329 ms | 367 ms | 1.06x | −1.05x |
| tsv (native) | 147 ms | 131 ms | 104 ms | 1.12x | 1.41x |
| tsv-wasm | 161 ms | 161 ms | 112 ms | ≈1.00x | 1.44x |
| tsv+locations (native) | 192 ms | 185 ms | 148 ms | 1.04x | 1.30x |
| tsv-wasm+locations | 206 ms | 215 ms | 159 ms | −1.04x | 1.30x |
| tsv internal (native) | 17 ms | 16 ms | 14 ms | 1.03x | 1.15x |
| tsv-wasm internal | 24 ms | 27 ms | 23 ms | −1.14x | 1.03x |
| rsvelte-parse (native) | 586 ms | 559 ms | 500 ms | 1.05x | 1.17x |
| rsvelte-parse skip-expr-loc (native) | 383 ms | 364 ms | 336 ms | 1.05x | 1.14x |
Parse TypeScript/JS
| implementation | node | deno | bun | deno vs node | bun vs node |
|---|---|---|---|---|---|
| acorn-typescript | 1,382 ms | 1,036 ms | 1,300 ms | 1.33x | 1.06x |
| tsv (native) | 932 ms | 789 ms | 597 ms | 1.18x | 1.56x |
| tsv-wasm | 988 ms | 953 ms | 623 ms | 1.04x | 1.58x |
| tsv+locations (native) | 1,133 ms | 1,003 ms | 793 ms | 1.13x | 1.43x |
| tsv-wasm+locations | 1,187 ms | 1,163 ms | 824 ms | 1.02x | 1.44x |
| tsv internal (native) | 101 ms | 91 ms | 81 ms | 1.11x | 1.25x |
| tsv-wasm internal | 135 ms | 156 ms | 124 ms | −1.16x | 1.09x |
| oxc-parser (native) | 1,372 ms | 1,216 ms | 853 ms | 1.13x | 1.61x |
| oxc-parser (wasm) | 1,430 ms | 1,348 ms | 1,029 ms ⚠ | 1.06x | 1.39x |
| yuku-parser (native) | 382 ms | 439 ms | 327 ms | −1.15x | 1.17x |
| yuku-parser (wasm) | 301 ms | 378 ms | 245 ms | −1.26x | 1.23x |
| swc (native) | 1,769 ms | 1,603 ms | 1,339 ms | 1.10x | 1.32x |
Parse CSS
| implementation | node | deno | bun | deno vs node | bun vs node |
|---|---|---|---|---|---|
| svelte/compiler | 11 ms | 10 ms | 20 ms | 1.03x | −1.88x |
| tsv (native) | 19 ms | 16 ms | 15 ms | 1.18x | 1.32x |
| tsv-wasm | 21 ms | 20 ms | 13 ms | 1.02x | 1.61x |
| tsv+locations (native) | 23 ms | 21 ms | 20 ms | 1.11x | 1.18x |
| tsv-wasm+locations | 23 ms | 25 ms | 17 ms | −1.05x | 1.37x |
| tsv internal (native) | 2.8 ms | 2.5 ms | 2.3 ms | 1.10x | 1.19x |
| tsv-wasm internal | 4.1 ms | 4.5 ms | 3.3 ms | −1.10x | 1.24x |
| postcss | 12 ms | 12 ms | 17 ms | ≈−1.01x | −1.42x |
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 21 to 4,880 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,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,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 2% 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 3,580 .svelte, .ts/.js, and .css files of
real-world code, vendored in the fuzdev/corpora@63d1790 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).
- The snapshot's community Svelte libraries and tooling are left out: they would dominate the Svelte set. The CLI section's Svelte corpus draws on them.
- 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 — 20 of its 55 entries. Even so, CSS is the weakest sample, with just 35 standalone files. - The corpus is the author's own code plus Svelte's, the same code tsv is developed and tested against and mostly tsv-formatted already. Input already in a tool's own style may format faster, which would favor tsv. 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 | 3,580 | 929 | 2,596 | 55 | |
| 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 |
| harvested <style> blocks | 20 | 0 | 0 | 20 | |
| 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 |