
Today’s issue: This thing called math, subjecting agents to a Google performance review, and why I’ll never listen to another PM.
Welcome to #531.


We can get 3x the performance if we migrate this to Rust
It’s only been 3 months since TypeScript 7 aka “the Go port” came out, which was supposed to solve all of our TypeScript perf problems. But in the last few weeks, we’ve had not one, not two, not three, but four “slop ports” of the compiler, which is proof that we’ve reached the 7th level of hell.
And while it’s hard to focus with the weeping and gnashing of teeth, I suppose it’s fair to ask the question: why is everyone porting the compiler?
How did we get here:
When TypeScript migrated to Go, they shipped a native binary that made the compiler run faster, but it meant tools depending on its old JavaScript API could no longer call it directly. Instead, they had to talk to it over a client/server protocol, leaving the tooling ecosystem somewhat fragmented. When you combine this with a Rust fetish and unlimited tokens, it isn’t hard to see why it’s forking season.
The pitchforks:
tsc-rs: Theo’s influencer token budget brought forth the original “experimental” port, ts-rust, which can type-check the entire VS Code codebase in 4.8 seconds, compared with 9.6 seconds for the Go version.
bun check: Bun aka “the slop father” also ported the TypeScript compiler and embedded it into their toolkit, making type checks 3–6.4x faster while using 2.2–4.9x less memory in Bun’s benchmarks.
tsc-ts: Perhaps the most interesting fork was Vercel Labs deciding to migrate the compiler BACK to TypeScript and compile it to native using scriptc, delivering similar performance to the Go version.
tsrs: Not wanting to be left out, the VoidZero team at Cloudflare announced they will be maintaining a new project called tsrs, a Rust port they plan to merge with Theo’s port and integrate it into the Oxc toolchain.
Bottom Line: In the slopfork ecosystem, when you outsource original ideas for more control, projects like these can start to feel pretty boring. But what did you expect… we’re in hell after all.


Catching up on the 80 code reviews awaiting your approval
AI made code cheap. It did not make changes safe to ship. Agentic Change Management gives teams the controls around agent output: review every change with codebase context, prioritize a queue hundreds of PRs deep, understand big diffs in minutes, and secure the whole codebase.
Bring Agentic Change Management to your PR today

Trigger.dev is an open-source platform for building durable AI agents and workflows in TypeScript. If steps fail, processes restart, or code deploys mid-run, your tasks pick up where they left off instead of dying.
function flattenArray(arr) {
let result = [];
arr.forEach((item) => {
if (Array.isArray(item)) {
result.concat(flattenArray(item));
} else {
result.push(item);
}
});
return result;
}
console.log(flattenArray([1, [2, [3, [4]]]]));

Google Research open sourced harness2, a recursive agent harness for “an open world” that allows agents to self-reflect. Is this Google’s way of subjecting agents to their performance review culture?
React Native shipped version 0.88 bringing variable fonts and event dispatching to the platform. It’s apparently only the third time they’ve managed to ship a release without breaking changes? Not sure I’d want to advertise this, but you do you RN.
Convex CEO James Cowling hosted a chat with Theo Browne, Jean-Denis Greze, and David Cramer about agentic development and the future of open source software. If you haven’t watched it yet, you should. [sponsored]
Speaking of libraries known for breaking changes, React Router released version 8.5, which deprecates its view transition APIs in favor of React’s <ViewTransition> component.
Kristen Maevyn wrote an essay on the concept of decoherence and why, according to this thing called math, AI-generated complexity could lead to our downfall.
After getting benchmogged by all the slop forks, the TypeScript team shipped version 7.1 in beta, which is 1.2–1.9x faster and uses 15–50% less memory than 7.0 in its benchmarks.
Blacksmith is a drop-in replacement for GitHub runners that’s significantly faster and costs 60% less. It’s dead simple and also fully observable in your CI pipeline. [sponsored]
Justin Bennett spent some time thinking about how to make code reviews not suck — his words, not mine.
Darius Cepulis asks the existential question we’ve all had anxious thoughts about — what the iPhone Duo means for web development.
Will we still have a job in 5 years? AI.js Day 2026 puts frontend’s scariest AI questions on air. Free, live, happening on Nov 13. Save your spot. [sponsored]
Pere Diaz Bou wrote about what happens to a row in Turso’s MVCC, from bytecode that inserts it to the checkpoint that deletes it.
Marc-Andre Giroux finally found a use case for GraphQL operations. This is why you never let PMs tell you not to build a feature because someone is going to eventually want it.
Array.prototype.concat() doesn’t mutate the original array; it returns a new array. To fix the issue, we need to assign the return value of result.concat(flattenArray(item)) back to result.
function flattenArray(arr) {
let result = [];
arr.forEach((item) => {
if (Array.isArray(item)) {
result = result.concat(flattenArray(item));
} else {
result.push(item);
}
});
return result;
}
console.log(flattenArray([1, [2, [3, [4]]]]));