Skip to content

docs: voice pass over docs/ - #38760

Merged
alii merged 1 commit into
mainfrom
farm/955b1777/docs-voice-sweep
Aug 15, 2026
Merged

docs: voice pass over docs/#38760
alii merged 1 commit into
mainfrom
farm/955b1777/docs-voice-sweep

Conversation

@robobun

@robobun robobun commented Aug 15, 2026

Copy link
Copy Markdown
Collaborator

Problem

Fix

  • Wording-only pass over every page in docs/ (332 files read, 179 changed, 845 hunks, +1011/-966). Each hunk is one of: name the actor (Bun, the bundler, the test coordinator, you), split a run-on sentence or turn an enumeration into a list, present tense, name the subject of a bare "this"/"it", "you" instead of "we", or drop a subjective word. Net 80 fewer em dashes; no new ones.
  • Nothing but prose changed. Checked mechanically for every changed file against main: fenced code blocks byte-identical, headings identical, frontmatter identical, link targets identical (same multiset), MDX component tags identical, same number of table rows, and no inline code span added or removed. prettier --check docs is clean.
  • No claim about Bun's behavior was added, removed or changed. Every hunk got a second read specifically for that (20 hunks were tightened and 28 reverted as a result, which is why two of the 181 files touched ended up unchanged). The 37 hunks where a qualifier word (not, only, unless, except, default, ...) disappeared from the old text were checked individually; in each the condition is still stated in the new wording (for example "the next fire is not scheduled until it settles" became "Bun schedules the next fire only once it settles").
  • Docs-only, so CI skips the test pipeline for this PR. This will conflict with open docs PRs that touch the same lines; the edits are sentence-level, so rebasing either side is mechanical.

Background

Example hunks

docs/test/parallel.mdx:

- Coverage, JUnit XML and snapshot writes are merged by the coordinator, so ...
+ The coordinator merges coverage, JUnit XML and snapshot writes, so ...

- --timings can be passed more than once; the files are read as one table (paths that don't exist yet are skipped), and --update-timings writes to the first path.
+ You can pass --timings more than once. Bun reads the files as one table and skips paths that don't exist yet. --update-timings writes to the first path.

docs/guides/process/os-signals.mdx: one sentence carrying two events, two links and two conditions became a two-item list.

docs/project/building-windows.mdx: the four things --lto=on does became a four-item list; the two reasons there is no LTO for arm64 and --baseline became two sentences.

docs/runtime/sqlite.mdx:

- Using a statement that was finalized by close() throws Database has closed, except toString(), which returns an empty string, and finalize(), which stays safe to call.
+ Using a statement that close() finalized throws Database has closed. Two exceptions: toString() returns an empty string, and finalize() stays safe to call.

@robobun

robobun commented Aug 15, 2026

Copy link
Copy Markdown
Collaborator Author
Updated 5:19 PM PT - Aug 14th, 2026

@robobun, your commit 53cd56770877a79159458424cf94d674cb0e5c51 passed in Build #96932! 🎉


🧪   To try this PR locally:

bunx bun-pr 38760

That installs a local version of the PR into your bun-38760 executable, so you can run:

bun-38760 --bun

@robobun

robobun commented Aug 15, 2026

Copy link
Copy Markdown
Collaborator Author

Status: merged at 53cd567 (rebased; the two conflicts in docs/runtime/toml.mdx and docs/runtime/html-rewriter.mdx were resolved by taking main's new text).

Review comments that arrive after the merge are welcome; anything that needs a change will go into a follow-up PR.

Guidelines this applies: #38705. Pointer for reviewers of future docs PRs: #38718.

Apply the voice rules from docs/project/contributing.mdx to the existing
pages: passive sentences now name the actor (Bun, the bundler, the
coordinator, you), run-on sentences are split or turned into lists, present
tense replaces "will" for current behavior, bare "this"/"it" subjects name
the thing they refer to, tutorial "we" becomes "you", and words like easy,
simple, just and quick are removed.

Wording only. Code blocks, inline code, headings, frontmatter, link targets
and MDX components are unchanged in every file, and no claim about Bun's
behavior was added, removed or changed.
@robobun
robobun force-pushed the farm/955b1777/docs-voice-sweep branch from 3ea9691 to 53cd567 Compare August 15, 2026 00:19
@alii
alii merged commit f89d370 into main Aug 15, 2026
5 checks passed
@alii
alii deleted the farm/955b1777/docs-voice-sweep branch August 15, 2026 00:24

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I reviewed this PR and didn't find any bugs — every hunk I sampled across the diff is a meaning-preserving voice edit matching the #38705 rules. Because it rewrites prose across 179 pages (~845 hunks) of user-facing docs, a maintainer skim for tone would still be worthwhile before merge.

What was reviewed:

  • Sampled hunks across bundler/, guides/, pm/, runtime/, test/, and project/ — all passive→active, sentence-split, or subject-naming edits with technical claims preserved.
  • Checked qualifier-bearing hunks (only/unless/except/default) in cron.mdx, prune.mdx, overrides.mdx, lockfile.mdx, routing.mdx — conditions still stated in the new wording.
  • Checked the enumeration→list conversions in loaders.mdx, file-types.mdx, os-signals.mdx, migrate-from-jest.mdx, building-windows.mdx, css.mdx — content unchanged.
  • Spot-checked that inline code spans and link targets are unchanged in the reworded sentences.
Extended reasoning...

Overview

This PR is a wording-only voice pass over 179 files in docs/ (845 hunks, +1011/-966), applying the docs voice rules merged in #38705: name the actor instead of passive voice, split run-on sentences, present tense, name the referent of bare "this"/"it", second person instead of "we", and drop subjective words like "just"/"simple"/"easy". No source code, tests, or type declarations are touched. The PR body documents mechanical verification that fenced code blocks, headings, frontmatter, link targets, MDX component tags, table row counts, and inline code spans are byte-identical to main, and that prettier --check docs is clean. CI passes (docs-only pipeline).

Security risks

None. This touches only .mdx prose under docs/. No executable code paths, config, or dependency changes.

Level of scrutiny

Low per hunk — each is a 1-3 sentence rewording — but the aggregate is a sweeping rewrite of the public documentation's voice. I sampled broadly across the diff (bundler, guides, pm/cli, runtime API pages, test runner docs, project/contributing pages) and every hunk I read preserves technical meaning. I paid particular attention to hunks where a qualifier word moved or a clause was split off, since those are where meaning drift is most likely; in each case the condition survives in the new wording (e.g. "the next fire is not scheduled until it settles" → "Bun schedules the next fire only once it settles").

Other factors

Voice and tone across the entire docs tree is ultimately an editorial call. At 845 hunks I can't claim to have read every one, and even where meaning is preserved a maintainer may prefer specific phrasings. Given the scope — nearly every user-facing page — a human skim seems appropriate before this lands, so I'm deferring rather than shadow-approving.

alii added a commit that referenced this pull request Aug 15, 2026
### Problem
- While rewording pages for #38760 (wording only, no facts touched),
about 400 passages were noted that looked factually wrong: a page
contradicting itself, an example that cannot produce the output shown
next to it, a flag table that disagrees with `--help`, a default that
disagrees with the implementation, or a link to a page that no longer
exists.
- Examples: `docs/runtime/sqlite.mdx` ran `create table foo;` (a syntax
error) and showed a result; seven CLI snippets said `--backend` defaults
to `clonefile` (only on macOS; `PackageInstall.rs` defaults to
`hardlink` elsewhere); `docs/pm/overrides.mdx` declared `foo: ^2.0.0`
and showed `foo@1.2.3` installed; `docs/runtime/s3.mdx` used a `file`
variable whose definition an earlier commit deleted;
`docs/bundler/css.mdx` listed the configured target strings instead of
the versions they resolve to (`targets.rs` min-merges `es2020` with the
explicit entries, giving Chrome 80 / Edge 80 / Opera 67);
`docs/runtime/http/routing.mdx` still had a Markdoc `{% callout %}` that
does not render.

### Fix
- Every note was checked twice before anything was edited, once to
decide whether it was real and once more on the resulting diff, in both
cases against the page itself, `src/` or `packages/bun-types`, or by
running the snippet with a current Bun. Of the notes that survived the
first check, 311 corrections landed on 119 pages; 47 turned out to
describe correct text and 50 could not be settled (platform-specific
claims, benchmark figures, places where the implementation rather than
the docs looks wrong), and those pages were left as they were. Both
lists are in the first comment on this PR.
- The second check changed the outcome in 4 places (3 first-pass edits
reverted, 1 corrected: the `symlink` backend is only selected for
`file:` dependencies, `link:` dependencies go through a different code
path, so `docs/pm/cli/install.mdx` and `docs/pm/global-cache.mdx` now
both say `file:` only).
- Each edit is the smallest one that makes the page right: a number, a
flag, a link target, a line in an example, or one sentence. Where an
example's shown output was wrong, the example was run and the output
pasted (`bun run` listing, `Bun.inspect()`, the `--todo` and `.skip`
reports, the minifier samples, `bun:sqlite` `.values()`). The only
additions are things a page claimed to list completely but did not:
missing `bun build` flags in `docs/snippets/cli/build.mdx` (text taken
from `--help`), missing `CompileBuildOptions`/`Terminal`/`BunFile`
members in the reference blocks, and the vendored libraries missing from
`docs/project/license.mdx` (each one is in `vendor/` and
`scripts/build/deps/`).
- Verified on the final tree: `prettier --check docs` clean; every
internal link target added or changed by this PR resolves to a page
under `docs/`; the three in-page anchors that were added match a heading
on their page; files outside `docs/` are untouched, so CI skips the test
pipeline.
- Independently re-derived a sample of about 40 hunks across all
sections while reviewing the diff (CSS effective targets, compile-target
parsing, minifier outputs, macro dead-code elimination needing
`--minify-syntax`, the Windows cron trigger count, the vImage filter
condition, the global-store ratio, `.env` precedence, `.npmrc` vs
`bunfig` password encoding, the shell `mv` EXDEV fallback,
`--sourcemap`/`--metafile` needing `=`, and others); all held.
- Review follow-ups (second commit): the duplicate `--sourcemap` row in
`docs/bundler/esbuild.mdx` that the list below already claimed was
removed is now actually removed; `bun patch --quiet` gets the same
"Disable the progress bar" text as `bun link` (`LogLevel::Quiet` only
turns off progress outside `bun pm pack`); the Redis subscriber-mode
note lists every method the client still accepts (`psubscribe`,
`punsubscribe` and `pubsub` are `DontCare` in `js_valkey_functions.rs`,
`ping` is ungated).

### Out of scope, noted for follow-up
- The same review turned up a few problems outside `docs/`: the
`--ignore-scripts` help string still says dependency scripts never run,
and `AUTO_PIPELINE_DISALLOWED_COMMANDS` in `ValkeyCommand.rs` contains
`UNPSUBSCRIBE` (a typo for `PUNSUBSCRIBE`, which is why
`docs/runtime/redis.mdx` still lists that name); both have been filed
separately. Stale JSDoc noted in `bun-types` (`Cookie.domain` is typed
`string | undefined` but is `null` at runtime, which is why
`docs/runtime/cookies.mdx` now says `string | null`; `Server.reload()`
JSDoc only mentions `fetch`/`error`; `WorkerOptions.ref` default; the
cron step-count comment) is listed in the first comment and not touched
here.
- Root `LICENSE.md` repeats the stale "CSS lexer" credit fixed in
`docs/project/license.mdx`; left alone since it is outside `docs/`.

<details>
<summary>What changed, page by page (119 pages)</summary>

**docs/bundler/bytecode.mdx**
- Line 375: '2-4x larger files' -> '2-8x larger files' to match lines
196/312; measured .jsc/.js with bun build --bytecode: tsc 3.30x,
typescript.js 3.60x, minified…
- Line 68 table: '> 5 MB' row '2.5x-4x faster' -> '2-4x faster'; page's
own tsc example (5.5 MB bundle) is 2x (line 6, executables.mdx:338);
measured tsc 2.0-2.3x,…

**docs/bundler/css.mdx**
- Default targets list: ES2020/Edge 88+/Chrome 87+ replaced with Edge
80+/Chrome 80+/Opera 67+; Firefox 78+ and Safari 14+ unchanged.
- Evidence: src/css/targets.rs:190-199 input list; es2020 expands to
chrome80/edge80/safari14.1/firefox80/opera67 (l.279-288); min-merge at
l.401.
- Effective set chrome 80, edge 80, firefox 78, safari 14, opera 67 also
appears in test/js/bun/css/css.test.ts:150-156 and commit f2063ffe87's
bundlerDefault.
- Ran: bun build --minify on `a{color:red} li::marker{color:red}` leaves
rules unmerged (::marker needs chrome/edge 86, opera 72); merges with
--target=bun.

**docs/bundler/esbuild.mdx**
- --jsx-side-effects row: n/a -> `--jsx-side-effects`, note dropped.
Arguments.rs:153/1556 (in BUILD_PARAMS); with --jsx-runtime classic it
removes @__PURE__
- Removed the second `--sourcemap` row (was line 100, alphabetical
block); it was byte-identical to line 51 in esbuild's simple-options
block, which stays

**docs/bundler/executables.mdx**
- Embed directories (~878): sentence now names both import attribute and
extra entry points; compiled test binaries showed each alone embeds
icon-<hash>.png
- Codesign (~1083): plist block retitled info.plist ->
entitlements.plist, matching prose ~1081, command ~1105 and
guides/runtime/codesign-macos-executable.mdx:31
- CompileTarget listing (~1286): added bun-linux-x64-baseline-musl;
table row 239 says musl x64 has baseline, compile_target.rs parses it,
bun-release platform.ts:79…
- API reference (~1241): added executablePath?: string; declared
bun.d.ts:3338, read JSBundler.rs:319-334, used
StandaloneModuleGraph.rs:1920; verified Bun.build +…
- (5 more, see the diff)

**docs/bundler/fullstack.mdx**
- Step 5 (line 563): `static` -> `routes`. serve.d.ts:650-726 types only
`routes`; ServerConfig.rs:660 keeps `static` as untyped fallback; page
line 6 and all examples…
- Opening example (line 9): import { serve } -> import { serve, sql }
from "bun". `bun -e 'typeof sql'` prints undefined; sql.d.ts:1030
declares sql inside declare module…

**docs/bundler/hot-reloading.mdx**
- 'Accepting other modules' example: callback now declares `newModule`
param; hmr-module.ts:790 passes new exports
(test/bake/dev/hot.test.ts:125); old code threw…

**docs/bundler/index.mdx**
- iife: replaced the TODO body with a verified sentence; --format iife
and Bun.build format:'iife' both emit (() => {...})(); no globalName in
src or bun-types
- Basic example: out/index.js now shows $jsxDEV("h1", ...) to match
Component.tsx's <h1>; bun build of the example emits jsxDEV("h1",
{children: ...}, ...)
- splitting tree: entry-a/entry-b/shared now end in .ts, matching the
sources, their ./shared.ts imports, and both build commands
- naming prose: default is now [dir]/[name].[ext], matching
options.rs:2304 PathTemplate::FILE, context.rs:247, Arguments.rs:495 and
the page's code samples
- (4 more, see the diff)

**docs/bundler/loaders.mdx**
- Intro list (line 10) now includes .json5 .xml .text .md .markdown;
src/bundler/options.rs:585-609 maps all of them by default, and bun
1.4.0 imports + `bun build`…
- text section (line 280): 'Default for .txt' -> '.txt and .text';
options.rs:601-602 map both to Loader::Text, `import t from './a.text'`
yields the string. No json5/md…

**docs/bundler/macros.mdx**
- L25 and L51: 'Stage 3' -> 'Stage 4' for import attributes; the TC39
proposal reached Stage 4 in Oct 2024 and is in ES2025 (standards fact,
not repo code).
- L115: replaced 'before plugins and before ... generates the AST' with
'after the transpiler parses the file into an AST'; parse_entry.rs:829
parse, :864 visit.
- L115 evidence cont.: macros run in the e_call visitor
(visit_expr.rs:2125-2213) and onLoad plugin contents arrive before
parsing (ParseTask.rs:2225, 2303).
- L288: added 'provided that the minify syntax option is enabled'; ran
the example: default bun build keeps the if/throw, --minify-syntax
removes it (see L129).

**docs/bundler/minifier.mdx**
- Combined Example: input block is 176 bytes (wc -c), not 158; `bun
build --minify` writes `var t=()=>42,e=t();` (20-byte file). Output
replaced; 20 bytes, 89%.
- Boolean algebra: value context prints !!x, x===!0, x&&!0, x||!1
(--minify-syntax on f(...)); only if/loop/ternary tests fold. Examples
now wrapped in if().
- Boolean algebra: dropped `x === true` -> x; no such rule exists
(simplify_boolean in src/js_parser/scan/scan_side_effects.rs:38-94
handles only !!a, &&, ||).
- Double negation: !!x -> x only in boolean tests
(scan_side_effects.rs:58); f(!!x) keeps !!x, as Unary folding shows.
First example now `if (!!x) y;` -> if(x)y;
- (1 more, see the diff)

**docs/bundler/plugins.mdx**
- onStart in Reference and section: callback is `() => void |
Promise<void>`, returns `void` like the other hooks; bun.d.ts
OnStartCallback, BundlerPlugin.ts:248
- onLoad example: `});` -> `};`, `import { plugin }` -> `import type {
BunPlugin }`; original fails bun parse and tsc TS2304, fixed copy
bundles cleanly
- Rust example now passes `loader` (crate lib.rs:78-80) and drops unused
BunLoader import; ParseTask.rs:2151 applies it, jsx loader rejects TS
syntax in .tsx
- Moved `### onEnd` verbatim from `## Native plugins` into `## Plugin
lifecycle` after .defer(); it is a JS builder hook
(BundlerPlugin.ts:271); anchor unchanged
- (2 more, see the diff)

**docs/bundler/standalone-html.mdx**
- L28: webarchive/MHTML (RFC 2557; Chrome format, see
bun-inspector-protocol v8 protocol.json:10409) are single files; edited
attribution and failure clause
- L28 clause "unpack into a folder of loose files" describes
Webpage-Complete saves, not these formats; replaced with "only some
browsers can open them"

**docs/guides/deployment/google-cloud-run.mdx**
- L23 Step title 'by select/creating a project' -> 'by selecting or
creating a project'; matches L25 body ('select an existing project or
create a new one'); no docs link…

**docs/guides/deployment/railway.mdx**
- L97 dashboard link: changed http://railway.com/dashboard to https://;
L15, L18, L26, L138 on the same page all use https://railway.com (grep
confirmed L97 was the only…

**docs/guides/deployment/vercel.mdx**
- L129: snippet title index.ts -> server.ts; page entrypoints are
server.* (L39-40, L46, L57) and api/server.ts (L69). bun -e of that line
prints runtime 1.4.0.

**docs/guides/ecosystem/astro.mdx**
- L71 caption 'An Astro v3 starter app' -> 'An Astro starter app': L61
output says 'astro v7.2.2'; commit 5638c62153 bumped v3.1.4->v7.2.2 but
left caption; image URL…

**docs/guides/ecosystem/discordjs.mdx**
- L29: 'Discord's [setup walkthrough]' -> 'The Discord.js guide's [setup
walkthrough]'; link is discordjs.guide, which repo commit 14bcc6c534
describes as the discord.js…
- L38: 'Discord's [guide to adding a bot]' -> 'the Discord.js [guide to
adding a bot]'; same discordjs.guide link; kept 'Discord's developer
portal' on L29 since that…

**docs/guides/ecosystem/docker.mdx**
- L124: replaced the `Hello, World!` promise with 'your application's
response'; no index.ts or app is defined anywhere on the page (true
since the guide was added in…

**docs/guides/ecosystem/elysia.mdx**
- L24 log string read 'running at on port ...'; removed stray 'at ' so
it reads 'running on port ${app.server?.port}'. Ran the template literal
with a Bun.serve stand-in;…

**docs/guides/ecosystem/neon-serverless-postgres.mdx**
- L37: neon(process.env.DATABASE_URL) ->
neon(process.env.DATABASE_URL!), matching neon-drizzle.mdx:37; bun init
tsconfig sets strict (tsconfig.default.json:19)
- Evidence: @types/node ProcessEnv extends Dict<string> (values string |
undefined); tsc in a bun init -y project gave TS2345 on that line, none
after adding !
- Caveat: @neondatabase/serverless is unavailable offline;
neon(connectionString: string) was mirrored in a local stub. Bun strips
the !, so runtime is unchanged

**docs/guides/ecosystem/vite.mdx**
- Note link 'HTML imports' -> /bundler/fullstack (was
/bundler/html-static): fullstack.mdx:58 documents them;
html-static.mdx:478 and server.mdx:71 link there

**docs/guides/http/stream-file.mdx**
- Line 7: 'reads a file from disk and returns a BunFile' -> 'accepts a
path and returns a lazily-loaded BunFile'; Blob.rs:3689 -> Store.rs:146
init_file stores path only,…
- Line 17: 'reads the Content-Type from the file' -> 'determines the
Content-Type from the file extension'; Store.rs:105 mime_from_path_ext;
nonexistent ./img.png =>…

**docs/guides/install/custom-registry.mdx**
- Added .env.production.local to the list of files bun install loads;
PackageManager.rs:1895 passes DotEnvFileSuffix::Production and
env_loader.rs:709-736 loads…
- Confirmed by running bun install in a dir with all 8 dotenv variants:
stderr lists ".env.production.local", ".env.local", ".env.production",
".env" regardless of NODE_ENV

**docs/guides/install/registry-scope.mdx**
- Added .env.production.local to bun install env list (l.31);
PackageManager.rs:1895 uses Suffix::Production, env_loader.rs:709-736 +
bun install output confirm

**docs/guides/process/stdin.mdx**
- Comment 'assumes ASCII encoding' -> 'assumes UTF-8 encoding':
JSBuffer.cpp:2304 toStringBody defaults to utf8; bun -e on bytes c3 a9
e2 82 ac decodes to 'é€'; snippet…

**docs/guides/read-file/mime.mdx**
- Block declared `const file` 3x; running it errored '"file" has already
been declared'. Renamed 2nd/3rd to html/image; now runs, output matches
comments.
- MIME comments verified: bun prints application/json;charset=utf-8,
text/html;charset=utf-8, image/png; same strings in
src/http_types/MimeType.rs:271,274,1174.

**docs/guides/runtime/build-time-constants.mdx**
- Value format: 'Values must be valid JSON' -> 'Values can be JSON,
identifiers, or property paths such as globalThis or console.log'.
defines.rs:345-386 builds an…

**docs/guides/runtime/set-env.mdx**
- Added
`.env.production.local`/`.env.development.local`/`.env.test.local` as
the highest-precedence bullet; src/dotenv/env_loader.rs:694-737 loads
them first with…

**docs/guides/test/migrate-from-jest.mdx**
- Line 119 'File a feature request' linked to repo root; now links to
https://github.com/oven-sh/bun/issues/new?template=4-feature-request.yml,
same URL as…

**docs/guides/test/skip-tests.mdx**
- Output block now matches the 1-test source: removed add/multiply and
'2 expect() calls', '2 pass'->'0 pass', 'Ran 3 tests'->'Ran 1 test'.
- Evidence: ran snippet under TTY (script -qec 'bun test'): '»
unimplemented feature / 0 pass / 1 skip / 0 fail / Ran 1 test across 1
file.'
- Source: src/runtime/cli/test_command.rs:197 ('»' skip marker), :2944
(expect() line only when count > 0), :1545 (singular 'test' when 1).

**docs/guides/test/todo-tests.mdx**
- First `bun test` output block now matches the single test.todo source:
removed add/multiply lines, 2 pass -> 0 pass, dropped expect() line, Ran
1 test. Verified by…
- expect() calls line is only printed when count > 0
(src/runtime/cli/test_command.rs:2944); summary reads 'Ran 1 test across
1 file.' (test_command.rs:1545); glyph is ✎…
- `--todo` output block: my.test.ts -> test.test.ts, the only file name
the page uses. Rest of that block (✗, caret message, 0 pass/1 fail/1
expect, exit 1) matches a…

**docs/guides/websocket/pubsub.mdx**
- Line 7 prose: socket.publish(<name>, <message>) ->
server.publish(<name>, <message>), matching the only example
(server.publish at lines 28/32/36).
- Evidence: ws.publish skips the sender unless publishToSelf
(ServerWebSocket.rs:306; flags default empty,
WebSocketServerContext.rs:125; serve.d.ts:490).
- Runtime check with two clients: ws.publish from a reached only b;
server.publish reached a and b, so the example comment 'to everyone'
fits server.publish.
- History: example moved from ws.publish to server.publish in #6739 and
#8855; the intro sentence was never updated.

**docs/guides/write-file/blob.mdx**
- First example now writes a Blob (const data = new Blob(["Lorem
ipsum"]); await Bun.write(path, data)); prose/title say Blob but snippet
was a string copy of…

**docs/installation.mdx**
- Line 119 'Add this line' -> 'Add these lines': block has 2 exports,
and src/runtime/cli/install.sh:231-234/263-266/313-314 appends
BUN_INSTALL + PATH lines

**docs/pm/catalogs.mdx**
- L243: --catalog=<name> now says it adds to catalogs.<name> and writes
"catalog:<name>"; add_catalog.rs:188-196 reference_literal, :281-284
entries_object,…

**docs/pm/cli/install.mdx**
- Line 38: added 'unless they are `[trusted](/pm/lifecycle)`';
lockfile.rs:3105-3163 has_trusted_dependency runs scripts for
trustedDependencies or the 367-entry default…
- Line 363: 'hardlink on Linux' -> 'on Linux and Windows';
PackageInstall.rs:252-256 SUPPORTED_METHOD is Hardlink on every
non-macOS target, Windows task uses…
- Line 463: 'default backend on Linux' -> 'on Linux and Windows';
CommandLineArguments.rs:48-50 prints "hardlink" (default) on non-macOS;
matches global-cache.mdx:57.…
- L491: removed '(and eventually `link:`)'; now 'used for `file:` and
`link:` dependencies', same wording as docs/pm/global-cache.mdx:61
- (2 more, see the diff)

**docs/pm/cli/outdated.mdx**
- lodash row: catalog (@test/app, @test/app) -> catalog (@test/app).
Local verdaccio run of bun outdated -r lists each workspace once, e.g.
catalog (a, b)
- Duplicate name only reproduces when root package.json shares a
workspace name (fixture artifact); outdated_command.rs:216-283 pushes
one entry per package id

**docs/pm/cli/patch.mdx**
- Step 2: attributed the diff to `bun patch --commit <pkg>`;
prepare_patch (patchPackage.rs:700-1005) only delete_tree+FileCopier
copies from cache, git diff runs in…

**docs/pm/global-cache.mdx**
- Line 44 now says hardlinks on Linux and Windows: PackageInstall.rs:252
SUPPORTED_METHOD defaults to Hardlink on every non-macOS target
(CreateHardLinkW on Windows);…
- Line 61: dropped '(and eventually `link:`)'. link: -> resolution
Tag::Symlink -> install_from_link (PackageInstaller.rs:1825, symlinkat);
bun install of link:mylib…

**docs/pm/global-store.mdx**
- L57: first 6.6x -> 6.7x. Table: 840.9/124.8 = 6.738 (isolated, no
store); 823.9/124.8 = 6.602 is the hoisted ratio, so the second 6.6x
stays.
- L34: 'The previous isolated linker called' -> 'Without the global
store, the isolated linker calls' (same-sentence tense too). Store is
off by default.
- L34 evidence: Enable::default() (PackageManagerOptions.rs:977) omits
GLOBAL_VIRTUAL_STORE; Installer.rs:1176-1300 still clones/hardlinks each
entry when off.

**docs/pm/isolated-installs.mdx**
- Line 217 (From pnpm): now says Bun keeps its store in
node_modules/.bun/ by default and links to #global-virtual-store;
globalStore is opt-in…

**docs/pm/npmrc.mdx**
- Lines 53/89: install.scopes links now use #install-scopes;
docs/runtime/bunfig.mdx:582 has its own '### install.scopes' heading
(registry is :559).
- Line 92: bunfig snippet now notes password is not base64 encoded,
unlike .npmrc _password (src/ini/lib.rs:1129-1151 decodes;
src/bunfig/bunfig.rs:1213 verbatim).
- Evidence: local registry + bun install, NPM_PASSWORD=c2VjcmV0 gave
different Authorization headers for .npmrc vs bunfig; edited snippet
parses and sends user:secret.

**docs/pm/overrides.mdx**
- Tree at line 36: foo@1.2.3 -> foo@2.3.4. All four package.json blocks
declare foo ^2.0.0; Bun.semver.satisfies('1.2.3','^2.0.0') is false,
'2.3.4' is true.

**docs/pm/security-scanner-api.mdx**
- Related 'Package Manager' link: /installation -> /pm/cli/install.
docs/installation.mdx is 'Install Bun'; docs.json Package Manager tab
starts at /pm/cli/install;…

**docs/project/benchmarking.mdx**
- Deleted ", which the harness and tooling key on" (Heap profiling);
"the harness" is test/js/node/test/common/prof.js:10 filtering
.heapprofile, internal only.
- Clause added in 43caaf38f9 (#34660); no other "harness" in docs/. Kept
Node-contract claim: bun --heap-prof wrote Heap.*.heapprofile
(BunHeapProfiler.rs:127)

**docs/project/bindgen.mdx**
- L66-67 'the generated module' -> hand-written in
src/jsc/bindings/GeneratedBindings.rs; bindgen.ts:4-6,
GeneratedBindings.rs:1-7, jsc/lib.rs:1859-1863 say so.
- bindgen.ts:1218-1221/1303 and scripts/build/codegen.ts:856-884 show
bindgen outputs only GeneratedBindings.cpp + Generated*.h, no .rs;
crate::r#gen path kept…
- L81 'The generated callback constructor' -> 'The hand-written callback
constructor'; create_required_and_optional_arg_callback is hand-written
at GeneratedBindings.rs:38.
- Unlisted, same code block: L33 global.throw_pretty -> global.throw; no
throw_pretty exists in src, JSGlobalObject.rs:837 has throw(Arguments),
bindgen_test.rs:42 uses it.

**docs/project/building-windows.mdx**
- Extra paths: build/debug/cache/webkit/ ->
$Env:BUN_INSTALL\build-cache\webkit-<version>-debug (-arm64-debug on
ARM64); config.ts:939-947 + webkit.ts:81-102, build.ninja…
- Tests: 'bun test' / 'bun node:test' wrapper -> 'bun-debug test' / 'bun
run test'; package.json node:test runs runner --node-tests with
$npm_execpath (Node subset, not…

**docs/project/license.mdx**
- Removed 'CSS lexer' from the esbuild credit and added a Lightning
CSS/Servo credit: src/css/README.md says src/css derives from those;
esbuild css_scanner.zig deleted…
- Added ls-hpack, ls-qpack, lsquic rows: scripts/build/deps/index.ts
builds them into the binary; vendor/*/LICENSE are MIT,
lsquic/LICENSE.chrome BSD-3; wording matches…
- Added libjpeg-turbo, libspng, libwebp, highway rows (deps/index.ts
direct builds; vendor license files: IJG+BSD3+zlib, BSD-2, BSD-3,
Apache-2.0/BSD-3 dual) as in…
- Added HdrHistogram_c (deps/hdrhistogram.ts, vendor LICENSE.txt: CC0 or
BSD-2) and sqlite on Linux/Windows (config.ts:900 staticSqlite =
!darwin; amalgamation is public…

**docs/runtime/archive.mdx**
- Both `[Bun.Glob](/docs/api/glob)` links (lines 286, 295) now point to
/runtime/glob; docs/api/ does not exist, docs/runtime/glob.mdx does (git
show 1606a9f24e:…
- Error-handling bullet (line 232) `new Archive()` -> `new
Bun.Archive()`; bun -e: typeof Archive is undefined, typeof Bun.Archive
is function; bun-types globals.d.ts has…

**docs/runtime/auto-install.mdx**
- Accordion title line 84: 'different from Yarn Plug'N'Play does?' ->
'different from what Yarn Plug'N'Play does?', matching the pnpm/Deno
sibling titles (lines 78, 90);…

**docs/runtime/binary-data.mdx**
- L23: 'ECMAScript v5 (2009)' -> 'ECMAScript 2015 (ES6)'.
vendor/WebKit/JSTests/test262 ArrayBuffer/TypedArray tests carry es6id
(9 files), none es5id.
- L130 Float16Array range -> '-6.55e4 to 6.55e4'. bun: new
Float16Array([-65504])[0] is -65504, [-610400] gives -Infinity. Row
width kept at 298 chars.
- L341 WritableStream link now .../Web/API/WritableStream (was the
ReadableStream URL); docs/runtime/streams.mdx:8 has the same sentence
with the right URL.
- L206 new Uint8Array(arr) -> new Uint8Array(arr1): the snippet only
defines arr1; run as written bun throws ReferenceError: arr is not
defined.
- (7 more, see the diff)

**docs/runtime/bun-apis.mdx**
- TCP row: Bun.connect now links to
/runtime/networking/tcp#create-a-connection-bun-connect; tcp.mdx:115
heading 'Create a connection (`Bun.connect()`)', slug matches…

**docs/runtime/bunfig.mdx**
- Global vs. local: scoped the global .bunfig.toml to package manager
commands; command_tag.rs:93-110 read_global_config() lists only
install/pm/bunx-type commands.
- Global vs. local: added 'Only package manager commands (...) read the
global file'; verified: global preload/run.silent ignored by bun run,
bun file, bun test; bun pm…
- install.dryRun: first sentence was inverted ('actually installs'); now
'resolves dependencies without installing them', matching the key,
bunfig.rs:1333 (dryRun ->…

**docs/runtime/c-compiler.mdx**
- flags prose said 'array of strings'; heading/type block say string |
string[]; ffi_body.rs:1056-1091 accepts both; ran cc({flags:"-DFOO=9"})
-> 9. Prose now 'string or…
- u64 row now lists `usize` (line 69): src/runtime/ffi/abi_type.rs:84
maps usize=>Uint64T; cc() uses the same ABIType::LABEL table
(ffi_body.rs:1026,1786,1819).
- Verified: cc({args:['usize'],returns:'usize'}) on a uint64_t C fn
printed 42n; matches docs/runtime/ffi.mdx:146 and
packages/bun-types/ffi.d.ts:431.

**docs/runtime/child-process.mdx**
- Output streams prose: now says stdout is a ReadableStream and stderr
is inherited (proc.stderr undefined unless stderr: "pipe");
js_bun_spawn_bindings.rs:335 defaults…
- Reference OptionsObject: added cgroup?: string | number;
bun.d.ts:7097, js_bun_spawn_bindings.rs:698, runtime error says cgroup
must be 'string or number'
- Reference Terminal: added
inputFlags/outputFlags/localFlags/controlFlags: number;
Terminal.classes.ts:46-61, Terminal.rs:1357-1466, runtime prototype
lists all four as…
- Same reference block (not in items): terminal?: TerminalOptions
changed to TerminalOptions | Terminal to match bun.d.ts:7436 and the
page's own Reusable Terminal section

**docs/runtime/color.mdx**
- Line 262: 'writes the following to client-side.js' -> 'prints the
following to stdout'. build_command.rs:174-176 output_to_stdout; ran
`bun build ./client-side.ts`:…

**docs/runtime/cookies.mdx**
- set(name, value) heading now lists options?: CookieInit;
JSCookieMap.cpp:404-411 applies a 3rd arg (bun -e verified), matching
the Types block and http/cookies.mdx usage.
- Added delete(name, options: Omit<CookieStoreDeleteOptions, "name">)
heading; JSCookieMap.cpp:449-455 accepts it (bun -e verified) and the
Types block already listed it.
- Types block: added set(cookie: Cookie): void; JSCookieMap.cpp:382-386
has a dedicated branch and the page's headings/example already document
it.
- Types block domain?: string -> domain: string | null; JSCookie.cpp:641
uses IDLNullable, bun -e prints null, cookie-map.test.ts:10 toBeNull,
Properties block says null.
- (1 more, see the diff)

**docs/runtime/cron.mdx**
- L402: "work regardless of other fields" -> "use Repetition only when
the other four fields are unrestricted"; cron.rs:2859-2868 needs wild
day/wday/month+24h
- Extra, not in items: "0 9 * * MON-FRI" row said 5 triggers;
cron.rs:2935 and 2962-2968 emit one CalendarTrigger with ScheduleByWeek,
so count changed to 1

**docs/runtime/csrf.mdx**
- Intro: "expiration timestamp" -> "issue timestamp and an expiry
duration"; src/csrf/lib.rs:122-126 token layout is
timestamp|nonce|expires_in|signature.
- generate(): contents now list nonce, issue timestamp, expiresIn
duration, HMAC signature; bun -e decoded hex token: bytes 0..8 =
Date.now(), 24..32 = 3600000.

**docs/runtime/debugger.mdx**
- captureStackTrace snippet: `throw err;` -> `throw new Error("here!")`;
as written, bun 1.4.0 printed `ReferenceError: err is not defined`, not
`Error: here!`
- Output block now matches running the fixed index.ts from /path/to
(frames :3:15, :7:5, top-level `at /path/to/index.ts:18`); old block had
lines 4/8/17, file.js, and…

**docs/runtime/environment-variables.mdx**
- Added missing highest-precedence bullet
`.env.{production,development,test}.local`:
src/dotenv/env_loader.rs:702-736 loads it first (OVERRIDE=false); bun -e
printed…

**docs/runtime/ffi.mdx**
- Pointers accordion: 'about 11 bits of extra space' -> '1 bit'; the
page's own figures are 52 addressable vs 53 usable bits (53-52=1);
FFI.h:205 also calls pointers…
- Callbacks examples (2 places): new CString(ptr, length) -> new
CString(ptr, 0, Number(length)); arg 2 is byteOffset per
JSFFICString.cpp:59-61, ffi.d.ts:1049; bun -e:…
- Number() is needed too: a usize callback arg arrives as a BigInt
(invoked via CFunction, got 5n) and JSFFICString.cpp:70 silently drops a
BigInt byteLength; fixed…
- FFI types table: added `usize` to the u64 aliases; abi_type.rs:84 and
src/js/bun/ffi.ts:47 map usize to u64 (FFIType.usize === 8 at runtime),
ffi.d.ts:431 types it,…

**docs/runtime/file-io.mdx**
- Reference: writer(params: ...) -> writer(params?: ...); bun.d.ts:2430
declares options? and the page's own snippets call file.writer() with no
args (runs fine).
- Reference: added bytes(): Promise<Uint8Array> and delete():
Promise<void> to BunFile, which the page's prose documents (lines 35,
74); verified at runtime and…

**docs/runtime/file-types.mdx**
- css section: 'full-stack applications' link now /bundler/fullstack
(was /bundler/html-static); server.mdx:71, executables.mdx:597,
html-static.mdx:492 agree
- Intro list: added `.text` `.md` `.markdown`;
src/bundler/options.rs:644,668,677 map them by default, and `bun
run`/`bun build` on .text/.md/.markdown files work. Item's…
- text section: 'Default for `.txt`.' -> 'Default for `.txt` and
`.text`.'; options.rs:668 `.text` => Loader::Text, and importing
file.text at runtime prints the string;…

**docs/runtime/glob.mdx**
- Removed 'with additional features' (line 164): pattern arrays and
exclude are Node's own API (@types/node fs.d.ts:4597,4621;
src/js/internal/fs/glob.ts:4 is a port of…

**docs/runtime/globals.mdx**
- Item 2 (JSON): Source 'Web' -> 'Cross-platform'. JSON is installed by
JSC itself (vendor/WebKit/.../JSGlobalObject.cpp:423), same class of
global as globalThis (line…
- Item 2 (ShadowRealm): Source 'Web' -> 'Cross-platform'. TC39 proposal
installed by JSC (JSGlobalObject.cpp:1870, enabled in
src/jsc/bindings/ZigGlobalObject.cpp:318),…

**docs/runtime/hashing.mdx**
- HMAC: deleted clause claiming .digest() is unsupported;
CryptoHasher.rs:777-786 consumes HMAC in final_: digest() works once
(examples verified), then throws
- update() table: removed "binary" from Binary encodings row (kept in
Legacy row); types.rs:637 binary => Latin1, update(s, "binary") hashes
same bytes as latin1
- bcrypt Output: removed trailing ";"; bcrypt output is 60 chars of
[./A-Za-z0-9]; verify("hello", hash) is true without ";", throws
InvalidEncoding with it

**docs/runtime/http/routing.mdx**
- Item 1: line 6 #fetch -> #fetch-request-handler; only heading is '##
`fetch` request handler', no {#fetch} id; cf. server.mdx
#server-timeout-request-seconds
- Item 2: {% callout %} block (old lines 211-213) is now
<Info>...</Info>, words unchanged; docs/ is Mintlify (docs.json), grep
found no other '{%' in docs
- Item 4: same callout as item 2, same edit; <Info> matches this page's
other callout and how 1606a9f24e migrated old {% callout %}
(error-handling.mdx:40)

**docs/runtime/http/server.mdx**
- Reference reload() comment now lists fetch, error, routes, websocket:
matches line 351 and server_body.rs on_reload_from_zig; bun -e reload()
swapped both
- Reference reload() now (options: Serve.Options<undefined>): Server;
serve.d.ts:959 returns Server, bun -e reload()===server true; tsc: bare
Serve is namespace
- publishToSelf comment (line 689) now says ws.publish() also sends to
the publishing socket; matches serve.d.ts:490 and ServerWebSocket.rs:306
do_publish;…

**docs/runtime/http/tls.mdx**
- Line 17 key/cert type list now ends with 'or an array of those';
bun.d.ts:4344,4355 and SSLConfig.bindv2.ts:14 accept arrays, and
Bun.serve with array key/cert served…

**docs/runtime/http/websockets.mdx**
- Line 12: 'requests per second' -> 'messages per second';
bench/websocket-server/chat-client.mjs prints 'messages per second' and
the table header is 'Messages sent per…
- Line 235: '.publish(data)' -> '.publish(topic, data)'; serve.d.ts:159
publish(topic, data, compress?), ServerWebSocket.rs:826-855;
ws.publish('x') throws 'requires a…

**docs/runtime/image.mdx**
- Backends table: macOS 'Resize / rotate / flip' cell now 'Accelerate
vImage ³' + footnote that only the default lanczos3 resize uses vImage,
other filters use Highway…

**docs/runtime/index.mdx**
- Removed 'Cleaning...' from the `bun run clean` output block; ran the
page's package.json with `bun run clean`: prints `$ rm -rf dist && echo
'Done.'` then `Done.` only.
- Replaced stale `bun run` (no args) sample ('quickstart scripts:' ...
'2 scripts') with real tail: '...' then 'package.json scripts (2
found):' + '$ bun run clean'…

**docs/runtime/json5.mdx**
- Line 136: 'used as the indent character' -> 'used as the indent string
for each level'. JSON5Object.rs:409-418 appends the string (clamped to
10 chars) once per indent…

**docs/runtime/jsonl.mdx**
- Uint8Array streaming example: buf.slice(read) -> buf.subarray(read);
prose above says subarray/zero-copy, bun.d.ts:1195 uses subarray; edited
snippet runs.
- Dropped "using SIMD-accelerated conversion": BunObject.cpp:486/585
decode via fromUTF8ReplacingInvalidSequences, a scalar loop
(UTF8Conversion.cpp:92-152).

**docs/runtime/jsx.mdx**
- jsx table react-jsx row: jsx("Box", { width: 5 }, "Hello") -> jsx(Box,
{ width: 5, children: "Hello" }); matches `bun build` output with jsx:
react-jsx
- Replaced "Box" with Box in the jsxDEV rows of both tables and the two
jsx() rows of the jsxImportSource table; parser.rs:757-780 makes
capitalized tags identifiers
- jsxImportSource react-jsxdev row comment now says /jsx-dev-runtime is
appended; src/options_types/jsx.rs:233-239 appends /jsx-dev-runtime in
development
- Re-padded header/separator/rows of the two edited tables so every row
stays one line and columns stay aligned (whitespace only, lines 34-39
and 67-71)

**docs/runtime/markdown.mdx**
- L105: removed 'React elements, ' from the render() intro;
bun.d.ts:1527-1570 RenderCallbacks return string|null|undefined and
render(): string (bun.d.ts:1717-1721)
- Same passage (item 2, duplicate of item 1): MarkdownObject.rs:1246
to_slice()s the callback result; `bun -e` returning an object from
heading gave "[object Object]"

**docs/runtime/module-resolution.mdx**
- L234 'Subpath imports and conditional imports' -> 'Subpath exports and
conditional exports': the example is an exports map; page uses 'subpath
imports' for the #…
- import.meta.resolve table cell changed zod/index.ts -> index.js to
match the code block; verified with a fake node_modules/zod (exports ->
./index.js) that bun prints…
- Moved the ### NODE_PATH block (added mid-narrative in 98d1a9d110)
below the legacy-fields block, so 'Once it finds the foo package' now
follows L180; heading set and…

**docs/runtime/networking/fetch.mdx**
- sendfile bullet: 'particularly effective for HTTP (not HTTPS)' -> Bun
only uses it for HTTP, not on Windows. SendFile.rs:17-23 is_eligible =
!windows && url.is_http()…
- Added 'or the compress option' to the proxy condition:
webcore/fetch.rs:1728 requires proxy.is_none() && compress.is_none().
Local run: http 64KB body read lazily…

**docs/runtime/networking/tcp.mdx**
- L84: added 'or an array of these' to the key/cert type list;
SSLConfig.bindv2.ts:9-15 + bun.d.ts:4344/4355 allow arrays, and
Bun.listen with key:[BunFile] worked at…

**docs/runtime/networking/udp.mdx**
- Moved the drain sentence out of the sendMany bullet into its own
paragraph ('In either case, Bun calls the drain socket handler...'); it
applies to send() too.
- Evidence: send (udp_socket.rs:1545-1554, returns res > 0) and sendMany
(udp_socket.rs:1446-1450) both call us_udp_socket_send (udp.c:47-81).
- udp.c:66-77 re-arms LIBUS_SOCKET_WRITABLE on any would-block or
partial batch; loop.c:1048-1056 then calls on_drain. dgram.ts:271-275
relies on send()===false -> drain.
- History: original docs (e2c36aabff docs/api/udp.md:113-115) had the
sentence as a standalone line after both bullets; prettier folded it
into the second bullet.

**docs/runtime/plugins.mdx**
- L172: link #what-is-a-namespace -> #namespaces; grep of docs/ finds no
such anchor, the only related heading is '### Namespaces' on this page
(L88).
- L8: dropped `.yaml` as a plugin-added file type; options.rs:597-598
maps .yaml/.yml to Loader::Yaml, data.yaml imports with no plugin, L52
lists yaml.
- L25, L102: onStart is now `(callback: () => void | Promise<void>):
void`; bun.d.ts:5774 allows Promise, BundlerPlugin.ts:256-268 awaits it
and returns this.
- L225/L237: now `import type { BunPlugin }` and `};`; `bun build
--no-bundle` on the old block failed 'Expected ";" but found ")"'; fixed
block runs and builds.

**docs/runtime/redis.mdx**
- Note ~L229: subscribed client may call subscribe(), unsubscribe(),
ping(); js_valkey_functions.rs:1870 require_subscriber for unsubscribe,
ping unchecked, redis.d.ts:2697
- Pub/Sub examples L194/L207: 6739 -> 6379; implementation default port
is 6379 (js_valkey.rs:542, :663) and the page's own L55 default and Note
example use 6379

**docs/runtime/s3.mdx**
- Static S3Client.write example now passes `credentials`; without
options S3File.rs:132-145 builds the store from env creds (bun -e threw
ERR_S3_MISSING_CREDENTIALS).
- S3Client.list example: added the missing comma after `startAfter:
...key`; `bun build --no-bundle` failed on the block as written, parses
after the fix.
- Supabase example endpoint changed to .../storage/v1/s3, matching the
page's prose; presign shows Bun builds <endpoint>/<bucket>/<key>, so the
extra segment was wrong.
- `S3Client` objects example: added `const file =
client.file("my-file.txt");` (git show 24a2c9b50c removed the
definition); offline part runs, block parses.
- (1 more, see the diff)

**docs/runtime/secrets.mdx**
- CLI example: get now reads my-app.com/github-token, matching the set
calls above it (was gh-cli/github.com, which the example never stores).
- CLI example fetch URL /name -> /user, matching the top example (line
30) fixed in dce7a02f4d; ran snippet with stand-ins, set/get keys now
match.

**docs/runtime/shell.mdx**
- Features bullet `.bun.sh` -> `.sh`: run_command.rs:937 checks suffix
".sh"; `bun ./script.sh` runs; page's `.sh` loader section and
loaders.mdx:458 say `.sh`
- Removed stale 'Partially implemented: mv (missing cross-device
support)': mv.rs:480-499 falls back to move_across_devices on EXDEV; mv
/tmp -> /dev/shm works
- '.lines() on a completed command' -> 'on a piped command': ShellOutput
(builtins/shell.ts:74-104) has no lines(); awaited result .lines is
undefined
- Reset-env example now calls `$.env()` as the prose says
(shell.ts:265-267); `.env(undefined)` was a per-command reset
(shell.ts:158-162); prints bar, then empty
- (1 more, see the diff)

**docs/runtime/sql.mdx**
- Moved 'Only one command per query...' bullet from the prepare:false
reasons list into the effects list; prepare:false still uses Parse/Bind…
- Deleted 'including secure password exchange over non-SSL connections';
MySQLConnection.rs:857-866 refuses RSA key retrieval without TLS unless
allowPublicKeyRetrieval,…
- Removed Roadmap bullet for `--db-preconnect`; `--sql-preconnect`
exists (Arguments.rs:294, run_command.rs:1354-1373, bun --help) and is
documented as working at…
- Replaced the 53-bit claim: PG int8 is always a string unless bigint
(DataCell.rs:767-775; sql.test.ts:997 returns "2147483649"), MySQL
BIGINT is a string outside…
- (1 more, see the diff)

**docs/runtime/sqlite.mdx**
- Integers intro: '52-bit' -> '53-bit'. bun -e prints
Number.MAX_SAFE_INTEGER === 2**53-1; page itself says 'larger than 2^53'
and '53 bits' in the same section.
- .values() output block replaced with '[ [ "Hello world" ] ]' / '[ [ 2
] ]'; running the snippet returns exactly those (movies output belonged
to a different query).
- .run() example SQL changed to 'create table foo (bar text);'.
db.query('create table foo;') throws 'near ";": syntax error'; new SQL
returns…
- safeIntegers:false: 'truncates any bits beyond 53' -> 'rounds integers
beyond 53 bits to the nearest representable number'. SELECT
9007199254741095 returns ...096…

**docs/runtime/streams.mdx**
- L47 'copies each chunk into a queue' -> 'adds each chunk to a queue':
StreamQueue.h:138 stores a WriteBarrier to the value; read() returns the
same object
- L59 deleted 'no need to clone the chunk data into memory': enqueue
never clones; a JS-consumed direct stream copies into an ArrayBufferSink
(value !== chunk)
- L45 dropped 'data copying and': both paths write via the same sink
(BunStreamSource.cpp rsisSinkWrite vs readDirectStream); direct only
skips the queue

**docs/runtime/templating/create.mdx**
- Accordion remote branch scoped to elysia/elysia-buchta/stric; other
names go to bunx create-<t> (cli/mod.rs:1784,1867-1891; bun create remix
ran create-remix)
- Lead-in added before steps 4-8: they apply to remote, GitHub and local
(create_command.rs:741-1171 shared; bun create elysia rewrote pkg,
installed, git init)
- Added start row to table (create_command.rs:777 default bun dev, :1018
read, :1244 printed; ran local template); array sentence now names
pre/postinstall

**docs/runtime/templating/init.mdx**
- Cursor bullet now notes CURSOR_AGENT_RULE_DISABLED, matching the
Claude bullet; src/runtime/cli/init_command.rs:1560-1561 checks it, and
CURSOR_TRACE_ID=1…

**docs/runtime/transpiler.mdx**
- Reference: scan() imports: Import -> Import[]; bun-types bun.d.ts:2845
has Import[], JSTranspiler.rs:1631 builds an array, Array.isArray(...)
is true

**docs/runtime/utils.mdx**
- L127 'lowest 48 bits' -> 'most significant 48 bits': uuid.rs:189-195
writes the timestamp big-endian into bytes 0-5; bun -e with ts
0x0192ce1126d5 printed it as bytes…
- L133 'final 8 bytes ... random' now excepts the two variant bits:
uuid.rs:204 sets byte 8 = 0x80 | (random & 0x3F); 200 samples all had
byte 8 top bits == 0b10.
- Bun.inspect example (utils.mdx:653/657) declared `const str` twice;
running it gave `error: "str" has already been declared`. Made both
calls bare expressions (page's…
- Same block, line 654: shown output '{\nfoo: "bar" \n}' did not match
actual Bun.inspect({foo:"bar"}) which is '{\n foo: "bar",\n}' (verified
with bun -e, strict ===);…

**docs/runtime/watch-mode.mdx**
- --hot example: changed the command block after 'run this file with bun
--hot server.ts' from 'bun --hot index.ts' to 'bun --hot server.ts';
snippet title and prose both…
- Line 15 scope sentence now also lists bun build: --watch is in
BUILD_ONLY_PARAMS (src/runtime/cli/Arguments.rs:447) and handled in
parse_build_command_options (:2214);…

**docs/runtime/webview.mdx**
- Intro line 20: 'On Linux and Windows it drives an installed Chrome' ->
'On Linux ...'; now matches the Backends table (macOS / Linux).
ChromeProcess.rs:110-122 returns…

**docs/runtime/workers.mdx**
- ref() section: intro sentence now says `ref: false` is equivalent to
worker.unref(). JSWorker.cpp:192-196 sets options.unref=!ref;
WorkerOptions.h:21 unref defaults…
- Line 115: self.postMessage link changed from MDN Window/postMessage to
DedicatedWorkerGlobalScope/postMessage. Worker.cpp:389-408 and
globals.d.ts:1388 take (message,…

**docs/runtime/yaml.mdx**
- Line 16: 'over 90% of the official YAML test suite' + 'working toward
100%' -> 'passes the official YAML test suite';
test/js/bun/yaml/yaml-test-suite.test.ts (402…
- Line 73: dropped 'full' from 'supports the full YAML 1.2
specification'; bun -e shows '!<tag:yaml.org,2002:int> 42' -> "42",
'!!int 1.5' -> 1.5, '%YAML 2.0' accepted;…

**docs/snippets/cli/add.mdx**
- --ignore-scripts: dropped '(dependency scripts are never run)';
PackageInstaller.rs:1954-1995 enqueues trusted deps' scripts, gated by
Do::RUN_SCRIPTS at :2470
- Verified: bun add ../dep with dep in trustedDependencies ran dep
postinstall (marker file); with --ignore-scripts neither root nor dep
script ran

**docs/snippets/cli/build.mdx**
- Added --compile-autoload-{dotenv,bunfig,tsconfig,package-json} and
their --no-* pairs under Standalone Executables; defaults
true/true/false/false per…
- Added --compile-executable-path and --asset (requires --compile) under
Standalone Executables; src/runtime/cli/Arguments.rs:440-443, 2237-2244,
2331-2337
- Added --metafile and --metafile-md under Output & File Handling;
Arguments.rs:458-461, verified `bun build a.ts --outdir d --metafile`
writes meta.json
- Added --allow-unresolved (default *) and --reject-unresolved under
Bundling Options; Arguments.rs:486-489, 2094-2113, verified both flags
with bun 1.4.0
- (1 more, see the diff)

**docs/snippets/cli/init.mdx**
- Line 35 <pre><code> rendered 3 commands as one line (react-dom render
confirmed); split with {"\n"} into the 3 separate commands shown by `bun
init --help`.

**docs/snippets/cli/install.mdx**
- --ignore-scripts: dropped false 'Bun never runs dependency scripts';
trusted dep postinstall ran without flag, skipped with it
(PackageInstaller.rs:1944,2470)
- --dry-run: now 'Perform a dry run without making changes'
(CommandLineArguments.rs:74, bun install --help); test run wrote no
node_modules and no bun.lock

**docs/snippets/cli/link.mdx**
- --ignore-scripts: dropped '(dependency scripts are never run)';
trusted deps' scripts run unless flag clears Do::RUN_SCRIPTS
(PackageInstaller.rs:1944-1995, :2466);…
- --backend: removed default="clonefile"; default is clonefile only on
macOS, hardlink elsewhere (PackageInstall.rs:252-256,
CommandLineArguments.rs:44-51, `bun link…
- --quiet: replaced 'Only show tarball name when packing' with 'Disable
the progress bar'; LogLevel::Quiet only special-cased in
pack_command.rs, elsewhere just…
- (extra, not in items) --save: removed default="true"; link defaults to
not saving (CommandLineArguments.rs:1423-1429); verified package.json
untouched without --save,…

**docs/snippets/cli/outdated.mdx**
- --ignore-scripts: dropped '(Bun never runs dependency scripts)';
trusted deps' scripts run (PackageInstaller.rs:1944-1955) and the flag
clears Do::RUN_SCRIPTS…
- --backend: removed default="clonefile" and wrote clonefile (default on
macOS) / hardlink (default on Linux and Windows);
PackageInstall.rs:252-256,…
- Added -r, --recursive ('Check outdated packages in all workspaces'):
OUTDATED_PARAMS CommandLineArguments.rs:313-315, read at :1358, honoured
in…

**docs/snippets/cli/patch.mdx**
- --dry-run text -> 'Perform a dry run without making changes'
(CommandLineArguments.rs:74, `bun patch --help`);
PackageManagerOptions.rs:726-731 also skips…
- --backend: dropped default="clonefile"; now 'clonefile (default on
macOS), hardlink (default on Linux and Windows)' per
PackageInstall.rs:252-256, CLA.rs:44-51, help on…
- Added --minimum-release-age ParamField (help text verbatim); flag is
in SHARED_TAIL_PARAMS (CLA.rs:120) used by PATCH_PARAMS (CLA.rs:285) and
printed by `bun patch…
- '# CLI Usage' -> '## CLI Usage': 9 of 13 cli snippets use H2 with ###
children; pm/cli/patch.mdx already gets its H1 from frontmatter title
(Mintlify docs.json)

**docs/snippets/cli/publish.mdx**
- Added --tolerate-republish entry: in PUBLISH_PARAMS
(CommandLineArguments.rs:378), listed by `bun publish --help`,
documented at pm/cli/publish.mdx:92
- --registry: added 'and environment variables'; help text
CommandLineArguments.rs:101, env read at
PackageManagerOptions.rs:599-632, CLI wins at 690-707; verified live
- Renamed second '### Publishing Options' (it covers shared install
flags) to '### General Options'; first heading kept; no docs link to
#publishing-options
- Extra, not in items: --backend claimed clonefile default everywhere;
PackageInstall.rs:252-256 and Linux `bun publish --help` show hardlink
default off macOS

**docs/snippets/cli/remove.mdx**
- --dry-run text -> 'Perform a dry run without making changes'
(CommandLineArguments.rs:74); PackageManagerOptions.rs:726-731 also
skips package.json/lockfile
- Verified: `bun remove foo --dry-run` on a file: dep left package.json,
bun.lock and node_modules untouched, so 'Don't install anything'
understated it
- --backend: removed default="clonefile" prop; prose now: clonefile
(default on macOS), hardlink (default on Linux and Windows);
PackageInstall.rs:252-256
- Evidence: CommandLineArguments.rs:44-51 help is per-platform; `bun
remove --help` on Linux prints hardlink (default); wording as
docs/pm/cli/install.mdx:363

**docs/snippets/cli/run.mdx**
- --no-deprecation -> 'Silence all deprecation warnings';
BunProcess.cpp:2164-2167 drops every DeprecationWarning; bun
--no-deprecation -e printed none
- --throw-deprecation -> 'Throw deprecation warnings as errors';
BunProcess.cpp:2168-2178 queues a throw; bun --throw-deprecation -e
exited 1
- --main-fields: dropped 'Defaults to --target dependent'; --target is
build-only (Arguments.rs:453), absent from bun run --help; run target is
bun (mod.rs:1434)
- --extension-order default .tsx,.ts,.jsx,.js,.json ->
.tsx,.ts,.jsx,.cts,.cjs,.js,.mjs,.mts,.json,.node
(bundler/options.rs:1805-1813; require() tests agree)

**docs/snippets/cli/test.mdx**
- Removed default="1" from --bail ParamField: TestOptions default bail
is 0 (src/options_types/context.rs:494); bun test on 2 failing tests ran
all tests without --bail,…
- --reporter-outfile now says '(required with --reporter=junit)':
Arguments.rs:1787-1798 only errors for junit; `bun test --reporter=dots`
runs without an outfile, junit…

**docs/snippets/cli/update.mdx**
- --ignore-scripts: dropped '(Bun never runs dependency scripts)';
PackageInstaller.rs:1944-1995/2466 enqueue trusted deps' scripts unless
Do::RUN_SCRIPTS is off…
- --backend: removed default="clonefile" and made prose per-platform;
PackageInstall.rs:252-256 and CommandLineArguments.rs:44-51 default to
hardlink off macOS; `bun…
- --dry-run: 'Don't install anything' -> 'Perform a dry run without
making changes' (CommandLineArguments.rs:74);
PackageManagerOptions.rs:726-731 also skips…

**docs/test/code-coverage.mdx**
- GitLab example: Arguments.rs:1769-1778 accepts only text/lcov (no
cobertura); replaced coverage_report/cobertura block with
artifacts.paths: [coverage/lcov.info].
- GitLab coverage regex: real output is 'All files | 33.33 | 50.00 |'
(no 'Lines :' or '%'); new regex tested against real run, captures
50.00.
- GitLab script: --coverage-reporter=lcov alone prints no text table
(Arguments.rs:1764 resets reporters; verified by running); added
--coverage-reporter=text.
- Line 71: dropped 'enables `fail_on_low_coverage`'; it is only an
internal field (code_coverage_options.rs:36, bunfig.rs:497-518); no
bunfig key or flag, bogus key is…
- (1 more, see the diff)

**docs/test/configuration.mdx**
- L297: dropped the `fail_on_low_coverage` name; it is only a Rust field
(options_types/code_coverage_options.rs:36, set in bunfig.rs:497-518),
not a bunfig/CLI option.…

**docs/test/dates-times.mdx**
- TZ example: new Date() gives 480/300 in standard time (bun test w/ Jan
setSystemTime: Received 480, 300); pinned both to new
Date("2020-07-01T00:00:00.000Z") -> 420/240
- Re-ran the edited snippet under bun test: passes with the machine's
current date (Aug) and with system time pinned to January

**docs/test/lifecycle.mdx**
- Mock Setup afterEach: mock.restore() -> mock.clearAllMocks().
JSMockFunction.cpp:642-646 resetSpies only touches activeSpies; mock()
adds to activeMocks (L1627-1633);…
- L220: added expect to bun:test import; as written, bun test prints
'ReferenceError: expect is not defined' (parse_entry.rs:1841 skips
injection); now passes

**docs/test/mocks.mdx**
- Advanced Spy Usage: added `jest` to the bun:test import; running the
snippet gave `ReferenceError: jest is not defined` (parse_entry.rs:1843
skips injection once…
- Mock Cleanup Patterns: added `mock` to the bun:test import; hooks
threw `ReferenceError: mock is not defined`; `mock` is not in
Jest::FIELDS (parser.rs:1609), so it is…
- Mock Cleanup Patterns: replaced '// Clean up all mocks' over
mock.restore(); restore() only clears activeSpies
(JSMockFunction.cpp:642-646,1445-1449), module mock stays…

**docs/test/parallel.mdx**
- L62: dropped 'a native addon segfaults' from per-file example;
Coordinator.rs:833 is_panic_status aborts run on SIGSEGV (ran: rest
'aborted: worker panicked')

**docs/test/reporters.mdx**
- L26: "Ran 4 tests in 1.44ms" -> "Ran 4 tests across 1 file. [1.44ms]";
test_command.rs:1545 formats "Ran {} test{} across {} file{}. " then
prints [elapsed]
- L41: "across 1 files." -> "across 1 file."; test_command.rs:1547-1549
singularize when files == 1; bun test prints "Ran 4 tests across 1 file.
[23.00ms]"

**docs/test/runtime-behavior.mdx**
- Unhandled Errors snippet: import { test } -> { test, expect }; bun
test gave 'ReferenceError: expect is not defined' before, 2 pass after
- Promise Rejections snippet: import { test } -> { test, expect }; same
ReferenceError before; after, the run exits 1 from the rejection as the
comment says
- Test Isolation snippet: import { afterEach } -> { afterEach, jest };
'jest is not defined' before, passes after (injection skipped:
parse_entry.rs:1841-1855)

**docs/test/snapshots.mdx**
- L51: replaced 'or added new snapshot tests' with the CI condition;
snapshot.rs:184-188 and expect.rs:1105-1114 only block new snapshots
when is_ci(); verified CI=false…
- L363-371 Troubleshooting diff: replaced Jest-style 'Object {' and
header legend with Bun's output ('{' body, then '- Expected - 1' / '+
Received + 1'); printDiff.rs:710…

**docs/test/writing-tests.mdx**
- L6: removed stale clause 'for now, it supports a limited set of expect
matchers'; jest.classes.ts Expect proto declares 89 matchers (80 to*),
tables at L471-576 all…
- Evidence: runtime proto lists every Jest core matcher; only
expect.addSnapshotSerializer throws 'Not implemented'
(expect.rs:1655-1657, 1731-1733), as L576 says.
- --todo output: caret text now 'Remove `.todo` if tested behavior now
works', matching src/runtime/cli/test_command.rs:1144 and a real `bun
test --todo` run
- --todo output: file/test now math.test.ts / 'fix this' to match the
snippet above it; reproduced by running that snippet (myTestFunction
defined) with --todo
- (3 more, see the diff)

</details>

<!-- robobun:evidence:begin -->

---

**no test proof** · iteration 0 · docs-only change; test-proof not
applicable

<!-- robobun:evidence:end -->

Co-authored-by: Alistair Smith <hi@alistair.sh>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants