Skip to content
Guides

Bundle Size and Performance

These measurements describe the 0.1.0 release and its frozen pre-release timing snapshot, compared with React 19.3.0 on September 11, 2026. They are not measurements of every later release.

Bundle size

Production ESM bundles retaining all exports from the React, JSX, DOM, and DOM-client entries:

RuntimeGzip bytesCompared with React
React 19.3.069,162Reference
Redact, default Vite configuration23,31166.3% smaller
Redact, native animation enabled28,15959.3% smaller

These are runtime bundles, not whole applications. Redact is measured from the 0.1.0 release build. Real apps tree-shake differently, and the runtimes have different scheduling capabilities.

Standalone Redact entries, measured separately:

Entry / configurationGzip bytes
DOM client, default Vite features20,139
DOM client, native animation enabled24,991
DOM client, nano preset12,466
React API entry2,764
Server entry8,964

These entries overlap, so their sizes are not additive. nano removes behavior and is not a full-compatibility preset. The expanded API surface is larger than earlier Redact, not a size reduction over previous releases. Exact configurations, inputs, and historical comparisons.

Performance

Production microbenchmarks on an Apple M5 Pro, Chrome 152, without CPU throttling: five fresh-browser blocks, five rounds each. Redact uses the built package with default Vite features. Synchronous flushes ensure updates complete before timing stops.

These timings use the frozen pre-release snapshot, before the final hydration-recovery cleanup was merged from 0.0.21. That cleanup passed the release tests; the timing experiments were not repeated.

Times are median averages per completed workload batch in milliseconds, not per component. Negative percentages mean less time. Percentages use paired measurements, not division of the rounded medians.

Browser workloadReact msRedact msRedact time vs React
Sparse state updates0.0090.002-71.9%
Mixed-depth state updates0.2270.093-59.1%
Keyed list reversal0.1610.112-30.3%
Context through memo0.0730.052-29.1%
Deep-tree prop updates0.0120.010-22.4%
Batched state updates0.0500.041-19.7%
Null-heavy child lists0.0940.083-14.2%
Stable keyed rows, automatic JSX0.0500.043-11.6%
Controlled selects0.1420.132-7.6%
Prop updates, automatic JSX0.2370.226-3.8%
Prop updates, classic JSX0.2490.243-2.3%
Stable keyed rows, classic JSX0.0450.046No clear difference
Mount and unmount0.1490.162+7.5%
Reducer batches0.0510.055+7.9%
String SSR in the browser0.0380.043+10.4%
Hydration0.1820.227+21.4%
Passive effects0.0240.032+27.0%
Reducer updates under Suspense0.0510.076+49.6%
Suspense retry cycles0.1170.268+124.8%

The largest ratio, Suspense retries, is about 0.15 ms of extra work per cycle here. A cycle covers 96 components, 192 reducer actions, hiding, retrying, revealing, and shared correctness checks. It does not mean interactions feel 2.25 times slower. Larger trees, repeated retries, and slower devices can make the difference matter.

Server rendering

Separate Node 24 measurements use production source bundles, five fresh-process blocks, and the same checked output. They exclude package startup, network latency, and streaming waterfalls.

Server workloadReact msRedact msRedact time vs React
Fully-ready readable stream0.1750.088-49.4%
String SSR with hooks/context0.0760.053-30.5%
String SSR, clean text0.0570.053-6.9%
String SSR, escaped text0.1260.124No clear difference

Interactions and memory

Separate 2,400-row fixtures use normal scheduling for clicks and forced garbage collection for retained heap:

MeasurementReactRedact, default
Click handler to committed DOM, median / p951.5 / 1.6 ms1.2 / 1.3 ms
Mounted retained JS heap, median666.4 KiB762.5 KiB
Extra DOM nodes after final unmount00

Handler-to-commit is not paint latency or field INP; retained heap is not allocation rate or proof of no leaks. Observed click durations were browser-rounded to 16 ms for both; one Redact event entry was absent, not zero.

An identical-React control measured 0.5% median absolute variation across browser workloads, with wider uncertainty in some cases. Small differences need caution. These results do not establish whole-app speedups, behavior under concurrent input, or mobile/Safari/Firefox performance. All intervals and measurements, independent audit.