Today’s issue: Post-modern JavaScript servers, mixed signals from create-react-app, and everything Kevin Bacon taught me about building beautiful dashboards.
Welcome to #363.
When the new standard hits before you finished learning the old standard
We interrupt this DeepSeek-fueled death spiral to bring you an important announcement: the final boss of type nerds has arrived.
It’s called Standard Schema, and it’s a new specification designed by the creators of Zod, Valibot, and ArkType that aims to provide a “common interface” for all TypeScript schema libraries.
Why tho? If you’ve ever tried integrating one of these schema libraries into another framework or tool, you’ve probably gotten stuck in adapter hell – where each tool requires a different format that requires a bunch of custom logic to pass in your existing schemas.
That’s where Standard Schema comes in. Instead of picking a single winner, it provides a shared structure that any library can implement. This makes it way easier for tools like tRPC to accept user-defined schemas, without needing separate adapters for every library.
Or as Zod creator Colin McDonnell puts it: Integrate once, validate anywhere ✨🧚💫.
But even if you’re not a library maintainer, Standard Schema still provides some powerful benefits:
Less lock-in – You can easily switch from Zod to Valibot (or anything else) without rewriting adapters.
Predictable runtime validation – All spec-compliant validators will validate your data in a predictable way, with errors formatted consistently.
Type-maxxing – The spec allows libraries to advertise their inferred types, which makes it easier for TypeScript-based tools to extract and use them.
Minimal and non-intrusive – It only requires a few lines of code for libraries to implement, and it avoids polluting autocomplete suggestions by tucking everything inside a ~standard
property.
Bottom Line: It’s cool to see the creators of competing libraries come together to create a standard that should hopefully allow schema validation to eventually just work across the entire JS ecosystem.
Can’t wait for Sam Altman, Elon, and the DeepSeek guys to do the same. 🙃
![]() ![]() ![]() ![]() |
Me after telling Gemini to do the thing I literally get paid to do
We’ve already told you about how Project IDX is Google’s one-stop shop for building, testing, and deploying full-stack applications in the browser.
But now they just launched a developer preview of Interactive Chat – a supercharged AI chat experience that embeds interactive actions into Gemini’s responses.
This lets it make direct changes to your project and dev environment, enabling some pretty cool stuff:
Turn prompts into action – Instead of just offering suggestions, it can actually perform tasks in the IDX workspace. Ask it to “run my unit tests” or “extract this function into a new component”, and it… will.
Automate tedious setups – Gemini can now generate files, install packages, and configure your whole project for you. Just ask it to “add Tailwind CSS” to your React project or “add Express” to your Node backend, and it’s done. No boilerplate, no manually tweaking your package.json
.
Try building with it – it’s still early days, but it already feels like the future.
Their AI code reviewer gives you context-aware review feedback on your PR’s, so you can spend less time on manual code reviews and catch more errors.
const car = {
name: 'Tesla',
startEngine() {
console.log(`The ${this.name} engine is starting...`);
},
delayedStart() {
setTimeout(this.startEngine, 1000);
}
};
car.delayedStart();
Marvin Hagemeister outlined the modern way to write JavaScript servers. I’m more into post-modern JS servers these days, but that’s just because I’m going through a big Jean-Michel Basquiat phase.
Blacksmith gets you 2x faster GitHub Actions for half the cost – because they run them on high-performance gaming CPUs, instead of GitHub’s older server hardware. Even GitHub’s ex-CTO said that it “helps you save money and go faster from day 1.” [sponsored]
Vercel acquired Tremor, the React component library of charts and dashboards. Not to be confused with the classic Kevin Bacon film from 1990 with literally six sequels (and counting).
TypeScript 5.8 beta just came out with checked conditional return types, a new --erasableSyntaxOnly
option, and a lot of other features that only the strongest typists among us will notice.
Turso co-founder, Glauber Costa went on the Changelog podcast to discuss libSQL, Limbo, and how they’re rewriting SQLite in Rust. Godspeed, comrades.
QA Wolf saves teams $10,000 per engineer per month (on average) – because they get you 80% automated e2e test coverage and unlimited, parallel test runs on their infrastructure. This massively speeds up release cycles and helps teams ship 5x more releases than with traditional QA solutions. Check out their free demo. [sponsored]
Netlify CEO, Matt Biilmann wrote about why Agent Experience (AX) matters. So when the uprising happens, the agents will always know that at least Matt tried to take care of them. And that’s the kind of forward thinking that makes Matt a great CEO.
bunchee is a new, zero-config bundler for npm packages that’s powered by Rollup and SWC.
Ian Macartney wrote about how he built a local-first text editing UX with Automerge and Convex. [sponsored]
The former CTO of Shopify wrote a long-ass tweet blog post(?) giving more context about how and why they went all in on React Native 5 years ago.
Astro 5.2 comes with support for Tailwind 4, trailing slash redirects, and a bunch of bug fixes.
In a weird turn of events, create-react-app
just got updated to include better support for React 19 and simultaneously got slapped with an official deprecation warning. I haven’t felt this jerked around since they announced that Kevin Bacon would be starring in a new Tremors TV show back in 2018, only to pull the plug six months later 😭.
const car = {
name: 'Tesla',
startEngine() {
console.log(`The ${this.name} engine is starting...`);
},
delayedStart() {
setTimeout(this.startEngine, 1000);
}
};
car.delayedStart();
The bug has to do with our invocation of startEngine
. Because we’re passing this.startEngine
as an argument to setTimeout
, we’re not the ones invoking it. That means it’s not going to get invoked with the correct context (this
). We can fix this in two ways – either using .bind
(🙃) or invoking the function ourselves like this.
const car = {
name: 'Tesla',
startEngine() {
console.log(`The ${this.name} engine is starting...`);
},
delayedStart() {
setTimeout(() => this.startEngine(), 1000);
}
};
If you’d like a longer explanation, we break it down in Understanding the “this” keyword, call, apply, and bind in JavaScript.