
Today’s issue: The Spider-Man of package managers, WebAssembly heresies, and the curious case of the missing Zeit cofounder.
Welcome to #473.


TypeScript's codebase breaking free of JavaScript
Much like my last job as a Chili’s bartender, Monday’s TypeScript 6.0 release is more of a transition phase than a final destination. A bridge to a better place.
That’s because this is the last TypeScript version built on its existing JavaScript codebase, before it graduates to its fancy new Go compiler and language service that promises native speed and multi-threaded type checking.
That means TypeScript 6.0 is basically a polite way of saying “please update your tsconfig before we blow everything up in TypeScript 7.0 in a few months.” (SemVer is a social construct at Microsoft.)
Strict mode is now true by default, module defaults to esnext, target floats to the current-year ES spec (currently es2025), and types now defaults to an empty array instead of vacuuming up everything in node_modules/@types. That last one alone will break a lot of projects, but should also speed them by 20–50%.
Here’s what else landed:
Temporal API types — From reading this newsletter, you already know the long-awaited Temporal proposal just hit stage 4, and TypeScript 6.0 ships built-in types so you can start using it today with --target esnext.
Map.getOrInsert — The ECMAScript “upsert” proposal also hit stage 4, adding getOrInsert and getOrInsertComputed to Map and WeakMap. This collapses the classic has/set/get pattern into one clean call.
Deprecation tsunami — Lots of spring cleaning, with outFile, baseUrl, --moduleResolution node, target: es5, and AMD/UMD/SystemJS module targets all gone or on death row.
Bottom Line: It’s officially the end of an era for TypeScript’s codebase. The new era should be faster and better in pretty much every way, but I’ll still make sure to pour out a Presidente Margarita to honor the OG.


GitHub Copilot is your agentic AI coding partner that works across your editor, the command line, and GitHub, bringing real project and codebase context into your workflow. Get real‑time code suggestions, stay in flow, and offload tasks like spec‑driven development, test generation, documentation, and app modernization.
Whether you’re shipping a new feature or migrating an existing app, GitHub Copilot helps you move faster with less overhead, so you can focus on solving real problems. Get started for free

Datadog’s free Front-end Developer Kit gives you instant access to three killer resources that help you understand your users and troubleshoot issues effectively.
We usually try to keep these 🍦 JavaScript, but here’s one for you React devs this week.
import { useState } from 'react';
export default function Counter() {
const [number, setNumber] = useState(0);
return (
<>
<h1>{number}</h1>
<button onClick={() => {
setNumber(number + 1);
setNumber(number + 1);
setNumber(number + 1);
}}>Increment</button>
</>
)
}

Pierce Boggan wrote about how the VS Code team builds VS Code with AI. Sadly, we didn’t get any details about how they trick their bosses into thinking that they actually use Copilot.
Andrew Nesbitt wrote about the top 10 biggest conspiracies in open source, and he didn’t even mention how the original Zeit cofounder was just deployed to Iran.
Kyle Tryon wrote the definitive guide to choosing a JavaScript logging library in 2026, including why Sentry’s runtime-agnostic logger stands out as the best new entry. We might be a little biased, but we definitely agree. [sponsored]
Sugar High is a super lightweight syntax highlighter for JavaScript and JSX, which reminds me that it’s been almost 45 minutes since my last pack of Sour Patch Kids Watermelons.
Neciu Dan gave some unsolicited advice on why you should start naming your useEffect functions. The best advice is always unsolicited, as my dad would say.
Expo just shipped real Jetpack Compose and SwiftUI in React Native. So you get the same components, same behavior, and same platform polish as native developers - but all in React Native. [sponsored]
The Thesys engineering team wrote about how rewriting their Rust Wasm parser in TypeScript made it 3x faster, and they were never heard from again.
pnpm 11 beta just dropped, but I gotta say that this preview wasn’t quite as exciting as the new sad-boi SpiderMan one.
Zero 1.0 is the first stable release of Rocicorp’s local-first sync engine for web apps.
Addy Osmani wrote about Comprehension Debt, which he calls “the hidden cost of AI generated code.” I always thought that term referred to my ability to only read at a 5th-grade level, but I’m proud to announce I finally finished the first Diary of a Wimpy Kid book.
You might expect that clicking the button would increment our number state by 3, but that’s not how it works. In short, JavaScript creates a closure around the number variables so it’s as if we’re doing
setNumber(0 + 1);
setNumber(0 + 1);
setNumber(0 + 1);
which of course will always set number to 1.
Instead, if we want to update the same state multiple times before the next render, we can pass a function to our setter function like so -
setNumber(n => n + 1);
setNumber(n => n + 1);
setNumber(n => n + 1);
Now React will add all these functions to a queue, and during the next render, React goes through the queue passing the result from the previous item in the queue to the next, eventually leading to a number of 3.
0 + 1 = 1
1 + 1 = 2
2 + 1 = 3