Bun

Bun v1.3.8


Jarred Sumner Β· January 29, 2026

To install Bun

curl
npm
powershell
scoop
brew
docker
curl
curl -fsSL https://bun.sh/install | bash
npm
npm install -g bun
powershell
powershell -c "irm bun.sh/install.ps1|iex"
scoop
scoop install bun
brew
brew tap oven-sh/bun
brew install bun
docker
docker pull oven/bun
docker run --rm --init --ulimit memlock=-1:-1 oven/bun

To upgrade Bun

bun upgrade

Bun.markdown β€” Built-in Markdown Parser

Bun now includes a fast, CommonMark-compliant Markdown parser written in Zig. This is a Zig port of the popular md4c library.

The new Bun.markdown API provides three ways to render Markdown:

Bun.markdown.html() β€” Render to HTML

const html = Bun.markdown.html("# Hello **world**");
// "<h1>Hello <strong>world</strong></h1>\n"

// With options
Bun.markdown.html("## Hello", { headingIds: true });
// '<h2 id="hello">Hello</h2>\n'

Bun.markdown.render() β€” Custom Callbacks

Render with JavaScript callbacks for each element, perfect for custom HTML, ANSI terminal output, or stripping formatting:

// Custom HTML with classes
const html = Bun.markdown.render("# Title\n\nHello **world**", {
  heading: (children, { level }) =>
    `<h${level} class="title">${children}</h${level}>`,
  paragraph: (children) => `<p>${children}</p>`,
  strong: (children) => `<b>${children}</b>`,
});

// ANSI terminal output
const ansi = Bun.markdown.render("# Hello\n\n**bold**", {
  heading: (children) => `\x1b[1;4m${children}\x1b[0m\n`,
  paragraph: (children) => children + "\n",
  strong: (children) => `\x1b[1m${children}\x1b[22m`,
});

// Return null to omit elements
const result = Bun.markdown.render("# Title\n\n![logo](img.png)", {
  image: () => null,
  heading: (children) => children,
});

Bun.markdown.react() β€” React Elements

Returns a React Fragment directly usable as a component return value:

function Markdown({ text }: { text: string }) {
  return Bun.markdown.react(text);
}

// With custom components
const element = Bun.markdown.react("# Hello", {
  h1: ({ children }) => <h1 className="title">{children}</h1>,
});

// Server-side rendering
import { renderToString } from "react-dom/server";
const html = renderToString(Bun.markdown.react("# Hello **world**"));

For React 18 and older, pass reactVersion: 18 since the default targets React 19's element format.

GFM Extensions

GitHub Flavored Markdown extensions are enabled by default:

  • Tables
  • Strikethrough (~~deleted~~)
  • Task lists (- [x] done)
  • Permissive autolinks

Additional options include wikiLinks, latexMath, headingIds, and autolinkHeadings.

--metafile-md CLI option for LLM-friendly bundle analysis

bun build now supports a --metafile-md option that generates a Markdown visualization of your bundle's module graph. This is particularly useful for analyzing bundle composition with LLMs like Claudeβ€”paste the output into a chat to identify bloat, understand dependency chains, and optimize your builds.

# Default filename (meta.md)
bun build entry.js --metafile-md --outdir=dist

# Custom filename
bun build entry.js --metafile-md=analysis.md --outdir=dist

# Both JSON and markdown
bun build entry.js --metafile=meta.json --metafile-md=meta.md --outdir=dist

The generated Markdown includes:

  • Quick Summary β€” Module counts, sizes, ESM/CJS breakdown, output/input ratio
  • Largest Input Files β€” Sorted by size to identify potential bloat
  • Entry Point Analysis β€” Bundle size, exports, CSS bundles, and bundled modules
  • Dependency Chains β€” Most commonly imported modules and reverse dependencies
  • Full Module Graph β€” Complete import/export info for each module
  • Raw Data for Searching β€” Grep-friendly markers like [MODULE:], [SIZE:], [IMPORT:]

The Bun.build() API also supports this via an expanded metafile option:

const result = await Bun.build({
  entrypoints: ["./index.ts"],
  outdir: "./dist",
  // Can now be a string path or object with json/markdown paths
  metafile: {
    json: "meta.json",
    markdown: "meta.md",
  },
});

Bugfixes

  • Updated mimalloc
  • Fixed: napi_typeof incorrectly returning napi_object instead of napi_function for callbacks wrapped in AsyncContextFrame, which caused native addons like encore.dev to panic with "expect Function, got: Object" when using AsyncLocalStorage.run()
  • Fixed: Crash during heap snapshot generation in certain cases
  • Fixed: Crash in node:vm when using SyntheticModule with node:async_hooks enabled, such as when running the React Email preview server
  • Fixed: HTTP/2 stream state handling that caused gRPC streaming calls to fail with DEADLINE_EXCEEDED errors in certain cases when using libraries like @google-cloud/firestore and @grpc/grpc-js
  • Fixed: npm i -g bun failing on Windows due to npm's cmd-shim generating broken wrappers that referenced /bin/sh from placeholder scripts' shebang lines

Thanks to 4 contributors!