Bun v1.3.14 Here is a factual summary of the article: Bun version 1.3.14 introduces a built-in `Bun.Image` API for server-side image processing, supporting formats like JPEG, PNG, WebP, and GIF with chainable transforms such as resize, rotate, and format conversion, designed as a zero-dependency alternative to sharp. The update also adds an experimental global virtual store for `bun install --linker=isolated`, which uses symlinks instead of file copies to significantly speed up warm installs by sharing packages from a central cache. To install Bun curl -fsSL https://bun.sh/install | bash npm install -g bun powershell -c "irm bun.sh/install.ps1|iex" scoop install bun brew tap oven-sh/bun brew install bun docker pull oven/bun docker run --rm --init --ulimit memlock=-1:-1 oven/bun To upgrade Bun bun upgrade Bun.Image — Built-in Image Processing Bun.Image — Built-in Image ProcessingBun now ships a built-in image processing API that handles JPEG, PNG, WebP, GIF, and BMP — plus HEIC, AVIF, and TIFF on macOS and Windows — with zero native module installs . Bun.Image provides a chainable pipeline for decoding, transforming, and encoding images, designed as a drop-in alternative to sharp for common server-side image operations. // Resize and convert a photo to WebP await Bun.file "photo.jpg" .image .resize 1024, 1024, { fit: "inside" } .rotate 90 .webp { quality: 85 } .write "thumb.webp" ; // Generate a thumbnail from an upload in a single expression return new Response new Bun.Image upload .resize 200 .jpeg ; Input sources input-sources Bun.Image accepts path strings, ArrayBuffer / TypedArray zero-copy , Blob / BunFile / S3File , and data: URLs. You can also use Bun.file "photo.jpg" .image or blob.image to start a pipeline. Chainable transforms chainable-transforms The pipeline supports .resize w, h?, {filter, fit, withoutEnlargement} , .rotate 90|180|270 , .flip , .flop , and .modulate {brightness, saturation} . Output format is set with .jpeg , .png , .webp , .heic , or .avif — each with format-specific quality/compression options. Resize filters resize-filters All sharp filters are supported: nearest , box , bilinear , cubic , mitchell , lanczos2 , lanczos3 , plus mks2013 and mks2021 . Terminal methods terminal-methods All processing runs off the main thread except metadata . Output via .bytes , .buffer , .blob , .toBase64 , .dataurl , .placeholder thumbhash , .metadata , or .write dest . js const meta = await new Bun.Image buf .metadata ; // { width: 1920, height: 1080, format: "jpeg", ... } const placeholder = await Bun.file "hero.jpg" .image .placeholder ; // thumbhash data URL for blur-up Body integration body-integration Bun.Image instances work directly as response/request bodies with automatic Content-Type : return new Response new Bun.Image upload .resize 200 .jpeg ; Platform-specific formats platform-specific-formats | Format | macOS | Windows | Linux | |---|---|---|---| | JPEG | ✅ | ✅ | ✅ | | PNG | ✅ | ✅ | ✅ | | WebP | ✅ | ✅ | ✅ | | GIF | ✅ | ✅ | ✅ | | BMP simple | ✅ | ✅ | ✅ | | TIFF | ✅ decode | ✅ decode | — | | HEIC | ✅ decode + encode | ✅ decode + encode | — | | AVIF | ✅ decode + encode on Apple Silicon | ✅ decode + encode | — | JPEG, PNG, WebP, GIF, and BMP use statically linked codecs and produce identical output across all platforms. HEIC, AVIF, and TIFF use OS system backends ImageIO + vImage on macOS, WIC on Windows with lazy symbol resolution for zero startup cost. Performance vs sharp 0.34.5 performance-vs-sharp-0-34-5 Benchmarked on linux/x64 with 50 iterations and sharp.concurrency 1 : | Operation | Bun.Image | sharp | Speedup | |---|---|---|---| metadata | 0.004 ms | 0.28 ms | 70× | | 1080p PNG → 400×400 → JPEG | 28.6 ms | 39.5 ms | 1.38× | | 1080p PNG → 800×600 → WebP | 82.7 ms | 110.1 ms | 1.33× | | 4K JPEG → 800×450 → JPEG | 35.8 ms | 45.5 ms | 1.27× | | 4K JPEG → 1920×1080 → JPEG | 57.2 ms | 69.9 ms | 1.22× | | 12MP JPEG → 1024×768 → WebP | 138 ms | 165 ms | 1.20× | The performance comes from i16 fixed-point SIMD resize kernels, JPEG IDCT scaling to the smallest sufficient size, zero-copy ArrayBuffer borrowing, and a single pre-allocated arena for resize scratch memory. Global Virtual Store global-virtual-store bun install --linker=isolated now supports a shared global virtual store via the install.globalStore = true option in bunfig.toml . Instead of cloning every package from the cache into each project's node modules on every install, packages are materialized once into a global