
Happy Monday! ☀️
Welcome to the 1512 new hungry minds who have joined us since last Monday!
If you aren't subscribed yet, join smart, curious, and hungry folks by subscribing here.

📚 Software Engineering Articles
🗞️ Tech and AI Trends
👨🏻💻 Coding Tip
Use type assertions to build flexible plugin architectures with optional capabilities.
Time-to-digest: 5 minutes

lovable.dev handles 42M+ monthly visitors across nearly 400 routes and 910K+ lines of code. It started as a Next.js app on Vercel, but the team decided to eat their own dog food—migrating to Lovable itself, running on TanStack Start. This wasn't just a hosting change; it was a six-month race against a moving finish line as the codebase grew 2.4x during the migration.
The core motivation was dogfooding. The team wanted to feel their users' pain firsthand, push single-app scaling limits, and feed internal learnings back into their product. By hosting lovable.dev on their own platform, every infrastructure improvement automatically benefits all 60M+ apps running there.
The challenge: Migrate a rapidly-evolving, massive codebase from Next.js to TanStack Start without halting feature development or breaking the live product.
Implementation highlights:
Parallel framework routing. A proxy worker dispatched requests to either Next.js on Vercel or TanStack Start based on route and user, enabling gradual rollout rather than big-bang switching. Feature flags controlled which framework served which percentage of traffic per route group.
Route grouping by user journeys. Instead of random route order, migrations were batched into five major groups based on how users actually navigate. This minimized expensive hard navigations (full document reloads) between frameworks, keeping median load times fast.
Shared code architecture. 90–95% of code lived in a framework-agnostic
#shared/folder accessible to both frameworks via TypeScript import aliases. Lint rules enforced that shared code never imported framework-specific modules.Adapter pattern for portability. Platform-specific APIs (routing, fonts, images) were wrapped in adapters with common interfaces, then imported as if they were framework-agnostic. The same
import { usePathname }call resolved to Next.js or TanStack Start depending on context.AI-assisted bulk migration. Agents drafted production-ready PRs for moving components and features, evolving from "teams review drafts" to "land them directly." Reusable prompts and agent skills meant the migration happened largely invisibly to the growing dev team.
Results and learnings:
Scaling lesson. Supporting tens of millions of visitors for a single app revealed unique challenges different from hosting millions of small apps—every fix became a platform-wide improvement.
Framework abstraction paid off. Pre-migration work replacing Next.js-specific APIs (fonts, images, auth, i18n) reduced migration surface area and brought immediate wins like 10x fewer Firebase calls.
Deterministic testing. Feature flags with overrideable parameters let tests run predictably against both frameworks, catching regressions before users saw them.
The real insight: when you're migrating a living, breathing codebase, incremental wins beat perfection. By shipping route groups gradually and keeping both frameworks alive in parallel, you turn a terrifying rewrite into a series of manageable steps. Plus, you get to tell people your website is now running on your website—which, architecturally speaking, is either brilliant or a bit too recursive.

ARTICLE (open models everywhere)
State of Open Models: Summer 2026 Observations
ARTICLE (flaky tests begone)
How we raised mobile end-to-end test stability to 98%
ARTICLE (seo gets generative)
ChatGPT search now uses the site:operator at scale
ESSENTIAL (keys distribute poorly)
Email encryption
ARTICLE (git goes brrr)
20× the CI traffic without getting slower: How we rebuilt Git serving at Datadog
ARTICLE (lisp for mortals)
A Friendly Introduction to Racket
ARTICLE (ai costs exploding)
How Should Engineering Leaders Measure The ROI Of AI?
ARTICLE (queries need translation)
Building a semantic layer: What it is and how we did it at PostHog
Want to reach 200,000+ engineers?
Let’s work together! Whether it’s your product, service, or event, we’d love to help you connect with this awesome community.

Brief: OpenRouter, the largest AI model marketplace processing 10+ trillion tokens daily, is joining Stripe to accelerate growth while maintaining its neutral, multi-model mission.
Brief: AWS launched Aws-Bench, a new tool to evaluate AI agents on cloud tasks.
Brief: VoidZero released Vite+ Beta, a unified web toolchain that consolidates multiple tools behind a single command.
Brief: MCP released an updated roadmap covering five priority areas including agentic messaging primitives, HTTP transport unification, and agent identity with enterprise security improvements.
Brief: AliExpress runs hidden WebAudio fingerprinting scripts that prevent Bluetooth multipoint headphones from switching between devices.

This week’s tip:
Interface Composition and Type Assertions for Plugin Architectures
Design minimal interfaces and use type assertions to create flexible plugin systems where components can optionally implement optional interfaces for extended behavior.

Wen?
When building extensible frameworks where components can opt into additional capabilities
When reducing coupling between core business logic and cross-cutting concerns
When migrating monolithic architectures to support third-party extensions
When it is dark enough, you can see the stars.
Ralph Waldo Emerson


That’s it for today! ☀️
Enjoyed this issue? Send it to your friends here to sign up, or share it on Twitter!
If you want to submit a section to the newsletter or tell us what you think about today’s issue, reply to this email or DM me on Twitter! 🐦
Thanks for spending part of your Monday morning with Hungry Minds.
See you in a week — Alex.
Icons by Icons8.
*I may earn a commission if you get a subscription through the links marked with “aff.” (at no extra cost to you).





