Today’s issue: Angular fixes my carpal tunnel, JavaScript fatigue strikes back, and Mistral convinces my cousins to stop suing each other.
Welcome to #374.
MFW I read about threads for the first time since College
The ByteDance team has been dipping their toes into open source for years with projects like Rspack, but they just cannonballed into the OSS deep end with Lynx – a brand new framework for building cross-platform native apps with web technologies.
Led by former React core team member Xuan Huang, Lynx is the spiritual successor to projects like Flutter, React Native, and Cordova (it’ll always be PhoneGap to me). It shares the same “write once, render anywhere” ethos as these tools, but it somehow manages to maintain the expressivity of the web without compromising on performance.
Lynx uses two novel techniques to unlock that silky smooth native feel:
Main-Thread Scripting – Lynx is written in Rust and uses a dual-threading approach to improve performance. The “main” thread is dedicated to user interactions and runs on their custom JavaScript engine, Primjs, while the “background” thread runs the rest of the app.
Instant First Frame Rendering – Lynx synchronously renders the UI on the main thread at startup, kind of like SSR for mobile. This makes the app feel “instant.”
Perhaps most impressively, Lynx natively supports CSS and React, so web developers can build high-performance native apps using the tools we already know and love.
Bottom Line: After ByteDance released TikTok, every other app in existence raced to copy it and integrate their own algorithmic video feed as quickly as possible.
Will mobile apps now rush to integrate Lynx in the same way? I guess we’ll find out soon. Unless Tr*mp bans it first.
![]() ![]() ![]() ![]() |
When future you asks why you self-hosted the app despite knowing nothing about infrastructure
Convex’s “pure TypeScript” backend and reactive database have always been built for the cloud – but they know that some of you self-hosting sickos won’t rest until you can run everything on your own machine.
So they just open-sourced their backend code and launched a new self-hosting option that will let you experience the Dunning-Kruger effect in action the joys of scaling your own infrastructure.
Here’s how it works:
They open-sourced Convex’s dashboard and backend, so you can fork and modify it however you want (see repo).
They provide pre-built binaries, Dockerfiles, container images, and Docker Compose configs – so you can easily spin up and configure your own backend.
Everything runs as a single-node instance to keep things simple and lightweight.
Check out the full tutorial – or fire up a local instance with npx convex dev
to get started.
Check out their Figma plugin that lets you automatically turn your Storybook components into Figma components 🔥.
Why does this code work?
const friends = ['Alex', 'AB', 'Mikenzi']
friends.hasOwnProperty('push') // false
Specifically, why does friends.hasOwnProperty('push')
work even though friends
doesn’t have a hasOwnProperty
property and neither does Array.prototype
?
Agents.json is an open-source JSON spec that formally describes contracts for API and AI agent interactions and is built on top of the OpenAPI standard.
Allen Pike wrote an article called, JavaScript fatigue strikes back. And I can’t believe that Jordan Walke was Alex Russell’s father this whole time.
Meticulous generates and maintains an exhaustive suite of e2e UI tests that cover every edge case of your web app with zero developer effort. The tool has zero flakes (powered by a deterministic replay engine), and it’s relied on by Dropbox, Lattice, Bilt Rewards and hundreds of engineering organizations. Check it out. [sponsored]
Norah Sakal wrote about the key differences between MCP and APIs. Has anyone else been talking about MCP much recently? I really haven’t noticed.
Jeremy Wells wrote an article called Rails views, web components, React. Why make a choice? Because sometimes, indecision is the best decision.
React Router v7.3 came out with Vite environment API improvements, client-side context (unstable), and middleware (unstable).
Bit created an open-source build system framework for developing “composable software”. It helps you leverage, reuse, and extend your application’s existing code so that you can build a better user experience much faster. [sponsored]
Eliseo Martelli wrote about Apple’s software quality crisis, but has he even tried to Genmoji it tho?
Angular 19.2 introduced new APIs for asynchronous reactivity and some better template ergonomics. If this doesn’t fix my carpal tunnel, nothing will.
CarbonQA provides high-quality QA services that scale. Their US-based testers will break your app repeatedly, and do all the manual testing your engineers hate doing. [sponsored]
Ryan Dahl and Andy Jiang wrote about what Node’s new TypeScript support means for Deno.
Mistral OCR is an Optical Character Recognition API that claims to be the world’s “best document understanding API.” I’m really hoping it can understand my late grandfather’s will better than my family can, because six of my cousins are currently suing each other over his souvenir spoon collection.
const friends = ['Alex', 'AB', 'Mikenzi']
friends.hasOwnProperty('push') // false
As mentioned earlier, if you look at Array.prototype
, it doesn’t have a hasOwnProperty
method. How then, does the friends
array have access to hasOwnProperty
?
The reason is because the Array
class extends the Object
class. So when the JavaScript interpreter sees that friends
doesn’t have a hasOwnProperty
property, it checks if Array.prototype
does. When Array.prototype
doesn’t, it checks if Object.prototype
does, it does, then it invokes it.
const friends = ['Alex', 'AB', 'Mikenzi']
console.log(Object.prototype)
/*
constructor: ƒ Object()
hasOwnProperty: ƒ hasOwnProperty()
isPrototypeOf: ƒ isPrototypeOf()
propertyIsEnumerable: ƒ propertyIsEnumerable()
toLocaleString: ƒ toLocaleString()
toString: ƒ toString()
valueOf: ƒ valueOf()
*/
friends instanceof Array // true
friends instanceof Object // true
friends.hasOwnProperty('push') // false