My Thoughts on Bun and Other Adventures

## Metadata
- Author: [[nodeland.dev]]
- Full Title: My Thoughts on Bun and Other Adventures
- Category: #articles
- Document Note: ---
tags:
- #javascript
- #nodejs
- #bun
- #runtime
- #fastify
- #pino
- #performance
- #openstandards
- #oss-governance
- #tooling
- #package-managers
- #deno
- #edge
- #devrel
- #wordpress
Author: nodeland.dev (Matteo Collina)
Source: Newsletter article
Reference: https://adventures.nodeland.dev/archive/my-thoughts-on-bun/
date created: 2025-08-22 00:00
---
# Title: My thoughts on Bun and other Adventures
## Table of Contents:
- [🚀 Bun 1.0: Excitement and Frustrations](#-bun-10-excitement-and-frustrations)
- [⚡ Why Bun Is Faster Than Node.js](#-why-bun-is-faster-than-nodejs)
- [đź§© Compatibility Today: Fastify and Pino](#-compatibility-today-fastify-and-pino)
- [📦 bun install: Speed Tradeoffs](#-bun-install-speed-tradeoffs)
- [🏎️ What’s Next for Node.js Performance](#️-whats-next-for-nodejs-performance)
- [🎥 Videos: OpenMeter, EventEmitter Anti-pattern, Platformatic-in-Public](#-videos-openmeter-eventemitter-anti-pattern-platformatic-in-public)
- [🛠️ Releases Roundup (Fastify & Pino Ecosystem)](#️-releases-roundup-fastify--pino-ecosystem)
- [đź”— Curated Links](#-curated-links)
- [đź“– References](#-references)
### References:
- State of Node.js Performance 2023 (by Rafael Gonzaga)
- OpenMeter overview
- EventEmitter async anti-pattern explainer
- Platformatic repo PR thread (development-in-public series)
- Deno Deploy native npm support
- Cloudflare Pingora engineering story
- GitHub on JSON Schema
- How Query Engines Work (online book)
- Serverless shortcomings analysis
- Canva’s “When URL parsers disagree” (CVE-2023-38633)
Note: Where the article lists titles without explicit URLs, I’ve named them to support further search; add actual links if you have them bookmarked.
## 📝 Summary:
The author reacts to Bun 1.0 with both enthusiasm for innovation and concern about Node.js compatibility claims. They outline why Bun is currently faster (focus on performance over backward compatibility, lean governance, and lack of constraints) and contrast that with Node.js’s open governance and ecosystem-protective approach. They note present incompatibilities with Fastify and Pino, cautioning users to report bugs upstream to Bun. bun install’s speed comes with DX tradeoffs, especially around version freshness versus cache preference. Node.js has renewed focus on performance via a dedicated team, delivering incremental gains without breaking changes. The issue closes with videos on OpenMeter and an EventEmitter async anti-pattern, release notes across the Fastify/Pino ecosystem, and curated links on Deno’s npm support, Cloudflare’s Pingora, JSON Schema at GitHub, serverless realities, and URL parsing pitfalls.
## đź“– Main Content:
- The Bun 1.0 milestone underscores the tension between speed and compatibility. The author argues that calling 1.0 before broad Node.js parity has led to real-world friction for maintainers, who receive issue reports for Bun-specific behavior.
- Bun’s speed story:
- Organizational incentives: Node.js has limited funding and prioritizes security/capability; cloud providers aren’t incentivized to reduce compute time.
- Architectural latitude: Bun prioritized performance first, then compatibility; Node.js prioritizes ecosystem stability, making aggressive performance changes harder.
- Governance tradeoffs: Open standards and open governance improve trust and longevity but slow decision-making.
- Current gaps: Fastify and Pino don’t run on Bun as-is. Users are encouraged to file issues with Bun rather than project maintainers.
- bun install: A blazing-fast installer that prefers local cache, trading update freshness for speed. Similar behavior can be achieved with pnpm’s prefer-offline, and macOS copy-on-write (clonefile) is a clever acceleration many managers could adopt.
- Node.js outlook: Since the performance team launched, Node is improving release-over-release without breaking changes. Contributions and funding are welcomed.
- Videos:
- OpenMeter for usage-based metering and client generation testing.
- Why EventEmitter with async functions is an anti-pattern.
- Building Platformatic in public with automated test harness generation.
- Ecosystem releases: Notable updates across Fastify plugins and the Pino logging stack, plus a new Fastify onListen hook.
- Link curation: Discourse around TypeScript, Deno’s native npm on Deploy (enabling Fastify at the edge), Cloudflare’s Pingora replacing NGINX, JSON Schema at GitHub, query engine fundamentals, serverless tradeoffs, and URL parsing CVE lessons.
### 🗒️ Notes
- Bun 1.0 reaction
- Dual sentiment: innovation welcomed, compatibility claims premature.
- Maintainer burden: Issue noise due to Bun differences.
- Preference: delay 1.0 until broader compatibility.
- Performance comparison
- Incentives: No direct revenue for performance; clouds profit from slower runtimes.
- Strategy: Bun optimized first; Node.js protects compatibility first.
- Governance: Open governance strengthens ecosystem but slows change.
- Compatibility status
- Fastify, Pino unsupported on Bun at time of writing.
- Guidance: File bugs with Bun; saved reply emphasizes non-drop-in reality.
- bun install vs npm/pnpm/yarn
- Speed: bun install is extremely fast; pnpm --prefer-offline approaches similar times.
- Tradeoff: Local-first may miss bug/security updates.
- Technique: macOS clonefile enables near-instant hot cache; others should adopt.
- Node.js performance roadmap
- Performance Team -> strategic initiative.
- Incremental gains each release; no massive breaking changes.
- Call to action: contribute or fund performance work.
- Video topics
- OpenMeter usage metering and client generation.
- EventEmitter + async anti-pattern: stop using it.
- Platformatic: test harness automation (parts 1–4).
- Releases highlights
- Fastify plugins: mongodb v8 (mongodb@6), static URL type, leveldb updates, secure-session v7 with .touch(), throttle v1.0.0, oauth2 updates (gitlab, yandex, revoke), jwt typing helpers.
- Pino ecosystem: pino-http typings, pino-abstract-transport CJS default export types, pino v8.5.1 stability for CITGM.
- Fastify core v4.23.0: new onListen hook.
- Others: mercurius-upload major update, fluent-json-schema type cleanup.
- Curated links
- TS discourse drama; Deno Deploy native npm; Cloudflare Pingora; JSON Schema at GitHub; query engines; serverless shortcomings; URL parser CVE.
## đź“– References:
- Deno Deploy announcement of native npm support: “Deno can now run Fastify at the edge.”
- Cloudflare’s “How we built Pingora”
- GitHub on adopting JSON Schema
- Canva Engineering on URL parser discrepancies (CVE-2023-38633)
- “How Query Engines Work” online book
If you’d like, I can enrich this section with exact URLs from your bookmarks.
## 🗣️ Paraphrase:
1) Original idea: “Bun hit 1.0... I really like what Jarred is building... frustrated by their compatibility claim... not a drop-in replacement... random issues... I would have preferred waiting to call it 1.0.”
- Paraphrase: Bun’s 1.0 debut is exciting, but labeling it production-ready while Node.js compatibility still lags has created avoidable friction. It’s not yet a seamless swap-in for Node, and maintainers are fielding scattered bug reports. Holding off on the 1.0 label until compatibility improved would have reduced disruption.
2) Original idea: “One of the most impressive things about bun install is performance... comes with a considerable cost... bun prefers local versions... pnpm --prefer-offline behaves similarly... copy-on-write via clonefile on macOS is clever... others should adopt.”
- Paraphrase: bun install is blazingly fast partly because it defaults to cached packages, sacrificing immediate updates you’d typically get with npm/pnpm/yarn. You can mimic this with pnpm’s offline preference, achieving similar times. On macOS, Bun’s use of clone-on-write file operations is a smart optimization that other package managers could emulate.
## đź“° Newsletter:
Learning web development just got spicier: Bun 1.0 landed with dazzling speed—but not without compatibility hiccups for Node.js ecosystems like Fastify and Pino. Meanwhile, Node’s Performance Team is quietly shaving milliseconds r
- Summary: In this issue of "Adventures in Nodeland," the author shares their thoughts on various topics. They discuss the release of Bun 1.0 and express some frustrations with its compatibility with Node.js. The author also explores why Bun is faster than Node.js and mentions that Bun does not currently support Pino and Fastify. They highlight the performance of "bun install" but note that it comes with a cost in developer experience. The author also shares news about videos they recorded on OpenMeter and EventEmitter anti-patterns. The issue concludes with a list of recent releases and links to interesting articles.
- URL: https://adventures.nodeland.dev/archive/my-thoughts-on-bun/?utm_source=substack&utm_medium=email
#### Bun 1.0 release, Node.js performance, and released videos on OpenMeter and EventEmitter anti-pattern.
[](https://adventures.nodeland.dev/)
Hi Folks!
As I write this, I'm on a plane to London, where I will spend the entire week working with my co-founder, Luca Maraschi. Since I last wrote, there has been quite a bit of news.
#### Bun 1.0
[Bun hit the 1.0 release](https://bun.sh/blog/bun-v1.0?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun), and I'm both excited and disappointed. I *really* like what [Jarred Sumner](https://twitter.com/jarredsumner?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) is building with Bun, but I'm a bit frustrated by their compatibility claim with Node.js. In my experience, it's not a drop-in replacement, and many inner details differ. This results in many random issues over my repos asking for fixes for Bun incompatibilities while people try it out. I would have preferred if they waited for calling a 1.0 to reach greater compatibility with the ecosystem.
##### Why is Bun faster than Node.js?
A few reasons:
1. Node.js has no budget, and a tiny team maintains npm. Most investments are in adding capabilities or things more secure, not making things faster. Making things faster does not make anyone more money; it’s a bit of a tragedy of the commons. Moreover, the cloud providers (the real money-makers these days) have no interest in improving the performance of anything, as it would mean *less revenue* for them.
2. Bun did not care about backward compatibility with a significant portion of the npm ecosystem. They made things fast and are working to preserve backward compatibility as an after-fact: this is how you approach building fast software. Conversely, Node.js processes are built around protecting the ecosystem instead. We know how to make Node.js faster, but doing so will create a lot of friction for the end users.
3. I believe in open standards and open governance. Runtimes and infrastructure are better with it (see [the terraform fiasco](https://opentf.org/?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun)). Having open governance means a broader decision-making process, which makes everyone heard, but it also requires more time to make decisions.
##### Bun does not currently support Pino and Fastify
As I'm writing this, Bun does not support [Fastify](https://fastify.dev?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) or [Pino](https://getpino.io?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun). Both are high-impact modules, with pino being as popular as Next.js. The Bun team is actively looking into adding the missing APIs and behaviors, and I expect them to catch up in the coming months. Given how many are asking for support, a variation of the following message ended up in my GitHub saved reply:
> Ultimately, Bun does not implement all Node.js APIs. It's not a clean drop-in replacement for Node.js (despite their claims). Please refer to the Bun [Discord](https://bun.sh/discord?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) or [Issue Tracker](https://github.com/oven-sh/bun?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) for such questions.
>
>
**If any of my repositories do not run well on Bun, please open a bug on Bun.** This approach is also what [Jarred asked everybody to follow](https://x.com/jarredsumner/status/1700497869160268155?s=20&utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun).
##### `bun install` speed comes at a cost
One of the most impressive things about Bun is the performance of `bun install`. However, it comes with a considerable cost in developer experience. `npm`, `pnpm` and `yarn` check if a new version is available and fetch it from the registry by default. Instead, `bun` would pick a local version first. In fact, `pnpm --prefer-offline` flag has roughly the same behavior of `bun install` and it yields performance in the same ballpark: on my system 750ms vs 150ms (see also [this tweet](https://x.com/youyuxi/status/1701243750666703338?s=46&t=22eoAstJVk5l46KQXYEk5Q&utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) from Evan You). While this difference matters, the two numbers are comparable, and hopefully, the gap will be reduced.
What would be interesting is how the end users would appreciate this difference in behavior. Would you use the latest and the greatest, or what you have installed locally, knowing you might lose on bug or security fixes?
I was also very impressed by the clever use of copy-on-write on Mac OS X, making it almost instantaneous with a hot cache. This is partially due to `clonefile`, which tells the operating system to copy the file only when modified for the first time, saving precious seconds. I hope all the other JavaScript package managers copy this technique.
##### What's next for Node.js?
For a few years, Node.js invested very little in improving the runtime performance. Last year, [Yagiz Nizipli](https://twitter.com/yagiznizipli?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) kicked off the [Performance Team](https://github.com/nodejs/performance?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun), and it's now a strategic initiative. This has led to quite a few significant Performance improvements that are described by [Rafael Gonzaga](https://twitter.com/_rafaelgss?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun)) in the [State of Node.js Performance 2023](https://blog.rafaelgss.dev/state-of-nodejs-performance-2023?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun). Node.js is getting faster at each release, without massive breaking changes.
Would you like for Node.js to become faster? Join the performance team and contribute... alternatively, find a way to fund the development of Node.js.
#### Videos
Have you ever wondered how to implement usage metering for your SaaS? In [this video](https://youtu.be/nBKWRM0KgYI?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun), I pair up with Peter Marton to find out what OpenMeter is, how to use it, and how it enables tracking how much a user has used a specific feature. We will also check if the new Platformatic client would generate a good client for OpenMeter... and we have found a few bugs!
I also recorded a [video](https://youtu.be/Ra7Ji9LmG9o?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) explaining why using EventEmitter with an async function is an anti-pattern. Are you using this pattern? Stop now!
I've also been busy building Platformatic in public: we are adding automated tests to the code created by the `create-platformatic` generator, so all the harness for testing is already set up.
* [Part 1](https://youtu.be/R6jlU3o5-78?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun)
* [Part 2](https://youtu.be/TX906eOrEBI?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun)
* [Part 3](https://youtu.be/igG65kuFP7Y?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun)
* [Part 4](https://youtu.be/jCk8m8yWW78?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun)
Follow along with the development at https://github.com/platformatic/platformatic/pull/1323.
#### Releases
* [@fastify/mongodb v8.0.0](https://github.com/fastify/fastify-mongodb/releases/tag/v8.0.0?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) updates to `mongodb@6` driver and drops Node.js v14.
* [@fastify/static v6.11.0](https://github.com/fastify/fastify-static/releases/tag/v6.11.0?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) add URL type.
* [@fastify/leveldb v5.1.0](https://github.com/fastify/fastify-leveldb/releases/tag/v5.1.0?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) updates dependencies and TS nodenext compatibility.
* [@fastify/secure-session v7.0.0](https://github.com/fastify/fastify-secure-session/releases/tag/v7.0.0?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) updates `@fastify/cookie` to v9; [v7.1.0](https://github.com/fastify/fastify-secure-session/releases/tag/v7.1.0?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) adds a `.touch()` method to refresh the session.
* [@fastify/throttle v1.0.0](https://github.com/fastify/fastify-throttle/releases/tag/v1.0.0?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) new plugin throttling a request's download speed.
* [@fastify/restartable v2.1.1](https://github.com/fastify/restartable/releases/tag/v2.1.1?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) fixes a type.
* [@fastify/oauth2 v7.3.0](https://github.com/fastify/fastify-oauth2/releases/tag/v7.3.0?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) allows default cookie options to be overriden; adds gitlab provider.
* [@fastify/jwt v7.2.1](https://github.com/fastify/fastify-jwt/releases/tag/v7.2.1?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) adds FastifyJwtNamespace type helper.
* [@fastify/oauth2 v7.4.0](https://github.com/fastify/fastify-oauth2/releases/tag/v7.4.0?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) implements yandex configuration in prese; Add default user-agent + enable custom one; implement revoke token and revoke all token.
* [pino-http v8.5.0](https://github.com/pinojs/pino-http/releases/tag/v8.5.0?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) loosening up the IncomingMessage and ServerResponse typings.
* [pino-abstract-transport v1.1.0](https://github.com/pinojs/pino-abstract-transport/releases/tag/v1.1.0?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) fix CJS default exports in types.
* [mercurius-upload v7.0.0](https://github.com/mercurius-js/mercurius-upload/releases/tag/v7.0.0?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) switches from graphql-upload to graphql-upload-minimal, drop Node.js v14.x and v16.x.
* [@fastify/swagger v8.10.0](https://github.com/fastify/fastify-swagger/releases/tag/v8.10.0?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) adds endpoint-specific transforms.
* [pino-elasticsearch v6.7.0](https://github.com/pinojs/pino-elasticsearch/releases/tag/v6.7.0?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) adds `opts.rejectUnauthorized` for SSL option.
* [@fastify/session v10.5.0](https://github.com/fastify/session/releases/tag/v10.5.0?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) fixes an issue where the session is not saved when `request.session.cookie.expires` is `null`.
* [pino v8.5.1](https://github.com/pinojs/pino/releases/tag/v8.15.1?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) increases test stability for Node.js CITGM.
* [fastify v4.23.0](https://github.com/fastify/fastify/releases/tag/v4.23.0?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) adds a new `onListen` hook!
* [fluent-json-schema v4.1.2](https://github.com/fastify/fluent-json-schema/releases/tag/v4.1.2?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) removes a duplicate type definition.
#### I'm trying out htmx!
[fastify-html v0.1.0](https://github.com/mcollina/fastify-html/releases/tag/v0.1.0?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) is a new module I plan to use to explore [htmx](https://htmx.org/?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun). I'm planning a [stream](https://twitch.com/matteocollina?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) on this in the coming weeks. Would you join?
#### Links
* [How much drama can happen if a major technical influencer drops TypeScript?](https://world.hey.com/dhh/turbo-8-is-dropping-typescript-70165c01?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) It sparked a massive flame war between TypeScript lovers and haters.
* [Announcing native npm support on Deno Deploy](https://deno.com/blog/npm-on-deno-deploy?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) - Amazing news as Deno can know run Fastify at the edge!
* [How we built Pingora, the proxy that connects Cloudflare to the Internet](https://blog.cloudflare.com/how-we-built-pingora-the-proxy-that-connects-cloudflare-to-the-internet/?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) - read this amazing engineering story on how CloudFlare replace NGINX.
* Learn [how JSON Schema Was an Obvious Choice at GitHub](https://json-schema.org/blog/posts/github-case-study?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun)
* I've found this online book quite interesting - [How Query Engines Work](https://howqueryengineswork.com/?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun); maybe I will implement one day!
* [The shortcomings of serverless computing](https://www.infoworld.com/article/3705610/the-shortcomings-of-serverless-computing.html?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun)
* [When URL parsers disagree (CVE-2023-38633) - Canva Engineering Blog](https://www.canva.dev/blog/engineering/when-url-parsers-disagree-cve-2023-38633/?utm_source=nodeland&utm_medium=email&utm_campaign=my-thoughts-on-bun) - who said that parsing a URL was easy?
You just read issue #112 of Adventures in Nodeland. You can also browse the [full archives](https://adventures.nodeland.dev/archive/) of this newsletter., My Thoughts on Bun and Other Adventures, nodeland.dev, 01ha9v0wrm4032jrwe8jd0vmh0.