Happy Monday! ☀️

Welcome to the 264 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.

In 2017, Yelp chose Flow over TypeScript for its typechecker. But by 2021, the landscape had shifted: TypeScript's DefinitelyTyped had vastly more packages, the Flow team refocused on Facebook's internal needs, and TypeScript proved more stable long-term. Starting in early 2022, Yelp began scoping a migration of its entire monorepo—over 1.4 million lines of code spread across 570+ packages.

The core challenge: migrate gradually without losing type safety or breaking the development experience. A single rewrite was infeasible. A code freeze was unrealistic. So Yelp had to run Flow and TypeScript side-by-side in production, converting one package at a time while maintaining complete type integrity across the entire system.

The challenge: Converting a million-line Flow monorepo to TypeScript without ever breaking typechecking or sacrificing type coverage.

Implementation highlights:

  1. Automated tooling backbone. Used open-source flowts and later Stripe's flow-to-typescript-codemod for bulk conversions, augmented with custom codemods for edge cases. Manual effort was still required, but automation saved tens of thousands of engineer hours.

  2. Bidirectional type compatibility. Converted TypeScript packages back to Flow-compatible headers using flowgen, allowing Flow code to safely import newly migrated packages. Yelp started with deepest dependencies and worked upward to avoid type integrity gaps.

  3. Monorepo-level tooling. The Lerna monorepo structure enabled single-PR toolchain updates across all JavaScript code, rather than hundreds of individual package repos. Each package was small enough (a few thousand lines) to migrate in a day or two.

  4. Extensive dogfooding. Webcore and Design Systems converted ~90 foundational packages before launching to feature teams. This exposed toolchain issues early and built confidence in the new developer experience.

  5. Data-driven unblocking. Built graph analysis tools that scored packages by their "importance"—prioritizing conversions that would unblock the most downstream packages. Used visualizations to coordinate the final push to completion.

Results and learnings:

  • Type coverage improved significantly. Overall type coverage rose from 83.15% (Flow) to 96.44% (TypeScript), with only ~6,000 @ts-expect-error directives across 1.4M SLoC.

  • Developer experience won converts. 82% of surveyed engineers reported increased productivity in TypeScript, with 45% calling it "significant." LLMs also perform better on TypeScript code due to larger training datasets.

  • Preserved trust through consistency. Only one brief typechecking outage occurred during the three-year-seven-month migration. Never compromising type safety meant teams stayed confident in their tools—the opposite of migrations that accumulate type-ignore comments like technical debt.

The real lesson: a gradual migration with polished tooling and extensive communication beats any quick rewrite. Yelp's three-year journey turned what could have been a painful flag day into a steady conversion that teams eventually embraced. Just don't rely on 2023-era LLMs to do the heavy lifting—they're still better at pretending to fix your types than actually fixing them.

ARTICLE (agents need guardrails)
Brownfield agentic engineering

ESSENTIAL (just ship the thing)
Grit your teeth and ship it

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: OpenAI released GPT-6 Sol and Luna, more affordable models trained with Astra's methods, cutting API prices by 50% compared to their GPT-5.6 predecessors.

Brief: Anthropic launched Claude Opus 5.5, delivering 40% lower costs and 30% faster output while matching Claude Fable 5.1 performance on most tasks.

Brief: Grok 4.7 improves coding and reasoning capabilities with better self-verification while maintaining the same price as Grok 4.6.

Brief: Anthropic's Claude AI discovered a novel enzyme system with CRISPR-like properties in bacteriophage DNA by autonomously analyzing massive sequence databases.

Brief: Cloudflare now supports HTTP Vary headers in Cache Rules, letting customers control how the company handles request header variations to improve cache efficiency across all plans.

This week’s tip:

Memory-Safe Concurrent Patterns with Arc and Parking Lot

Replacing std::sync::Mutex with parking_lot::Mutex and leveraging Arc for shared ownership eliminates poisoning semantics while reducing lock contention in high-throughput concurrent systems, critical for building performant server applications.

Wen?

  • When building low-latency services where Mutex poisoning or lock fairness becomes a bottleneck

  • When implementing lock-free read patterns where readers vastly outnumber writers

  • When migrating from std synchronization primitives shows measurable contention in profiling data

Sometimes you have to travel a long way to find what is near.
Paulo Coelho

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).