Next.js and React
React has been the dominant UI library for a while now, but the introduction of Server Components changed the conversation in a meaningful way. Instead of hydrating an entire component tree on the client, you can now decide per-component whether the work should happen on the server — keeping JavaScript payloads small and data fetching close to the source.
Next.js is the framework that makes all of this practical. The App Router (introduced in version 13 and stable in 15) uses the filesystem for routing, co-locates layouts with their segments, and gives you streaming and Suspense out of the box. It's a significant departure from the Pages Router, but the mental model — layouts wrap pages, loading.tsx handles async states, error.tsx catches failures — clicks quickly once you internalize it.
The shift from getServerSideProps and getStaticProps to async server components that fetch data directly is one of those changes that feels overdue in hindsight. There's less indirection and the data flows are easier to follow. Server Actions add one more layer, letting form submissions and mutations happen without a separate API route for the simple cases. It's not a perfect model, but it's a genuinely productive one.

