Ryan talks to Sam about reproducing iOS's new image background treatment for his Open Graph Preview tool, opengraph.ing. They talk about different approaches for generating gradients from images, including finding the vibrant color of an image, luminosity-weighted averages, k-means clustering, and more. Timestamps: 0:00 - Intro 3:07 - Apple's new OG image gradient 10:06 - Luminosity-weighted average 14:22 - Finding the vibrant color of an image 21:41 - Contrast ratios on favicons 32:21 - K-means...
Dec 12, 2024•49 min•Ep. 201
Sam and Ryan talk about React 19's useActionState hook. They discuss how adding async functions to a plain React app introduces lots of in-between states that developers must grapple with, and how useActionState allows React to collapse and eliminate these states, bringing the simplicity of React's sync mental model to our async code. Timestamps: 0:00 - Intro 1:51 - How React normally eliminates state in synchronous apps 8:20 - How useActionState lets React eliminate state in asynchronous apps 1...
Nov 14, 2024•1 hr•Ep. 200
Sam and Ryan talk about using Cloudflare Tunnel for local development, the new React Compiler beta release, and why reading or writing refs during render violates the rules of React. Timestamps: 0:00 - Intro 1:42 - Cloudflare Tunnel 7:06 - React Compiler 14:21 - Reading or writing refs during render Links: Cloudflare Tunnel React Compiler Beta release React Docs Pitfall on refs...
Oct 31, 2024•43 min•Ep. 199
Sam and Ryan talk about building a useAnimatedText hook that can animate streaming text. They also discuss how React code that uses state changes to approximate events can be simplified, and the benefits of having escape hatches when building UI with Catalyst. Timestamps: 0:00 - Intro 1:22 - Catalyst and escape hatches 16:03 - Building a useAnimatedText hook (aka useBufferedText) 54:10 - Avoiding using state changes to approximate events Links: Catalyst Sam's Tweet about useBufferedText and Anim...
Oct 24, 2024•1 hr 8 min•Ep. 198
Sam and Ryan talk about how frameworks and infrastructure evolve with each other, using Next.js as a representative example. They discuss how hosting providers like Heroku have always imposed certain constraints on apps, what features those constraints enable hosting providers to support, how burdensome those constraints are across different frameworks, and how frameworks that add infra-specific APIs can best communicate the costs of those APIs and benefits they enable. Timestamps: 0:00 - Intro ...
Oct 10, 2024•58 min•Ep. 197
Tom Occhino, Chief Product Officer at Vercel and former Engineering Director at Facebook, joins Sam to talk about the pivotal moments in React's history. He talks about how React popularized the ideas of declarative rendering and unidirectional data flow, how GraphQL furthered React's goal of co-locating all the concerns of a particular piece of UI, the problems that GraphQL led to at Facebook and how Relay solved them, and how Suspense, Server Components, and PPR are the generalized spiritual s...
Sep 18, 2024•1 hr•Ep. 196
Sam and Ryan talk about render props in React. They discuss where they came from, how Hooks superseded them for sharing stateful logic, how data attributes compare to them for customizing styling, and how for certain complex components like forms they're still a great solution for accessing slices of internal state. Timestamps: 0:00 - Intro 3:40 - Where did render props come from? 6:01 - How hooks replaced many use cases for render props 8:14 - Using render props for custom styling 10:32 - Data ...
Sep 05, 2024•35 min•Ep. 195
Sam and Ryan discuss controlled and uncontrolled components in React. They talk about how uncontrolled components can be thought of as components that manage their own internal state, why you should model your complex React components after the simpler APIs of native HTML elements like inputs, why you shouldn't try to make components that are both controlled and uncontrolled, and why making a new component boundary is sometimes all you need to make your custom components behave more predictably....
Aug 28, 2024•47 min•Ep. 194
Sam and Ryan talk about the pattern of building unstyled components with React. They discuss why unstyled components were created, how they improve upon composition patterns from UI libraries like Bootstrap, how they can be used to share behavior and logic without prescribing any styling opinions, and how they fit into a larger collection of React patterns that can be used to build more powerful components that avoid premature abstractions. Timestamps: 0:00 - Intro 1:36 - What are unstyled compo...
Aug 15, 2024•34 min•Ep. 193
Sam and Ryan talk about what sorts of capabilities a tool should have to be considered a web framework. They discuss how frameworks tackle the complexity of getting different systems to communicate with each other, how good frameworks embrace the strengths and patterns of the language they're written in, and why frameworks and services are not in opposition to each other. Timestamps: 0:00 - Intro 3:58 - Adapter pattern and cohesive boundaries 9:43 - Rails is Omakase 13:47 - Configurable, but sti...
Aug 01, 2024•1 hr 3 min•Ep. 192
Sam joins Lane Wagner in a crossover episode with the Backend Banter podcast. They talk about abstractions in frontend and backend frameworks, what JavaScript is doing differently from other languages and frameworks, why the frontend should drive the backend even if you're building in a server-side framework, and what's so special about React Server Components. Timestamps: 0:00 - Intro 2:12 - When abstractions leak 6:37 - Recap of Sam's BigSky talk 10:51 - What is JavaScript doing differently? 1...
Jul 25, 2024•59 min•Ep. 191
Sam and Ryan read and discuss a fantastic interactive blog post about queueing in HTTP written by Sam Rose. Timestamps: 0:00 - Intro 6:57 - Queueing: An interactive study of queueing strategies 9:05 - Why do we need queues? 13:16 - FIFO and timing out 17:55 - LIFO 20:58 - Priority queues 25:21 - Active queue management 29:08 - Comparing queues 36:32 - Conclusion Links: Queueing: An interactive study of queueing strategies Up and Down the Ladder of Abstraction...
Jul 18, 2024•46 min•Ep. 190
Sam and Ryan discuss the new features in React 19 that will specifically benefit developers building single-page applications. They talk about how Suspense and Transitions let developers "teach" React about when their apps are in a loading or a pending state, how Client Actions improve upon using events in React 18 to handle data mutations, and how Actions enable React Components to automatically render and discard optimistic updates without any knowledge of the application's data layer. They al...
Jul 11, 2024•1 hr•Ep. 189
Sam tells Ryan about a recent talk he gave at BigSkyDevCon. They chat about how backend frameworks are raising the ceiling of what UIs they’re capable of delivering, how frontend frameworks are raising the floor of what backend features they come bundled with, and what each community can learn from the other. Timestamps: 0:00 - Intro 4:23 - Recap of Ryan Florence’s talk 6:49 - Overview of "High floor, high ceiling" 10:02 - Cohesion is the biggest strength of backend frameworks 17:10 - Why doesn’...
Jul 03, 2024•59 min•Ep. 188
Sam and Ryan talk about the difference between the costs of building a feature and the benefits that feature brings to our end users. They discuss how libraries and frameworks can lower the technical cost of building a given feature, how Ryan Florence framed this calculation in his talk at Big Sky Dev Con, and how sometimes developers’ opinions and tastes about tech can smuggle their way from the cost side of the equation into the benefit side. Topics include: 0:00 - Intro 6:53 - How Ryan Floren...
Jun 20, 2024•1 hr 14 min•Ep. 187
Ryan tells Sam about his experiments with using the new View Transitions API in a React photo gallery app. He talks about how he likes the flexibility of the API, how to think about integrating it into any client-rendered app regardless of the framework, and how he used a Promise with an Effect to tie a View Transition to a React Transition. Topics include: 0:00 - Intro 1:11 - What it’s like to integrate View Transitions with React 7:30 - How View Transitions work 16:09 - Building a gallery that...
Jun 12, 2024•53 min•Ep. 186
Sam tells Ryan about his experience setting up an in-browser code editor with CodeMirror that he plans on using for blog posts and code recipes, as well as what he thought about using Radix Themes for the first time in earnest on a side project of his currently styled with Tailwind. Topics include: 0:00 - Intro 4:01 - Building an authoring tool with CodeMirror 18:47 - Refactoring Tailwind to Radix Themes Links: CodeMirror Sam’s YouTube video on Radix Themes Radix Themes docs...
Apr 17, 2024•45 min•Ep. 185
Sam and Ryan talk about why it’s better to think of throw as a general-purpose JavaScript language feature rather than something that should only be used for error handling. They discuss the ambiguity around the phrase “error handling”, situations that call for dealing with errors locally vs. globally, and how throw can be useful for non-error control flow. They also discuss the problems with trying to shoehorn dynamic features into a static site. Topics include: 0:00 - Intro 4:07 - Error handli...
Apr 10, 2024•1 hr 4 min•Ep. 184
Sam and Ryan discuss the core values of the Next.js framework, and how those values motivate several of the framework’s design decisions. They talk about caching, why layouts don’t have access to the URL, and why the router doesn’t expose navigation events, as well as how developers should think about extending Next’s functionality with their own application code. Topics include: 0:00 - Intro 2:58 - Why don’t layouts re-render in Next.js? 7:10 - Push-based vs. pull-based rendering 8:56 - Thinkin...
Mar 22, 2024•1 hr 16 min•Ep. 183
Sam talks to Ryan about refactoring an MDX blog post to a React Server Component. They discuss how RSC’s ability to render server-side content with “client-side holes” turns out to replace MDX for many uses cases. They also talk about other tools that are (surprisingly) a conceptual subset of the RSC architecture, such as custom Webpack loaders. Topics include: 0:00 - Intro 5:05 - The Next.js happy path for MDX: Local files 11:15 - Exploring remote MDX content with mdx-remote 14:46 - Separating ...
Mar 13, 2024•1 hr 10 min•Ep. 182
Sam and Ryan read and discuss the latest update from React Labs. Topics include: 0:00 - Intro 5:26 - Opening 6:18 - React Compiler 27:27 - Actions 51:44 - Asset loading 1:13:06 - Next Major Version of React 1:15:42 - Activity Links: React Labs blog post Sam’s video on Strict Mode...
Mar 01, 2024•1 hr 23 min•Ep. 181
Sam and Ryan discuss the intuition behind React Transitions, and why React’s new useOptimistic hook is a good fit for building a URL-driven filter panel that stays fully responsive to client interactions. Topics include: 0:00 - Intro 1:12 - The problem: In a world of Server Components, URL updates are blocked by a server-side roundtrip 10:44 - Attempted solution: Use the browser’s Native History API (history.pushState) 15:03 - Realization: The source of truth flips from server to client during t...
Feb 21, 2024•45 min•Ep. 180
Ryan and Sam discuss the purpose and usage of the useOptimistic() hook, a new experimental API from React. Topics include: 0:00 - Intro 2:18 - Problem: RSCs require a server roundtrip before the UI can be updated 10:13 - Solution: useOptimistic() lets you merge ephemeral client-side state with server-side data so you can update the UI during a Server Action or Transition 14:03 - How useOptimistic() avoids the notion of identity by discarding the ephemeral state after the app settles 21:17 - How ...
Feb 14, 2024•51 min•Ep. 179
Ryan and Sam discuss the purpose and usage of the cache() function, a new experimental API from React. Topics include: 0:00 - Intro 2:29 - Caching in Next.js vs. React cache() 8:11 - Why React invalidates the cache for each server request 14:43 - How cache() enables colocation of data-fetching code 16:14 - Using cache() to share CPU-heavy or I/O-bound tasks between components 19:31 - Why cache() obviates the need for context in Server Components 23:19 - The danger of module scope on the server 2...
Feb 07, 2024•1 hr 7 min•Ep. 178
Sam and Ryan talk about Advanced Radix UI, Build UI’s newest course. They also read and discuss a blog post that describes the RSC architecture in terms of two processes: React Server and React Client. Topics include: 0:00 - Intro 0:49 - Ceilingless libraries + Advanced Radix UI 21:02 - Read and discuss: “RSC is React Server + Component” Links: Advanced Radix UI course Radix UI RSC is React Server + Component...
Feb 01, 2024•56 min•Ep. 177
Ian Landsman & Aaron Francis join Sam to discuss React Server Actions & Server Components, why it's important to have one set of opinions, and yes, the infamous SQL Injection Slide at NextConf. This is a crossover episode with the excellent podcast Mostly Technical . Topics include: 0:00 - The Most Memed Man on the Internet 09:06 - High Floor vs. High Ceiling 19:20 - What the Hell Is Next? 23:22 - The Third Phase of React 29:09 - Your App Is Not Unique 35:23 - Server Actions & Server...
Nov 06, 2023•1 hr 28 min•Ep. 176
Sam and Ryan talk about the key parts of Remix’s architecture in the context of the Work Journal app from Build UI’s latest course. They discuss how Remix’s conventions around Links, Forms, Actions, and Loaders allow developers to eliminate boilerplate and take advantage of the best HTTP has to offer, while still providing a seamless way to enhance their UIs using the full power of client-side React. Topics include: 0:00 - Intro 0:31 - The Work Journal app 2:20 - Making dynamic pages with Loader...
Oct 14, 2023•46 min•Ep. 175
Ryan continues to share the details behind his custom RSC implementation. He talks with Sam about how Server Actions allow the client to reference server-side code (in the same way client components allow the server to reference client-side code), how Server Actions are bundled and invoked, and the security concerns associated with blurring the lines between the server and the client. Topics include: 0:00 - Intro 0:52 - Ryan’s course on React Server Components 3:06 - Motivating Server Actions, h...
Oct 04, 2023•57 min•Ep. 174
Ryan shares how building his own RSC implementation from scratch helped him better understand React’s new paradigm. He and Sam talk about how a client React app can fetch an RSC Payload from a server endpoint to update the UI, how an RSC server renders and bundles Client code that’s part of a Server Component tree, and how a client-side Router can be used to fetch new RSC trees based on the URL. Topics include: 0:00 - Intro 2:48 - Making a server endpoint that a client React app can use to re-re...
Sep 29, 2023•59 min•Ep. 173
Ryan and Sam talk about how to invalidate Next.js’ client-side cache when a different session makes changes to backend data, and ultimately discuss whether clicking a link to a URL vs. hitting refresh on that same URL should render the same page if no backend data has changed. Topics include: 0:00 - Intro 1:00 - Suspense boundary identity and the Await component 11:07 - How to refresh RSC using a Server Action 27:17 - The difference between a navigation and a page refresh Links: Ryan’s Data Fetc...
Sep 20, 2023•45 min•Ep. 172