cd /news/developer-tools/bun-v1-3-8 · home topics developer-tools article
[ARTICLE · art-9956] src=bun.com ↗ pub= topic=developer-tools verified=true sentiment=↑ positive

Bun v1.3.8

Bun version 1.3.8 introduces a built-in CommonMark-compliant Markdown parser written in Zig, offering three rendering APIs: `Bun.markdown.html()` for HTML output, `Bun.markdown.render()` for custom callbacks, and `Bun.markdown.react()` for React elements. The update also adds a `--metafile-md` CLI option for `bun build` that generates Markdown-based bundle analysis, designed to help developers identify bloat and understand dependency chains when shared with LLMs.

read3 min views19 publishedJan 29, 2026

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.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.

bun build entry.js --metafile-md --outdir=dist
bun build entry.js --metafile-md=analysis.md --outdir=dist
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 returningnapi_object instead ofnapi_function for callbacks wrapped inAsyncContextFrame , which caused native addons like encore.dev to panic with "expect Function, got: Object" when usingAsyncLocalStorage.run()
  • Fixed: Crash during heap snapshot generation in certain cases
  • Fixed: Crash in node:vm when usingSyntheticModule withnode: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'scmd-shim generating broken wrappers that referenced/bin/sh from placeholder scripts' shebang lines
── more in #developer-tools 4 stories · sorted by recency
── more on @bun 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
Live at https://your-agent.zahid.host
Get free account → Pricing
from €0/mo · no card required
LIVE [news/bun-v1-3-8] indexed:0 read:3min 2026-01-29 ·