Skip to content
Cognate Press
Jonah Vail, JavaScript engineer and the byline behind JS Ledger
First issue 13 issues publishedOne byline, nothing syndicatedWrites only the language they work in

Their publication

JS Ledger

JavaScript · jsledger.com

JavaScript, TypeScript, and the runtimes, frameworks and tooling behind modern web applications.

Read the archive ↗

All authors →

Author

Jonah Vail

Writes JS Ledger — JavaScript, TypeScript, and the systems that run them.

Jonah Vail writes about JavaScript, TypeScript, and the systems behind modern web applications. His work explores what happens beneath runtimes, frameworks, and tooling, from language semantics and performance to browser and production behavior. He prefers source code, reproducible experiments, and measurable behavior over received wisdom.

JS Ledger exists because most writing about JavaScript describes how an API is meant to behave, and stops there. Each entry takes the gap between that description and what the machine actually does: why a function that looks identical to another one runs four times slower, why a type narrowed in one branch and stopped narrowing in the next, why a build that works on one machine produces a different bundle on another. Five areas carry the site — language internals, frameworks, tooling and build, runtime and performance, and ecosystem and production.

A ledger records what happened, and a good one can be audited by someone who was not there. Versions are pinned to the patch rather than called recent, numbers arrive with the command that produced them, sources are primary, and a claim that is only inferred is labelled as inferred. Corrections are made in place with a dated note — nothing is silently rewritten, because a ledger that can be edited without a trace is not a ledger.

Jonah Vail is a publishing byline. It identifies the author of every article at jsledger.com, and nothing else — it is not the operator of the domain named in that site's legal pages.

Every issue so far

  1. Being able to require() an ES module removes the reason most packages shipped two builds. The dual package hazard is a layout problem, and it survived.

  2. A single-pass push through a diamond recomputes the leaf twice, and the first result mixes a fresh value with a stale one. Two passes are what remove it.

  3. A naked type parameter splits its union before the conditional runs, so IsArray<string[] | number> comes back as 'no' | 'yes'. Read out of TypeScript 7.0.2.

  4. Vite 7 depends on esbuild and Rollup; Vite 8 on neither. Serving one module from both majors shows what the swap to Rolldown changed and what it left alone.

  5. A hidden class is a node in a transition tree V8 keeps for the whole isolate — which is why an unrelated function can decide how your object is stored.

  6. One async function compiled three ways — TypeScript's ES5 emit, V8's bytecode and the spec's Await steps — and the microtask turns each one predicts.

  7. An npm provenance attestation binds a tarball to a repository, a workflow and a commit. Reading the payload shows what it never claims.

  8. What package-lock.json actually records, what its integrity hashes do and do not prove, and where the real install-time risk sits.

  9. Control flow analysis is a graph walk over your code. Knowing what widens a type again explains most of the errors that look wrong.

  10. Microtasks, rendering opportunities and starvation — what the loop actually does between your callbacks, in the browser and in Node.

  11. A walk through one request to a Vite dev server: resolution, the transform pipeline, import rewriting, pre-bundling, and why production differs.

  12. Every signals library is the same forty lines of bookkeeping. Here is what those lines do, and where the four popular implementations diverge.

  13. Two functions that look identical can run at very different speeds. The difference is usually shapes, inline caches, and a deoptimization you never saw.

Elsewhere in the network

ElephantPHP · JVM Scope · PyDepth · CSharpMind · SQLPress · Gopheria — six more languages, six more specialists, one imprint. Every language has a page of its own.