
ALT Poster for bun lint, an ESLint-compatible linter built into Bun. Headline: 26x faster than ESLint. Table of lint times on real projects, each with its own config and plugins, bun lint vs ESLint: shadcn/ui 2.1 s vs 90.4 s (43x), chakra-ui 0.59 s vs 22.6 s (38x), vscode 15.8 s vs 404 s (26x), mastodon 6.6 s vs 100 s (15x), playwright 4.9 s vs 53.4 s (11x). On vscode, 9,823 of 9,826 messages are identical. 99.6% of ESLint's tests pass. 99.8% of oxlint's tests pass. 2x faster than oxlint with 3x less memory. 1,021 rules built in, including type-aware rules.

ALT Poster for bun fmt, a Prettier-compatible formatter built into Bun. Headline: 320x faster than Prettier. Bar chart of wall-clock time to run --check on microsoft/vscode (10,148 files, 8 cores): bun fmt 0.43 s, oxfmt 0.72 0.85 s (2x slower), Biome 2.5 3.6 s (8.3x slower), Prettier 3.9.9 139 s (320x slower). Formats 20 languages: JavaScript, TypeScript, JSX, Flow, HTML, Vue, Angular, Handlebars, MJML, CSS, SCSS, Less, JSON, JSONC, JSON5, YAML, TOML, GraphQL, Markdown and MDX. 99% of Prettier's tests pass (9,728 of 9,821). 5x less memory than Prettier (183 MB vs 972 MB).

ALT Slide titled “Route navigation on 4G”, subtitle “click → lazy route’s chunks fetched, parsed, and rendered by React · lower is better”. Three horizontal bars: Bun 1.4.0, 1104 ms (dark gray); Vite 8, 757 ms (gray); Bun 1.4.1, 681 ms (pink-to-orange gradient, labeled −38%). Table below with columns Bun 1.4.0 / Vite 8 / Bun 1.4.1: Requests per navigation 108 / 108 / 61; LCP, cold first load 736 ms / 560 ms / 576 ms; JS chunks emitted 918 / 908 / 750; Total JS shipped (gzip) 1.75 MB / 1.67 MB / 1.61 MB. Footnote: 200 lazy routes, 800 components, 30 npm deps, React Compiler on in both, headless Chrome, 170 ms RTT / 9 Mbps, cold cache, median of 7 runs × 12 routes; Bun built with bun build –splitting –min-chunk-size=16384 –react-compiler; Vite 8.2 with @vitejs/plugin-react 6 compiler: true.

ALT Smaller bundles for libraries that use export * as# Libraries like zod and Effect group their exports with export * as. When you called z.object(), Bun 1.4.0 kept every export of that group, because it built a namespace object with a getter for each one. Now z.object points straight at the object function, and the exports you don't use are tree-shaken. out.js var User = exports_external.object({ a: exports_external.string() }); var User = object({ a: string2() }); Each program below calls two or three functions from one library, built with bun build --minify: Package Bun 1.4.0 Bun 1.4.1 Change fp-ts 2.16 21.8 KB 3.2 KB −85% zod 4.5 375.3 KB 77.3 KB −79% ox 1.7 15.4 KB 4.7 KB −70% effect 3.22 369.1 KB 163.6 KB −56% @sinclair/typebox 0.34 107.1 KB 53.3 KB −50%

ALT Line chart titled "45% smaller." showing Claude Code install size by release from May to v2.1.248. Two lines: macOS arm64 rises from about 217 MB in May to a peak of 376 MB at v2.1.245, then drops sharply to 207 MB (−45%). Linux x64 rises from about 249 MB to 392 MB, then drops to 224 MB (−43%).












