Today’s issue: Triangle-shaped waffle parties, escaping the Reno airport, and the Ruby web framework that smells like a winner.
Welcome to #406.
Guillermo after buying out every single Next.js rival
If there’s one thing I learned from my University of Phoenix degree in Freudian Marketing, it’s that branding your product as the solution to a problem is a great way to subconsciously trick people into forgetting that your competitors exist.
And nobody understands that better than Vercel – ”the AI Cloud” that’s behind Next.js (”the React Framework for the web”), Turborepo (”the build system for JS and TS codebases”), and AI SDK (”the AI Toolkit for TypeScript”).
Yesterday, they announced two new Senior Superlatives technologies to their portfolio – Nuxt (”the progressive web framework”) and xmcp
(”the framework for building & shipping MCP applications”). Let’s take a quick look at each one.
You probably know Nuxt as the Vue metaframework that’s only one vowel away from Next. Similar to Vercel’s Svelte deal from 2022, the big triangle is hiring the Nuxt core team members and funneling more sponsor dollars into the project – while promising to allow Nuxt to retain its independence and open governance model.
As part of that deal, Vercel also gets Nitro, the next-gen server toolkit that powers Nuxt, SolidStart, TanStack Start, and AnalogJS. As Ryan Carniato pointed out, this means that basically every metaframework besides Astro, Remix, QwikCity, and Fresh is now being built by developers who work at Vercel 🥴. More on that later.
Their other big announcement from Monday is the new xmcp
framework that Vercel built in-house for improving the DX for building on MCP. Just run npx create-xmcp-app
, and it’ll give you:
File-system routing that auto-registers tools from a tools/
directory
A middleware toolkit for auth and custom middleware, plus configurable MCP server settings
Hot reloading for instant development feedback
Easy deployment to Vercel (of course), plus support for other platforms
Vercel clearly expects these investments in open-source frameworks and AI tools to eventually generate a meaningful ROI for its shareholders. But thankfully, they have a pretty solid track record of stewarding projects like Svelte and shadcn/ui in a way that benefits the whole ecosystem as well – even if some developers aren’t exactly stoked to see so many tools all flying the black triangle flag.
Bottom Line: Is it great to see open-source authors getting paid? Absolutely. Is it possible that this rapid consolidation could eventually threaten the overall health of the JavaScript ecosystem? I hope not.
![]() ![]() ![]() ![]() |
The marketing team asking you to "whip up a couple dashboards"
Instead of writing SQL queries (gross) or clicking through drag-and-drop builders (more gross), you just tell Basedash what you want – and their AI builds it for you.
It’s simple:
Describe your charts in plain English – Ask it to “show me active users by device type” or “compare sales by region” (see 7-minute YouTube demo).
Chat with your data – Basedash comes with its own Postgres data warehouse that connects to 600+ data sources, or you can connect your own DB. Ask the AI follow-up questions to drill deeper into your insights.
Get instant visualizations – Basedash automatically chooses the best chart type, table, or dashboards and formats it beautifully.
Try the 14-day free trial (no credit card required) – and see why it was Product Hunt’s #3 Product of the Week and is used by hundreds of AI-first companies.
They created a Frontend Monitoring Best Practices Guide that’ll teach you how to monitor route changes, user interactions, and errors in your single-page apps.
const blob = new Blob([`
self.onmessage = function() {
const processor = {
cache: new Map(),
process(data) {
return data.map(x => x * 2);
}
};
processor.cache.set('results', processor.process([1,2,3]));
processor.cache.set('processFn', processor.process);
self.postMessage({
type: 'DONE',
state: processor.cache
});
};
`], { type: 'application/javascript' });
const worker = new Worker(URL.createObjectURL(blob));
worker.postMessage('start');
worker.onerror = (e) => console.error('Worker error:', e);
worker.onmessage = (e) => console.log(e.data);
Ashwin wrote about using AI without leaving the terminal, which would’ve been helpful when I was stuck in the Reno airport for 7 hours after my bachelor party.
The TypeScript 5.9 beta introduces an updated tsc --init
, support for the new import defer
syntax, and more.
Sasha Blumenfeld wrote about a major upgrade to Sentry Agent Monitoring – which now brings tracing, model performance, and deep context into one unified experience for seamless AI monitoring. [sponsored]
Loren Stewart wrote about building a lightweight reactive state manager with JavaScript proxies. And the faster you build it, the faster you can sell it to Vercel and earn your first triangle-shaped waffle party.
Rspack 1.4 comes with new Wasm target support, smaller bundles, and incremental build by default.
The Bun team bought bun.com. Everything else about the site is the exact same, but as a fellow domain degenerate, I believe that a mid six-figure domain purchase by an open-source project is newsworthy enough.
Can your coding agent run long commands and plan its next move? Warp’s can – and it just beat Claude Code by 20% on the Terminal-Bench
benchmark. Warp’s eng team wrote about how they pulled it off. [sponsored]
Electron 37 came out last month – and much like the Jurassic Park franchise, no matter how much you slander it, it will always succeed and never die.
Una Kravets wrote about CSS conditionals with the new if()
function.
QA Wolf is hosting a free workshop on Patent strategy for startups with Saad Hassan, the go-to IP attorney for Sequoia and a16z founders. He’ll demystify patents vs trademarks vs copyrights and share common IP landmines to avoid. [sponsored]
The Deno team took a break from suing the fourth-largest software company in the world to ship Deno 2.4 – which brings back the deno bundle
subcommand for creating single-file JavaScript bundles, introduces bytes and text imports, and lots more.
Brut is a new web framework for Ruby that’s presumably inspired by the green cologne you bought for $7 at Walgreens your freshman year of high school. Smells like success. And desperation. A potent combo indeed.
The processor.cache
is a Map
object, which is not serializable. To fix this, you can convert the Map
to a serializable object before posting it to the main thread.
const blob = new Blob([`
self.onmessage = function() {
const processor = {
cache: new Map(),
process(data) {
return data.map(x => x * 2);
}
};
processor.cache.set('results', processor.process([1,2,3]));
// Convert Map to serializable object, skip functions
const serializableState = {
type: 'DONE',
state: Object.fromEntries(processor.cache)
};
self.postMessage(serializableState);
};
`], { type: 'application/javascript' });
const worker = new Worker(URL.createObjectURL(blob));
worker.postMessage('start');
worker.onmessage = (e) => console.log(e.data);