Today’s issue: MDN does the most MDN thing ever, OpenCode migrates to Electron, and my codebase is 6’5” btw.
Welcome to #479.

The Main Thing

POV you're an agent that just broke in front of 100,000 people
Agent-chella 2026
Building agents is a lot like going to Coachella: it sounds fun to do what all the cool kids are doing, but before you know it you’re drowning in infinite loops and influencer sweat. At least I hope that’s sweat.
The problem is that for an agent to be halfway useful, it needs to be able to access the internet like a real human. And REST APIs don’t let it log into sites, fill out forms, or do other tasks that are actually helpful.
Most developers are trying to patch this together with Playwright scripts and hardcoded selectors. But brittle automation and agents are a terrible combination, because one DOM update makes everything break.
Stagehand is an open source SDK that’s solving this problem by combining deterministic code with natural language AI.
It does this by giving your agent four primitives for surviving the real web:
-
act(): plain-English browser actions that resolve at runtime, so instructions like “click the submit button” still work after a site redesign
-
extract(): grabs structured data from any page using a Zod schema with no selectors required
-
observe(): surfaces what’s actually actionable on a page before your agent commits to anything
-
agent(): autonomous multi-step execution for when you want to hand off an entire workflow, like booking a flight on the Frontier Airlines site that hasn’t been updated since 2004
Bottom Line: Most web agent demos you see are either faked or so convoluted that they’re slower than just doing the task yourself. Open source tools like Stagehand are the best hope we have for getting out of the uncanny valley.

Our Friends
(With Benefits)

My team's 45 PRs watching my agent open another PR
Agent-assisted development speeds up your engineers, but without a QA process that can keep up, those PRs are sitting around untested and unreleased.
Join QA Wolf CEO Jon Perl for a live webinar on how QA Wolf uses AI to ship every day without bugs.
You’ll see how QA Wolf’s AI:
- Finds critical workflows and turns them into deterministic test coverage
- Runs tests in parallel to catch issues before they hit production
- Gets fast signal on PRs before merge
RSVP here — and see what shipping with confidence looks like.

Spot the Bug
class ChatApp {
constructor() {
this.keywordRegex = /hello|hi|hey/g;
}
receiveMessage(message) {
if (this.keywordRegex.test(message)) {
this.sendGreeting();
}
}
sendGreeting() {
console.log("ChatApp: Hello, how can I assist you today?");
}
}
let chatApp = new ChatApp();
chatApp.receiveMessage("hi, how are you?");
chatApp.receiveMessage("hello, can you help me?");

Cool Bits
-
Vercel got hacked over the weekend when a third-party AI tool used by one of their employees was compromised, allowing the attackers to get access to sensitive customer data. If you haven’t been contacted by Vercel, it means you probably weren’t affected. Guillermo mentioned that this attack was probably “significantly accelerated by AI,” so I guess this kind of thing will just keep happening now.
-
Clerk just introduced B2B authentication so you can enable your users to quickly set up organizations, invite members, and assign roles in one flow. [sponsored]
-
In a big blow to pirated sports streaming websites everywhere, Google introduced a new spam policy for “back button hijacking”.
-
Ivan Cernja wrote about what the Encore team learned building a Rust runtime for TypeScript, including the non-obvious problems of making Node and Rust work together.
-
Build dynamic forms that work your way. With SurveyJS, you get a fully customizable JavaScript form builder that integrates seamlessly with any backend—no vendor lock-in, or usage limits. [sponsored]
-
TkDodo wrote about the benefits of a vertical codebase. My codebase is 6’5” btw.
-
pnpm 11 RC just shipped with a new SQLite-backed store index and supply-chain protection turned on by default. I know you hate opinionated defaults, but this one probably makes sense.
-
OpenCode desktop migrated to Electron because it’s “faster and more reliable” than their Tauri build. Rust-maxxers are invited to take a personal day to process the news.
-
The Databased podcast broke down 6 counterintuitive systems design principles that agents don’t understand with the founder/CTO of Convex, Jamie Turner. [sponsored]
-
Leo McArdle wrote this deep dive going under the hood of MDN’s new frontend. MDN going all in on Web Components is the most MDN thing ever and I love that for them.
-
Yuku is a high-performance JS/TS compiler and toolchain written in Zig that’s 100% JS spec compliant.
-
The GitHub team wrote about the uphill climb of making diff lines performant. Please enjoy it during the 47 minutes per day when GitHub isn’t down.

Spot the Bug: Solution
chatApp.receiveMessage("hi, how are you?");
chatApp.receiveMessage("hello, can you help me?");
In JavaScript, RegExp objects with the g (global) flag retain state between matches due to the lastIndex property, which can lead to unexpected results when reused across different inputs.
The solution is to create a fresh RegExp object for each incoming message, ensuring proper recognition and response to all greetings.
class ChatApp {
receiveMessage(message) {
let keywordRegex = /hello|hi|hey/g;
if (keywordRegex.test(message)) {
this.sendGreeting();
}
}
sendGreeting() {
console.log("ChatApp: Hello, how can I assist you today?");
}
}
let chatApp = new ChatApp();
chatApp.receiveMessage("hi, how are you?");
chatApp.receiveMessage("hello, can you help me?");

Want us to say nice things
about your company?
Built with ❤️ by Fireship
50 W Broadway Ste 333 PMB 51647 Salt Lake City, Utah 84101