From 5e073487946a47df909ce8d5d335363b60698d22 Mon Sep 17 00:00:00 2001 From: Atharva Deosthale Date: Fri, 21 Aug 2026 16:31:28 +0530 Subject: [PATCH 1/4] Add Bun 1.4 runtime announcement blog, changelog, and runtimes docs update --- .optimize-cache.json | 1 + .../announcing-bun-1-4-runtime/+page.markdoc | 94 ++++++++++++++++++ .../changelog/(entries)/2026-08-21.markdoc | 14 +++ .../products/functions/runtimes/+page.markdoc | 31 +++++- .../announcing-bun-1-4-runtime/cover.avif | Bin 0 -> 10689 bytes static/images/changelog/2026-08-21.avif | Bin 0 -> 10689 bytes 6 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 src/routes/blog/post/announcing-bun-1-4-runtime/+page.markdoc create mode 100644 src/routes/changelog/(entries)/2026-08-21.markdoc create mode 100644 static/images/blog/announcing-bun-1-4-runtime/cover.avif create mode 100644 static/images/changelog/2026-08-21.avif diff --git a/.optimize-cache.json b/.optimize-cache.json index 55bf9be19bc..09686376614 100644 --- a/.optimize-cache.json +++ b/.optimize-cache.json @@ -210,6 +210,7 @@ "static/images/blog/announcing-bigint-columns/console-create-bigint.png": "21e815c2f7d297ef6f544c71f17680367391e35e36e809b3c71029397c6706d7", "static/images/blog/announcing-bigint-columns/cover.png": "de0ec57085646427a552f35f0b1ab9a77f9e38b9b20801329ac19bc4bdb069f7", "static/images/blog/announcing-bulk-api/cover.png": "78a0fdf3b54ce8412bf6be1880eb4a42bcac2cb04420045a60bce888c8999c6f", + "static/images/blog/announcing-bun-1-4-runtime/cover.png": "a3bd868c50656b11e064e0e4990c88d319575e80e228335a39d0d7dcd002e462", "static/images/blog/announcing-bun-and-dart/bun-and-dart.png": "ea94af00a5c035cefb6474a9061441803db0160b7cc194fb5a71fbe05abf0d12", "static/images/blog/announcing-bun-deno-runtimes/cover.png": "5c739aa57624b990174943108de2433dd9292798d9e488d01351d5f01eba7800", "static/images/blog/announcing-bun-deno-runtimes/runtime-bun.png": "3ca689b349526e34386ac8dac25eb3ced20952c4493a85800da848a4e81fe319", diff --git a/src/routes/blog/post/announcing-bun-1-4-runtime/+page.markdoc b/src/routes/blog/post/announcing-bun-1-4-runtime/+page.markdoc new file mode 100644 index 00000000000..72c05ea39ff --- /dev/null +++ b/src/routes/blog/post/announcing-bun-1-4-runtime/+page.markdoc @@ -0,0 +1,94 @@ +--- +layout: post +title: "Bun 1.4 lands on Appwrite: the first Bun written in Rust" +description: Bun 1.4 is now available as a runtime for Appwrite Functions and as a build runtime for Appwrite Sites. We benchmarked it against Bun 1.3 and Node 26. +date: 2026-08-21 +cover: /images/blog/announcing-bun-1-4-runtime/cover.avif +timeToRead: 6 +author: atharva +category: announcement +featured: false +callToAction: true +faqs: + - question: "What is new in Bun 1.4?" + answer: "Bun 1.4 is the first Bun release written in Rust instead of Zig. It reports Node.js 26 compatibility, starts 50% faster on Linux, uses up to 35% less memory for HTTP servers, and ships a faster bun install with a global virtual store. The full changelog is on the [Bun blog](https://bun.com/blog/bun-v1.4)." + - question: "How do I use Bun 1.4 on Appwrite?" + answer: "For [Appwrite Functions](/docs/products/functions), pick `bun-1.4` as the runtime when creating or updating a function. For [Appwrite Sites](/docs/products/sites), pick Bun 1.4 as the build runtime in Site settings under Runtime settings; for SSR sites it also serves your requests. Both are available on Appwrite Cloud today." + - question: "Do I need to change my code to upgrade from Bun 1.3 to Bun 1.4?" + answer: "Most projects need no changes. Bun 1.4 tightens TLS certificate verification, parses YAML 1.2 strictly, and no longer loads .env files when invoked as node, so projects relying on those behaviors should review the [upgrade notes](https://bun.com/blog/bun-v1.4) before switching." + - question: "Is Bun 1.4 faster than Node for building sites?" + answer: "In our test deployments on Appwrite Cloud, a Next.js app with 640 packages built in a median of 152 seconds on Bun 1.4, against 213 seconds on Node 26 with npm. Results vary by project, dependency count, and lockfile state." + - question: "Why was Bun rewritten from Zig to Rust?" + answer: "The Bun team ported the entire codebase from Zig to Rust to improve memory safety and long-term maintainability. The port was written by around 64 Claude agents working concurrently over 11 days, landed with the full test suite passing, and shipped as Bun 1.4. The team documented the process in [Bun in Rust](https://bun.com/blog/bun-in-rust)." +--- + +Bun 1.4 is now available on Appwrite Cloud, as a runtime for Appwrite Functions and Appwrite Sites. You can pick `bun-1.4` for new functions today, switch existing functions over with a redeploy, and select it in the build runtime dropdown for any Node-based Sites framework. For SSR sites, the runtime you pick also serves your requests; static sites use it for the build only. + +Version bumps to a runtime line are usually routine, but Bun 1.4 is the first release of Bun written in Rust, and the release before it, 1.3.14, was the last one written in Zig. The team and the test suite stayed the same while the language underneath changed. We wanted to know what that means in practice for functions and site builds, so we benchmarked it. The numbers are further down. + +# What's in Bun 1.4 + +The release covers everything shipped since Bun 1.3.0. The parts that matter most for serverless workloads: + +- **Node.js 26 compatibility.** Bun now reports Node.js 26 and passes **1,517** more tests from Node's own test suite than 1.3 did, the largest compatibility jump since Bun 1.0. Playwright, Next.js 16, Vitest, and OpenTelemetry now work. +- **Faster startup.** A hello-world script starts in **5.1 ms** on Linux, down from 10.9 ms in Bun 1.3. Node 26 takes 27.2 ms on the same machine. +- **Less memory.** HTTP servers use **13 to 48% less** peak memory. Express drops from 169 MB to 92 MB under load, Next.js from 397 MB to 285 MB. +- **Lower idle cost.** An idle server burns **5x less CPU** than on Bun 1.3, after the team replaced JavaScriptCore's allocator with a unified mimalloc heap. +- **Faster installs.** The isolated linker gets a global virtual store, making warm CI installs up to **7x faster** on large dependency trees. +- **Native Web Streams.** ReadableStream and friends moved to a native implementation with automatic backpressure, so a slow client can no longer balloon server memory. + +There are also fifteen new built-in APIs that replace common npm dependencies, including `Bun.Image` for image processing, `Bun.markdown` for Markdown rendering, and `Bun.cron()` for scheduled jobs. The [release post](https://bun.com/blog/bun-v1.4) has the full list. + +A few changes can bite when you upgrade. TLS certificate verification got stricter, `Bun.YAML` now follows YAML 1.2, and Bun invoked as `node` no longer auto-loads `.env` files. Most function code is unaffected, but the [upgrade notes](https://bun.com/blog/bun-v1.4) are worth two minutes before you switch production traffic. + +# A runtime rewritten by AI agents + +Bun's entire codebase, around 780,000 lines, was ported from Zig to Rust, and the port was not written by hand. The Bun team ran roughly **64 Claude agents concurrently** over **11 days**, landing **6,778 commits** and a diff of over a million lines. The merge gate was strict: the full test suite passing on all platforms, with zero tests skipped or deleted. + +The engine underneath did not change. Bun still embeds JavaScriptCore, which is C++, so your JavaScript executes exactly as before. What changed is everything around it: the HTTP server, the bundler, the package manager, the file system layer. The team reports the Rust port fixed **128 bugs** that reproduce in 1.3.14, eliminated every memory leak they could instrument, and picked up **2 to 5%** more HTTP throughput from cross-language link-time optimization between Rust and the C++ engine. + +Before the release, the Rust port ran in production for months inside Claude Code. Jarred Sumner's write-up, [Bun in Rust](https://bun.com/blog/bun-in-rust), covers the process in detail, including what the agents got wrong along the way. It is worth reading whether or not you use Bun, because a million-line port with a green test suite says as much about where software development is going as it does about Bun. + +# Benchmark: build times on Appwrite Cloud + +Faster installs and faster startup should add up to faster deployments, so we measured the one number every deploy pays: build time. We deployed the same app five times per runtime on Appwrite Cloud and compared Bun 1.4 against Bun 1.3 and Node 26. + +The setup: + +- A Next.js SSR app with a deliberately heavy dependency tree: **640 packages**, including MUI, Ant Design, AWS SDK clients, Apollo, D3, and Three.js +- Build resources set to 4 vCPU and 4 GB RAM, in the Frankfurt region +- No lockfile committed, so every build resolves and installs from scratch +- Bun runtimes install with `bun install`, Node installs with `npm install`, which is what each runtime uses by default on Appwrite +- Build duration as reported by the Appwrite deployment, which covers install and `next build` together + +The results, five builds per runtime: + +| Runtime | Build times (seconds) | Median | +| --- | --- | --- | +| Bun 1.4 | 141, 142, 152, 165, 181 | **152 s** | +| Bun 1.3 | 142, 187, 195, 200, 211 | **195 s** | +| Node 26 (npm) | 187, 209, 213, 227, 268 | **213 s** | + +What stands out: + +- Bun 1.4's median build is **22% faster than Bun 1.3** on the identical app, with no code or configuration changes, so the difference comes from the runtime upgrade alone. +- Against Node 26 with npm, the median gap grows to **29%**, about a minute saved on every deploy of this app. +- Bun 1.4 was also the most consistent of the three, with a 40-second spread across five builds against 69 seconds for Bun 1.3 and 81 seconds for Node. + +The usual caveats apply. These are our runs, on one app, on one day. Your dependency tree will produce different numbers. But the ordering held across every run we did, and a minute off every deploy compounds quickly when you ship several times a day. + +# Switching to Bun 1.4 + +For Functions, create a new function and pick `bun-1.4` from the runtime list, or open an existing Bun function's settings and change the runtime version. The change applies on the next deployment. + +For Sites, open your site in the Appwrite Console, go to **Site settings**, then **Runtime settings**, and select Bun 1.4 as the build runtime. Your live deployment keeps serving traffic until you redeploy. + +Bun 1.4 is available on Appwrite Cloud today, alongside the existing 1.0 through 1.3 versions for projects pinned to an older release. + +# More resources + +- [Appwrite Functions documentation](/docs/products/functions) +- [Function runtimes](/docs/products/functions/runtimes) +- [Appwrite Sites documentation](/docs/products/sites) +- [Bun 1.4 release notes](https://bun.com/blog/bun-v1.4) +- [Bun in Rust](https://bun.com/blog/bun-in-rust) diff --git a/src/routes/changelog/(entries)/2026-08-21.markdoc b/src/routes/changelog/(entries)/2026-08-21.markdoc new file mode 100644 index 00000000000..6e998824c33 --- /dev/null +++ b/src/routes/changelog/(entries)/2026-08-21.markdoc @@ -0,0 +1,14 @@ +--- +layout: changelog +title: 'Bun 1.4 is now available for Functions and Sites' +date: 2026-08-21 +cover: /images/changelog/2026-08-21.avif +--- + +Bun 1.4 is now available on Appwrite Cloud as a runtime for [Appwrite Functions](/docs/products/functions) and [Appwrite Sites](/docs/products/sites). Pick `bun-1.4` when creating a function, or select Bun 1.4 as the build runtime for any Node-based Sites framework. For SSR sites, the runtime also serves your requests. + +Bun 1.4 is the first release of Bun written in Rust instead of Zig. It reports Node.js 26 compatibility, starts faster, uses less memory, and installs dependencies quicker than Bun 1.3. In our deployments of a Next.js app with 640 packages, builds on Bun 1.4 were 22% faster than Bun 1.3 and 29% faster than Node 26 with npm. + +{% arrow_link href="/blog/post/announcing-bun-1-4-runtime" %} +Read the announcement +{% /arrow_link %} diff --git a/src/routes/docs/products/functions/runtimes/+page.markdoc b/src/routes/docs/products/functions/runtimes/+page.markdoc index 2fd3cbfd548..45390202571 100644 --- a/src/routes/docs/products/functions/runtimes/+page.markdoc +++ b/src/routes/docs/products/functions/runtimes/+page.markdoc @@ -27,14 +27,19 @@ While still in beta, Appwrite Cloud has limited support for Cloud runtimes. As w `node-20.0` `node-21.0` `node-22` +`node-23` +`node-24` `node-25` +`node-26` * x86 / arm64 / armv7 / armv8 --- * {% icon icon="bun-sh" size="l" /%} * [Bun](https://hub.docker.com/r/openruntimes/bun/tags) * `bun-1.0` `bun-1.1` +`bun-1.2` `bun-1.3` +`bun-1.4` * x86 / arm64 --- * {% icon icon="deno" size="l" /%} @@ -45,12 +50,15 @@ While still in beta, Appwrite Cloud has limited support for Cloud runtimes. As w `deno-1.40` `deno-1.46` `deno-2.0` +`deno-2.5` `deno-2.6` * x86 --- * {% icon icon="go" size="l" /%} * [Go](https://hub.docker.com/r/openruntimes/go/tags) * `go-1.23` +`go-1.24` +`go-1.25` `go-1.26` * x86 / arm64 --- @@ -61,12 +69,15 @@ While still in beta, Appwrite Cloud has limited support for Cloud runtimes. As w `python-3.10` `python-3.11` `python-3.12` +`python-3.13` `python-3.14` * x86 / arm64 / armv7 / armv8 --- * {% icon icon="python" size="l" /%} * [Python ML](https://hub.docker.com/r/openruntimes/python-ml) * `python-ml-3.11` +`python-ml-3.12` +`python-ml-3.13` * x86 / arm64 --- * {% icon icon="dart" size="l" /%} @@ -75,12 +86,16 @@ While still in beta, Appwrite Cloud has limited support for Cloud runtimes. As w `dart-2.16` `dart-2.17` `dart-2.18` +`dart-2.19` `dart-3.0` `dart-3.1` `dart-3.3` `dart-3.5` +`dart-3.8` +`dart-3.9` `dart-3.10` `dart-3.11` +`dart-3.12` * x86 / arm64 / armv7 / armv8 --- * {% icon icon="php" size="l" /%} @@ -98,6 +113,7 @@ While still in beta, Appwrite Cloud has limited support for Cloud runtimes. As w `ruby-3.1` `ruby-3.2` `ruby-3.3` +`ruby-3.4` `ruby-4.0` * x86 / arm64 / armv7 / armv8 --- @@ -106,6 +122,7 @@ While still in beta, Appwrite Cloud has limited support for Cloud runtimes. As w * `dotnet-6.0` `dotnet-7.0` `dotnet-8.0` +`dotnet-10` * x86 / arm64 / armv7 / armv8 --- * {% icon icon="java" size="l" /%} @@ -116,6 +133,7 @@ While still in beta, Appwrite Cloud has limited support for Cloud runtimes. As w `java-18.0` `java-21.0` `java-22` +`java-25` * x86 / arm64 / armv7 / armv8 --- * {% icon icon="swift" size="l" /%} @@ -124,6 +142,7 @@ While still in beta, Appwrite Cloud has limited support for Cloud runtimes. As w `swift-5.8` `swift-5.9` `swift-5.10` +`swift-6.2` * x86 / arm64 / armv7 / armv8 --- * {% icon icon="kotlin" size="l" /%} @@ -132,12 +151,19 @@ While still in beta, Appwrite Cloud has limited support for Cloud runtimes. As w `kotlin-1.8` `kotlin-1.9` `kotlin-2.0` +`kotlin-2.3` * x86 / arm64 / armv7 / armv8 --- * {% icon icon="flutter" size="l" /%} * [Flutter](https://hub.docker.com/r/openruntimes/flutter/tags) -* `flutter-3.38` +* `flutter-3.24` +`flutter-3.27` +`flutter-3.29` +`flutter-3.32` +`flutter-3.35` +`flutter-3.38` `flutter-3.41` +`flutter-3.44` * x86 / arm64 --- * {% icon icon="cpp" size="l" /%} @@ -168,6 +194,7 @@ While still in beta, Appwrite Cloud has limited support for Cloud runtimes. As w `node-18.0` `node-22` `node-25` +`node-26` * x86 / arm64 / armv7 / armv8 --- * {% icon icon="bun-sh" size="l" /%} @@ -175,6 +202,7 @@ While still in beta, Appwrite Cloud has limited support for Cloud runtimes. As w * `bun-1.0` `bun-1.1` `bun-1.3` +`bun-1.4` * x86 / arm64 --- * {% icon icon="deno" size="l" /%} @@ -208,6 +236,7 @@ While still in beta, Appwrite Cloud has limited support for Cloud runtimes. As w `dart-3.5` `dart-3.10` `dart-3.11` +`dart-3.12` * x86 / arm64 / armv7 / armv8 --- * {% icon icon="flutter" size="l" /%} diff --git a/static/images/blog/announcing-bun-1-4-runtime/cover.avif b/static/images/blog/announcing-bun-1-4-runtime/cover.avif new file mode 100644 index 0000000000000000000000000000000000000000..f7323b4f968457a023c00b2a2237fb94484688dd GIT binary patch literal 10689 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 Se|eDqVYmJ-?tiiWN&0^@5>W5} literal 0 HcmV?d00001 diff --git a/static/images/changelog/2026-08-21.avif b/static/images/changelog/2026-08-21.avif new file mode 100644 index 0000000000000000000000000000000000000000..f7323b4f968457a023c00b2a2237fb94484688dd GIT binary patch literal 10689 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 Se|eDqVYmJ-?tiiWN&0^@5>W5} literal 0 HcmV?d00001 From 7710004a289d2e0acb28bce4de304a8e7e7041b5 Mon Sep 17 00:00:00 2001 From: Atharva Deosthale Date: Fri, 21 Aug 2026 16:32:33 +0530 Subject: [PATCH 2/4] Remove SSR serving mentions, split changelog paragraph --- .../blog/post/announcing-bun-1-4-runtime/+page.markdoc | 4 ++-- src/routes/changelog/(entries)/2026-08-21.markdoc | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/routes/blog/post/announcing-bun-1-4-runtime/+page.markdoc b/src/routes/blog/post/announcing-bun-1-4-runtime/+page.markdoc index 72c05ea39ff..ca90b696ce5 100644 --- a/src/routes/blog/post/announcing-bun-1-4-runtime/+page.markdoc +++ b/src/routes/blog/post/announcing-bun-1-4-runtime/+page.markdoc @@ -13,7 +13,7 @@ faqs: - question: "What is new in Bun 1.4?" answer: "Bun 1.4 is the first Bun release written in Rust instead of Zig. It reports Node.js 26 compatibility, starts 50% faster on Linux, uses up to 35% less memory for HTTP servers, and ships a faster bun install with a global virtual store. The full changelog is on the [Bun blog](https://bun.com/blog/bun-v1.4)." - question: "How do I use Bun 1.4 on Appwrite?" - answer: "For [Appwrite Functions](/docs/products/functions), pick `bun-1.4` as the runtime when creating or updating a function. For [Appwrite Sites](/docs/products/sites), pick Bun 1.4 as the build runtime in Site settings under Runtime settings; for SSR sites it also serves your requests. Both are available on Appwrite Cloud today." + answer: "For [Appwrite Functions](/docs/products/functions), pick `bun-1.4` as the runtime when creating or updating a function. For [Appwrite Sites](/docs/products/sites), pick Bun 1.4 as the build runtime in Site settings under Runtime settings. Both are available on Appwrite Cloud today." - question: "Do I need to change my code to upgrade from Bun 1.3 to Bun 1.4?" answer: "Most projects need no changes. Bun 1.4 tightens TLS certificate verification, parses YAML 1.2 strictly, and no longer loads .env files when invoked as node, so projects relying on those behaviors should review the [upgrade notes](https://bun.com/blog/bun-v1.4) before switching." - question: "Is Bun 1.4 faster than Node for building sites?" @@ -22,7 +22,7 @@ faqs: answer: "The Bun team ported the entire codebase from Zig to Rust to improve memory safety and long-term maintainability. The port was written by around 64 Claude agents working concurrently over 11 days, landed with the full test suite passing, and shipped as Bun 1.4. The team documented the process in [Bun in Rust](https://bun.com/blog/bun-in-rust)." --- -Bun 1.4 is now available on Appwrite Cloud, as a runtime for Appwrite Functions and Appwrite Sites. You can pick `bun-1.4` for new functions today, switch existing functions over with a redeploy, and select it in the build runtime dropdown for any Node-based Sites framework. For SSR sites, the runtime you pick also serves your requests; static sites use it for the build only. +Bun 1.4 is now available on Appwrite Cloud, as a runtime for Appwrite Functions and Appwrite Sites. You can pick `bun-1.4` for new functions today, switch existing functions over with a redeploy, and select it in the build runtime dropdown for any Node-based Sites framework. Version bumps to a runtime line are usually routine, but Bun 1.4 is the first release of Bun written in Rust, and the release before it, 1.3.14, was the last one written in Zig. The team and the test suite stayed the same while the language underneath changed. We wanted to know what that means in practice for functions and site builds, so we benchmarked it. The numbers are further down. diff --git a/src/routes/changelog/(entries)/2026-08-21.markdoc b/src/routes/changelog/(entries)/2026-08-21.markdoc index 6e998824c33..1adf67e055e 100644 --- a/src/routes/changelog/(entries)/2026-08-21.markdoc +++ b/src/routes/changelog/(entries)/2026-08-21.markdoc @@ -5,9 +5,11 @@ date: 2026-08-21 cover: /images/changelog/2026-08-21.avif --- -Bun 1.4 is now available on Appwrite Cloud as a runtime for [Appwrite Functions](/docs/products/functions) and [Appwrite Sites](/docs/products/sites). Pick `bun-1.4` when creating a function, or select Bun 1.4 as the build runtime for any Node-based Sites framework. For SSR sites, the runtime also serves your requests. +Bun 1.4 is now available on Appwrite Cloud as a runtime for [Appwrite Functions](/docs/products/functions) and [Appwrite Sites](/docs/products/sites). Pick `bun-1.4` when creating a function, or select Bun 1.4 as the build runtime for any Node-based Sites framework. -Bun 1.4 is the first release of Bun written in Rust instead of Zig. It reports Node.js 26 compatibility, starts faster, uses less memory, and installs dependencies quicker than Bun 1.3. In our deployments of a Next.js app with 640 packages, builds on Bun 1.4 were 22% faster than Bun 1.3 and 29% faster than Node 26 with npm. +Bun 1.4 is the first release of Bun written in Rust instead of Zig. It reports Node.js 26 compatibility, starts faster, uses less memory, and installs dependencies quicker than Bun 1.3. + +In our deployments of a Next.js app with 640 packages, builds on Bun 1.4 were 22% faster than Bun 1.3 and 29% faster than Node 26 with npm. {% arrow_link href="/blog/post/announcing-bun-1-4-runtime" %} Read the announcement From 56799b89a0dcae39beca440007d6e5b29a13774c Mon Sep 17 00:00:00 2001 From: Atharva Deosthale Date: Fri, 21 Aug 2026 16:33:52 +0530 Subject: [PATCH 3/4] Reference blog cover in changelog entry instead of duplicating asset --- .../changelog/(entries)/2026-08-21.markdoc | 2 +- static/images/changelog/2026-08-21.avif | Bin 10689 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 static/images/changelog/2026-08-21.avif diff --git a/src/routes/changelog/(entries)/2026-08-21.markdoc b/src/routes/changelog/(entries)/2026-08-21.markdoc index 1adf67e055e..c7841b6e604 100644 --- a/src/routes/changelog/(entries)/2026-08-21.markdoc +++ b/src/routes/changelog/(entries)/2026-08-21.markdoc @@ -2,7 +2,7 @@ layout: changelog title: 'Bun 1.4 is now available for Functions and Sites' date: 2026-08-21 -cover: /images/changelog/2026-08-21.avif +cover: /images/blog/announcing-bun-1-4-runtime/cover.avif --- Bun 1.4 is now available on Appwrite Cloud as a runtime for [Appwrite Functions](/docs/products/functions) and [Appwrite Sites](/docs/products/sites). Pick `bun-1.4` when creating a function, or select Bun 1.4 as the build runtime for any Node-based Sites framework. diff --git a/static/images/changelog/2026-08-21.avif b/static/images/changelog/2026-08-21.avif deleted file mode 100644 index f7323b4f968457a023c00b2a2237fb94484688dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10689 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 Se|eDqVYmJ-?tiiWN&0^@5>W5} From 07f7724484a88f793eb5c73f14646da4aa066a7a Mon Sep 17 00:00:00 2001 From: Atharva Deosthale Date: Fri, 21 Aug 2026 16:40:30 +0530 Subject: [PATCH 4/4] Add build-time medians chart to benchmark section --- .optimize-cache.json | 1 + .../announcing-bun-1-4-runtime/+page.markdoc | 2 ++ .../build-medians.avif | Bin 0 -> 16292 bytes 3 files changed, 3 insertions(+) create mode 100644 static/images/blog/announcing-bun-1-4-runtime/build-medians.avif diff --git a/.optimize-cache.json b/.optimize-cache.json index 09686376614..18dcff244fb 100644 --- a/.optimize-cache.json +++ b/.optimize-cache.json @@ -210,6 +210,7 @@ "static/images/blog/announcing-bigint-columns/console-create-bigint.png": "21e815c2f7d297ef6f544c71f17680367391e35e36e809b3c71029397c6706d7", "static/images/blog/announcing-bigint-columns/cover.png": "de0ec57085646427a552f35f0b1ab9a77f9e38b9b20801329ac19bc4bdb069f7", "static/images/blog/announcing-bulk-api/cover.png": "78a0fdf3b54ce8412bf6be1880eb4a42bcac2cb04420045a60bce888c8999c6f", + "static/images/blog/announcing-bun-1-4-runtime/build-medians.png": "3eee621d23ce934ed7866069b6e578063d44ae1e58eed4640353d620c74fe2ef", "static/images/blog/announcing-bun-1-4-runtime/cover.png": "a3bd868c50656b11e064e0e4990c88d319575e80e228335a39d0d7dcd002e462", "static/images/blog/announcing-bun-and-dart/bun-and-dart.png": "ea94af00a5c035cefb6474a9061441803db0160b7cc194fb5a71fbe05abf0d12", "static/images/blog/announcing-bun-deno-runtimes/cover.png": "5c739aa57624b990174943108de2433dd9292798d9e488d01351d5f01eba7800", diff --git a/src/routes/blog/post/announcing-bun-1-4-runtime/+page.markdoc b/src/routes/blog/post/announcing-bun-1-4-runtime/+page.markdoc index ca90b696ce5..bd2bfb9c0f5 100644 --- a/src/routes/blog/post/announcing-bun-1-4-runtime/+page.markdoc +++ b/src/routes/blog/post/announcing-bun-1-4-runtime/+page.markdoc @@ -51,6 +51,8 @@ Before the release, the Rust port ran in production for months inside Claude Cod # Benchmark: build times on Appwrite Cloud +![Median build time of a 640-package Next.js app: 152 seconds on Bun 1.4, 195 on Bun 1.3, 213 on Node 26](/images/blog/announcing-bun-1-4-runtime/build-medians.avif) + Faster installs and faster startup should add up to faster deployments, so we measured the one number every deploy pays: build time. We deployed the same app five times per runtime on Appwrite Cloud and compared Bun 1.4 against Bun 1.3 and Node 26. The setup: diff --git a/static/images/blog/announcing-bun-1-4-runtime/build-medians.avif b/static/images/blog/announcing-bun-1-4-runtime/build-medians.avif new file mode 100644 index 0000000000000000000000000000000000000000..75bfda5cdf4bd7206c151bc1579e95dd9b06ddcc GIT binary patch literal 16292 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