<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yahoo.com/mrss/" xmlns:podcast="https://podcastindex.org/namespace/1.0">
  <channel>
    <atom:link href="https://feeds.simplecast.com/sOJAMohP" rel="self" title="MP3 Audio" type="application/atom+xml"/>
    <atom:link href="https://simplecast.superfeedr.com" rel="hub" xmlns="http://www.w3.org/2005/Atom"/>
    <generator>https://simplecast.com</generator>
    <title>Frontend First</title>
    <description>A podcast about modern UI development on the web. Hosted by Sam Selikoff and Ryan Toronto.</description>
    <copyright>Copyright 2017-2020 Frontend First</copyright>
    <language>en</language>
    <pubDate>Thu, 12 Dec 2024 18:33:54 +0000</pubDate>
    <lastBuildDate>Thu, 12 Dec 2024 18:34:05 +0000</lastBuildDate>
    <image>
      <link>https://frontendfirst.fm</link>
      <title>Frontend First</title>
      <url>https://image.simplecastcdn.com/images/84e5ba06-8b7b-48ae-957b-d3dc44f6da5a/33fedf57-a991-4ed4-9bba-76fce454895c/3000x3000/frontend-first-podcast-art.jpg?aid=rss_feed</url>
    </image>
    <link>https://frontendfirst.fm</link>
    <itunes:type>episodic</itunes:type>
    <itunes:summary>A podcast about modern UI development on the web. Hosted by Sam Selikoff and Ryan Toronto.</itunes:summary>
    <itunes:author>Sam Selikoff, Ryan Toronto</itunes:author>
    <itunes:explicit>false</itunes:explicit>
    <itunes:image href="https://image.simplecastcdn.com/images/84e5ba06-8b7b-48ae-957b-d3dc44f6da5a/33fedf57-a991-4ed4-9bba-76fce454895c/3000x3000/frontend-first-podcast-art.jpg?aid=rss_feed"/>
    <itunes:new-feed-url>https://feeds.simplecast.com/sOJAMohP</itunes:new-feed-url>
    <itunes:keywords>technology, web, javascript, ember, ember.js, software, development, design</itunes:keywords>
    <itunes:owner>
      <itunes:name>Frontend First</itunes:name>
      <itunes:email>sam@samselikoff.com</itunes:email>
    </itunes:owner>
    <itunes:category text="Technology"/>
    <itunes:category text="Technology"/>
    <itunes:category text="Technology"/>
    <item>
      <guid isPermaLink="false">c86f6e34-a0f5-4c51-830f-a53c3d8823f6</guid>
      <title>Creating a background gradient from an image</title>
      <description><![CDATA[<p>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.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>3:07 - Apple's new OG image gradient</li><li>10:06 - Luminosity-weighted average</li><li>14:22 - Finding the vibrant color of an image</li><li>21:41 - Contrast ratios on favicons</li><li>32:21 - K-means clustering</li><li>41:25 - Refactoring UI tip about rotating the hue</li></ul><p>Links:</p><ul><li><a href="https://opengraph.ing/">Open Graph Preview</a></li><li><a href="https://www.refactoringui.com/">Refactoring UI</a></li></ul>
]]></description>
      <pubDate>Thu, 12 Dec 2024 18:33:54 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>3:07 - Apple's new OG image gradient</li><li>10:06 - Luminosity-weighted average</li><li>14:22 - Finding the vibrant color of an image</li><li>21:41 - Contrast ratios on favicons</li><li>32:21 - K-means clustering</li><li>41:25 - Refactoring UI tip about rotating the hue</li></ul><p>Links:</p><ul><li><a href="https://opengraph.ing/">Open Graph Preview</a></li><li><a href="https://www.refactoringui.com/">Refactoring UI</a></li></ul>
]]></content:encoded>
      <enclosure length="46717981" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/8d0c5f53-4776-46bb-aa47-33885a16875d/audio/695d4b9b-f227-469b-a349-57cb6354a055/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Creating a background gradient from an image</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:48:39</itunes:duration>
      <itunes:summary>Ryan talks to Sam about reproducing iOS&apos;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.</itunes:summary>
      <itunes:subtitle>Ryan talks to Sam about reproducing iOS&apos;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.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>201</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">2920a3c1-c6d2-4661-aced-8ab91cc505e4</guid>
      <title>Exploring useActionState</title>
      <description><![CDATA[<p>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.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>1:51 - How React normally eliminates state in synchronous apps</li><li>8:20 - How useActionState lets React eliminate state in asynchronous apps</li><li>18:17 - Why you shouldn't just pass server actions into useActionState</li><li>23:00 - TCP/IP and UDP analogy</li><li>26:39 - Thinking of useActionState like enqueue</li><li>34:55 - Why the term "reducer" is too loaded for best understanding useActionState</li><li>51:07 - How useActionState helps you build a Todo app that stays responsive during pending actions</li></ul>
]]></description>
      <pubDate>Thu, 14 Nov 2024 19:47:04 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>1:51 - How React normally eliminates state in synchronous apps</li><li>8:20 - How useActionState lets React eliminate state in asynchronous apps</li><li>18:17 - Why you shouldn't just pass server actions into useActionState</li><li>23:00 - TCP/IP and UDP analogy</li><li>26:39 - Thinking of useActionState like enqueue</li><li>34:55 - Why the term "reducer" is too loaded for best understanding useActionState</li><li>51:07 - How useActionState helps you build a Todo app that stays responsive during pending actions</li></ul>
]]></content:encoded>
      <enclosure length="57568202" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/43041d3d-79d0-4e02-9fbe-db76ff0789ee/audio/e1bffaca-f573-409a-9148-78891ddf5730/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Exploring useActionState</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:59:57</itunes:duration>
      <itunes:summary>Sam and Ryan talk about React 19&apos;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&apos;s sync mental model to our async code.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about React 19&apos;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&apos;s sync mental model to our async code.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>200</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">f1e441aa-88f3-4e9d-8b47-9bb1c6156a33</guid>
      <title>Cloudflare Tunnel | React Compiler | refs during render</title>
      <description><![CDATA[<p>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.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>1:42 - Cloudflare Tunnel</li><li>7:06 - React Compiler</li><li>14:21 - Reading or writing refs during render</li></ul><p>Links:</p><ul><li><a href="https://www.cloudflare.com/products/tunnel/">Cloudflare Tunnel</a></li><li><a href="https://react.dev/blog/2024/10/21/react-compiler-beta-release">React Compiler Beta release</a></li><li><a href="https://react.dev/reference/react/useRef#referencing-a-value-with-a-ref">React Docs Pitfall on refs</a></li></ul>
]]></description>
      <pubDate>Thu, 31 Oct 2024 15:58:05 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>1:42 - Cloudflare Tunnel</li><li>7:06 - React Compiler</li><li>14:21 - Reading or writing refs during render</li></ul><p>Links:</p><ul><li><a href="https://www.cloudflare.com/products/tunnel/">Cloudflare Tunnel</a></li><li><a href="https://react.dev/blog/2024/10/21/react-compiler-beta-release">React Compiler Beta release</a></li><li><a href="https://react.dev/reference/react/useRef#referencing-a-value-with-a-ref">React Docs Pitfall on refs</a></li></ul>
]]></content:encoded>
      <enclosure length="41071353" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/b4be29f6-f474-499e-a5ef-eb4294945fb6/audio/cba6d5cb-c9b1-41ec-9204-4b9fd6fc188d/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Cloudflare Tunnel | React Compiler | refs during render</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:42:46</itunes:duration>
      <itunes:summary>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.</itunes:summary>
      <itunes:subtitle>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.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>199</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">028e2250-817f-4541-b0af-8c2e6b9cf4ce</guid>
      <title>useAnimatedText | Events vs. State Changes | Catalyst</title>
      <description><![CDATA[<p>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.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>1:22 - Catalyst and escape hatches</li><li>16:03 - Building a useAnimatedText hook (aka useBufferedText)</li><li>54:10 - Avoiding using state changes to approximate events</li></ul><p>Links:</p><ul><li><a href="https://catalyst.tailwindui.com/">Catalyst</a></li><li><a href="https://x.com/samselikoff/status/1845640546208870750">Sam's Tweet about useBufferedText and AnimatedScroller</a></li><li><a href="https://buildui.com/recipes/use-animated-text">useAnimatedText recipe</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter">Intl.Segmenter on MDN</a></li><li><a href="https://twitter.com/DavidKPiano/status/1844726710559793370">David K's Tweet on events</a></li><li><a href="https://twitter.com/rickhanlonii/status/1845514610692272402">Ricky's Tweet on Intersection Observer</a></li><li><a href="https://buildui.com/courses/advanced-react-component-patterns">Build UI's new course</a></li></ul>
]]></description>
      <pubDate>Thu, 24 Oct 2024 15:09:56 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>1:22 - Catalyst and escape hatches</li><li>16:03 - Building a useAnimatedText hook (aka useBufferedText)</li><li>54:10 - Avoiding using state changes to approximate events</li></ul><p>Links:</p><ul><li><a href="https://catalyst.tailwindui.com/">Catalyst</a></li><li><a href="https://x.com/samselikoff/status/1845640546208870750">Sam's Tweet about useBufferedText and AnimatedScroller</a></li><li><a href="https://buildui.com/recipes/use-animated-text">useAnimatedText recipe</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter">Intl.Segmenter on MDN</a></li><li><a href="https://twitter.com/DavidKPiano/status/1844726710559793370">David K's Tweet on events</a></li><li><a href="https://twitter.com/rickhanlonii/status/1845514610692272402">Ricky's Tweet on Intersection Observer</a></li><li><a href="https://buildui.com/courses/advanced-react-component-patterns">Build UI's new course</a></li></ul>
]]></content:encoded>
      <enclosure length="65598451" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/329cc3dd-43eb-4ad4-9231-344c0bc12b99/audio/e398059f-c632-4e86-af0c-cddbba369608/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>useAnimatedText | Events vs. State Changes | Catalyst</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:08:19</itunes:duration>
      <itunes:summary>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.</itunes:summary>
      <itunes:subtitle>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.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>198</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">8cd53414-3b57-4a33-8103-508f086e93ae</guid>
      <title>Can you self-host Next.js?</title>
      <description><![CDATA[<p>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.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>3:03 - Heroku and the Twelve-Factor App</li><li>7:39 - GitHub Pages and static sites</li><li>13:57 - Serverless and JAMstack</li><li>17:30 - Vercel and CDNs, self-hosting, and Next.js</li><li>19:00 - How framework APIs can nudge an app towards a particular hosting solution</li><li>23:09 - What constraints does Next.js impose on your app (e.g. middleware doesn't run node), and what benefits do those constraints give you?</li><li>36:13 - How Next.js APIs are motivated by wanting to tease apart static and dynamic code, in an attempt to support the needs of any web app with a single stack</li><li>40:33 - What is the relationship between frameworks and infra?</li><li>47:37 - How can frameworks that add infra-specific APIs best communicate the costs of those APIs and the benefits they enable?</li></ul><p>Links:</p><ul><li><a href="https://12factor.net/">The Twelve-Factor App</a></li></ul>
]]></description>
      <pubDate>Thu, 10 Oct 2024 16:26:06 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>3:03 - Heroku and the Twelve-Factor App</li><li>7:39 - GitHub Pages and static sites</li><li>13:57 - Serverless and JAMstack</li><li>17:30 - Vercel and CDNs, self-hosting, and Next.js</li><li>19:00 - How framework APIs can nudge an app towards a particular hosting solution</li><li>23:09 - What constraints does Next.js impose on your app (e.g. middleware doesn't run node), and what benefits do those constraints give you?</li><li>36:13 - How Next.js APIs are motivated by wanting to tease apart static and dynamic code, in an attempt to support the needs of any web app with a single stack</li><li>40:33 - What is the relationship between frameworks and infra?</li><li>47:37 - How can frameworks that add infra-specific APIs best communicate the costs of those APIs and the benefits they enable?</li></ul><p>Links:</p><ul><li><a href="https://12factor.net/">The Twelve-Factor App</a></li></ul>
]]></content:encoded>
      <enclosure length="55730435" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/3a00676a-df9c-4368-9b88-563b363418f1/audio/a2ebc699-e85f-421e-8dc8-3e74687f2624/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Can you self-host Next.js?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:58:03</itunes:duration>
      <itunes:summary>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.</itunes:summary>
      <itunes:subtitle>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.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>197</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">3a4037a3-e9f7-490f-9aa8-d82f7c1af668</guid>
      <title>Tom Occhino on the future of React</title>
      <description><![CDATA[<p>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 successors to the stack used at Facebook.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>2:53 - Declarative rendering as React's legacy</li><li>8:12 - How GraphQL enabled complex components to be fully self-contained</li><li>20:12 - How React's goal has always been to co-locate all the concerns of a particular piece of UI</li><li>22:58 - The problem with co-locating GraphQL with components, and how Relay solved it</li><li>26:28 - How RSC is the generalized spiritual successor to BigPipe and GraphQL</li><li>34:46 - What PPR is, and how it and Suspense fit into this story</li><li>55:55 - The general paradigm shift of getting static code to the device as soon as possible</li></ul><p>Links:</p><ul><li><a href="https://youtu.be/C1m5hQDjk20">Tom Occhino with Ben Dunphy</a></li><li><a href="https://youtu.be/8pDqJVdNa44">React: The Documentary</a></li><li><a href="https://youtu.be/g5BGoLyGjY0">React Roundtable with Andrew Clark and Sebastian Markbåge</a></li><li><a href="https://twitter.com/tomocchino">Tom Occhino on Twitter</a></li></ul>
]]></description>
      <pubDate>Wed, 18 Sep 2024 17:43:46 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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 successors to the stack used at Facebook.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>2:53 - Declarative rendering as React's legacy</li><li>8:12 - How GraphQL enabled complex components to be fully self-contained</li><li>20:12 - How React's goal has always been to co-locate all the concerns of a particular piece of UI</li><li>22:58 - The problem with co-locating GraphQL with components, and how Relay solved it</li><li>26:28 - How RSC is the generalized spiritual successor to BigPipe and GraphQL</li><li>34:46 - What PPR is, and how it and Suspense fit into this story</li><li>55:55 - The general paradigm shift of getting static code to the device as soon as possible</li></ul><p>Links:</p><ul><li><a href="https://youtu.be/C1m5hQDjk20">Tom Occhino with Ben Dunphy</a></li><li><a href="https://youtu.be/8pDqJVdNa44">React: The Documentary</a></li><li><a href="https://youtu.be/g5BGoLyGjY0">React Roundtable with Andrew Clark and Sebastian Markbåge</a></li><li><a href="https://twitter.com/tomocchino">Tom Occhino on Twitter</a></li></ul>
]]></content:encoded>
      <enclosure length="58036734" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/20eed85d-a40d-40d6-a723-ff46ad6c49b7/audio/27f7825d-678e-4840-89c1-f01d56c17144/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Tom Occhino on the future of React</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:00:27</itunes:duration>
      <itunes:summary>Tom Occhino, Chief Product Officer at Vercel and former Engineering Director at Facebook, joins Sam to talk about the pivotal moments in React&apos;s history. He talks about how React popularized the ideas of declarative rendering and unidirectional data flow, how GraphQL furthered React&apos;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 successors to the stack used at Facebook.</itunes:summary>
      <itunes:subtitle>Tom Occhino, Chief Product Officer at Vercel and former Engineering Director at Facebook, joins Sam to talk about the pivotal moments in React&apos;s history. He talks about how React popularized the ideas of declarative rendering and unidirectional data flow, how GraphQL furthered React&apos;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 successors to the stack used at Facebook.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>196</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">bfbf1ec0-accb-4424-b3fa-32008be3f625</guid>
      <title>Render props</title>
      <description><![CDATA[<p>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.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>3:40 - Where did render props come from?</li><li>6:01 - How hooks replaced many use cases for render props</li><li>8:14 - Using render props for custom styling</li><li>10:32 - Data attributes vs. render props for custom styling</li><li>16:43 - Using render props to peek into an uncontrolled component's internal state</li><li>21:05 - Forms example and using render props for a smaller public API</li><li>24:10 - React docs mention of render props</li><li>25:48 - Where render props shine</li></ul><p>Links:</p><ul><li><a href="https://headlessui.com/react/menu#using-data-attributes">Headless UI Menu</a></li><li><a href="https://www.radix-ui.com/primitives/docs/components/form#accessing-the-validity-state-for-more-control">Radix Forms</a></li><li><a href="https://react-spectrum.adobe.com/react-aria/forms.html">React Aria Forms</a></li><li><a href="https://react.dev/reference/react/cloneElement#passing-data-with-a-render-prop">React docs - Render props</a></li><li><a href="https://buildui.com/courses/advanced-react-component-patterns">Our upcoming course on React Component Patterns</a></li><li><a href="mailto:sam@buildui.com">Email Sam</a></li><li><a href="mailto:ryan@buildui.com">Email Ryan</a></li></ul>
]]></description>
      <pubDate>Thu, 5 Sep 2024 19:13:06 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>3:40 - Where did render props come from?</li><li>6:01 - How hooks replaced many use cases for render props</li><li>8:14 - Using render props for custom styling</li><li>10:32 - Data attributes vs. render props for custom styling</li><li>16:43 - Using render props to peek into an uncontrolled component's internal state</li><li>21:05 - Forms example and using render props for a smaller public API</li><li>24:10 - React docs mention of render props</li><li>25:48 - Where render props shine</li></ul><p>Links:</p><ul><li><a href="https://headlessui.com/react/menu#using-data-attributes">Headless UI Menu</a></li><li><a href="https://www.radix-ui.com/primitives/docs/components/form#accessing-the-validity-state-for-more-control">Radix Forms</a></li><li><a href="https://react-spectrum.adobe.com/react-aria/forms.html">React Aria Forms</a></li><li><a href="https://react.dev/reference/react/cloneElement#passing-data-with-a-render-prop">React docs - Render props</a></li><li><a href="https://buildui.com/courses/advanced-react-component-patterns">Our upcoming course on React Component Patterns</a></li><li><a href="mailto:sam@buildui.com">Email Sam</a></li><li><a href="mailto:ryan@buildui.com">Email Ryan</a></li></ul>
]]></content:encoded>
      <enclosure length="33336600" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/9ae1021c-9556-45c3-8331-92948a09672c/audio/9c7dfaec-287b-4203-ab4d-6a167a26474a/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Render props</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:34:43</itunes:duration>
      <itunes:summary>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&apos;re still a great solution for accessing slices of internal state.</itunes:summary>
      <itunes:subtitle>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&apos;re still a great solution for accessing slices of internal state.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>195</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">897072c4-b0fe-47db-b3cc-06f8d7c421cb</guid>
      <title>Controlled and uncontrolled components</title>
      <description><![CDATA[<p>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.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>1:41 - What are controlled and uncontrolled components?</li><li>6:11 - How to change a component from uncontrolled to controlled</li><li>8:48 - How do you decide when to use a controlled or uncontrolled component?</li><li>12:00 - Sortable table example and a single source of truth</li><li>15:27 - Is it always either controlled or uncontrolled?</li><li>21:09 - Color picker example and not exposing internal state</li><li>28:46 - Sortable list example with Framer Motion</li><li>39:45 - Component boundaries and wearing two hats: the library author vs. library consumer</li><li>41:43 - How do you know if you are using the wrong approach?</li></ul><p>Links:</p><ul><li><a href="https://buildui.com/courses/advanced-react-component-patterns">New course: Advanced React Component Patterns</a></li><li><a href="https://react.dev/learn/sharing-state-between-components#controlled-and-uncontrolled-components">React docs: Controlled and uncontrolled components</a></li><li><a href="https://react.dev/reference/react/useState#storing-information-from-previous-renders">React docs: Storing state from previous renders</a></li><li><a href="mailto:sam@buildui.com">Email Sam</a></li><li><a href="mailto:ryan@buildui.com">Email Ryan</a></li><li><a href="https://x.com/frontendfirstfm">Frontend First on Twitter</a></li></ul>
]]></description>
      <pubDate>Wed, 28 Aug 2024 14:00:17 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>1:41 - What are controlled and uncontrolled components?</li><li>6:11 - How to change a component from uncontrolled to controlled</li><li>8:48 - How do you decide when to use a controlled or uncontrolled component?</li><li>12:00 - Sortable table example and a single source of truth</li><li>15:27 - Is it always either controlled or uncontrolled?</li><li>21:09 - Color picker example and not exposing internal state</li><li>28:46 - Sortable list example with Framer Motion</li><li>39:45 - Component boundaries and wearing two hats: the library author vs. library consumer</li><li>41:43 - How do you know if you are using the wrong approach?</li></ul><p>Links:</p><ul><li><a href="https://buildui.com/courses/advanced-react-component-patterns">New course: Advanced React Component Patterns</a></li><li><a href="https://react.dev/learn/sharing-state-between-components#controlled-and-uncontrolled-components">React docs: Controlled and uncontrolled components</a></li><li><a href="https://react.dev/reference/react/useState#storing-information-from-previous-renders">React docs: Storing state from previous renders</a></li><li><a href="mailto:sam@buildui.com">Email Sam</a></li><li><a href="mailto:ryan@buildui.com">Email Ryan</a></li><li><a href="https://x.com/frontendfirstfm">Frontend First on Twitter</a></li></ul>
]]></content:encoded>
      <enclosure length="45520528" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/7396880f-9483-44d7-9e4f-6ae738bdc6ba/audio/e58b91af-a73c-487b-823e-46d7c3e6180f/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Controlled and uncontrolled components</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:47:25</itunes:duration>
      <itunes:summary>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&apos;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.</itunes:summary>
      <itunes:subtitle>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&apos;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.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>194</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">bafe73d7-283a-440e-85a5-e30f41bbffb7</guid>
      <title>Unstyled React components</title>
      <description><![CDATA[<p>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.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>1:36 - What are unstyled components?</li><li>2:24 - How do unstyled components improve upon earlier patterns?</li><li>6:44 - Why would you want to use an unstyled component?</li><li>9:58 - How can you compose an unstyled component with a styled component?</li><li>16:41 - How to decide which pattern is best suited for the code you want to share</li><li>19:36 - Using patterns that preserve React's locality of behavior</li><li>24:49 - How do you know if an abstraction is good?</li><li>32:54 - Build UI's upcoming course on Advanced React Component Patterns</li></ul><p>Links:</p><ul><li><a href="https://buildui.com/courses/advanced-react-component-patterns">Build UI's newest course: Advanced React Component Patterns</a></li><li><a href="https://youtu.be/6UU2Ey4KZr8?si=voMRjo3lyVTaXVeu">Sam's YouTube video on Recursive Components</a></li><li><a href="mailto:sam@buildui.com">Email Sam</a></li><li><a href="mailto@ryan@buildui.com">Email Ryan</a></li></ul>
]]></description>
      <pubDate>Thu, 15 Aug 2024 03:11:11 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>1:36 - What are unstyled components?</li><li>2:24 - How do unstyled components improve upon earlier patterns?</li><li>6:44 - Why would you want to use an unstyled component?</li><li>9:58 - How can you compose an unstyled component with a styled component?</li><li>16:41 - How to decide which pattern is best suited for the code you want to share</li><li>19:36 - Using patterns that preserve React's locality of behavior</li><li>24:49 - How do you know if an abstraction is good?</li><li>32:54 - Build UI's upcoming course on Advanced React Component Patterns</li></ul><p>Links:</p><ul><li><a href="https://buildui.com/courses/advanced-react-component-patterns">Build UI's newest course: Advanced React Component Patterns</a></li><li><a href="https://youtu.be/6UU2Ey4KZr8?si=voMRjo3lyVTaXVeu">Sam's YouTube video on Recursive Components</a></li><li><a href="mailto:sam@buildui.com">Email Sam</a></li><li><a href="mailto@ryan@buildui.com">Email Ryan</a></li></ul>
]]></content:encoded>
      <enclosure length="32774445" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/e982af84-1adc-43c0-946d-29db34d225fc/audio/63fb6120-1fbc-4177-99f4-bdc682ad409e/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Unstyled React components</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:34:08</itunes:duration>
      <itunes:summary>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.</itunes:summary>
      <itunes:subtitle>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.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>193</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">30ab9e96-778b-4a85-b963-f61f1f831995</guid>
      <title>What is a framework?</title>
      <description><![CDATA[<p>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.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>3:58 - Adapter pattern and cohesive boundaries</li><li>9:43 - Rails is Omakase</li><li>13:47 - Configurable, but still cohesive</li><li>17:04 - Frontend frameworks try to “work with everything”</li><li>21:42 - Does composition mean a React framework will look different than Rails?</li><li>29:29 - Why taste still matters</li><li>34:20 - A framework is a shell of adapters and a brain that coordinates them</li><li>35:16 - When using services, complexity still exists in the in-between</li><li>37:59 - A fullstack dev is someone who acknowledges and understands how all the parts come together</li><li>44:06 - Tweets about the hard problems that Laravel tackles, and the deep design it took to get there</li><li>49:15 - Frameworks should embrace the strengths and patterns of their language and ecosystem</li><li>50:35 - Why RSCs and Server Actions mean the “Rails for JS” may end up looking nothing like Rails</li><li>52:11 - Why users of a “fullstack framework” shouldn’t even care about where the code is running</li><li>55:31 - Why libraries or services that are easy to install and set up are not a replacement for frameworks</li></ul><p>Links:</p><ul><li><a href="https://www.youtube.com/live/uVKSmR_hBMs?t=5689s">Sam's BigSkyDevCon talk</a></li><li><a href="https://dhh.dk/2012/rails-is-omakase.html">Rails is omakase</a></li><li><a href="https://x.com/PovilasKorop/status/1813473550990205101">Povilas' Laravel tweet</a></li><li><a href="https://x.com/sifrious/status/1813539307308646608">Mary's Laravel tweet</a></li><li><a href="https://buildui.com/courses/advanced-react-component-patterns">Build UI's upcoming React Component Patterns course</a></li><li><a href="mailto:sam@buildui.com">Email Sam</a></li><li><a href="mailto:ryan@buildui.com">Email Ryan</a></li></ul>
]]></description>
      <pubDate>Thu, 1 Aug 2024 14:40:54 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>3:58 - Adapter pattern and cohesive boundaries</li><li>9:43 - Rails is Omakase</li><li>13:47 - Configurable, but still cohesive</li><li>17:04 - Frontend frameworks try to “work with everything”</li><li>21:42 - Does composition mean a React framework will look different than Rails?</li><li>29:29 - Why taste still matters</li><li>34:20 - A framework is a shell of adapters and a brain that coordinates them</li><li>35:16 - When using services, complexity still exists in the in-between</li><li>37:59 - A fullstack dev is someone who acknowledges and understands how all the parts come together</li><li>44:06 - Tweets about the hard problems that Laravel tackles, and the deep design it took to get there</li><li>49:15 - Frameworks should embrace the strengths and patterns of their language and ecosystem</li><li>50:35 - Why RSCs and Server Actions mean the “Rails for JS” may end up looking nothing like Rails</li><li>52:11 - Why users of a “fullstack framework” shouldn’t even care about where the code is running</li><li>55:31 - Why libraries or services that are easy to install and set up are not a replacement for frameworks</li></ul><p>Links:</p><ul><li><a href="https://www.youtube.com/live/uVKSmR_hBMs?t=5689s">Sam's BigSkyDevCon talk</a></li><li><a href="https://dhh.dk/2012/rails-is-omakase.html">Rails is omakase</a></li><li><a href="https://x.com/PovilasKorop/status/1813473550990205101">Povilas' Laravel tweet</a></li><li><a href="https://x.com/sifrious/status/1813539307308646608">Mary's Laravel tweet</a></li><li><a href="https://buildui.com/courses/advanced-react-component-patterns">Build UI's upcoming React Component Patterns course</a></li><li><a href="mailto:sam@buildui.com">Email Sam</a></li><li><a href="mailto:ryan@buildui.com">Email Ryan</a></li></ul>
]]></content:encoded>
      <enclosure length="60139487" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/48eb200b-d0e9-4f15-bbcd-2e0f718f0987/audio/3f9eb08b-77aa-4ea4-8a1f-b9165e773921/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>What is a framework?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:02:38</itunes:duration>
      <itunes:summary>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&apos;re written in, and why frameworks and services are not in opposition to each other.</itunes:summary>
      <itunes:subtitle>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&apos;re written in, and why frameworks and services are not in opposition to each other.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>192</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">0ed0590c-9198-4c0d-b501-f5f62de8b8fa</guid>
      <title>Crossover: Declaring War Against the Frontend</title>
      <description><![CDATA[<p>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.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>2:12 - When abstractions leak</li><li>6:37 - Recap of Sam's BigSky talk</li><li>10:51 - What is JavaScript doing differently?</li><li>19:10 - Why frontend frameworks should have more backend features</li><li>24:04 - Strong opinions on a library level</li><li>30:29 - Shipping more standardized interfaces</li><li>37:06 - The frontend should be driving everything in the backend</li><li>39:12 - Your types should flow from the database to the frontend, but not your product decisions</li><li>46:53 - React Server Components</li></ul><p>Link:</p><ul><li><a href="https://www.backendbanter.fm/">Backend Banter</a></li></ul>
]]></description>
      <pubDate>Thu, 25 Jul 2024 16:52:52 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>2:12 - When abstractions leak</li><li>6:37 - Recap of Sam's BigSky talk</li><li>10:51 - What is JavaScript doing differently?</li><li>19:10 - Why frontend frameworks should have more backend features</li><li>24:04 - Strong opinions on a library level</li><li>30:29 - Shipping more standardized interfaces</li><li>37:06 - The frontend should be driving everything in the backend</li><li>39:12 - Your types should flow from the database to the frontend, but not your product decisions</li><li>46:53 - React Server Components</li></ul><p>Link:</p><ul><li><a href="https://www.backendbanter.fm/">Backend Banter</a></li></ul>
]]></content:encoded>
      <enclosure length="56917122" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/56b6b11a-1273-4e56-bb8a-8fdcd6cf8a30/audio/af1a4ab2-4718-41c0-8d58-4c661622d3a5/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Crossover: Declaring War Against the Frontend</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:59:17</itunes:duration>
      <itunes:summary>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&apos;re building in a server-side framework, and what&apos;s so special about React Server Components.</itunes:summary>
      <itunes:subtitle>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&apos;re building in a server-side framework, and what&apos;s so special about React Server Components.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>191</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">21306cc2-f5d3-498d-9c40-c3ee8e9d398f</guid>
      <title>Blog Post Club: Queueing - An interactive study of queueing strategies</title>
      <description><![CDATA[<p>Sam and Ryan read and discuss a fantastic interactive blog post about queueing in HTTP written by Sam Rose.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>6:57 - Queueing: An interactive study of queueing strategies</li><li>9:05 - Why do we need queues?</li><li>13:16 - FIFO and timing out</li><li>17:55 - LIFO</li><li>20:58 - Priority queues</li><li>25:21 - Active queue management</li><li>29:08 - Comparing queues</li><li>36:32 - Conclusion</li></ul><p>Links:</p><ul><li><a href="https://encore.dev/blog/queueing">Queueing: An interactive study of queueing strategies</a></li><li><a href="https://worrydream.com/LadderOfAbstraction/">Up and Down the Ladder of Abstraction</a></li></ul>
]]></description>
      <pubDate>Thu, 18 Jul 2024 17:19:18 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan read and discuss a fantastic interactive blog post about queueing in HTTP written by Sam Rose.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>6:57 - Queueing: An interactive study of queueing strategies</li><li>9:05 - Why do we need queues?</li><li>13:16 - FIFO and timing out</li><li>17:55 - LIFO</li><li>20:58 - Priority queues</li><li>25:21 - Active queue management</li><li>29:08 - Comparing queues</li><li>36:32 - Conclusion</li></ul><p>Links:</p><ul><li><a href="https://encore.dev/blog/queueing">Queueing: An interactive study of queueing strategies</a></li><li><a href="https://worrydream.com/LadderOfAbstraction/">Up and Down the Ladder of Abstraction</a></li></ul>
]]></content:encoded>
      <enclosure length="44592659" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/d0a7da0a-77c1-4e0d-ba76-ca1879d77257/audio/f5d31a11-4589-4114-ae37-f5af2715e8f3/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Blog Post Club: Queueing - An interactive study of queueing strategies</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:46:27</itunes:duration>
      <itunes:summary>Sam and Ryan read and discuss a fantastic interactive blog post about queueing in HTTP written by Sam Rose.</itunes:summary>
      <itunes:subtitle>Sam and Ryan read and discuss a fantastic interactive blog post about queueing in HTTP written by Sam Rose.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>190</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">c35d66a1-e1eb-45d8-872f-2e92216fec0c</guid>
      <title>SPAs in React 19</title>
      <description><![CDATA[<p>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 also discuss several new Hooks like useOptimistic, useFormStatus, useActionState, and useOptimistic.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>2:19 - How SPAs are built in React 18</li><li>5:29 - How Suspense made loading a first-class concept in React</li><li>7:48 - The problem with data writes in React 18</li><li>10:37 - What are Client Actions?</li><li>12:05 - What does it look like to use Actions?</li><li>14:13 - What are the benefits of Actions?</li><li>18:46 - How does React 19 change the Optimistic UI story?</li><li>29:40 - Working with Transitions outside of Actions</li><li>36:06 - The useActionState Hook</li><li>37:51 - Using Transitions to keep the old UI rendered and responsive</li><li>41:25 - How Transitions enable better composition patterns in third-party libraries</li><li>43:55 - Building a SortableList that flips between being controlled and uncontrolled</li></ul><p>Links:</p><ul><li><a href="https://www.youtube.com/live/T8TZQ6k4SLE?si=rxfqP8Nu5_JKLjvr&t=10112">React Unpacked: A Roadmap to React 19</a></li></ul>
]]></description>
      <pubDate>Thu, 11 Jul 2024 16:05:50 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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 also discuss several new Hooks like useOptimistic, useFormStatus, useActionState, and useOptimistic.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>2:19 - How SPAs are built in React 18</li><li>5:29 - How Suspense made loading a first-class concept in React</li><li>7:48 - The problem with data writes in React 18</li><li>10:37 - What are Client Actions?</li><li>12:05 - What does it look like to use Actions?</li><li>14:13 - What are the benefits of Actions?</li><li>18:46 - How does React 19 change the Optimistic UI story?</li><li>29:40 - Working with Transitions outside of Actions</li><li>36:06 - The useActionState Hook</li><li>37:51 - Using Transitions to keep the old UI rendered and responsive</li><li>41:25 - How Transitions enable better composition patterns in third-party libraries</li><li>43:55 - Building a SortableList that flips between being controlled and uncontrolled</li></ul><p>Links:</p><ul><li><a href="https://www.youtube.com/live/T8TZQ6k4SLE?si=rxfqP8Nu5_JKLjvr&t=10112">React Unpacked: A Roadmap to React 19</a></li></ul>
]]></content:encoded>
      <enclosure length="57198308" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/b07c4828-f8c8-409b-bcb3-9136337b3e81/audio/33dd653d-a121-4a3b-a1dc-2f4669bf5cbe/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>SPAs in React 19</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:59:34</itunes:duration>
      <itunes:summary>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 &quot;teach&quot; 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&apos;s data layer. They also discuss several new Hooks like useOptimistic, useFormStatus, useActionState, and useOptimistic.</itunes:summary>
      <itunes:subtitle>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 &quot;teach&quot; 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&apos;s data layer. They also discuss several new Hooks like useOptimistic, useFormStatus, useActionState, and useOptimistic.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>189</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">31a5b66d-0bbc-4886-bdeb-1e4fd1aa5864</guid>
      <title>High floor, high ceiling</title>
      <description><![CDATA[<p>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.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>4:23 - Recap of Ryan Florence’s talk</li><li>6:49 - Overview of "High floor, high ceiling"</li><li>10:02 - Cohesion is the biggest strength of backend frameworks</li><li>17:10 - Why doesn’t Rails for JavaScript exist?</li><li>23:48 - Locality of behavior is the biggest strength of frontend frameworks</li><li>33:14 - The use of lexical scope in React</li><li>50:27 - Which community is raising both the floor and ceiling the most?</li></ul><p>Links:</p><ul><li><a href="https://www.youtube.com/live/uVKSmR_hBMs?t=5689s">"High floor, high ceiling" talk</a></li></ul>
]]></description>
      <pubDate>Wed, 3 Jul 2024 14:07:15 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>Timestamps:</p><ul><li>0:00 - Intro</li><li>4:23 - Recap of Ryan Florence’s talk</li><li>6:49 - Overview of "High floor, high ceiling"</li><li>10:02 - Cohesion is the biggest strength of backend frameworks</li><li>17:10 - Why doesn’t Rails for JavaScript exist?</li><li>23:48 - Locality of behavior is the biggest strength of frontend frameworks</li><li>33:14 - The use of lexical scope in React</li><li>50:27 - Which community is raising both the floor and ceiling the most?</li></ul><p>Links:</p><ul><li><a href="https://www.youtube.com/live/uVKSmR_hBMs?t=5689s">"High floor, high ceiling" talk</a></li></ul>
]]></content:encoded>
      <enclosure length="57039901" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/3bc7d9d5-f012-44c4-ae9f-7d190ddaaea3/audio/1b63299d-a9c7-434c-be1c-09673932dbaa/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>High floor, high ceiling</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:59:24</itunes:duration>
      <itunes:summary>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.</itunes:summary>
      <itunes:subtitle>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.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>188</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">1287bc12-83b2-4f17-80f9-b04ee6a94a43</guid>
      <title>Technical Cost vs. Product Benefit</title>
      <description><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>6:53 - How Ryan Florence framed the problem in his talk “Mind the Gap”</li><li>14:38 - How frontend frameworks and backend frameworks both have their own ways of crossing the network gap</li><li>19:11 - How Network-Sensitive Interactions force technologies to grapple with both server and client environments</li><li>23:02 - How React is trying to lower the cost of moving interactions between the server and client with Server Components and Server Actions</li><li>26:53 - Why “Use the right tool for the job” doesn’t capture the dynamic requirements of living software</li><li>31:53 - How discussions about the product benefits of a feature and the technical costs of that feature are often conflated with each other</li><li>34:08 - A thought experiment from economics that highlights how uncertainty plays a role in the estimation of product benefits</li><li>56:54 - How to think about tech choice independently of the estimation of product benefits</li></ul><p>Links:</p><ul><li><a href="https://youtu.be/zqhE-CepH2g?si=zjUBdmVHOfRpth1O">"Mind the Gap" by Ryan Florence</a></li><li><a href="https://astro.build/blog/future-of-astro-zero-js-view-transitions">Zero-JavaScript View Transitions in Astro</a></li></ul>
]]></description>
      <pubDate>Thu, 20 Jun 2024 14:06:35 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>6:53 - How Ryan Florence framed the problem in his talk “Mind the Gap”</li><li>14:38 - How frontend frameworks and backend frameworks both have their own ways of crossing the network gap</li><li>19:11 - How Network-Sensitive Interactions force technologies to grapple with both server and client environments</li><li>23:02 - How React is trying to lower the cost of moving interactions between the server and client with Server Components and Server Actions</li><li>26:53 - Why “Use the right tool for the job” doesn’t capture the dynamic requirements of living software</li><li>31:53 - How discussions about the product benefits of a feature and the technical costs of that feature are often conflated with each other</li><li>34:08 - A thought experiment from economics that highlights how uncertainty plays a role in the estimation of product benefits</li><li>56:54 - How to think about tech choice independently of the estimation of product benefits</li></ul><p>Links:</p><ul><li><a href="https://youtu.be/zqhE-CepH2g?si=zjUBdmVHOfRpth1O">"Mind the Gap" by Ryan Florence</a></li><li><a href="https://astro.build/blog/future-of-astro-zero-js-view-transitions">Zero-JavaScript View Transitions in Astro</a></li></ul>
]]></content:encoded>
      <enclosure length="71208300" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/8618b42d-6558-4e6f-96ab-4fecf87aa80d/audio/fd42887e-73f2-4323-8fb8-10822a3cd6af/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Technical Cost vs. Product Benefit</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:14:10</itunes:duration>
      <itunes:summary>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.</itunes:summary>
      <itunes:subtitle>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.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>187</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">5b7a8039-1771-4e8a-b7a1-13c08adafec0</guid>
      <title>View Transitions in React</title>
      <description><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:11 - What it’s like to integrate View Transitions with React</li><li>7:30 - How View Transitions work</li><li>16:09 - Building a gallery that animates photos across page navigations</li><li>19:38 - How to use startViewTransition for enter/update/exit animations</li><li>26:52 - Using a Promise to link a View Transition to a React Transition</li><li>43:02 - Do View Transitions replace framework-specific animation libraries?</li><li>45:17 - Using DevTools to preview and tweak transitions</li></ul><p>Links:</p><ul><li><a href="https://easings.net/">easings.net</a></li><li><a href="https://github.com/ionic-team/ionic-framework/tree/main/core/src/components/action-sheet/animations">Ionic Framework's animation curves</a></li><li><a href="https://github.com/shuding/next-view-transitions">Shu’s next-view-transitions library</a></li></ul>
]]></description>
      <pubDate>Wed, 12 Jun 2024 18:02:19 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:11 - What it’s like to integrate View Transitions with React</li><li>7:30 - How View Transitions work</li><li>16:09 - Building a gallery that animates photos across page navigations</li><li>19:38 - How to use startViewTransition for enter/update/exit animations</li><li>26:52 - Using a Promise to link a View Transition to a React Transition</li><li>43:02 - Do View Transitions replace framework-specific animation libraries?</li><li>45:17 - Using DevTools to preview and tweak transitions</li></ul><p>Links:</p><ul><li><a href="https://easings.net/">easings.net</a></li><li><a href="https://github.com/ionic-team/ionic-framework/tree/main/core/src/components/action-sheet/animations">Ionic Framework's animation curves</a></li><li><a href="https://github.com/shuding/next-view-transitions">Shu’s next-view-transitions library</a></li></ul>
]]></content:encoded>
      <enclosure length="51231940" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/185a1c89-bfae-4f4f-a3ce-d195b2288d5f/audio/d481b79a-aa7b-4897-9f75-a52eca9d7ffe/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>View Transitions in React</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:53:21</itunes:duration>
      <itunes:summary>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.</itunes:summary>
      <itunes:subtitle>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.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>186</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">20348f97-7fd1-495e-bbb5-2ff5f838737f</guid>
      <title>CodeMirror | Radix Themes</title>
      <description><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>4:01 - Building an authoring tool with CodeMirror</li><li>18:47 - Refactoring Tailwind to Radix Themes</li></ul><p>Links:</p><ul><li><a href="https://codemirror.net">CodeMirror</a></li><li><a href="https://youtu.be/Hvn_fFMhVCA?si=W-KD2VtKa9jsCt2n">Sam’s YouTube video on Radix Themes</a></li><li><a href="https://www.radix-ui.com/themes/docs/overview/getting-started">Radix Themes docs</a></li></ul>
]]></description>
      <pubDate>Wed, 17 Apr 2024 14:38:22 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>4:01 - Building an authoring tool with CodeMirror</li><li>18:47 - Refactoring Tailwind to Radix Themes</li></ul><p>Links:</p><ul><li><a href="https://codemirror.net">CodeMirror</a></li><li><a href="https://youtu.be/Hvn_fFMhVCA?si=W-KD2VtKa9jsCt2n">Sam’s YouTube video on Radix Themes</a></li><li><a href="https://www.radix-ui.com/themes/docs/overview/getting-started">Radix Themes docs</a></li></ul>
]]></content:encoded>
      <enclosure length="43383086" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/f2889f5b-88be-4355-a97f-f95dc165e2f0/audio/7bf806cb-1869-4100-957e-9e05a6f4e4d0/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>CodeMirror | Radix Themes</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:45:11</itunes:duration>
      <itunes:summary>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.</itunes:summary>
      <itunes:subtitle>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.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>185</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">ab4aba5d-d707-42a5-81c1-b113f6bcd800</guid>
      <title>Throw is about control flow – not error handling</title>
      <description><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>4:07 - Error handling vs. throw-try/catch</li><li>23:34 - Errors vs. Exceptions</li><li>31:52 - How Next.js uses throw for non-error control flow</li><li>40:44 - Adding a dynamic feature to a static site</li></ul><p>Links:</p><ul><li><a href="https://buildui.com/posts/global-progress-in-nextjs">Global progress in Next.js</a></li><li><a href="https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/">What color is your function</a></li><li><a href="https://overreacted.io/algebraic-effects-for-the-rest-of-us/">Algebraic Effects for the Rest of Us</a></li></ul>
]]></description>
      <pubDate>Wed, 10 Apr 2024 16:31:00 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>4:07 - Error handling vs. throw-try/catch</li><li>23:34 - Errors vs. Exceptions</li><li>31:52 - How Next.js uses throw for non-error control flow</li><li>40:44 - Adding a dynamic feature to a static site</li></ul><p>Links:</p><ul><li><a href="https://buildui.com/posts/global-progress-in-nextjs">Global progress in Next.js</a></li><li><a href="https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/">What color is your function</a></li><li><a href="https://overreacted.io/algebraic-effects-for-the-rest-of-us/">Algebraic Effects for the Rest of Us</a></li></ul>
]]></content:encoded>
      <enclosure length="61616555" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/6c99172d-8ff1-4cae-980a-4792af8f55cb/audio/9fdd9771-1db9-43e0-9d6c-9bdd72d2609e/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Throw is about control flow – not error handling</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:04:11</itunes:duration>
      <itunes:summary>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.</itunes:summary>
      <itunes:subtitle>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.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>184</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">3a9a8faf-a92f-43c5-922f-37a49f5977c1</guid>
      <title>The Philosophy of Next.js</title>
      <description><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:58 - Why don’t layouts re-render in Next.js?</li><li>7:10 - Push-based vs. pull-based rendering</li><li>8:56 - Thinking about re-renders in a pure React app</li><li>11:07 - Why Server Actions need to call the revalidate* APIs</li><li>12:26 - Why doesn’t Next.js pass the request to every page and layout?</li><li>31:40 - Immediate-mode rendering vs. “Do the least amount of work possible”</li><li>51:54 - Is opting-in to more re-renders framework fighting?</li><li>53:44 - Helping users by communicating the philosophy</li><li>56:25 - Why doesn’t Next.js expose global router events?</li><li>1:00:17 - Why it’s important to understand Next’s design decisions when choosing it for your next project</li></ul>
]]></description>
      <pubDate>Fri, 22 Mar 2024 18:50:38 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:58 - Why don’t layouts re-render in Next.js?</li><li>7:10 - Push-based vs. pull-based rendering</li><li>8:56 - Thinking about re-renders in a pure React app</li><li>11:07 - Why Server Actions need to call the revalidate* APIs</li><li>12:26 - Why doesn’t Next.js pass the request to every page and layout?</li><li>31:40 - Immediate-mode rendering vs. “Do the least amount of work possible”</li><li>51:54 - Is opting-in to more re-renders framework fighting?</li><li>53:44 - Helping users by communicating the philosophy</li><li>56:25 - Why doesn’t Next.js expose global router events?</li><li>1:00:17 - Why it’s important to understand Next’s design decisions when choosing it for your next project</li></ul>
]]></content:encoded>
      <enclosure length="72972924" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/c4a8d0df-78d3-4e9e-a5db-f1f97647886e/audio/46b73d62-8b4d-42d9-8f83-774cd968f936/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>The Philosophy of Next.js</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:16:00</itunes:duration>
      <itunes:summary>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.</itunes:summary>
      <itunes:subtitle>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.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>183</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">f223abbd-3075-497f-b8b7-a8126499c102</guid>
      <title>Beyond Data Fetching with RSCs</title>
      <description><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>5:05 - The Next.js happy path for MDX: Local files</li><li>11:15 - Exploring remote MDX content with mdx-remote</li><li>14:46 - Separating the serializable parts of MDX from the runtime imports</li><li>17:13 - Realizing that RSC covers the same problem space, and ditching MDX</li><li>26:50 - Exploring other APIs and plugin ecosystems that RSC could replace: Webpack loaders, next/image, and Liquid templates</li><li>32:11 - React’s vision for RSCs</li><li>35:18 - How RSCs could replace build-time plugin APIs</li><li>44:51 - Replacing MDX with Markdoc, Shiki, and custom node code during render</li></ul><p>Links:</p><ul><li><a href="https://markdoc.dev">Markdoc</a></li><li><a href="https://shiki.matsu.io">Shiki</a></li></ul>
]]></description>
      <pubDate>Wed, 13 Mar 2024 21:07:51 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>5:05 - The Next.js happy path for MDX: Local files</li><li>11:15 - Exploring remote MDX content with mdx-remote</li><li>14:46 - Separating the serializable parts of MDX from the runtime imports</li><li>17:13 - Realizing that RSC covers the same problem space, and ditching MDX</li><li>26:50 - Exploring other APIs and plugin ecosystems that RSC could replace: Webpack loaders, next/image, and Liquid templates</li><li>32:11 - React’s vision for RSCs</li><li>35:18 - How RSCs could replace build-time plugin APIs</li><li>44:51 - Replacing MDX with Markdoc, Shiki, and custom node code during render</li></ul><p>Links:</p><ul><li><a href="https://markdoc.dev">Markdoc</a></li><li><a href="https://shiki.matsu.io">Shiki</a></li></ul>
]]></content:encoded>
      <enclosure length="67040830" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/0f4f407a-8cd0-4c25-9c42-5824c66966ff/audio/8514aea7-96d4-44a9-a90a-b72359d9fc62/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Beyond Data Fetching with RSCs</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:09:50</itunes:duration>
      <itunes:summary>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.</itunes:summary>
      <itunes:subtitle>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.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>182</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">a8740332-f466-41ac-8e03-68e855021e4f</guid>
      <title>Blog Post Club: React Labs – What We’ve Been Working On</title>
      <description><![CDATA[<p>Sam and Ryan read and discuss the latest update from React Labs.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>5:26 - Opening</li><li>6:18 - React Compiler</li><li>27:27 - Actions</li><li>51:44 - Asset loading</li><li>1:13:06 - Next Major Version of React</li><li>1:15:42 - Activity</li></ul><p>Links:</p><ul><li><a href="https://react.dev/blog/2024/02/15/react-labs-what-we-have-been-working-on-february-2024">React Labs blog post</a></li><li><a href="https://youtu.be/1UOAI7pFDek?si=HFJyqOZHwunEGbww">Sam’s video on Strict Mode</a></li></ul>
]]></description>
      <pubDate>Fri, 1 Mar 2024 19:16:06 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan read and discuss the latest update from React Labs.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>5:26 - Opening</li><li>6:18 - React Compiler</li><li>27:27 - Actions</li><li>51:44 - Asset loading</li><li>1:13:06 - Next Major Version of React</li><li>1:15:42 - Activity</li></ul><p>Links:</p><ul><li><a href="https://react.dev/blog/2024/02/15/react-labs-what-we-have-been-working-on-february-2024">React Labs blog post</a></li><li><a href="https://youtu.be/1UOAI7pFDek?si=HFJyqOZHwunEGbww">Sam’s video on Strict Mode</a></li></ul>
]]></content:encoded>
      <enclosure length="79768105" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/ed471a38-4fdc-4fa2-b051-5fecdbd19d1a/audio/41f55d72-c930-4400-a3e8-920fb6362a70/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Blog Post Club: React Labs – What We’ve Been Working On</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:23:05</itunes:duration>
      <itunes:summary>Sam and Ryan read and discuss the latest update from React Labs.</itunes:summary>
      <itunes:subtitle>Sam and Ryan read and discuss the latest update from React Labs.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>181</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">b4f89f22-5041-4234-a763-eefca8fa906d</guid>
      <title>Instant URL search params in Next.js</title>
      <description><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:12 - The problem: In a world of Server Components, URL updates are blocked by a server-side roundtrip</li><li>10:44 - Attempted solution: Use the browser’s Native History API (history.pushState)</li><li>15:03 - Realization: The source of truth flips from server to client during the transition – which is exactly what useOptimistic was designed for</li><li>17:54 - Unwinding our mental model of client-first React apps by thinking about how HTML-only checkout forms work</li><li>21:44 - The intuition behind React Transitions, and how they put our UI into a state of preparation</li><li>30:39 - How Transitions improve upon default browser behavior by keeping our current UI 100% responsive, and how useOptimistic solves the checkbox filter panel</li><li>37:46 - Ryan’s take: It’s a bonus when tools make you feel smart, but it’s more important for them to not make you feel dumb</li></ul>
]]></description>
      <pubDate>Wed, 21 Feb 2024 15:09:44 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:12 - The problem: In a world of Server Components, URL updates are blocked by a server-side roundtrip</li><li>10:44 - Attempted solution: Use the browser’s Native History API (history.pushState)</li><li>15:03 - Realization: The source of truth flips from server to client during the transition – which is exactly what useOptimistic was designed for</li><li>17:54 - Unwinding our mental model of client-first React apps by thinking about how HTML-only checkout forms work</li><li>21:44 - The intuition behind React Transitions, and how they put our UI into a state of preparation</li><li>30:39 - How Transitions improve upon default browser behavior by keeping our current UI 100% responsive, and how useOptimistic solves the checkbox filter panel</li><li>37:46 - Ryan’s take: It’s a bonus when tools make you feel smart, but it’s more important for them to not make you feel dumb</li></ul>
]]></content:encoded>
      <enclosure length="43674404" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/af338a44-f2c7-4def-9118-861d10b64d9e/audio/a2808c64-2910-45c9-8494-9945be95b01c/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Instant URL search params in Next.js</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:45:29</itunes:duration>
      <itunes:summary>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.</itunes:summary>
      <itunes:subtitle>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.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>180</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">ccf134df-34d7-4b39-9bd6-dad5a97a126b</guid>
      <title>React Deep Dive: useOptimistic</title>
      <description><![CDATA[<p>Ryan and Sam discuss the purpose and usage of the useOptimistic() hook, a new experimental API from React.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:18 - Problem: RSCs require a server roundtrip before the UI can be updated</li><li>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</li><li>14:03 - How useOptimistic() avoids the notion of identity by discarding the ephemeral state after the app settles</li><li>21:17 - How useOptimistic() lets you safely “fork” state that eventually syncs with the server</li><li>27:32 - Handling error states</li><li>29:26 - Differences between useOptimistic() and Remix fetchers</li><li>34:57 - How useOptimistic() lets you avoid managing a long-lived client-side cache</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/ryantotweets/status/1754177804323738016">Ryan’s useOptimistic tweet</a></li><li><a href="https://www.youtube.com/watch?v=_gZ3ctkbGPo">Ryan’s video on React Cache: Part 2</a></li></ul>
]]></description>
      <pubDate>Wed, 14 Feb 2024 18:37:59 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Ryan and Sam discuss the purpose and usage of the useOptimistic() hook, a new experimental API from React.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:18 - Problem: RSCs require a server roundtrip before the UI can be updated</li><li>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</li><li>14:03 - How useOptimistic() avoids the notion of identity by discarding the ephemeral state after the app settles</li><li>21:17 - How useOptimistic() lets you safely “fork” state that eventually syncs with the server</li><li>27:32 - Handling error states</li><li>29:26 - Differences between useOptimistic() and Remix fetchers</li><li>34:57 - How useOptimistic() lets you avoid managing a long-lived client-side cache</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/ryantotweets/status/1754177804323738016">Ryan’s useOptimistic tweet</a></li><li><a href="https://www.youtube.com/watch?v=_gZ3ctkbGPo">Ryan’s video on React Cache: Part 2</a></li></ul>
]]></content:encoded>
      <enclosure length="49099514" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/514a14c8-5f0b-43db-9724-7f3f5a2ccbc3/audio/26c2d19d-3891-47c0-bb76-5da68b1f3e80/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>React Deep Dive: useOptimistic</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:51:08</itunes:duration>
      <itunes:summary>Ryan and Sam discuss the purpose and usage of the useOptimistic() hook, a new experimental API from React.</itunes:summary>
      <itunes:subtitle>Ryan and Sam discuss the purpose and usage of the useOptimistic() hook, a new experimental API from React.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>179</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">6536a887-c916-42bd-963d-515bdcfe9da1</guid>
      <title>React Deep Dive: cache</title>
      <description><![CDATA[<p>Ryan and Sam discuss the purpose and usage of the cache() function, a new experimental API from React.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:29 - Caching in Next.js vs. React cache()</li><li>8:11 - Why React invalidates the cache for each server request</li><li>14:43 - How cache() enables colocation of data-fetching code</li><li>16:14 - Using cache() to share CPU-heavy or I/O-bound tasks between components</li><li>19:31 - Why cache() obviates the need for context in Server Components</li><li>23:19 - The danger of module scope on the server</li><li>27:54 - Why cache() is implemented with AsyncLocalStorage</li><li>41:04 - Why cache() is part of React</li><li>48:27 - Why Server Components don’t support cache()</li><li>53:04 - How cache() eliminates waterfalls</li></ul><p>Links:</p><ul><li><a href="https://youtu.be/MxjCLqdk4G4">Ryan’s YouTube video on React Cache</a></li></ul>
]]></description>
      <pubDate>Wed, 7 Feb 2024 15:30:46 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Ryan and Sam discuss the purpose and usage of the cache() function, a new experimental API from React.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:29 - Caching in Next.js vs. React cache()</li><li>8:11 - Why React invalidates the cache for each server request</li><li>14:43 - How cache() enables colocation of data-fetching code</li><li>16:14 - Using cache() to share CPU-heavy or I/O-bound tasks between components</li><li>19:31 - Why cache() obviates the need for context in Server Components</li><li>23:19 - The danger of module scope on the server</li><li>27:54 - Why cache() is implemented with AsyncLocalStorage</li><li>41:04 - Why cache() is part of React</li><li>48:27 - Why Server Components don’t support cache()</li><li>53:04 - How cache() eliminates waterfalls</li></ul><p>Links:</p><ul><li><a href="https://youtu.be/MxjCLqdk4G4">Ryan’s YouTube video on React Cache</a></li></ul>
]]></content:encoded>
      <enclosure length="64770057" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/6fc58326-9bc6-4b56-886f-35b687d14605/audio/6376483c-0fe7-4769-8072-126ed4a244c9/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>React Deep Dive: cache</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:07:28</itunes:duration>
      <itunes:summary>Ryan and Sam discuss the purpose and usage of the cache() function, a new experimental API from React.</itunes:summary>
      <itunes:subtitle>Ryan and Sam discuss the purpose and usage of the cache() function, a new experimental API from React.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>178</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">cd28a9ef-7ae9-4153-a82e-011a99066d4f</guid>
      <title>Advanced Radix UI | Blog Post Club: React Server</title>
      <description><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>0:49 - Ceilingless libraries + Advanced Radix UI</li><li>21:02 - Read and discuss: “RSC is React Server + Component”</li></ul><p>Links:</p><ul><li><a href="https://buildui.com/courses/advanced-radix-ui">Advanced Radix UI course</a></li><li><a href="https://www.radix-ui.com">Radix UI</a></li><li><a href="https://bobaekang.com/blog/rsc-is-react-server-plus-component/">RSC is React Server + Component</a></li></ul>
]]></description>
      <pubDate>Thu, 1 Feb 2024 18:32:06 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>0:49 - Ceilingless libraries + Advanced Radix UI</li><li>21:02 - Read and discuss: “RSC is React Server + Component”</li></ul><p>Links:</p><ul><li><a href="https://buildui.com/courses/advanced-radix-ui">Advanced Radix UI course</a></li><li><a href="https://www.radix-ui.com">Radix UI</a></li><li><a href="https://bobaekang.com/blog/rsc-is-react-server-plus-component/">RSC is React Server + Component</a></li></ul>
]]></content:encoded>
      <enclosure length="53426645" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/03ccd7d0-9ad7-4f06-84c7-271066c8c32c/audio/1f8c3129-14a8-4e67-a72a-eb9986da8d03/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Advanced Radix UI | Blog Post Club: React Server</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:55:39</itunes:duration>
      <itunes:summary>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.</itunes:summary>
      <itunes:subtitle>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.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>177</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">58987d3c-0e98-4b7a-9730-6658147bd399</guid>
      <title>The SQL Injection Slide</title>
      <description><![CDATA[<p>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.</p><p>This is a crossover episode with the excellent podcast <a href="https://mostlytechnical.com/">Mostly Technical</a>.</p><p>Topics include:</p><ul><li>0:00 - The Most Memed Man on the Internet</li><li>09:06 - High Floor vs. High Ceiling</li><li>19:20 - What the Hell Is Next?</li><li>23:22 - The Third Phase of React</li><li>29:09 - Your App Is Not Unique</li><li>35:23 - Server Actions & Server Components</li><li>51:33 - CallYourMom.Com</li><li>01:00:56 - Fat Models, Skinny Controllers</li><li>01:14:16 - One Set of Opinions</li></ul><p>Links:</p><ul><li><a href="https://youtu.be/9CN9RCzznZc?si=lFiO0C2LPv4wxBUH">Sam’s Next.js Conf talk</a></li><li><a href="https://www.youtube.com/watch?v=QiR9viVIJgo">React is a programming language for UIs</a></li></ul>
]]></description>
      <pubDate>Mon, 6 Nov 2023 15:51:58 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>This is a crossover episode with the excellent podcast <a href="https://mostlytechnical.com/">Mostly Technical</a>.</p><p>Topics include:</p><ul><li>0:00 - The Most Memed Man on the Internet</li><li>09:06 - High Floor vs. High Ceiling</li><li>19:20 - What the Hell Is Next?</li><li>23:22 - The Third Phase of React</li><li>29:09 - Your App Is Not Unique</li><li>35:23 - Server Actions & Server Components</li><li>51:33 - CallYourMom.Com</li><li>01:00:56 - Fat Models, Skinny Controllers</li><li>01:14:16 - One Set of Opinions</li></ul><p>Links:</p><ul><li><a href="https://youtu.be/9CN9RCzznZc?si=lFiO0C2LPv4wxBUH">Sam’s Next.js Conf talk</a></li><li><a href="https://www.youtube.com/watch?v=QiR9viVIJgo">React is a programming language for UIs</a></li></ul>
]]></content:encoded>
      <enclosure length="84175902" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/4d2631b6-a479-44cd-9b05-fd09932dfa47/audio/86b946cb-2081-4193-bb91-a0c2a90ccfae/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>The SQL Injection Slide</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:27:40</itunes:duration>
      <itunes:summary>Ian Landsman &amp; Aaron Francis join Sam to discuss React Server Actions &amp; Server Components, why it&apos;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](https://mostlytechnical.com/).</itunes:summary>
      <itunes:subtitle>Ian Landsman &amp; Aaron Francis join Sam to discuss React Server Actions &amp; Server Components, why it&apos;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](https://mostlytechnical.com/).</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>176</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">491c6e5c-698b-41a3-ace6-46d5bf7f060a</guid>
      <title>The Remix Architecture</title>
      <description><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>0:31 - The Work Journal app</li><li>2:20 - Making dynamic pages with Loaders</li><li>8:00 - How Remix relies on HTTP for routing</li><li>12:30 - Making backend changes using Forms and Actions</li><li>19:41 - How Remix’s comprehension of Loaders and Actions eliminates boilerplate</li><li>25:20 - How Remix layers the full power of React on top of web fundamentals</li></ul><p>Links:</p><ul><li><a href="https://buildui.com/newsletter">Sign up for the Build UI Newsletter</a></li><li><a href="https://twitter.com/samselikoff/status/1711459635498983589">Video on HTTP Session Cookies</a></li></ul>
]]></description>
      <pubDate>Sat, 14 Oct 2023 18:06:14 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>0:31 - The Work Journal app</li><li>2:20 - Making dynamic pages with Loaders</li><li>8:00 - How Remix relies on HTTP for routing</li><li>12:30 - Making backend changes using Forms and Actions</li><li>19:41 - How Remix’s comprehension of Loaders and Actions eliminates boilerplate</li><li>25:20 - How Remix layers the full power of React on top of web fundamentals</li></ul><p>Links:</p><ul><li><a href="https://buildui.com/newsletter">Sign up for the Build UI Newsletter</a></li><li><a href="https://twitter.com/samselikoff/status/1711459635498983589">Video on HTTP Session Cookies</a></li></ul>
]]></content:encoded>
      <enclosure length="44630694" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/68134f93-711f-4916-95a4-13c60753214e/audio/df5dac0c-c6f4-4380-ae54-57cc7993e6ba/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>The Remix Architecture</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:46:29</itunes:duration>
      <itunes:summary>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.</itunes:summary>
      <itunes:subtitle>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.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>175</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">249df2e1-3cf6-4555-9066-587df31e855d</guid>
      <title>Implementing RSC, Part 2: Server Actions</title>
      <description><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>0:52 - Ryan’s course on React Server Components</li><li>3:06 - Motivating Server Actions, how to bundle them, and how to invoke them</li><li>27:38 - Sending arguments via hidden inputs or closures, and security concerns</li></ul><p>Links:</p><ul><li><a href="https://buildui.com/courses/react-server-components">Ryan’s React Server Components course</a></li></ul>
]]></description>
      <pubDate>Wed, 4 Oct 2023 18:18:33 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>0:52 - Ryan’s course on React Server Components</li><li>3:06 - Motivating Server Actions, how to bundle them, and how to invoke them</li><li>27:38 - Sending arguments via hidden inputs or closures, and security concerns</li></ul><p>Links:</p><ul><li><a href="https://buildui.com/courses/react-server-components">Ryan’s React Server Components course</a></li></ul>
]]></content:encoded>
      <enclosure length="54795044" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/1057b6c6-6ecb-4ebd-a798-1e81e4ebbc93/audio/21e9df42-e7e3-4923-a439-311fe265cc6d/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Implementing RSC, Part 2: Server Actions</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:57:04</itunes:duration>
      <itunes:summary>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.</itunes:summary>
      <itunes:subtitle>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.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>174</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">9805a6d6-02d5-4856-bfea-3d16632129bd</guid>
      <title>Implementing RSC, Part 1: Rendering</title>
      <description><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:48 - Making a server endpoint that a client React app can use to re-render the UI</li><li>15:42 - How the bundling step shims Client Components during a server render with a reference that the client app can later use to execute browser code</li><li>35:16 - How the React Component API unifies server and client functionality in a single composable interface</li><li>38:54 - How a client-side router can render different server trees based on the URL</li><li>49:09 - Reference projects used</li></ul><p>Links:</p><ul><li><a href="https://github.com/bholmesdev/simple-rsc">Simple RSC</a></li><li><a href="https://github.com/lubieowoce/tangle">Tangle</a></li><li><a href="https://github.com/cyco130/vite-rsc">Vite RSC</a></li><li><a href="https://nextjs.org/">Next.js</a></li></ul>
]]></description>
      <pubDate>Fri, 29 Sep 2023 14:03:12 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:48 - Making a server endpoint that a client React app can use to re-render the UI</li><li>15:42 - How the bundling step shims Client Components during a server render with a reference that the client app can later use to execute browser code</li><li>35:16 - How the React Component API unifies server and client functionality in a single composable interface</li><li>38:54 - How a client-side router can render different server trees based on the URL</li><li>49:09 - Reference projects used</li></ul><p>Links:</p><ul><li><a href="https://github.com/bholmesdev/simple-rsc">Simple RSC</a></li><li><a href="https://github.com/lubieowoce/tangle">Tangle</a></li><li><a href="https://github.com/cyco130/vite-rsc">Vite RSC</a></li><li><a href="https://nextjs.org/">Next.js</a></li></ul>
]]></content:encoded>
      <enclosure length="56366988" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/3f43bdf5-5df3-49e0-91b4-b6fe010521fb/audio/575e69f0-c9f9-46c5-b277-e612e248cc4e/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Implementing RSC, Part 1: Rendering</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:58:42</itunes:duration>
      <itunes:summary>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.</itunes:summary>
      <itunes:subtitle>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.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>173</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">48c020c6-ebd4-4552-807e-61325eb55f1a</guid>
      <title>Should a navigation and a refresh show the same page?</title>
      <description><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:00 - Suspense boundary identity and the Await component</li><li>11:07 - How to refresh RSC using a Server Action</li><li>27:17 - The difference between a navigation and a page refresh</li></ul><p>Links:</p><ul><li><a href="https://buildui.com/courses/react-server-components">Ryan’s Data Fetching with RSC course</a></li><li><a href="https://buildui.com/recipes/refresh-app-router-cache-server-action">Refresh App Router code recipe</a></li></ul>
]]></description>
      <pubDate>Wed, 20 Sep 2023 17:06:02 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>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.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:00 - Suspense boundary identity and the Await component</li><li>11:07 - How to refresh RSC using a Server Action</li><li>27:17 - The difference between a navigation and a page refresh</li></ul><p>Links:</p><ul><li><a href="https://buildui.com/courses/react-server-components">Ryan’s Data Fetching with RSC course</a></li><li><a href="https://buildui.com/recipes/refresh-app-router-cache-server-action">Refresh App Router code recipe</a></li></ul>
]]></content:encoded>
      <enclosure length="43283194" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/96df08f6-ff45-4a6f-90c0-b6d7c38d7a7e/audio/7c35f32a-e020-4dd8-b0cd-4be81049e558/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Should a navigation and a refresh show the same page?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:45:05</itunes:duration>
      <itunes:summary>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.</itunes:summary>
      <itunes:subtitle>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.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>172</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">457dd072-6d28-4b59-8cfb-2b918af1e787</guid>
      <title>Tim Neutkens on the Next.js App Router</title>
      <description><![CDATA[<p>Tim joins Sam to talk about his work on the new app router in Next.js 13. He explains how the app router leverages Server Components and React’s new cache API to bring a new level of composability to server-side code, how Server Actions are being designed to enable partial revalidation in a single round trip to the server, and how to think about UI updates as a result of server-side state changes.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:53 - Rendering Server Components and the RSC payload</li><li>21:49 - Composition vs. top-down data flow and the React cache</li><li>53:35 - Revalidation after a user event and Server Actions</li><li>1:06:37 - Revalidation after a server-side state change</li><li>1:14:02 - Back and forward navigation</li><li>1:21:43 - Caching layers</li><li>1:30:53 - Current focus on stability, performance, education, and TurboPack</li></ul><p>Links:</p><ul><li><a href="https://github.com/vercel/next.js/discussions/54075">Tim’s deep dive on caching and revalidating</a></li><li><a href="https://nextjs.org/docs/app/building-your-application/caching">Next.js docs on Caching</a></li></ul>
]]></description>
      <pubDate>Wed, 16 Aug 2023 18:35:32 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Tim joins Sam to talk about his work on the new app router in Next.js 13. He explains how the app router leverages Server Components and React’s new cache API to bring a new level of composability to server-side code, how Server Actions are being designed to enable partial revalidation in a single round trip to the server, and how to think about UI updates as a result of server-side state changes.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:53 - Rendering Server Components and the RSC payload</li><li>21:49 - Composition vs. top-down data flow and the React cache</li><li>53:35 - Revalidation after a user event and Server Actions</li><li>1:06:37 - Revalidation after a server-side state change</li><li>1:14:02 - Back and forward navigation</li><li>1:21:43 - Caching layers</li><li>1:30:53 - Current focus on stability, performance, education, and TurboPack</li></ul><p>Links:</p><ul><li><a href="https://github.com/vercel/next.js/discussions/54075">Tim’s deep dive on caching and revalidating</a></li><li><a href="https://nextjs.org/docs/app/building-your-application/caching">Next.js docs on Caching</a></li></ul>
]]></content:encoded>
      <enclosure length="100848294" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/f56cdb11-2959-4f48-9ba4-23b276ac480c/audio/65b1fc40-6348-483e-b0ac-df3b9ecbc180/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Tim Neutkens on the Next.js App Router</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:45:02</itunes:duration>
      <itunes:summary>Tim joins Sam to talk about his work on the new app router in Next.js 13. He explains how the app router leverages Server Components and React’s new cache API to bring a new level of composability to server-side code, how Server Actions are being designed to enable partial revalidation in a single round trip to the server, and how to think about UI updates as a result of server-side state changes.</itunes:summary>
      <itunes:subtitle>Tim joins Sam to talk about his work on the new app router in Next.js 13. He explains how the app router leverages Server Components and React’s new cache API to bring a new level of composability to server-side code, how Server Actions are being designed to enable partial revalidation in a single round trip to the server, and how to think about UI updates as a result of server-side state changes.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>171</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">60f3441d-c88c-40a8-b1f3-508c61216d6f</guid>
      <title>Understanding prop passing from RSC to Client Components</title>
      <description><![CDATA[<p>Sam and Ryan discuss how TypeScript helped them understand the mechanics of how props get passed from Server Components to Client Components, and how to properly type client component props if the prop starts out as a rich data type on the server. They also clarify some points from last episode’s discussion about the RSC payload.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>0:40 - Clarifying what the RSC Payload actually is</li><li>10:12 - Understanding prop serialization when passing props from Server Components to Client Components</li><li>23:38 - How to define TypeScript types for serialized props, and Remix’s SerializeFrom helper</li></ul><p>Links:</p><ul><li><a href="https://buildui.com/courses/react-server-components">Ryan’s RSC course on Build UI</a></li></ul>
]]></description>
      <pubDate>Wed, 9 Aug 2023 14:34:29 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan discuss how TypeScript helped them understand the mechanics of how props get passed from Server Components to Client Components, and how to properly type client component props if the prop starts out as a rich data type on the server. They also clarify some points from last episode’s discussion about the RSC payload.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>0:40 - Clarifying what the RSC Payload actually is</li><li>10:12 - Understanding prop serialization when passing props from Server Components to Client Components</li><li>23:38 - How to define TypeScript types for serialized props, and Remix’s SerializeFrom helper</li></ul><p>Links:</p><ul><li><a href="https://buildui.com/courses/react-server-components">Ryan’s RSC course on Build UI</a></li></ul>
]]></content:encoded>
      <enclosure length="46265750" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/7e9fc9dd-fc32-4383-a8ce-84b0dc6f20b2/audio/300a4193-ce4e-4d7e-b227-317860af34d1/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Understanding prop passing from RSC to Client Components</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:48:11</itunes:duration>
      <itunes:summary>Sam and Ryan discuss how TypeScript helped them understand the mechanics of how props get passed from Server Components to Client Components, and how to properly type client component props if the prop starts out as a rich data type on the server. They also clarify some points from last episode’s discussion about the RSC payload.</itunes:summary>
      <itunes:subtitle>Sam and Ryan discuss how TypeScript helped them understand the mechanics of how props get passed from Server Components to Client Components, and how to properly type client component props if the prop starts out as a rich data type on the server. They also clarify some points from last episode’s discussion about the RSC payload.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>170</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">f18811b1-3f0c-4204-b742-955d8abe681e</guid>
      <title>Server-side rendering vs. Server Components</title>
      <description><![CDATA[<p>Sam and Ryan explore different ways to think about the RSC architecture, including what problems RSC solve, why RSC are valuable even in a world without server-side rendering, and how React’s reconciliation phase enables RSC to make partial updates to the UI as a result of server-side events.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>5:45 - What if RSC were introduced before SSR?</li><li>10:54 - What does it mean to render RSC?</li><li>25:41 - Why SSR does not apply to Server Components</li><li>35:31 - Server-driven UI updates</li></ul>
]]></description>
      <pubDate>Wed, 12 Jul 2023 17:03:01 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan explore different ways to think about the RSC architecture, including what problems RSC solve, why RSC are valuable even in a world without server-side rendering, and how React’s reconciliation phase enables RSC to make partial updates to the UI as a result of server-side events.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>5:45 - What if RSC were introduced before SSR?</li><li>10:54 - What does it mean to render RSC?</li><li>25:41 - Why SSR does not apply to Server Components</li><li>35:31 - Server-driven UI updates</li></ul>
]]></content:encoded>
      <enclosure length="48413225" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/265c34d6-515b-421a-9bd0-c8a96d7e6638/audio/717ef0eb-aeba-4b58-b4b8-46ac7d5b7e88/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Server-side rendering vs. Server Components</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:50:25</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>169</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">6f7d0b54-4311-44e3-95df-c99dfbc08203</guid>
      <title>Reusable pending UI for forms with Server Actions</title>
      <description><![CDATA[<p>Ryan shares his thoughts on how Server Actions and the useFormStatus hook are letting him build reusable pending UI for any form in his Next.js side project. Sam talks about how TypeScript prevents an entire class of data-loading bugs that have plagued single-page applications built with a client-side cache.</p><p>Topics include:</p><ul><li>0:00 - Tailwind Connect</li><li>2:38 - Using TypeScript to prevent data-loading errors</li><li>19:27 - Building reusable form UI with Server Actions and useFormStatus</li></ul><p>Links:</p><ul><li><a href="https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions">Server Actions in Next.js</a></li><li><a href="https://www.youtube.com/watch?v=KvZoBV_1yYE">Styling a Radix Dialog with Tailwind CSS</a></li></ul>
]]></description>
      <pubDate>Wed, 5 Jul 2023 13:20:01 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Ryan shares his thoughts on how Server Actions and the useFormStatus hook are letting him build reusable pending UI for any form in his Next.js side project. Sam talks about how TypeScript prevents an entire class of data-loading bugs that have plagued single-page applications built with a client-side cache.</p><p>Topics include:</p><ul><li>0:00 - Tailwind Connect</li><li>2:38 - Using TypeScript to prevent data-loading errors</li><li>19:27 - Building reusable form UI with Server Actions and useFormStatus</li></ul><p>Links:</p><ul><li><a href="https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions">Server Actions in Next.js</a></li><li><a href="https://www.youtube.com/watch?v=KvZoBV_1yYE">Styling a Radix Dialog with Tailwind CSS</a></li></ul>
]]></content:encoded>
      <enclosure length="40611181" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/33d852b3-e9e8-49fb-a4f0-999df023a384/audio/b98d79f6-5aed-4600-9bf5-054e69a51a24/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Reusable pending UI for forms with Server Actions</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:42:18</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>168</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">bd4ac6d7-96f6-4fcf-9c64-5c1ee28a517c</guid>
      <title>How Suspense led to Server Components (React Roundtable reaction)</title>
      <description><![CDATA[<p>Sam and Ryan share their thoughts on the recent React Roundtable with core team members Sebastian Markbåge and Andrew Clark. They talk about the evolution of Server Components from the perspective of solving the problem of fetching data in React apps, how SPAs have a lower baseline but higher ceiling in terms of the user experience they can deliver, and what they’d like to see from frameworks that are built on the RSC architecture.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>0:36 - Recap of Server Components as a solution to data fetching in React</li><li>11:47 - How Server Components improve the baseline user experience of React apps while also letting us layer in SPA-like enhancements</li><li>20:11 - What features we give up with server-driven data fetching, and how can we get them back?</li><li>29:13 - How RSC and Actions bring the setState-and-diff model across the network</li><li>31:59 - What opinions are left to frameworks that are built on the constraints of RSC, and what would we like to see from them?</li></ul><p>Links:</p><ul><li><a href="https://youtu.be/g5BGoLyGjY0">React Roundtable with Sebastian and Andrew</a></li><li><a href="https://samselikoff.ck.page">Build UI Newsletter</a></li></ul>
]]></description>
      <pubDate>Wed, 7 Jun 2023 18:51:04 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan share their thoughts on the recent React Roundtable with core team members Sebastian Markbåge and Andrew Clark. They talk about the evolution of Server Components from the perspective of solving the problem of fetching data in React apps, how SPAs have a lower baseline but higher ceiling in terms of the user experience they can deliver, and what they’d like to see from frameworks that are built on the RSC architecture.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>0:36 - Recap of Server Components as a solution to data fetching in React</li><li>11:47 - How Server Components improve the baseline user experience of React apps while also letting us layer in SPA-like enhancements</li><li>20:11 - What features we give up with server-driven data fetching, and how can we get them back?</li><li>29:13 - How RSC and Actions bring the setState-and-diff model across the network</li><li>31:59 - What opinions are left to frameworks that are built on the constraints of RSC, and what would we like to see from them?</li></ul><p>Links:</p><ul><li><a href="https://youtu.be/g5BGoLyGjY0">React Roundtable with Sebastian and Andrew</a></li><li><a href="https://samselikoff.ck.page">Build UI Newsletter</a></li></ul>
]]></content:encoded>
      <enclosure length="48984157" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/f359ff3b-d82c-446a-93e9-27cf942aece3/audio/f2839527-3596-4552-b3e5-aea87725ee4a/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>How Suspense led to Server Components (React Roundtable reaction)</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:51:01</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>167</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">27af6fe8-877b-4e42-8504-dd35f4ffcfb0</guid>
      <title>Learning by copy-paste</title>
      <description><![CDATA[<p>Sam and Ryan use some recent Twitter discussion on copying + pasting code (instead of abstracting it for reuse) as a springboard for a discussion about how their thinking on low-level UI components and design systems has changed over the years.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:16 - Copy-paste vs. creating abstractions</li><li>11:43 - How we used to build shared UI components</li><li>15:34 - How we use UI components today</li><li>22:42 - Is copy-paste the easiest way for developers to implement consistent design?</li><li>27:41 - When should we create abstractions?</li><li>37:15 - Designing copy-pasteable APIs</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/dan_abramov/status/1659348147150245889">Dan’s tweet</a></li><li><a href="https://samselikoff.ck.page">Build UI Newsletter</a></li><li><a href="https://youtu.be/OAmp3GTfZnU">Sam’s Server Actions video on YouTube</a></li></ul>
]]></description>
      <pubDate>Wed, 24 May 2023 14:57:33 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan use some recent Twitter discussion on copying + pasting code (instead of abstracting it for reuse) as a springboard for a discussion about how their thinking on low-level UI components and design systems has changed over the years.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:16 - Copy-paste vs. creating abstractions</li><li>11:43 - How we used to build shared UI components</li><li>15:34 - How we use UI components today</li><li>22:42 - Is copy-paste the easiest way for developers to implement consistent design?</li><li>27:41 - When should we create abstractions?</li><li>37:15 - Designing copy-pasteable APIs</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/dan_abramov/status/1659348147150245889">Dan’s tweet</a></li><li><a href="https://samselikoff.ck.page">Build UI Newsletter</a></li><li><a href="https://youtu.be/OAmp3GTfZnU">Sam’s Server Actions video on YouTube</a></li></ul>
]]></content:encoded>
      <enclosure length="39363155" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/216cf68c-e569-4850-8aa8-e95aec3391d2/audio/ea09c6d0-1409-4f43-80e0-dbc65e932df0/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Learning by copy-paste</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:41:00</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>166</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">c1c51683-4b22-4a5b-9ced-d8368e07267a</guid>
      <title>What problems do React Server Components solve?</title>
      <description><![CDATA[<p>Sam and Ryan share their learnings from working with Server Components in earnest over the past week. They talk about how Server Components can simplify client components by passing them props, why it makes sense for a component that can run everywhere to be a Server Component by default, whether RSC is causing unnecessary churn in the ecosystem, and how to think about choosing Server Components vs. client components for a given task.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>0:48 - Lessons learned from building a D3 chart as a React Server Component</li><li>22:04 - Are Server Components causing unnecessary churn in the JavaScript ecosystem?</li><li>32:14 - Do Server Components replace Client Components?</li><li>40:13 - Ryan’s thoughts on rewriting some client-side data fetching code with Server Components</li></ul><p>Links:</p><ul><li><a href="https://buildui.com/series/react-server-components/building-a-users-table">Ryan’s Build UI course on Server Components</a></li><li><a href="https://www.youtube.com/watch?v=3JB_qEk39w0">Sam’s D3 Chart video on YouTube</a></li></ul>
]]></description>
      <pubDate>Wed, 17 May 2023 10:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan share their learnings from working with Server Components in earnest over the past week. They talk about how Server Components can simplify client components by passing them props, why it makes sense for a component that can run everywhere to be a Server Component by default, whether RSC is causing unnecessary churn in the ecosystem, and how to think about choosing Server Components vs. client components for a given task.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>0:48 - Lessons learned from building a D3 chart as a React Server Component</li><li>22:04 - Are Server Components causing unnecessary churn in the JavaScript ecosystem?</li><li>32:14 - Do Server Components replace Client Components?</li><li>40:13 - Ryan’s thoughts on rewriting some client-side data fetching code with Server Components</li></ul><p>Links:</p><ul><li><a href="https://buildui.com/series/react-server-components/building-a-users-table">Ryan’s Build UI course on Server Components</a></li><li><a href="https://www.youtube.com/watch?v=3JB_qEk39w0">Sam’s D3 Chart video on YouTube</a></li></ul>
]]></content:encoded>
      <enclosure length="49046433" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/db6e00b2-f739-4d03-9a58-fea9ca2ef561/audio/f0a16ae3-7c67-4f67-8b4c-80f7196e8605/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>What problems do React Server Components solve?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:51:05</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>165</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">d0a45049-c889-44e4-846b-ee720c92b144</guid>
      <title>Implicit time zones and the TZ environment variable</title>
      <description><![CDATA[<p>Sam shares some recent learnings around hydration mismatches when rendering time zoned dates on the server and the client. He talks about using the TZ environment variable to reproduce the issue locally, and how he solved his problem by avoiding impure format and transformation functions from date-fns.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>0:50 - Sever vs. client time zone mismatches, and the TZ environment variable</li><li>14:34 - Which date-fns functions are impure?</li><li>23:56 - Using intervals and comparison to remove impurities</li></ul><p>Links:</p><ul><li><a href="https://date-fns.org">date-fns</a></li><li><a href="https://github.com/marnusw/date-fns-tz">date-fns-tz</a></li></ul>
]]></description>
      <pubDate>Thu, 11 May 2023 14:16:21 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam shares some recent learnings around hydration mismatches when rendering time zoned dates on the server and the client. He talks about using the TZ environment variable to reproduce the issue locally, and how he solved his problem by avoiding impure format and transformation functions from date-fns.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>0:50 - Sever vs. client time zone mismatches, and the TZ environment variable</li><li>14:34 - Which date-fns functions are impure?</li><li>23:56 - Using intervals and comparison to remove impurities</li></ul><p>Links:</p><ul><li><a href="https://date-fns.org">date-fns</a></li><li><a href="https://github.com/marnusw/date-fns-tz">date-fns-tz</a></li></ul>
]]></content:encoded>
      <enclosure length="44432581" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/b2f1f25a-4f94-4152-b45c-e0daf5896a84/audio/5726c790-0642-4896-b8ef-e69aa2e85e17/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Implicit time zones and the TZ environment variable</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:46:17</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>164</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">901ab196-c0a7-47ef-ac87-ed2db244b62c</guid>
      <title>React email previews and radial gradients</title>
      <description><![CDATA[<p>Sam and Ryan talk about using MJML to design, build and send transactional emails with React directly in the browser. They also chat about how to use Framer Motion to get a CSS radial gradient to follow the mouse cursor and the differences between React state, refs, Motion Values, and external stores.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:10 - Building in-browser email previews with MJML</li><li>18:50 - Using radial gradients and Motion Values to build a moving spotlight treatment</li></ul><p>Links:</p><ul><li><a href="https://mjml.io">MJML</a></li><li><a href="https://react.email">React Email</a></li><li><a href="https://maizzle.com">Maizzle</a></li><li><a href="https://www.youtube.com/watch?v=uWfZ2bZuvpo">Sam’s Spotlight video on YouTube</a></li><li><a href="https://buildui.com/recipes/spotlight">Spotlight code recipe</a></li></ul>
]]></description>
      <pubDate>Wed, 3 May 2023 14:00:36 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about using MJML to design, build and send transactional emails with React directly in the browser. They also chat about how to use Framer Motion to get a CSS radial gradient to follow the mouse cursor and the differences between React state, refs, Motion Values, and external stores.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:10 - Building in-browser email previews with MJML</li><li>18:50 - Using radial gradients and Motion Values to build a moving spotlight treatment</li></ul><p>Links:</p><ul><li><a href="https://mjml.io">MJML</a></li><li><a href="https://react.email">React Email</a></li><li><a href="https://maizzle.com">Maizzle</a></li><li><a href="https://www.youtube.com/watch?v=uWfZ2bZuvpo">Sam’s Spotlight video on YouTube</a></li><li><a href="https://buildui.com/recipes/spotlight">Spotlight code recipe</a></li></ul>
]]></content:encoded>
      <enclosure length="40358733" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/4a98411c-4c3a-49f6-9ead-065bd3c85ea4/audio/6bcb7394-5121-45bd-92ea-f2f0d6dba30d/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>React email previews and radial gradients</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:42:02</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>163</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">a94ceaf8-e68b-4da4-92db-e4d6bdbbbba8</guid>
      <title>Blending modes and secure redirects</title>
      <description><![CDATA[<p>Sam and Ryan talk about building an animated tabs component with CSS’s mix-blend-mode property and Framer Motion’s layout animations. They also talk about how to use the URL constructor in JavaScript to help implement secure arbitrary redirects, as well as their initial reactions to new framework APIs that blur the lines between server and client code.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>0:35 - Animated tabs with mix-blend-mode exclusion and Framer Motion’s layoutId</li><li>14:26 - Using the URL constructor for arbitrary redirects after login</li><li>27:12 - Reacting to Rich Harris’ discussion on how new framework APIs are exposing hidden API routes</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/DanHollick/status/1583080119068807168">Dan Hollick’s thread on blending modes</a></li><li><a href="https://buildui.com/recipes/animated-tabs">Animated Tabs recipe</a></li><li><a href="https://youtu.be/kep_Iaxuzy0">Animated Tabs YouTube video</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Web/API/URL/URL">URL constructor</a></li><li><a href="https://youtu.be/uXCipjbcQfM">Rich Harris’ talk</a></li></ul>
]]></description>
      <pubDate>Wed, 26 Apr 2023 10:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about building an animated tabs component with CSS’s mix-blend-mode property and Framer Motion’s layout animations. They also talk about how to use the URL constructor in JavaScript to help implement secure arbitrary redirects, as well as their initial reactions to new framework APIs that blur the lines between server and client code.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>0:35 - Animated tabs with mix-blend-mode exclusion and Framer Motion’s layoutId</li><li>14:26 - Using the URL constructor for arbitrary redirects after login</li><li>27:12 - Reacting to Rich Harris’ discussion on how new framework APIs are exposing hidden API routes</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/DanHollick/status/1583080119068807168">Dan Hollick’s thread on blending modes</a></li><li><a href="https://buildui.com/recipes/animated-tabs">Animated Tabs recipe</a></li><li><a href="https://youtu.be/kep_Iaxuzy0">Animated Tabs YouTube video</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Web/API/URL/URL">URL constructor</a></li><li><a href="https://youtu.be/uXCipjbcQfM">Rich Harris’ talk</a></li></ul>
]]></content:encoded>
      <enclosure length="36155318" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/7a631739-dbe3-45cc-82c5-88f42dd49134/audio/a0a48844-057f-4624-a397-976cbaec9738/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Blending modes and secure redirects</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:37:39</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>162</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">5f63c5e6-76d0-476a-827b-5658928691b9</guid>
      <title>React Aria Components</title>
      <description><![CDATA[<p>Sam tells Ryan about his experience building an animated toggle with React Aria Components. He gives his first impressions of the new library and discusses some of functionality included from the lower-level React Aria hooks. Ryan also talks about his recent use of GitHub Copilot.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:15 - Using GitHub Copilot to keep you working at higher levels of abstraction</li><li>8:15 - react aria components toggle. pressed state. When to use browser defaults vs headless for form inputs.</li></ul><p>Links:</p><ul><li><a href="https://react-spectrum.adobe.com/react-aria/react-aria-components.html">React Aria Components</a></li><li><a href="https://youtu.be/T-pr-rZgMlQ">Sam’s YouTube video on building an animated toggle</a></li><li><a href="https://buildui.com/recipes/ios-animated-switch">Build UI Recipe: iOS Animated Switch</a></li></ul>
]]></description>
      <pubDate>Thu, 20 Apr 2023 11:53:37 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam tells Ryan about his experience building an animated toggle with React Aria Components. He gives his first impressions of the new library and discusses some of functionality included from the lower-level React Aria hooks. Ryan also talks about his recent use of GitHub Copilot.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:15 - Using GitHub Copilot to keep you working at higher levels of abstraction</li><li>8:15 - react aria components toggle. pressed state. When to use browser defaults vs headless for form inputs.</li></ul><p>Links:</p><ul><li><a href="https://react-spectrum.adobe.com/react-aria/react-aria-components.html">React Aria Components</a></li><li><a href="https://youtu.be/T-pr-rZgMlQ">Sam’s YouTube video on building an animated toggle</a></li><li><a href="https://buildui.com/recipes/ios-animated-switch">Build UI Recipe: iOS Animated Switch</a></li></ul>
]]></content:encoded>
      <enclosure length="33849019" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/dee6b7d8-69b4-454f-9fcd-79cdf1dcda68/audio/fa1eee00-132e-4394-bb45-b85ad5f17592/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>React Aria Components</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:35:15</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>161</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">dc0e329d-2ff4-41ce-b162-0d034a70b0d0</guid>
      <title>JavaScript needs a model layer</title>
      <description><![CDATA[<p>Sam and Ryan talk about updating Build UI to support lifetime memberships. They chat about the site’s current architecture, the strengths and weaknesses of objects vs. functions, how the full stack JavaScript community could benefit from a proper model layer like ActiveRecord, the challenges of using GraphQL on the backend, Prisma, and more.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:09 - Current architecture + single purchase</li><li>6:30 - Rails model layer. OOP vs functional</li><li>13:55 - What are classes good at, what are functions good at</li><li>23:53 - Composition vs. inheritance</li><li>31:44 - graphql. overfetching is not a problem on the backend. prisma.</li></ul><p>Links:</p><ul><li><a href="https://youtu.be/f5I1iyso29U">Go Ahead, Make a Mess by Sandi Metz</a></li></ul>
]]></description>
      <pubDate>Wed, 12 Apr 2023 10:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about updating Build UI to support lifetime memberships. They chat about the site’s current architecture, the strengths and weaknesses of objects vs. functions, how the full stack JavaScript community could benefit from a proper model layer like ActiveRecord, the challenges of using GraphQL on the backend, Prisma, and more.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:09 - Current architecture + single purchase</li><li>6:30 - Rails model layer. OOP vs functional</li><li>13:55 - What are classes good at, what are functions good at</li><li>23:53 - Composition vs. inheritance</li><li>31:44 - graphql. overfetching is not a problem on the backend. prisma.</li></ul><p>Links:</p><ul><li><a href="https://youtu.be/f5I1iyso29U">Go Ahead, Make a Mess by Sandi Metz</a></li></ul>
]]></content:encoded>
      <enclosure length="41318368" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/5655afb3-0045-48bf-84ed-159790c63d2a/audio/32c52e5f-2ba4-4dd4-9f9a-47685c733fb5/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>JavaScript needs a model layer</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:43:02</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>160</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">0ee573b7-2537-4019-825c-ffd879675b6d</guid>
      <title>Server Components and the React paradigm</title>
      <description><![CDATA[<p>Ryan and Sam use some recent Twitter conversation to guide a discussion about the design and purpose of React Server Components. They talk about how client trees and rendered on the server today, why a server-side rendered prepass is wasteful in light of RSC, how hydration of a client tree works, why RSC are never hydrated, how RSC is a purely additive technology, how server and client components can be interleaved, how RSC can be refreshed in-place without loss of any client state, how RSC fits into the React paradigm despite having a unique syntax and set of capabilities, and other topics.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>4:39 - How server-side rendering and hydration work today</li><li>14:51 - How RSC works, and why they’re never hydrated</li><li>24:48 - What is the React paradigm, and how RSC fits into it</li><li>27:54 - How RSC are revalidated</li><li>33:52 - Why the goal is not to eliminate Client components</li><li>38:53 - What it means for Server components and Client components to compose with each other</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/dan_abramov/status/1631641431742857216?s=20">Dan Abramov’s RSC AMA thread</a></li><li><a href="https://twitter.com/dan_abramov/status/1633574036767662080">Illustration of server and client trees</a></li></ul>
]]></description>
      <pubDate>Wed, 15 Mar 2023 15:00:21 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Ryan and Sam use some recent Twitter conversation to guide a discussion about the design and purpose of React Server Components. They talk about how client trees and rendered on the server today, why a server-side rendered prepass is wasteful in light of RSC, how hydration of a client tree works, why RSC are never hydrated, how RSC is a purely additive technology, how server and client components can be interleaved, how RSC can be refreshed in-place without loss of any client state, how RSC fits into the React paradigm despite having a unique syntax and set of capabilities, and other topics.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>4:39 - How server-side rendering and hydration work today</li><li>14:51 - How RSC works, and why they’re never hydrated</li><li>24:48 - What is the React paradigm, and how RSC fits into it</li><li>27:54 - How RSC are revalidated</li><li>33:52 - Why the goal is not to eliminate Client components</li><li>38:53 - What it means for Server components and Client components to compose with each other</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/dan_abramov/status/1631641431742857216?s=20">Dan Abramov’s RSC AMA thread</a></li><li><a href="https://twitter.com/dan_abramov/status/1633574036767662080">Illustration of server and client trees</a></li></ul>
]]></content:encoded>
      <enclosure length="48726694" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/19fec456-5d50-4f6a-a427-c39b3745aabc/audio/1474485a-83a8-4166-a1a9-60ae32d9ec1b/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Server Components and the React paradigm</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:50:45</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>159</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">41e27091-703a-4853-8dda-74aea152a285</guid>
      <title>HTML, HTTP, and React</title>
      <description><![CDATA[<p>Sam and Ryan share their thoughts on the latest server-centric developments taking place among React frameworks like Remix and Next.js. They discuss the declarative nature of HTML and HTTP, the evolution of frontend development from imperative libraries like jQuery to declarative libraries like React, why developers started creating SPAs in the first place, the power and limitations of server-side links and forms, whether the frontend community has overcomplicated web development, the problem with progressive enhancement, React Server Components, how server-centric approaches to building rich web experiences like Phoenix LiveView compare to the approaches in the React ecosystem, and other topics.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>3:02 - The strengths of HTML and HTTP</li><li>11:28 - Is frontend development overcomplicated?</li><li>21:18 - Progressive enhancement</li><li>33:33 - The nervous system of a web app</li><li>46:00 - React Server Components</li><li>53:46 - Server-side approaches</li></ul><p>Links:</p><ul><li><a href="https://buildui.com/series/my-first-remix-app/scaffolding-a-new-app">My first Remix app on Build UI</a></li></ul>
]]></description>
      <pubDate>Wed, 8 Mar 2023 08:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan share their thoughts on the latest server-centric developments taking place among React frameworks like Remix and Next.js. They discuss the declarative nature of HTML and HTTP, the evolution of frontend development from imperative libraries like jQuery to declarative libraries like React, why developers started creating SPAs in the first place, the power and limitations of server-side links and forms, whether the frontend community has overcomplicated web development, the problem with progressive enhancement, React Server Components, how server-centric approaches to building rich web experiences like Phoenix LiveView compare to the approaches in the React ecosystem, and other topics.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>3:02 - The strengths of HTML and HTTP</li><li>11:28 - Is frontend development overcomplicated?</li><li>21:18 - Progressive enhancement</li><li>33:33 - The nervous system of a web app</li><li>46:00 - React Server Components</li><li>53:46 - Server-side approaches</li></ul><p>Links:</p><ul><li><a href="https://buildui.com/series/my-first-remix-app/scaffolding-a-new-app">My first Remix app on Build UI</a></li></ul>
]]></content:encoded>
      <enclosure length="58784046" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/a399a156-eeb8-4e2d-bd5d-174e1d6169bf/audio/e21a0ea7-0695-4e1b-b5d1-d00d7c072df9/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>HTML, HTTP, and React</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:01:13</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>158</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">c2665f15-d497-4680-bd02-65d3072cef6d</guid>
      <title>Caching strategies</title>
      <description><![CDATA[<p>Sam and Ryan have an open-ended conversation about different caching APIs and what kinds of benefits they might afford app developers. They discuss transparent caching layers, cache keys and surrogate keys in systems like Fastly, how SSG is effectively a high-level caching solution, Next.js 13.2’s cache API, Russian doll caching in Rails, whether a fetch cache is too high-level of an abstraction, and other topics.</p><p>They also have a retro on choosing to use Hygraph as Build UI’s CMS, discussing some surprises they encountered including the fact that Hygraph favors high availability over consistency (stale reads, which can cause issues with serverless) and rate limits (which causes issues with SSG).</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:18 - Retro on Hygraph</li><li>16:27 - Caching conversation</li></ul><p>Links:</p><ul><li><a href="https://buildui.com">Build UI</a></li><li><a href="https://hygraph.com">Hygraph</a></li></ul>
]]></description>
      <pubDate>Wed, 1 Mar 2023 14:04:04 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan have an open-ended conversation about different caching APIs and what kinds of benefits they might afford app developers. They discuss transparent caching layers, cache keys and surrogate keys in systems like Fastly, how SSG is effectively a high-level caching solution, Next.js 13.2’s cache API, Russian doll caching in Rails, whether a fetch cache is too high-level of an abstraction, and other topics.</p><p>They also have a retro on choosing to use Hygraph as Build UI’s CMS, discussing some surprises they encountered including the fact that Hygraph favors high availability over consistency (stale reads, which can cause issues with serverless) and rate limits (which causes issues with SSG).</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:18 - Retro on Hygraph</li><li>16:27 - Caching conversation</li></ul><p>Links:</p><ul><li><a href="https://buildui.com">Build UI</a></li><li><a href="https://hygraph.com">Hygraph</a></li></ul>
]]></content:encoded>
      <enclosure length="66049012" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/05c39deb-d5d2-4af3-998e-ad2718e850f0/audio/ef49b60b-8f94-494c-9752-165ac25beb41/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Caching strategies</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:08:48</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>157</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">c68e65fb-095d-441c-8480-952dd4741a5a</guid>
      <title>Saying goodbye to static generation</title>
      <description><![CDATA[<p>Sam and Ryan chat about their recent work migrating Build UI from a statically generated site to a run-time server-rendered app using Next.js. They talk about their past experience working on server-rendered apps, the problems that static sites were created to solve, and the tradeoffs involved within the static-to-dynamic continuum.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:05 - How we built EmberMap with SSR + caching buckets with Redis</li><li>8:36 - How we launched Build UI as a static site with dynamic workarounds</li><li>13:15 - The problem with static-only sites</li><li>14:50 - First potential solution: client-side rendering of dynamic data</li><li>18:01 - Second potential solution: multiple versions of each page</li><li>25:25 - Third potential solution: run-time server rendering</li><li>35:44 - Why we left static</li><li>39:55 - Details and challenges of moving to getServerSideProps</li></ul><p>Links:</p><ul><li><a href="https://buildui.com">Build UI</a></li></ul>
]]></description>
      <pubDate>Wed, 22 Feb 2023 11:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan chat about their recent work migrating Build UI from a statically generated site to a run-time server-rendered app using Next.js. They talk about their past experience working on server-rendered apps, the problems that static sites were created to solve, and the tradeoffs involved within the static-to-dynamic continuum.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:05 - How we built EmberMap with SSR + caching buckets with Redis</li><li>8:36 - How we launched Build UI as a static site with dynamic workarounds</li><li>13:15 - The problem with static-only sites</li><li>14:50 - First potential solution: client-side rendering of dynamic data</li><li>18:01 - Second potential solution: multiple versions of each page</li><li>25:25 - Third potential solution: run-time server rendering</li><li>35:44 - Why we left static</li><li>39:55 - Details and challenges of moving to getServerSideProps</li></ul><p>Links:</p><ul><li><a href="https://buildui.com">Build UI</a></li></ul>
]]></content:encoded>
      <enclosure length="57445323" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/e4b595b9-fddb-439f-ab5a-d613d87e912a/audio/3ed74b26-e92e-4fae-ac7c-e89880ac8059/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Saying goodbye to static generation</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:59:50</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>156</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">e3ae2592-26ec-45dd-8c86-fc2bca613fdf</guid>
      <title>Building user search with React Server Components</title>
      <description><![CDATA[<p>Ryan talks about a demo he built in Next.js 13 with React Server Components. He explains how RSC driven by the URL eliminated client-side states, how he used React 18 Transitions to enhance the UI, and how he was able to fine-tune the experience differently for the initial render vs. subsequent client-side navigations.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:37 - Overview of Ryan’s user search page</li><li>14:06 - React 18 Transitions and how RSC eliminates client states</li><li>28:25 - How to change the UX for initial server navigations vs. in-app client navigations while still having one entry point for your data</li><li>37:01 - Why Next.js 13 encourages you to learn about the Suspense and Transition primitives</li><li>43:33 - What would a simple boilerplate for RSC look like?</li><li>49:18 - Do the benefits of backends-as-a-service go away with RSC?</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/ryantotweets/status/1622632894278533130">Ryan’s demo on Twitter</a></li></ul>
]]></description>
      <pubDate>Wed, 15 Feb 2023 21:12:02 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Ryan talks about a demo he built in Next.js 13 with React Server Components. He explains how RSC driven by the URL eliminated client-side states, how he used React 18 Transitions to enhance the UI, and how he was able to fine-tune the experience differently for the initial render vs. subsequent client-side navigations.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:37 - Overview of Ryan’s user search page</li><li>14:06 - React 18 Transitions and how RSC eliminates client states</li><li>28:25 - How to change the UX for initial server navigations vs. in-app client navigations while still having one entry point for your data</li><li>37:01 - Why Next.js 13 encourages you to learn about the Suspense and Transition primitives</li><li>43:33 - What would a simple boilerplate for RSC look like?</li><li>49:18 - Do the benefits of backends-as-a-service go away with RSC?</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/ryantotweets/status/1622632894278533130">Ryan’s demo on Twitter</a></li></ul>
]]></content:encoded>
      <enclosure length="62618404" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/9a985972-d7f1-4c45-b159-4c4caf0b6461/audio/4b58bd3c-2fa2-43de-8714-9a62570273b2/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Building user search with React Server Components</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:05:13</itunes:duration>
      <itunes:summary>Ryan talks about a demo he built in Next.js 13 with React Server Components. He explains how RSC driven by the URL eliminated client-side states, how he used React 18 Transitions to enhance the UI, and how he was able to fine-tune the experience differently for the initial render vs. subsequent client-side navigations.</itunes:summary>
      <itunes:subtitle>Ryan talks about a demo he built in Next.js 13 with React Server Components. He explains how RSC driven by the URL eliminated client-side states, how he used React 18 Transitions to enhance the UI, and how he was able to fine-tune the experience differently for the initial render vs. subsequent client-side navigations.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>155</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">0fc2392c-e477-4c8a-9f8e-4e306a3ceedc</guid>
      <title>Ship Small, Ship Fast</title>
      <description><![CDATA[<p>Ryan and Sam read a recent article by Derrick Reimer called “Ship Small, Ship Fast” and offer their thoughts on it. They discuss how implementation details can lead to reductions in scope, the relationship between shipping small and agile, and why quickly getting the first steps of a user flow into production is a good protocol for software teams to follow.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:06 - Ship Small, Ship Fast read-a-long</li><li>7:22 - Reactions</li></ul><p>Links:</p><ul><li><a href="https://www.derrickreimer.com/ship-small/">Ship Small, Ship Fast by Derrick Reimer</a></li><li><a href="https://embermap.com/podcast/derrick-reimer-on-spa-architecture-with-elm-and-graphql">Derrick Reimer on SPA architecture with Elm and GraphQL</a></li></ul>
]]></description>
      <pubDate>Wed, 8 Feb 2023 11:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Ryan and Sam read a recent article by Derrick Reimer called “Ship Small, Ship Fast” and offer their thoughts on it. They discuss how implementation details can lead to reductions in scope, the relationship between shipping small and agile, and why quickly getting the first steps of a user flow into production is a good protocol for software teams to follow.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:06 - Ship Small, Ship Fast read-a-long</li><li>7:22 - Reactions</li></ul><p>Links:</p><ul><li><a href="https://www.derrickreimer.com/ship-small/">Ship Small, Ship Fast by Derrick Reimer</a></li><li><a href="https://embermap.com/podcast/derrick-reimer-on-spa-architecture-with-elm-and-graphql">Derrick Reimer on SPA architecture with Elm and GraphQL</a></li></ul>
]]></content:encoded>
      <enclosure length="29578312" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/1c6ceae7-0888-47f9-ab05-a8b0da2c458d/audio/c8a425d7-cdfe-4fe4-894b-ccadbe946b2b/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Ship Small, Ship Fast</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:30:48</itunes:duration>
      <itunes:summary>Ryan and Sam discuss an article that explores how shipping small and fast can impact a product.</itunes:summary>
      <itunes:subtitle>Ryan and Sam discuss an article that explores how shipping small and fast can impact a product.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>154</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">826a59d7-cf78-4704-b43c-ab3717db8780</guid>
      <title>Lying in TypeScript</title>
      <description><![CDATA[<p>Sam and Ryan talk about seams in TypeScript programs where lies can sneak in. They chat about how API calls, form inputs, and URLs all relate to this problem, the similarity between drifting types and service mocks in testing, zod, and how type-safe languages like Elm eliminate this problem entirely.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:41 - Lying in Typescript</li></ul><p>Links:</p><ul><li><a href="https://github.com/colinhacks/zod">Zod</a></li><li><a href="https://elm-lang.org">Elm language</a></li></ul>
]]></description>
      <pubDate>Thu, 26 Jan 2023 16:14:21 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about seams in TypeScript programs where lies can sneak in. They chat about how API calls, form inputs, and URLs all relate to this problem, the similarity between drifting types and service mocks in testing, zod, and how type-safe languages like Elm eliminate this problem entirely.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:41 - Lying in Typescript</li></ul><p>Links:</p><ul><li><a href="https://github.com/colinhacks/zod">Zod</a></li><li><a href="https://elm-lang.org">Elm language</a></li></ul>
]]></content:encoded>
      <enclosure length="45997003" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/68094319-4731-448b-a00d-7f8045a39d5b/audio/3a0d7f38-2c08-4291-b945-23a47f2139bb/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Lying in TypeScript</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:47:54</itunes:duration>
      <itunes:summary>Sam and Ryan talk about seams in TypeScript programs where lies can sneak in. They chat about how API calls, form inputs, and URLs all relate to this problem, the similarity between drifting types and service mocks in testing, zod, and how type-safe languages like Elm eliminate this problem entirely.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about seams in TypeScript programs where lies can sneak in. They chat about how API calls, form inputs, and URLs all relate to this problem, the similarity between drifting types and service mocks in testing, zod, and how type-safe languages like Elm eliminate this problem entirely.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>153</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">d42baaba-9e02-4f06-b4b2-433314fd62ae</guid>
      <title>Animating a Stable Diffusion side project</title>
      <description><![CDATA[<p>Ryan tells Sam about a side project of his that involves running the text-to-image deep learning model Stable Diffusion on his laptop in response to web requests. Ryan asks Sam questions about animating this UI, including how to animate indeterminate progress, how to avoid unintentional layout animation, and how to automatically repeat a set of items while scrolling rather than stopping at the end.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>0:24 – Overview of Ryan’s Stable Diffusion project -</li><li>9:36 – Strategies for animating partially indeterminate progress -</li><li>18:25 – Brainstorm of the API for the headless version of a partially indeterminate progress Hook -</li><li>25:32 – Unintentional layout animation during window resize -</li><li>28:29 – Infinite scrolling of a finite array of items -</li><li>38:52 – Discussion of the need for more high-level Framer Motion examples -</li></ul><p>Links:</p><ul><li><a href="https://www.framer.com/motion">Framer Motion docs</a></li></ul>
]]></description>
      <pubDate>Thu, 19 Jan 2023 11:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Ryan tells Sam about a side project of his that involves running the text-to-image deep learning model Stable Diffusion on his laptop in response to web requests. Ryan asks Sam questions about animating this UI, including how to animate indeterminate progress, how to avoid unintentional layout animation, and how to automatically repeat a set of items while scrolling rather than stopping at the end.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>0:24 – Overview of Ryan’s Stable Diffusion project -</li><li>9:36 – Strategies for animating partially indeterminate progress -</li><li>18:25 – Brainstorm of the API for the headless version of a partially indeterminate progress Hook -</li><li>25:32 – Unintentional layout animation during window resize -</li><li>28:29 – Infinite scrolling of a finite array of items -</li><li>38:52 – Discussion of the need for more high-level Framer Motion examples -</li></ul><p>Links:</p><ul><li><a href="https://www.framer.com/motion">Framer Motion docs</a></li></ul>
]]></content:encoded>
      <enclosure length="46002854" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/b420b83d-8172-47bd-83d8-e205b6e63502/audio/39f2a351-fce7-4df7-9391-abf5a6bc88fd/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Animating a Stable Diffusion side project</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:47:55</itunes:duration>
      <itunes:summary>Ryan tells Sam about a side project of his that involves running the text-to-image deep learning model Stable Diffusion on his laptop in response to web requests. Ryan asks Sam questions about animating this UI, including how to animate indeterminate progress, how to avoid unintentional layout animation, and how to automatically repeat a set of items while scrolling rather than stopping at the end.</itunes:summary>
      <itunes:subtitle>Ryan tells Sam about a side project of his that involves running the text-to-image deep learning model Stable Diffusion on his laptop in response to web requests. Ryan asks Sam questions about animating this UI, including how to animate indeterminate progress, how to avoid unintentional layout animation, and how to automatically repeat a set of items while scrolling rather than stopping at the end.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>152</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">7523ef14-77d5-45fd-87d5-a8745818010b</guid>
      <title>Lessons from stitching GraphQL services with Hasura</title>
      <description><![CDATA[<p>Ryan talks about the pros and cons of exposing Build UI’s environment-independent CMS from Hasura via schema stitching. He also talks about writing a Postgres function to add a derived field to a database model. Sam shares a debugging story about fixing his personal website due to a breaking change in a minor version of npm.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:50 - Debugging Sam’s personal website due to a breaking change in npm related to peer dependencies</li><li>18:00 - Pros and cons of using a Postgres function to derive the active status of a Build UI subscription</li><li>28:42 - Exposing a Hygraph CMS through Hasura via schema stitching, and the fantastic TypeScript DX that came as a result</li></ul><p>Links:</p><ul><li><a href="https://hasura.io">Hasura</a></li><li><a href="https://hygraph.com">Hygraph</a></li></ul>
]]></description>
      <pubDate>Wed, 11 Jan 2023 11:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Ryan talks about the pros and cons of exposing Build UI’s environment-independent CMS from Hasura via schema stitching. He also talks about writing a Postgres function to add a derived field to a database model. Sam shares a debugging story about fixing his personal website due to a breaking change in a minor version of npm.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:50 - Debugging Sam’s personal website due to a breaking change in npm related to peer dependencies</li><li>18:00 - Pros and cons of using a Postgres function to derive the active status of a Build UI subscription</li><li>28:42 - Exposing a Hygraph CMS through Hasura via schema stitching, and the fantastic TypeScript DX that came as a result</li></ul><p>Links:</p><ul><li><a href="https://hasura.io">Hasura</a></li><li><a href="https://hygraph.com">Hygraph</a></li></ul>
]]></content:encoded>
      <enclosure length="51992627" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/5b492bfb-75db-4675-bab2-ebfa51712b2e/audio/f9f05c48-5c2a-4ead-a68a-921206901532/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Lessons from stitching GraphQL services with Hasura</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:54:09</itunes:duration>
      <itunes:summary>Ryan talks about the pros and cons of exposing Build UI’s environment-independent CMS from Hasura via schema stitching. He also talks about writing a Postgres function to add a derived field to a database model. Sam shares a debugging story about fixing his personal website due to a breaking change in a minor version of npm.</itunes:summary>
      <itunes:subtitle>Ryan talks about the pros and cons of exposing Build UI’s environment-independent CMS from Hasura via schema stitching. He also talks about writing a Postgres function to add a derived field to a database model. Sam shares a debugging story about fixing his personal website due to a breaking change in a minor version of npm.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>151</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">1831094c-7256-4a91-9870-545dac4a8b34</guid>
      <title>How to solve a SSR/CSR mismatch using the DOM</title>
      <description><![CDATA[<p>Sam and Ryan chat about how to avoid a flicker of content on initial render due to mismatched server/client rendering. They also chat about the pros and cons of React Hooks, and using StackBlitz containers to debug OSS issues.</p><p>Topics include:</p><ul><li>0:00 – Intro</li><li>1:46 – Ryan Florence’s tweets about Hooks, useEffect and refs</li><li>18:12 – How to avoid SSR/CSR rendering mismatches when your initial render depends on client-side APIs</li><li>37:40 – Using StackBlitz for reproduction in open source</li><li>45:17 – Isolated app development environments with JavaScript containers</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/ryanflorence/status/1603767700496338944">Ryan Florence’s tweets on Hooks</a></li><li><a href="https://twitter.com/dan_abramov/status/1603788551011078145">Dan Abramov’s reply</a></li><li><a href="https://beta.reactjs.org/reference/react/StrictMode#fixing-bugs-found-by-double-rendering-in-development">React beta docs on bugs found from double rendering</a></li><li><a href="https://beta.reactjs.org/reference/react/StrictMode#fixing-bugs-found-by-double-rendering-in-development">React beta docs on bugs found from re-running Effects</a></li><li><a href="https://stackblitz.com">StackBlitz</a></li><li><a href="https://changelog.com/jsparty/256">Changelog episode with Ryan Dahl about Deno Deploy as a platform</a></li></ul>
]]></description>
      <pubDate>Thu, 29 Dec 2022 13:24:37 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan chat about how to avoid a flicker of content on initial render due to mismatched server/client rendering. They also chat about the pros and cons of React Hooks, and using StackBlitz containers to debug OSS issues.</p><p>Topics include:</p><ul><li>0:00 – Intro</li><li>1:46 – Ryan Florence’s tweets about Hooks, useEffect and refs</li><li>18:12 – How to avoid SSR/CSR rendering mismatches when your initial render depends on client-side APIs</li><li>37:40 – Using StackBlitz for reproduction in open source</li><li>45:17 – Isolated app development environments with JavaScript containers</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/ryanflorence/status/1603767700496338944">Ryan Florence’s tweets on Hooks</a></li><li><a href="https://twitter.com/dan_abramov/status/1603788551011078145">Dan Abramov’s reply</a></li><li><a href="https://beta.reactjs.org/reference/react/StrictMode#fixing-bugs-found-by-double-rendering-in-development">React beta docs on bugs found from double rendering</a></li><li><a href="https://beta.reactjs.org/reference/react/StrictMode#fixing-bugs-found-by-double-rendering-in-development">React beta docs on bugs found from re-running Effects</a></li><li><a href="https://stackblitz.com">StackBlitz</a></li><li><a href="https://changelog.com/jsparty/256">Changelog episode with Ryan Dahl about Deno Deploy as a platform</a></li></ul>
]]></content:encoded>
      <enclosure length="49484036" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/462a9d12-6725-46f3-97cc-530b351a532f/audio/9fd6da54-f88a-4303-bccd-b72072cbb547/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>How to solve a SSR/CSR mismatch using the DOM</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:51:32</itunes:duration>
      <itunes:summary>Sam and Ryan chat about how to avoid a flicker of content on initial render due to mismatched server/client rendering. They also chat about the pros and cons of React Hooks, and using StackBlitz containers to debug OSS issues.</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about how to avoid a flicker of content on initial render due to mismatched server/client rendering. They also chat about the pros and cons of React Hooks, and using StackBlitz containers to debug OSS issues.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>150</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">310ba702-fe59-488a-9c71-8b360106950c</guid>
      <title>Why we’re adding a CMS to Build UI</title>
      <description><![CDATA[<p>Sam and Ryan chat about issues they’ve run into in the past when building media sites that store content alongside other dynamic data like user accounts, and how they’re using a CMS to alleviate these problems in Build UI. They also talk about the approach they’ll be using for access control to the CMS.</p><p>Topics include:</p><ul><li>0:00 – Intro</li><li>0:27 – Unintentional security attack vectors</li><li>11:20 – Environment-specific vs. environment-independent data</li><li>23:43 – Architecture discussion for an environment-independent CMS</li><li>34:39 – Added complexity for testing</li></ul><p>Links:</p><ul><li><a href="https://buildui.com">Framer Motion Recipes on Build UI</a></li><li><a href="https://news.ycombinator.com/item?id=33708060">Hacker News post on TeamViewer</a></li></ul>
]]></description>
      <pubDate>Fri, 2 Dec 2022 16:54:30 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan chat about issues they’ve run into in the past when building media sites that store content alongside other dynamic data like user accounts, and how they’re using a CMS to alleviate these problems in Build UI. They also talk about the approach they’ll be using for access control to the CMS.</p><p>Topics include:</p><ul><li>0:00 – Intro</li><li>0:27 – Unintentional security attack vectors</li><li>11:20 – Environment-specific vs. environment-independent data</li><li>23:43 – Architecture discussion for an environment-independent CMS</li><li>34:39 – Added complexity for testing</li></ul><p>Links:</p><ul><li><a href="https://buildui.com">Framer Motion Recipes on Build UI</a></li><li><a href="https://news.ycombinator.com/item?id=33708060">Hacker News post on TeamViewer</a></li></ul>
]]></content:encoded>
      <enclosure length="40227912" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/7839b414-5ab8-4d3c-a2ca-4a6d0bbf0655/audio/c35b59c3-711c-4164-8a94-c18f6996c5dd/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Why we’re adding a CMS to Build UI</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:41:54</itunes:duration>
      <itunes:summary>Sam and Ryan chat about issues they’ve run into in the past when building media sites that store content alongside other dynamic data like user accounts, and how they’re using a CMS to alleviate these problems in Build UI. They also talk about the approach they’ll be using for access control to the CMS.</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about issues they’ve run into in the past when building media sites that store content alongside other dynamic data like user accounts, and how they’re using a CMS to alleviate these problems in Build UI. They also talk about the approach they’ll be using for access control to the CMS.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>149</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">2e63f528-39f1-4706-88a6-dab1c19ccaa0</guid>
      <title>Testing is inescapable</title>
      <description><![CDATA[<p>Sam and Ryan chat about building their new site using services, and how they’re thinking about testing it. They talk about how testability is one of the biggest costs of using third-party hosted services, why they continue to like services in spite of this downside, and the fact that you always end up testing your app whether you eventually automate it or not.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>0:59 - How to run automated integration tests against a site that’s built with services</li></ul>
]]></description>
      <pubDate>Fri, 16 Sep 2022 19:42:58 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan chat about building their new site using services, and how they’re thinking about testing it. They talk about how testability is one of the biggest costs of using third-party hosted services, why they continue to like services in spite of this downside, and the fact that you always end up testing your app whether you eventually automate it or not.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>0:59 - How to run automated integration tests against a site that’s built with services</li></ul>
]]></content:encoded>
      <enclosure length="34749303" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/3c4d73d0-25ec-4fb5-ba04-1b76a24a78dc/audio/614200d6-7819-4aa7-a301-b60dfb4ec8cb/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Testing is inescapable</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:36:11</itunes:duration>
      <itunes:summary>Sam and Ryan chat about building their new site using services, and how they’re thinking about testing it. They talk about how testability is one of the biggest costs of using third-party hosted services, why they continue to like services in spite of this downside, and the fact that you always end up testing your app whether you eventually automate it or not.</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about building their new site using services, and how they’re thinking about testing it. They talk about how testability is one of the biggest costs of using third-party hosted services, why they continue to like services in spite of this downside, and the fact that you always end up testing your app whether you eventually automate it or not.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>148</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">338c0a0e-e293-4920-ad8d-dba301ef787b</guid>
      <title>Type safety from Hasura to SWR</title>
      <description><![CDATA[<p>Ryan shares his experience getting end-to-end type safety from a Hasura backend into a React application. He tells Sam about the different ways GraphQL codegen can be used to generate types, and how he ultimately landed on a solution that combines the TypedDocumentNode type and the zod library.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:51 - Using GraphQL Language Server to get autocomplete + linting</li><li>13:05 - Getting type information on the return object from a query passed to SWR</li><li>24:06 - Generating TypedDocumentNode objects with GraphQL codegen</li><li>33:33 - Using zod for run-time validation</li></ul><p>Links:</p><ul><li><a href="https://github.com/apollographql/graphql-tag">GraphQL Tag / gql</a></li><li><a href="https://www.graphql-code-generator.com/">GraphQL codegen</a></li><li><a href="https://www.the-guild.dev/blog/typed-document-node">GraphQL codegen over the years</a></li><li><a href="https://twitter.com/ryantotweets/status/1560444440111710219">Ryan’s Tweet with TypedDocumentNode</a></li><li><a href="https://github.com/graphql-editor/graphql-zeus">Zeus</a></li><li><a href="https://hasura.io/">Hasura</a></li><li><a href="https://github.com/colinhacks/zod">Zod</a></li></ul>
]]></description>
      <pubDate>Fri, 2 Sep 2022 20:22:28 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Ryan shares his experience getting end-to-end type safety from a Hasura backend into a React application. He tells Sam about the different ways GraphQL codegen can be used to generate types, and how he ultimately landed on a solution that combines the TypedDocumentNode type and the zod library.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:51 - Using GraphQL Language Server to get autocomplete + linting</li><li>13:05 - Getting type information on the return object from a query passed to SWR</li><li>24:06 - Generating TypedDocumentNode objects with GraphQL codegen</li><li>33:33 - Using zod for run-time validation</li></ul><p>Links:</p><ul><li><a href="https://github.com/apollographql/graphql-tag">GraphQL Tag / gql</a></li><li><a href="https://www.graphql-code-generator.com/">GraphQL codegen</a></li><li><a href="https://www.the-guild.dev/blog/typed-document-node">GraphQL codegen over the years</a></li><li><a href="https://twitter.com/ryantotweets/status/1560444440111710219">Ryan’s Tweet with TypedDocumentNode</a></li><li><a href="https://github.com/graphql-editor/graphql-zeus">Zeus</a></li><li><a href="https://hasura.io/">Hasura</a></li><li><a href="https://github.com/colinhacks/zod">Zod</a></li></ul>
]]></content:encoded>
      <enclosure length="53287465" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/7cb03baf-f18a-43ae-9231-6264ba2d9a8d/audio/d2e12823-2744-4d93-9033-f6677e962d59/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Type safety from Hasura to SWR</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:55:30</itunes:duration>
      <itunes:summary>Ryan shares his experience getting end-to-end type safety from a Hasura backend into a React application. He tells Sam about the different ways GraphQL codegen can be used to generate types, and how he ultimately landed on a solution that combines the TypedDocumentNode type and the zod library.</itunes:summary>
      <itunes:subtitle>Ryan shares his experience getting end-to-end type safety from a Hasura backend into a React application. He tells Sam about the different ways GraphQL codegen can be used to generate types, and how he ultimately landed on a solution that combines the TypedDocumentNode type and the zod library.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>147</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">497f3792-ef04-490d-8ad2-ef0b3e945712</guid>
      <title>Playing with Server Components in Vercel’s Edge Runtime</title>
      <description><![CDATA[<p>Ryan tells Sam about some experiments he’s been running using Server Components in Vercel’s new edge runtime. He talks about how components that suspend in the node runtime cause the static build of your Next.js app to wait until they unsuspend, while components that suspend in the edge runtime stream back fallback responses as data is being fetched. Ryan also tells Sam about a blocking JS trick he learned to alter the initial render of your clientside app based on client-specific data, like whether their theme preference is dark or light mode.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:00 - Running synchronous JS before React’s initial render of build-time generated HTML</li><li>17:03 - Using getServerSideProps on the edge in Next.js for run-time generated HTML</li><li>32:15 - Behavior of Server Components that suspend in edge runtime vs. node runtime</li></ul><p>Links:</p><ul><li><a href="https://www.joshwcomeau.com/react/dark-mode/">Josh Comeau’s post on dark mode</a></li><li><a href="https://github.com/vercel/next.js/discussions/34179">Next.js discussion on switchable runtime</a></li></ul>
]]></description>
      <pubDate>Mon, 22 Aug 2022 16:44:42 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Ryan tells Sam about some experiments he’s been running using Server Components in Vercel’s new edge runtime. He talks about how components that suspend in the node runtime cause the static build of your Next.js app to wait until they unsuspend, while components that suspend in the edge runtime stream back fallback responses as data is being fetched. Ryan also tells Sam about a blocking JS trick he learned to alter the initial render of your clientside app based on client-specific data, like whether their theme preference is dark or light mode.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:00 - Running synchronous JS before React’s initial render of build-time generated HTML</li><li>17:03 - Using getServerSideProps on the edge in Next.js for run-time generated HTML</li><li>32:15 - Behavior of Server Components that suspend in edge runtime vs. node runtime</li></ul><p>Links:</p><ul><li><a href="https://www.joshwcomeau.com/react/dark-mode/">Josh Comeau’s post on dark mode</a></li><li><a href="https://github.com/vercel/next.js/discussions/34179">Next.js discussion on switchable runtime</a></li></ul>
]]></content:encoded>
      <enclosure length="49410475" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/f8c59154-a55a-4af7-9b98-ffa27540610f/audio/8544c6e9-b034-4a3f-8ed5-e9b138842723/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Playing with Server Components in Vercel’s Edge Runtime</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:51:28</itunes:duration>
      <itunes:summary>Ryan tells Sam about some experiments he’s been running using Server Components in Vercel’s new edge runtime. He talks about how components that suspend in the node runtime cause the static build of your Next.js app to wait until they unsuspend, while components that suspend in the edge runtime stream back fallback responses as data is being fetched. Ryan also tells Sam about a blocking JS trick he learned to alter the initial render of your clientside app based on client-specific data, like whether their theme preference is dark or light mode.</itunes:summary>
      <itunes:subtitle>Ryan tells Sam about some experiments he’s been running using Server Components in Vercel’s new edge runtime. He talks about how components that suspend in the node runtime cause the static build of your Next.js app to wait until they unsuspend, while components that suspend in the edge runtime stream back fallback responses as data is being fetched. Ryan also tells Sam about a blocking JS trick he learned to alter the initial render of your clientside app based on client-specific data, like whether their theme preference is dark or light mode.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>146</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">3accb90f-a911-4b42-9a3e-a52c02fbc127</guid>
      <title>The problem with buttons on the web</title>
      <description><![CDATA[<p>Sam and Ryan chat about issues with default HTML buttons on the web across different devices and browsers. They talk about the Extensible Web Manifesto, how the React Aria library helps standardize button behavior across platforms, and the difference between state-based and event-based animations.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:09 – The problem with default buttons on the web -</li><li>17:26 – How we got here, and the Extensible Web Manifesto -</li><li>26:22 – React Aria’s unified Press interface -</li><li>32:26 – Getting consistent Focus styling -</li><li>40:30 – Event-based vs. state-based animations -</li></ul><p>Links:</p><ul><li><a href="https://www.youtube.com/watch?v=ydZSNUbHl_8">Sam’s video on building an animated button</a></li><li><a href="https://react-spectrum.adobe.com/react-aria/useButton.html">React Aria useButton</a></li><li><a href="https://react-spectrum.adobe.com/blog/building-a-button-part-1.html">Building a Button Part 1: Press Events</a></li><li><a href="https://react-spectrum.adobe.com/blog/building-a-button-part-2.html">Building a Button Part 2: Hover Interactions</a></li><li><a href="https://react-spectrum.adobe.com/blog/building-a-button-part-3.html">Building a Button Part 3: Keyboard Focus Behavior</a></li><li><a href="https://extensiblewebmanifesto.org">The Extensible Web Manifesto</a></li></ul>
]]></description>
      <pubDate>Wed, 20 Jul 2022 12:24:05 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan chat about issues with default HTML buttons on the web across different devices and browsers. They talk about the Extensible Web Manifesto, how the React Aria library helps standardize button behavior across platforms, and the difference between state-based and event-based animations.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:09 – The problem with default buttons on the web -</li><li>17:26 – How we got here, and the Extensible Web Manifesto -</li><li>26:22 – React Aria’s unified Press interface -</li><li>32:26 – Getting consistent Focus styling -</li><li>40:30 – Event-based vs. state-based animations -</li></ul><p>Links:</p><ul><li><a href="https://www.youtube.com/watch?v=ydZSNUbHl_8">Sam’s video on building an animated button</a></li><li><a href="https://react-spectrum.adobe.com/react-aria/useButton.html">React Aria useButton</a></li><li><a href="https://react-spectrum.adobe.com/blog/building-a-button-part-1.html">Building a Button Part 1: Press Events</a></li><li><a href="https://react-spectrum.adobe.com/blog/building-a-button-part-2.html">Building a Button Part 2: Hover Interactions</a></li><li><a href="https://react-spectrum.adobe.com/blog/building-a-button-part-3.html">Building a Button Part 3: Keyboard Focus Behavior</a></li><li><a href="https://extensiblewebmanifesto.org">The Extensible Web Manifesto</a></li></ul>
]]></content:encoded>
      <enclosure length="53167510" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/0b0cef8c-3f25-4857-b53b-3b91c14ef6e8/audio/04d2b680-089c-455f-8842-92bca7fde330/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>The problem with buttons on the web</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:55:22</itunes:duration>
      <itunes:summary>Sam and Ryan chat about issues with default HTML buttons on the web across different devices and browsers. They talk about the Extensible Web Manifesto, how the React Aria library helps standardize button behavior across platforms, and the difference between state-based and event-based animations.</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about issues with default HTML buttons on the web across different devices and browsers. They talk about the Extensible Web Manifesto, how the React Aria library helps standardize button behavior across platforms, and the difference between state-based and event-based animations.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>145</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">fabc3500-74be-4cc1-99e7-f49e6c7fb2f7</guid>
      <title>Should you use merge commits or rebase when working on large codebases?</title>
      <description><![CDATA[<p>Sam and Ryan talk about whether you should use merge commits or you should rebase commits in your PRs when working on large, fast-moving codebases. They also talk about implementing build-time client-side search with Stork, and why layering in animation code shouldn’t materially affect your existing React code.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:48 – How to use D3 with React elements -</li><li>9:14 – Why you should unmount Modals and Dialogs when they’re not visible -</li><li>24:36 – Using Stork to implement build-time, client-side search -</li><li>36:03 – Merge commits vs. rebasing in large codebases -</li></ul><p>Links:</p><ul><li><a href="https://youtu.be/kPbRDn5Fg0Y">Sam’s D3 and Framer Motion video</a></li><li><a href="https://github.com/jameslittle230/stork">Stork on GitHub</a></li><li><a href="https://samselikoff.com/framer-motion-course">Framer Motion course</a></li></ul>
]]></description>
      <pubDate>Mon, 6 Jun 2022 18:54:15 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about whether you should use merge commits or you should rebase commits in your PRs when working on large, fast-moving codebases. They also talk about implementing build-time client-side search with Stork, and why layering in animation code shouldn’t materially affect your existing React code.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:48 – How to use D3 with React elements -</li><li>9:14 – Why you should unmount Modals and Dialogs when they’re not visible -</li><li>24:36 – Using Stork to implement build-time, client-side search -</li><li>36:03 – Merge commits vs. rebasing in large codebases -</li></ul><p>Links:</p><ul><li><a href="https://youtu.be/kPbRDn5Fg0Y">Sam’s D3 and Framer Motion video</a></li><li><a href="https://github.com/jameslittle230/stork">Stork on GitHub</a></li><li><a href="https://samselikoff.com/framer-motion-course">Framer Motion course</a></li></ul>
]]></content:encoded>
      <enclosure length="56149632" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/8a95a1d6-ccc1-4287-b610-142a8c4a6990/audio/9d391760-e5a6-4284-b8ea-c21aada3d73a/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Should you use merge commits or rebase when working on large codebases?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:55:31</itunes:duration>
      <itunes:summary>Sam and Ryan talk about whether you should use merge commits or you should rebase commits in your PRs when working on large, fast-moving codebases. They also talk about implementing build-time client-side search with Stork, and why layering in animation code shouldn’t materially affect your existing React code.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about whether you should use merge commits or you should rebase commits in your PRs when working on large, fast-moving codebases. They also talk about implementing build-time client-side search with Stork, and why layering in animation code shouldn’t materially affect your existing React code.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>144</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">8f2c9cd8-7a8e-468f-83ad-3453c9ab1f16</guid>
      <title>Read and discuss: Next.js Layouts RFC</title>
      <description><![CDATA[<p>Sam and Ryan read and discuss the first two sections of the new Next.js Layouts RFC, Nested Layouts and Server Components. They also reflect on their experience using nested layouts in other frameworks.</p><p>Topics include:</p><ul><li>0:00 – Intro -</li><li>10:21 – Layouts and creating UI (Apple Music example) -</li><li>33:40 – React Server Components -</li></ul><p>Links:</p><ul><li><a href="https://nextjs.org/blog/layouts-rfc">Layouts RFC</a></li><li><a href="https://samselikoff.ck.page/posts/framer-motion-refactoring-with-variants-course-info">Framer Motion Course update</a></li></ul>
]]></description>
      <pubDate>Tue, 31 May 2022 23:32:29 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan read and discuss the first two sections of the new Next.js Layouts RFC, Nested Layouts and Server Components. They also reflect on their experience using nested layouts in other frameworks.</p><p>Topics include:</p><ul><li>0:00 – Intro -</li><li>10:21 – Layouts and creating UI (Apple Music example) -</li><li>33:40 – React Server Components -</li></ul><p>Links:</p><ul><li><a href="https://nextjs.org/blog/layouts-rfc">Layouts RFC</a></li><li><a href="https://samselikoff.ck.page/posts/framer-motion-refactoring-with-variants-course-info">Framer Motion Course update</a></li></ul>
]]></content:encoded>
      <enclosure length="54978946" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/e60d82f5-9032-4f5a-b6b0-902470001316/audio/9f0fec58-5a42-49f1-9bd8-037c119f2ba6/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Read and discuss: Next.js Layouts RFC</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:57:16</itunes:duration>
      <itunes:summary>Sam and Ryan read and discuss the first two sections of the new Next.js Layouts RFC, Nested Layouts and Server Components. They also reflect on their experience using nested layouts in other frameworks.</itunes:summary>
      <itunes:subtitle>Sam and Ryan read and discuss the first two sections of the new Next.js Layouts RFC, Nested Layouts and Server Components. They also reflect on their experience using nested layouts in other frameworks.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>143</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">9570b567-14bc-4661-9d0f-a46637926adc</guid>
      <title>All about useEvent</title>
      <description><![CDATA[<p>Sam and Ryan talk about the new useEvent RFC, and how useEvent lets you extract event logic from your side effects. They also read and discuss Dan Abramov’s recent Twitter thread on how useEvent addresses the problems people are encountering with React 18’s Strict Mode behavior around running effects twice on mount.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>0:34 - How useEvent relates to the changes to Strict Mode in React 18</li><li>12:04 - Dan Abramov’s thread on how useEvent relates to “fixing” useEffect</li><li>37:37 - What’s the correct mental model for useEvent</li><li>53:55 - How useEvent is different from useCallback</li></ul><p>Links:</p><ul><li><a href="https://github.com/reactjs/rfcs/pull/220">useEvent RFCS in the React repo</a></li><li><a href="https://twitter.com/dan_abramov/status/1522218410695794694">Dan Abramov’s thread on how useEvent relates to “fixing” useEffect</a></li><li><a href="https://github.com/reactjs/rfcs/pull/220#issuecomment-1119824954">Dan’s RFC comment on why useEvent is not just a “nicer” useCallback</a></li></ul>
]]></description>
      <pubDate>Thu, 12 May 2022 16:17:24 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about the new useEvent RFC, and how useEvent lets you extract event logic from your side effects. They also read and discuss Dan Abramov’s recent Twitter thread on how useEvent addresses the problems people are encountering with React 18’s Strict Mode behavior around running effects twice on mount.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>0:34 - How useEvent relates to the changes to Strict Mode in React 18</li><li>12:04 - Dan Abramov’s thread on how useEvent relates to “fixing” useEffect</li><li>37:37 - What’s the correct mental model for useEvent</li><li>53:55 - How useEvent is different from useCallback</li></ul><p>Links:</p><ul><li><a href="https://github.com/reactjs/rfcs/pull/220">useEvent RFCS in the React repo</a></li><li><a href="https://twitter.com/dan_abramov/status/1522218410695794694">Dan Abramov’s thread on how useEvent relates to “fixing” useEffect</a></li><li><a href="https://github.com/reactjs/rfcs/pull/220#issuecomment-1119824954">Dan’s RFC comment on why useEvent is not just a “nicer” useCallback</a></li></ul>
]]></content:encoded>
      <enclosure length="57093401" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/e25f6a93-5ef0-4b07-b8e6-cc62aaec8041/audio/8c29f637-1ccb-4bb0-9ab1-424375b44bee/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>All about useEvent</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:59:28</itunes:duration>
      <itunes:summary>Sam and Ryan talk about the new useEvent RFC, and how useEvent lets you extract event logic from your side effects. They also read and discuss Dan Abramov’s recent Twitter thread on how useEvent addresses the problems people are encountering with React 18’s Strict Mode behavior around running effects twice on mount.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about the new useEvent RFC, and how useEvent lets you extract event logic from your side effects. They also read and discuss Dan Abramov’s recent Twitter thread on how useEvent addresses the problems people are encountering with React 18’s Strict Mode behavior around running effects twice on mount.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>142</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">02fd3edb-38f1-49aa-94c6-dd4eb52a33fd</guid>
      <title>Strict Mode Behaviors in React 18</title>
      <description><![CDATA[<p>Sam and Ryan talk about the motivation behind the changes to Strict Mode in React 18, and in particular why React simulates an immediate unmount and remount by re-running component effects. They also talk about the tradeoff between database consistency and speed.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:12 - The tradeoff between data that’s fast but stale, vs. data that’s slow but consistent</li><li>11:55 - Strict mode in React 18, the proposed Offscreen API, and the implications for internal vs. external state in Concurrent React</li></ul><p>Links:</p><ul><li><a href="https://xata.io">Xata</a></li><li><a href="https://reactjs.org/blog/2022/03/29/react-v18.html#new-strict-mode-behaviors">New Strict Mode behaviors in React 18</a></li></ul>
]]></description>
      <pubDate>Fri, 6 May 2022 18:03:00 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about the motivation behind the changes to Strict Mode in React 18, and in particular why React simulates an immediate unmount and remount by re-running component effects. They also talk about the tradeoff between database consistency and speed.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:12 - The tradeoff between data that’s fast but stale, vs. data that’s slow but consistent</li><li>11:55 - Strict mode in React 18, the proposed Offscreen API, and the implications for internal vs. external state in Concurrent React</li></ul><p>Links:</p><ul><li><a href="https://xata.io">Xata</a></li><li><a href="https://reactjs.org/blog/2022/03/29/react-v18.html#new-strict-mode-behaviors">New Strict Mode behaviors in React 18</a></li></ul>
]]></content:encoded>
      <enclosure length="43177849" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/d4b89594-a418-4ebd-b635-1eea3113ed69/audio/98744e6c-f123-448f-8bf8-f22e8e7406f3/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Strict Mode Behaviors in React 18</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:44:31</itunes:duration>
      <itunes:summary>Sam and Ryan talk about the motivation behind the changes to Strict Mode in React 18, and in particular why React simulates an immediate unmount and remount by re-running component effects. They also talk about the tradeoff between database consistency and speed.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about the motivation behind the changes to Strict Mode in React 18, and in particular why React simulates an immediate unmount and remount by re-running component effects. They also talk about the tradeoff between database consistency and speed.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>141</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">719008da-26a8-4900-9410-aa58581c3cc7</guid>
      <title>Reacting to Remix!</title>
      <description><![CDATA[<p>Sam and Ryan share their experiences building with Remix for the very first time. Sam built a simple exercise tracking app using the Indie starter stack, and Ryan built a blog using server rendering in both Remix and Next.js, and talks about the differences between the two frameworks. They both discuss what the larger React community can learn from the ideas that Remix has to offer.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:33 - Sam’s Remix app</li><li>6:34 - The Indie stack</li><li>19:36 - Creating the data model in Prisma, a form, and an index route</li><li>25:48 - Ryan building the same Blog app in Remix and Next.js</li><li>32:33 - Using onSubmit vs. posting an HTML Form</li><li>39:15 - Remix’s fetcher API</li><li>46:46 - Borrowing declarative abstractions</li><li>56:18 - What did we give up when we left the PHP model of building websites? Did we throw the baby out with the bathwater?</li></ul><p>Links:</p><ul><li><a href="https://remix.run">Remix</a></li><li><a href="https://youtu.be/RwVrEQRI1HU">Sam’s YouTube video on Remix</a></li><li><a href="https://changelog.com/jsparty/215">Kent C Dodds on JS Party</a></li><li><a href="https://fly.io">Fly.io</a></li><li><a href="https://hasura.io/learn/graphql/remix-fullstack-firebase/introduction/">Hasura guide on Remix and Firebase</a></li></ul>
]]></description>
      <pubDate>Fri, 25 Mar 2022 19:19:27 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan share their experiences building with Remix for the very first time. Sam built a simple exercise tracking app using the Indie starter stack, and Ryan built a blog using server rendering in both Remix and Next.js, and talks about the differences between the two frameworks. They both discuss what the larger React community can learn from the ideas that Remix has to offer.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:33 - Sam’s Remix app</li><li>6:34 - The Indie stack</li><li>19:36 - Creating the data model in Prisma, a form, and an index route</li><li>25:48 - Ryan building the same Blog app in Remix and Next.js</li><li>32:33 - Using onSubmit vs. posting an HTML Form</li><li>39:15 - Remix’s fetcher API</li><li>46:46 - Borrowing declarative abstractions</li><li>56:18 - What did we give up when we left the PHP model of building websites? Did we throw the baby out with the bathwater?</li></ul><p>Links:</p><ul><li><a href="https://remix.run">Remix</a></li><li><a href="https://youtu.be/RwVrEQRI1HU">Sam’s YouTube video on Remix</a></li><li><a href="https://changelog.com/jsparty/215">Kent C Dodds on JS Party</a></li><li><a href="https://fly.io">Fly.io</a></li><li><a href="https://hasura.io/learn/graphql/remix-fullstack-firebase/introduction/">Hasura guide on Remix and Firebase</a></li></ul>
]]></content:encoded>
      <enclosure length="62511406" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/a674aa00-3254-43b4-bcd7-927610d4bf7f/audio/915d0237-b6bc-490c-9a13-6839d52e0067/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Reacting to Remix!</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:05:07</itunes:duration>
      <itunes:summary>Sam and Ryan share their experiences building with Remix for the very first time. Sam built a simple exercise tracking app using the Indie starter stack, and Ryan built a blog using server rendering in both Remix and Next.js, and talks about the differences between the two frameworks. They both discuss what the larger React community can learn from the ideas that Remix has to offer.</itunes:summary>
      <itunes:subtitle>Sam and Ryan share their experiences building with Remix for the very first time. Sam built a simple exercise tracking app using the Indie starter stack, and Ryan built a blog using server rendering in both Remix and Next.js, and talks about the differences between the two frameworks. They both discuss what the larger React community can learn from the ideas that Remix has to offer.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>140</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">9ae76461-6d65-466b-8701-1e7a061d9b3b</guid>
      <title>Client apps, server apps, and the real reason DX matters</title>
      <description><![CDATA[<p>Sam and Ryan chat about Remix and the differences between data fetching and mutations on the client vs. the server. They also talk about whether a framework’s APIs or the actual apps it enables developers to build are more important when choosing which tool to use.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:17 - What matters more to developers when choosing a framework: their experience using the APIs, or what they can build with it?</li><li>18:38 - Remix and data fetching on the client vs. the server</li><li>36:36 - Does running code on the edge really matter for day-to-day developers?</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/ryanflorence/status/1494108702986551298">Ryan Florence’s tweet on speakers vs. music</a></li><li><a href="https://youtu.be/ZdpGnNkT7M4">Sam’s video on building an iOS scaled background modal effect</a></li></ul>
]]></description>
      <pubDate>Thu, 17 Mar 2022 14:38:52 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan chat about Remix and the differences between data fetching and mutations on the client vs. the server. They also talk about whether a framework’s APIs or the actual apps it enables developers to build are more important when choosing which tool to use.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:17 - What matters more to developers when choosing a framework: their experience using the APIs, or what they can build with it?</li><li>18:38 - Remix and data fetching on the client vs. the server</li><li>36:36 - Does running code on the edge really matter for day-to-day developers?</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/ryanflorence/status/1494108702986551298">Ryan Florence’s tweet on speakers vs. music</a></li><li><a href="https://youtu.be/ZdpGnNkT7M4">Sam’s video on building an iOS scaled background modal effect</a></li></ul>
]]></content:encoded>
      <enclosure length="73959308" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/d4a11a73-8b68-40a8-88a1-1065c26567ab/audio/bf502d43-12a5-4cc5-a81d-f83054a272c6/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Client apps, server apps, and the real reason DX matters</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:17:02</itunes:duration>
      <itunes:summary>Sam and Ryan chat about Remix and the differences between data fetching and mutations on the client vs. the server. They also talk about whether a framework’s APIs or the actual apps it enables developers to build are more important when choosing which tool to use.</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about Remix and the differences between data fetching and mutations on the client vs. the server. They also talk about whether a framework’s APIs or the actual apps it enables developers to build are more important when choosing which tool to use.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>139</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">aa20ea0d-f9b1-4809-a0ab-9846817bece9</guid>
      <title>Auth-based route guards in Next.js and debugging in production</title>
      <description><![CDATA[<p>Sam and Ryan chat about adding authentication-based route guards to Next.js, tradeoffs between one-shot data loading vs. reactive pages in React apps, and instrumenting errors with Sentry.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>8:07 - Auth-based route guards and synchronized spinners in Next.js</li><li>26:34 - Tradeoffs of loading once on render vs. fully reactive pages</li><li>42:30 - Ryan’s video on Deploy notifications</li><li>47:45 - Errors + stale auth + Sentry</li></ul><p>Links:</p><ul><li><a href="https://www.youtube.com/watch?v=3kDVachh-BM">Fixing Twitter's loading screen using Synchronized Animations in React</a></li><li><a href="https://swr.vercel.app/">SWR</a></li><li><a href="https://sentry.io/welcome/">Sentry</a></li></ul>
]]></description>
      <pubDate>Tue, 8 Mar 2022 16:39:24 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan chat about adding authentication-based route guards to Next.js, tradeoffs between one-shot data loading vs. reactive pages in React apps, and instrumenting errors with Sentry.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>8:07 - Auth-based route guards and synchronized spinners in Next.js</li><li>26:34 - Tradeoffs of loading once on render vs. fully reactive pages</li><li>42:30 - Ryan’s video on Deploy notifications</li><li>47:45 - Errors + stale auth + Sentry</li></ul><p>Links:</p><ul><li><a href="https://www.youtube.com/watch?v=3kDVachh-BM">Fixing Twitter's loading screen using Synchronized Animations in React</a></li><li><a href="https://swr.vercel.app/">SWR</a></li><li><a href="https://sentry.io/welcome/">Sentry</a></li></ul>
]]></content:encoded>
      <enclosure length="64576206" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/3a54e7e5-530a-4ca1-8acd-66bb94152a76/audio/8921bf6c-f1b7-4263-aabd-18dd14b1d51e/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Auth-based route guards in Next.js and debugging in production</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:07:16</itunes:duration>
      <itunes:summary>Sam and Ryan chat about adding authentication-based route guards to Next.js, tradeoffs between one-shot data loading vs. reactive pages in React apps, and instrumenting errors with Sentry.</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about adding authentication-based route guards to Next.js, tradeoffs between one-shot data loading vs. reactive pages in React apps, and instrumenting errors with Sentry.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>138</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">c11ccf82-ed8e-43cb-8462-4bdd1853fe75</guid>
      <title>What’s the link between Server Components and Suspense for Data Fetching?</title>
      <description><![CDATA[<p>Sam and Ryan talk about why Suspense for Data Fetching isn’t ready yet, and how both it and the Server Components feature of React 18 rely on the ability to evict a cache that’s internal to React. They also talk about Transitions.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>5:19 - Using startTransition with a router</li><li>9:36 - How React 18 yields</li><li>21:37 - Why both Suspense for Data Fetching and Server Components need a way to invalidate React’s cache</li><li>37:24 - How Server Components can remove the need for explicit API calls without sacrificing any of React’s composability</li><li>1:01:00 - Real-world problems concurrent features address</li><li>1:03:20 - Moving state from React to the URL</li></ul><p>Links:</p><ul><li><a href="https://www.youtube.com/watch?v=JHGoXMvzTY4">Sam’s video: How to remove loading spinners in Next.js</a></li><li><a href="https://www.youtube.com/watch?v=0fdmDC0OIqU">Ryan’s video: Transitions that Suspend</a></li><li><a href="https://reactjs.org/blog/2020/12/21/data-fetching-with-react-server-components.html">React Server Components</a></li><li><a href="https://github.com/reactwg/react-18/discussions">React Working Group - React 18</a></li><li><a href="https://remix.run/blog/react-server-components">React Server Components and Remix</a></li></ul>
]]></description>
      <pubDate>Fri, 25 Feb 2022 17:33:14 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about why Suspense for Data Fetching isn’t ready yet, and how both it and the Server Components feature of React 18 rely on the ability to evict a cache that’s internal to React. They also talk about Transitions.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>5:19 - Using startTransition with a router</li><li>9:36 - How React 18 yields</li><li>21:37 - Why both Suspense for Data Fetching and Server Components need a way to invalidate React’s cache</li><li>37:24 - How Server Components can remove the need for explicit API calls without sacrificing any of React’s composability</li><li>1:01:00 - Real-world problems concurrent features address</li><li>1:03:20 - Moving state from React to the URL</li></ul><p>Links:</p><ul><li><a href="https://www.youtube.com/watch?v=JHGoXMvzTY4">Sam’s video: How to remove loading spinners in Next.js</a></li><li><a href="https://www.youtube.com/watch?v=0fdmDC0OIqU">Ryan’s video: Transitions that Suspend</a></li><li><a href="https://reactjs.org/blog/2020/12/21/data-fetching-with-react-server-components.html">React Server Components</a></li><li><a href="https://github.com/reactwg/react-18/discussions">React Working Group - React 18</a></li><li><a href="https://remix.run/blog/react-server-components">React Server Components and Remix</a></li></ul>
]]></content:encoded>
      <enclosure length="69695789" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/6b437b4b-8d10-4130-a820-0c19ec3cc395/audio/0a913540-6512-47e3-9793-be0a9ef1a470/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>What’s the link between Server Components and Suspense for Data Fetching?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:12:36</itunes:duration>
      <itunes:summary>Sam and Ryan talk about why Suspense for Data Fetching isn’t ready yet, and how both it and the Server Components feature of React 18 rely on the ability to evict a cache that’s internal to React. They also talk about Transitions.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about why Suspense for Data Fetching isn’t ready yet, and how both it and the Server Components feature of React 18 rely on the ability to evict a cache that’s internal to React. They also talk about Transitions.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>137</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">75aa7fbb-40ff-46bf-8e2a-885b29df4e16</guid>
      <title>Internal apps vs. public websites</title>
      <description><![CDATA[<p>Sam and Ryan chat about the differences between building internal apps vs. public websites, and why public sites get talked about more on forums like Twitter. They also talk more about their experiments with Suspense and Transitions in React 18.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:35 - How to trigger Suspense by accessing an unresolved promise</li><li>11:04 - Tension between flexibility of Transitions and Suspense vs. best practices around data fetching</li><li>21:00 - Semantics of React APIs when using Concurrent features</li><li>24:12 - How internal tools differ from public websites</li><li>43:24 - Sam’s next vid: Reducing loading spinners on route transitions in Next.js</li><li>45:28 - Ryan’s next vid: Demo of startTransition</li></ul><p>Links:</p><ul><li><a href="https://reactjs.org/docs/concurrent-mode-patterns.html">Concurrent UI Patterns (Experimental)</a></li></ul>
]]></description>
      <pubDate>Thu, 17 Feb 2022 01:26:10 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan chat about the differences between building internal apps vs. public websites, and why public sites get talked about more on forums like Twitter. They also talk more about their experiments with Suspense and Transitions in React 18.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:35 - How to trigger Suspense by accessing an unresolved promise</li><li>11:04 - Tension between flexibility of Transitions and Suspense vs. best practices around data fetching</li><li>21:00 - Semantics of React APIs when using Concurrent features</li><li>24:12 - How internal tools differ from public websites</li><li>43:24 - Sam’s next vid: Reducing loading spinners on route transitions in Next.js</li><li>45:28 - Ryan’s next vid: Demo of startTransition</li></ul><p>Links:</p><ul><li><a href="https://reactjs.org/docs/concurrent-mode-patterns.html">Concurrent UI Patterns (Experimental)</a></li></ul>
]]></content:encoded>
      <enclosure length="58152592" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/e7155494-c941-4430-b3ff-2a2047e29d4b/audio/8c456412-5578-42d6-bb60-976d9a15bcfc/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Internal apps vs. public websites</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:00:35</itunes:duration>
      <itunes:summary>Sam and Ryan chat about the differences between building internal apps vs. public websites, and why public sites get talked about more on forums like Twitter. They also talk more about their experiments with Suspense and Transitions in React 18.</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about the differences between building internal apps vs. public websites, and why public sites get talked about more on forums like Twitter. They also talk more about their experiments with Suspense and Transitions in React 18.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>136</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">c192d701-8bff-42a6-a886-7952783f302c</guid>
      <title>How to bridge the gap from module scope to React rendering</title>
      <description><![CDATA[<p>Sam and Ryan talk about using Promises and state libraries like Valtio to cross the bridge from changing module scope to React component state. Ryan also talks about writing an end-to-end Cypress test that verifies image uploads to S3.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:50 - Using Promises and state libraries to bridge the gap from module scope to React rendering</li><li>23:05 - How to test image file uploads given the security constraints of the browser</li></ul><p>Links:</p><ul><li><a href="https://github.com/pmndrs/valtio">Valtio</a></li><li><a href="https://www.youtube.com/watch?v=L6gG1Y_T2Cs">Removing State and Effects with Suspense!</a></li><li><a href="https://youtu.be/hUi5RcRyhxM">Reactive State and Built-In Suspense with Valtio</a></li><li><a href="https://youtu.be/EZcl3O_wUfk">Testing images with Cypress</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Element/script">SVG supports JavaScript</a></li><li><a href="https://rosettacode.org/wiki/Sorting_algorithms/Sleep_sort">SleepSort</a></li></ul>
]]></description>
      <pubDate>Fri, 4 Feb 2022 17:05:25 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about using Promises and state libraries like Valtio to cross the bridge from changing module scope to React component state. Ryan also talks about writing an end-to-end Cypress test that verifies image uploads to S3.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:50 - Using Promises and state libraries to bridge the gap from module scope to React rendering</li><li>23:05 - How to test image file uploads given the security constraints of the browser</li></ul><p>Links:</p><ul><li><a href="https://github.com/pmndrs/valtio">Valtio</a></li><li><a href="https://www.youtube.com/watch?v=L6gG1Y_T2Cs">Removing State and Effects with Suspense!</a></li><li><a href="https://youtu.be/hUi5RcRyhxM">Reactive State and Built-In Suspense with Valtio</a></li><li><a href="https://youtu.be/EZcl3O_wUfk">Testing images with Cypress</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Element/script">SVG supports JavaScript</a></li><li><a href="https://rosettacode.org/wiki/Sorting_algorithms/Sleep_sort">SleepSort</a></li></ul>
]]></content:encoded>
      <enclosure length="45383102" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/8dfc8cce-adfd-49ee-abae-683d85599c6a/audio/2813f6a2-1c54-43ea-87ca-5d382204a3d5/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>How to bridge the gap from module scope to React rendering</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:47:16</itunes:duration>
      <itunes:summary>Sam and Ryan talk about using Promises and state libraries like Valtio to cross the bridge from changing module scope to React component state. Ryan also talks about writing an end-to-end Cypress test that verifies image uploads to S3.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about using Promises and state libraries like Valtio to cross the bridge from changing module scope to React component state. Ryan also talks about writing an end-to-end Cypress test that verifies image uploads to S3.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>135</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">aa923501-c36f-42f1-be0e-be74e88f814c</guid>
      <title>Is Suspense “backwards compatible”, and thoughts on Remix &amp; web standards</title>
      <description><![CDATA[<p>Sam and Ryan chat about how Suspense lets you remove defensive and confusing useEffect code from your React components. They also share some initial thoughts about how Remix is positioning itself in the frontend dev space.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>4:53 - How compatible are non-Suspense APIs with Suspense, and how can we bridge these two worlds?</li><li>33:35 - Impressions about Remix’s positioning around web standards</li></ul><p>Links:</p><ul><li><a href="https://youtu.be/L6gG1Y_T2Cs">Sam’s video for this week</a></li><li><a href="https://remix.run/">Remix</a></li><li><a href="https://suricrasia.online/iceberg/">The Cursed Computer Iceberg Meme</a></li><li><a href="https://www.teamten.com/lawrence/writings/coding-machines/">Coding Machines</a></li><li><a href="https://www.youtube.com/watch?v=hB6eY73sLV0">Flappy Bird in Super Mario World</a></li></ul>
]]></description>
      <pubDate>Sat, 29 Jan 2022 16:20:58 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan chat about how Suspense lets you remove defensive and confusing useEffect code from your React components. They also share some initial thoughts about how Remix is positioning itself in the frontend dev space.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>4:53 - How compatible are non-Suspense APIs with Suspense, and how can we bridge these two worlds?</li><li>33:35 - Impressions about Remix’s positioning around web standards</li></ul><p>Links:</p><ul><li><a href="https://youtu.be/L6gG1Y_T2Cs">Sam’s video for this week</a></li><li><a href="https://remix.run/">Remix</a></li><li><a href="https://suricrasia.online/iceberg/">The Cursed Computer Iceberg Meme</a></li><li><a href="https://www.teamten.com/lawrence/writings/coding-machines/">Coding Machines</a></li><li><a href="https://www.youtube.com/watch?v=hB6eY73sLV0">Flappy Bird in Super Mario World</a></li></ul>
]]></content:encoded>
      <enclosure length="63826868" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/96634225-8bc9-4ec9-9289-7ef5602d5051/audio/6ab694e4-f6d6-41ac-939d-628ea0a47818/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Is Suspense “backwards compatible”, and thoughts on Remix &amp; web standards</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:03:41</itunes:duration>
      <itunes:summary>Sam and Ryan chat about how Suspense lets you remove defensive and confusing useEffect code from your React components. They also share some initial thoughts about how Remix is positioning itself in the frontend dev space.</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about how Suspense lets you remove defensive and confusing useEffect code from your React components. They also share some initial thoughts about how Remix is positioning itself in the frontend dev space.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>134</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">bd0cd801-3958-4d08-8d54-08ecb9828f22</guid>
      <title>Transitions and Data Fetching with Suspense in React 18</title>
      <description><![CDATA[<p>Sam and Ryan continue their discussions around React 18 and the in-progress work on data fetching with Suspense. They talk about the useTransition hook and how it helps eliminate inconsistent states from your application. They also talk about</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>4:13 - What does Suspense for Data Fetching mean?</li><li>15:00 - How Transitions allow us do work outside of render</li><li>39:43 - Dealing with Timezone-dependent tests</li><li>46:45 - Modal routing in Next.js</li><li>48:15 - Snapshotting form data</li></ul><p>Links:</p><ul><li><a href="https://youtu.be/sOkgIa560qM">Sam’s video on SuspenseAfterInitialRender</a></li><li><a href="https://github.com/pmndrs/suspend-react">suspend-react by pmndrs</a></li><li><a href="https://twitter.com/samselikoff/status/1481722464606457859">Sam’s thread on suspend-react</a></li><li><a href="https://github.com/reactwg/react-18/discussions/25">Built-in suspense cache discussion</a></li><li><a href="https://reactjs.org/docs/concurrent-mode-patterns.html#transitions">Concurrent mode transitions</a></li><li><a href="https://codesandbox.io/s/sad-banach-tcnim">Reddit example</a></li><li><a href="https://twitter.com/asidorenko_/status/1482679799374098433">React forms</a></li></ul>
]]></description>
      <pubDate>Wed, 19 Jan 2022 16:17:40 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan continue their discussions around React 18 and the in-progress work on data fetching with Suspense. They talk about the useTransition hook and how it helps eliminate inconsistent states from your application. They also talk about</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>4:13 - What does Suspense for Data Fetching mean?</li><li>15:00 - How Transitions allow us do work outside of render</li><li>39:43 - Dealing with Timezone-dependent tests</li><li>46:45 - Modal routing in Next.js</li><li>48:15 - Snapshotting form data</li></ul><p>Links:</p><ul><li><a href="https://youtu.be/sOkgIa560qM">Sam’s video on SuspenseAfterInitialRender</a></li><li><a href="https://github.com/pmndrs/suspend-react">suspend-react by pmndrs</a></li><li><a href="https://twitter.com/samselikoff/status/1481722464606457859">Sam’s thread on suspend-react</a></li><li><a href="https://github.com/reactwg/react-18/discussions/25">Built-in suspense cache discussion</a></li><li><a href="https://reactjs.org/docs/concurrent-mode-patterns.html#transitions">Concurrent mode transitions</a></li><li><a href="https://codesandbox.io/s/sad-banach-tcnim">Reddit example</a></li><li><a href="https://twitter.com/asidorenko_/status/1482679799374098433">React forms</a></li></ul>
]]></content:encoded>
      <enclosure length="54488042" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/9c09978f-664f-4cbd-961c-edd7e5d1dd7a/audio/17082da5-0aac-4ccd-a2c1-626dd30d2100/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Transitions and Data Fetching with Suspense in React 18</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:53:41</itunes:duration>
      <itunes:summary>Sam and Ryan continue their discussions around React 18 and the in-progress work on data fetching with Suspense. They talk about the useTransition hook and how it helps eliminate inconsistent states from your application. They also talk about </itunes:summary>
      <itunes:subtitle>Sam and Ryan continue their discussions around React 18 and the in-progress work on data fetching with Suspense. They talk about the useTransition hook and how it helps eliminate inconsistent states from your application. They also talk about </itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>133</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">c2b2b302-4b9f-440a-a4d2-03d48e3c2a33</guid>
      <title>Transitive Dependencies and Suspending After Initial Render</title>
      <description><![CDATA[<p>Happy New Year! Sam and Ryan are back from the holidays, talking about transitive dependencies in node and the browser in the context of Ryan’s next-s3-upload library. They also discuss a SuspenseAfterInitialRender component, speed vs. testability in services and monoliths, and a thought-provoking tweet from Dan Abramov on tests vs. source code.</p><p>Topics include:</p><ul><li>0:00 - Would you want tests or source code</li><li>11:20 - Suspense, SuspenseAfterInitialRender, unstable_avoidThisFallback</li><li>19:05 - Value of having a reproducible test suite for a dynamic app</li><li>22:12 - Speed vs. testability of services vs. monolith</li><li>26:24 - How to import different versions of dependencies in libraries. Module resolution in node vs. browser.</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/dan_abramov/status/1465507589949730819">Dan Abramov’s tweet on tests vs. source code</a></li><li><a href="https://youtu.be/FpFetyxapto">A Quick Intro to Suspense in React 18</a></li><li><a href="https://github.com/facebook/react/pull/15578">React PR for unstable_avoidThisFallback</a></li><li><a href="https://camchenry.com/blog/how-serverless-saved-my-heating-bill">How Serverless Saved Money on My Heating Bill</a></li><li><a href="https://github.com/ryanto/next-s3-upload">next-s3-upload, Ryan’s Next.js package for uploading images</a></li></ul>
]]></description>
      <pubDate>Tue, 11 Jan 2022 15:27:44 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Happy New Year! Sam and Ryan are back from the holidays, talking about transitive dependencies in node and the browser in the context of Ryan’s next-s3-upload library. They also discuss a SuspenseAfterInitialRender component, speed vs. testability in services and monoliths, and a thought-provoking tweet from Dan Abramov on tests vs. source code.</p><p>Topics include:</p><ul><li>0:00 - Would you want tests or source code</li><li>11:20 - Suspense, SuspenseAfterInitialRender, unstable_avoidThisFallback</li><li>19:05 - Value of having a reproducible test suite for a dynamic app</li><li>22:12 - Speed vs. testability of services vs. monolith</li><li>26:24 - How to import different versions of dependencies in libraries. Module resolution in node vs. browser.</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/dan_abramov/status/1465507589949730819">Dan Abramov’s tweet on tests vs. source code</a></li><li><a href="https://youtu.be/FpFetyxapto">A Quick Intro to Suspense in React 18</a></li><li><a href="https://github.com/facebook/react/pull/15578">React PR for unstable_avoidThisFallback</a></li><li><a href="https://camchenry.com/blog/how-serverless-saved-my-heating-bill">How Serverless Saved Money on My Heating Bill</a></li><li><a href="https://github.com/ryanto/next-s3-upload">next-s3-upload, Ryan’s Next.js package for uploading images</a></li></ul>
]]></content:encoded>
      <enclosure length="47812920" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/ea48f4fa-7f15-4079-be32-d4e11b428954/audio/6a986ae6-b215-4b1a-955c-057d4fccd6a6/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Transitive Dependencies and Suspending After Initial Render</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:46:26</itunes:duration>
      <itunes:summary>Happy New Year! Sam and Ryan are back from the holidays, talking about transitive dependencies in node and the browser in the context of Ryan’s next-s3-upload library. They also discuss a SuspenseAfterInitialRender component, speed vs. testability in services and monoliths, and a thought-provoking tweet from Dan Abramov on tests vs. source code.</itunes:summary>
      <itunes:subtitle>Happy New Year! Sam and Ryan are back from the holidays, talking about transitive dependencies in node and the browser in the context of Ryan’s next-s3-upload library. They also discuss a SuspenseAfterInitialRender component, speed vs. testability in services and monoliths, and a thought-provoking tweet from Dan Abramov on tests vs. source code.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>132</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">efcfc584-6a8e-4d29-95e2-d0dcc8586e58</guid>
      <title>Suspense and the React 18 Keynote</title>
      <description><![CDATA[<p>Sam and Ryan talk about how the React 18 Keynote told the story of Suspense. They discuss how Suspense resolves the tension between encapsulated data-fetching components on the one hand, and coordinated loading UI on the other. They also talk about Sam’s Tailwind course on Egghead and Ryan’s experience upgrading to Tailwind 3.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:14 - Sam’s Tailwind Course on Egghead</li><li>3:44 - Upgrading to Tailwind 3</li><li>6:57 - React Conf + Suspense</li></ul><p>Links:<br /><a href="https://egghead.io/courses/craft-scalable-custom-made-interfaces-with-tailwind-css-8dfee898">Craft Scalable, Custom-Made Interfaces with Tailwind CSS</a><br /><a href="https://tailwindcss.com/blog/tailwindcss-v3">Tailwind CSS v3.0</a><br /><a href="https://youtu.be/FZ0cG47msEk">React 18 Keynote</a></p>
]]></description>
      <pubDate>Tue, 21 Dec 2021 14:04:57 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about how the React 18 Keynote told the story of Suspense. They discuss how Suspense resolves the tension between encapsulated data-fetching components on the one hand, and coordinated loading UI on the other. They also talk about Sam’s Tailwind course on Egghead and Ryan’s experience upgrading to Tailwind 3.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:14 - Sam’s Tailwind Course on Egghead</li><li>3:44 - Upgrading to Tailwind 3</li><li>6:57 - React Conf + Suspense</li></ul><p>Links:<br /><a href="https://egghead.io/courses/craft-scalable-custom-made-interfaces-with-tailwind-css-8dfee898">Craft Scalable, Custom-Made Interfaces with Tailwind CSS</a><br /><a href="https://tailwindcss.com/blog/tailwindcss-v3">Tailwind CSS v3.0</a><br /><a href="https://youtu.be/FZ0cG47msEk">React 18 Keynote</a></p>
]]></content:encoded>
      <enclosure length="59171220" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/5e5a94ac-0b72-432f-adbe-a83a1d252641/audio/aa036429-d547-4e13-bdb0-fddc38ae4ec8/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Suspense and the React 18 Keynote</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:01:38</itunes:duration>
      <itunes:summary>Sam and Ryan talk about how the React 18 Keynote told the story of Suspense. They discuss how Suspense resolves the tension between encapsulated data-fetching components on the one hand, and coordinated loading UI on the other. They also talk about Sam’s Tailwind course on Egghead and Ryan’s experience upgrading to Tailwind 3.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about how the React 18 Keynote told the story of Suspense. They discuss how Suspense resolves the tension between encapsulated data-fetching components on the one hand, and coordinated loading UI on the other. They also talk about Sam’s Tailwind course on Egghead and Ryan’s experience upgrading to Tailwind 3.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>131</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">11330cd5-5369-46df-b520-69b5498be764</guid>
      <title>Pages are new entry points</title>
      <description><![CDATA[<p>Sam and Ryan talk about some tricky page configurations they ran into while working on a Next.js project, and how to deal with multiple dynamic router segments when some are known at build time and others at run time. They also talk about how non-reactive data can simplify your form components.</p><h3>Topics include:</h3><ul><li>0:00 - Intro</li><li>4:30 - Dealing with partially known dynamic router segments in Next.js</li><li>25:23 - Struggling with nested layouts in Next.js</li><li>31:00 - Why you should consider passing non-reactive snapshots of data into your form components</li><li>52:07 - How to use a seed when generating dynamic test data for predictable values</li></ul><h3>Links:</h3><ul><li><a href="https://twitter.com/samselikoff/status/1452999026312454161">Using useState to create nonreactive snapshots of a form component’s props</a></li></ul>
]]></description>
      <pubDate>Tue, 26 Oct 2021 14:16:39 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about some tricky page configurations they ran into while working on a Next.js project, and how to deal with multiple dynamic router segments when some are known at build time and others at run time. They also talk about how non-reactive data can simplify your form components.</p><h3>Topics include:</h3><ul><li>0:00 - Intro</li><li>4:30 - Dealing with partially known dynamic router segments in Next.js</li><li>25:23 - Struggling with nested layouts in Next.js</li><li>31:00 - Why you should consider passing non-reactive snapshots of data into your form components</li><li>52:07 - How to use a seed when generating dynamic test data for predictable values</li></ul><h3>Links:</h3><ul><li><a href="https://twitter.com/samselikoff/status/1452999026312454161">Using useState to create nonreactive snapshots of a form component’s props</a></li></ul>
]]></content:encoded>
      <enclosure length="63141815" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/3cc2a896-a81e-4a8f-841c-185f85b58a8f/audio/2aead287-0b2e-4ca2-b0e0-125a97b48ea7/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Pages are new entry points</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:02:12</itunes:duration>
      <itunes:summary>Sam and Ryan talk about some tricky page configurations they ran into while working on a Next.js project, and how to deal with multiple dynamic router segments when some are known at build time and others at run time. They also talk about how non-reactive data can simplify your form components.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about some tricky page configurations they ran into while working on a Next.js project, and how to deal with multiple dynamic router segments when some are known at build time and others at run time. They also talk about how non-reactive data can simplify your form components.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>130</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">46a8ad02-cec4-47a5-9879-b910264c2d69</guid>
      <title>The benefits of smarter form components</title>
      <description><![CDATA[<p>Sam and Ryan talk about the tradeoffs between smart and dumb form components, and toss around ideas for passing draft state into forms. They also talk about reimplementing Tailwind UI’s Modal animations using Framer Motion.<br /> </p><p>Topics include:<br />- 0:00 - Intro<br />- 5:33 - Smart vs. dumb forms, and lazy initial props<br />- 32:03 - Replacing Headless UI’s Transition component with Framer Motion’s AnimatePresence<br /> </p><p>Links:<br /><a href="https://www.youtube.com/watch?v=AaZ_RSt0KP8">The Universe is Hostile to Computers</a><br /><a href="https://headlessui.dev/react/transition">Headless UI’s Transition component</a><br /><a href="https://www.framer.com/docs/animate-presence">Framer Motion’s AnimatePresence component</a></p>
]]></description>
      <pubDate>Tue, 21 Sep 2021 15:30:27 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about the tradeoffs between smart and dumb form components, and toss around ideas for passing draft state into forms. They also talk about reimplementing Tailwind UI’s Modal animations using Framer Motion.<br /> </p><p>Topics include:<br />- 0:00 - Intro<br />- 5:33 - Smart vs. dumb forms, and lazy initial props<br />- 32:03 - Replacing Headless UI’s Transition component with Framer Motion’s AnimatePresence<br /> </p><p>Links:<br /><a href="https://www.youtube.com/watch?v=AaZ_RSt0KP8">The Universe is Hostile to Computers</a><br /><a href="https://headlessui.dev/react/transition">Headless UI’s Transition component</a><br /><a href="https://www.framer.com/docs/animate-presence">Framer Motion’s AnimatePresence component</a></p>
]]></content:encoded>
      <enclosure length="49519085" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/3dce2d66-7aa8-40a6-a256-4943dc455b79/audio/542ca603-c2e5-4b49-855a-b52fd37f9c41/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>The benefits of smarter form components</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:48:27</itunes:duration>
      <itunes:summary>Sam and Ryan talk about the tradeoffs between smart and dumb form components, and toss around ideas for passing draft state into forms. They also talk about reimplementing Tailwind UI’s Modal animations using Framer Motion.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about the tradeoffs between smart and dumb form components, and toss around ideas for passing draft state into forms. They also talk about reimplementing Tailwind UI’s Modal animations using Framer Motion.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>129</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">ea1de9ef-8b82-4363-92f2-4f10d2667604</guid>
      <title>Module side effects and import order</title>
      <description><![CDATA[<p>Sam and Ryan talk about how module side effects can expose order-dependent code, and why its worth ensuring your modules work regardless of import order. They also talk about different UI patterns for forms in modals, and some tips for working with Mirage in Cypress.</p><p>Topics include:</p><ul><li>0:00 – Intro</li><li>4:04 – Keeping imports order-independent when modules have side effects</li><li>25:02 – Using Mirage with Hasura</li><li>32:00 – Cypress helpers for mocking auth and data</li><li>46:37 – UI patterns for modal actions</li><li>56:26 – Organizing shared query code</li></ul><p>Links:</p><ul><li>[GitHub Codespaces](<a href="https://github.blog/2021-08-11-githubs-engineering-team-moved-codespaces/">https://github.blog/2021-08-11-githubs-engineering-team-moved-codespaces/</a>)</li></ul>
]]></description>
      <pubDate>Wed, 18 Aug 2021 16:51:49 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about how module side effects can expose order-dependent code, and why its worth ensuring your modules work regardless of import order. They also talk about different UI patterns for forms in modals, and some tips for working with Mirage in Cypress.</p><p>Topics include:</p><ul><li>0:00 – Intro</li><li>4:04 – Keeping imports order-independent when modules have side effects</li><li>25:02 – Using Mirage with Hasura</li><li>32:00 – Cypress helpers for mocking auth and data</li><li>46:37 – UI patterns for modal actions</li><li>56:26 – Organizing shared query code</li></ul><p>Links:</p><ul><li>[GitHub Codespaces](<a href="https://github.blog/2021-08-11-githubs-engineering-team-moved-codespaces/">https://github.blog/2021-08-11-githubs-engineering-team-moved-codespaces/</a>)</li></ul>
]]></content:encoded>
      <enclosure length="68022929" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/b5bb740f-1520-4885-bdd1-895271da6c76/audio/a7c5a1a1-2685-4b22-b77a-0c68eddc2c2b/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Module side effects and import order</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:07:24</itunes:duration>
      <itunes:summary>Sam and Ryan talk about how module side effects can expose order-dependent code, and why its worth ensuring your modules work regardless of import order. They also talk about different UI patterns for forms in modals, and some tips for working with Mirage in Cypress.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about how module side effects can expose order-dependent code, and why its worth ensuring your modules work regardless of import order. They also talk about different UI patterns for forms in modals, and some tips for working with Mirage in Cypress.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>128</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">cc47f649-047e-4405-acc7-43d9c22dc163</guid>
      <title>Mocking services</title>
      <description><![CDATA[<p>Sam and Ryan chat about the pros and cons of using third-party services, focusing on how they affect your application’s testing strategy.</p><p>Topics include:</p><p>0:00 - Intro</p><p>0:43 – If services don’t provide testing utils, you have to write library code just to test your app. What was the mocking story like for popular Rails services?</p><p>11:59 – Adding seams to service integrations so they can be used locally, offline and in testing</p><p>28:18 – How are people testing their service code today?</p><p>48:02 – Mocking vs. end-to-end testing</p><p>Links:</p><ul><li><a href="https://twitter.com/stefanpenner/status/1419833427314888708">Stefan Penner’s tweet about how critical it is for services to making testing easy</a></li></ul>
]]></description>
      <pubDate>Wed, 4 Aug 2021 10:04:06 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan chat about the pros and cons of using third-party services, focusing on how they affect your application’s testing strategy.</p><p>Topics include:</p><p>0:00 - Intro</p><p>0:43 – If services don’t provide testing utils, you have to write library code just to test your app. What was the mocking story like for popular Rails services?</p><p>11:59 – Adding seams to service integrations so they can be used locally, offline and in testing</p><p>28:18 – How are people testing their service code today?</p><p>48:02 – Mocking vs. end-to-end testing</p><p>Links:</p><ul><li><a href="https://twitter.com/stefanpenner/status/1419833427314888708">Stefan Penner’s tweet about how critical it is for services to making testing easy</a></li></ul>
]]></content:encoded>
      <enclosure length="64559822" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/52ae285d-9966-4a84-8e07-b633d8fae0bc/audio/37f550a3-ed66-4c30-8127-37079912d2f6/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Mocking services</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:04:06</itunes:duration>
      <itunes:summary>Sam and Ryan chat about the pros and cons of using third-party services, focusing on how they affect your application’s testing strategy.</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about the pros and cons of using third-party services, focusing on how they affect your application’s testing strategy.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>127</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">d91ed0f1-790e-4c2f-8559-cd24e5cea3e6</guid>
      <title>Shared reactive data without context or effects</title>
      <description><![CDATA[<p>Sam and Ryan talk about whether stores in module scope are a better alternative to Context for sharing global state in React apps.</p><p>Topics include:</p><ul><li>0:00 – Intro</li><li>3:21 – Using Zustand to refactor a useAuth hook</li><li>34:08 – Module scope vs. context for shared state</li><li>58:52 – 7 GUI tasks</li></ul><p>Links:</p><ul><li><a href="https://zustand.surge.sh">Zustand</a></li><li><a href="https://twitter.com/sebmarkbage/status/1219828998282215430">Sebastian’s tweet on default context values</a></li><li><a href="https://gist.github.com/samselikoff/ac8076c6c224786da23c9297567585cf">Sam’s Auth Provider using Zustand, SWR and Suspense</a></li><li><a href="https://eugenkiss.github.io/7guis/">7 GUIs</a></li></ul>
]]></description>
      <pubDate>Mon, 19 Jul 2021 14:40:28 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about whether stores in module scope are a better alternative to Context for sharing global state in React apps.</p><p>Topics include:</p><ul><li>0:00 – Intro</li><li>3:21 – Using Zustand to refactor a useAuth hook</li><li>34:08 – Module scope vs. context for shared state</li><li>58:52 – 7 GUI tasks</li></ul><p>Links:</p><ul><li><a href="https://zustand.surge.sh">Zustand</a></li><li><a href="https://twitter.com/sebmarkbage/status/1219828998282215430">Sebastian’s tweet on default context values</a></li><li><a href="https://gist.github.com/samselikoff/ac8076c6c224786da23c9297567585cf">Sam’s Auth Provider using Zustand, SWR and Suspense</a></li><li><a href="https://eugenkiss.github.io/7guis/">7 GUIs</a></li></ul>
]]></content:encoded>
      <enclosure length="62841936" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/b07d48b8-20a2-4958-8aae-f6ff2f94a4b1/audio/192027ab-d09c-4b1f-ae0a-b6fbf3238997/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Shared reactive data without context or effects</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:03:00</itunes:duration>
      <itunes:summary>Sam and Ryan talk about whether stores in module scope are a better alternative to Context for sharing global state in React apps.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about whether stores in module scope are a better alternative to Context for sharing global state in React apps.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>126</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">0437dafb-3591-4753-a90f-d6326a352891</guid>
      <title>The Costs of SSR in Next.js</title>
      <description><![CDATA[<p>Sam and Ryan talk about how Next.js places an upfront cost on app teams for the sake of scalability and server-side rendering, and how to avoid this cost when building apps with user-specific data where SSR is not a priority. They also talk about avoiding Context for global state in React apps.</p><p>Topics include:</p><ul><li>0:00 – Intro</li><li>1:51 – Avoiding Context for global state in React</li><li>22:22 – Safeguarding _app in Next.js & dynamic segments in the router</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/sebmarkbage/status/1219836431972978689">Sebastian’s tweet on not using context for global state</a></li><li><a href="https://zustand.surge.sh">Zustand</a></li></ul>
]]></description>
      <pubDate>Tue, 13 Jul 2021 05:23:02 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about how Next.js places an upfront cost on app teams for the sake of scalability and server-side rendering, and how to avoid this cost when building apps with user-specific data where SSR is not a priority. They also talk about avoiding Context for global state in React apps.</p><p>Topics include:</p><ul><li>0:00 – Intro</li><li>1:51 – Avoiding Context for global state in React</li><li>22:22 – Safeguarding _app in Next.js & dynamic segments in the router</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/sebmarkbage/status/1219836431972978689">Sebastian’s tweet on not using context for global state</a></li><li><a href="https://zustand.surge.sh">Zustand</a></li></ul>
]]></content:encoded>
      <enclosure length="50678358" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/dfb4b663-88d8-4be8-b392-e5525df35df5/audio/462bf743-14fe-42a7-b705-4ec05dce2577/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>The Costs of SSR in Next.js</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:49:33</itunes:duration>
      <itunes:summary>Sam and Ryan talk about how Next.js places an upfront cost on app teams for the sake of scalability and server-side rendering, and how to avoid this cost when building apps with user-specific data where SSR is not a priority. They also talk about avoiding Context for global state in React apps.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about how Next.js places an upfront cost on app teams for the sake of scalability and server-side rendering, and how to avoid this cost when building apps with user-specific data where SSR is not a priority. They also talk about avoiding Context for global state in React apps.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>125</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">81715098-cdcb-4db3-b0ce-0758604e291e</guid>
      <title>Sync code, async UI</title>
      <description><![CDATA[<p>Sam and Ryan continue to put some more pieces of the Suspense puzzle together as they talk about how throwing promises enables devs to write synchronous code while still building asynchronous (non-blocking) UI. They also talk about sharing state across pages in Next.js.</p><p>Topics include:</p><ul><li>0:00 – Intro</li><li>1:08 – Sharing state across pages in Next.js</li><li>9:03 – Confronting JS object identity up-front in React, and buiding consistent trees of different versions of your UI in parallel</li><li>25:55 – How Suspense lets you represent async UI with sync code</li><li>42:00 – Interruptibility and push vs. pull</li><li>49:20 – The problem of invalidation, and the Suspense cache</li></ul><p>Links:</p><ul><li><a href="https://github.com/facebook/react/issues/17526#issuecomment-769151686">Suspense’s contract</a></li><li><a href="https://github.com/reactwg/react-18/discussions/37">New Suspense SSR Architecture in React 18</a></li><li><a href="https://github.com/reactwg/react-18/discussions/25">Built-in Suspense Cache</a></li></ul>
]]></description>
      <pubDate>Tue, 6 Jul 2021 19:25:10 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan continue to put some more pieces of the Suspense puzzle together as they talk about how throwing promises enables devs to write synchronous code while still building asynchronous (non-blocking) UI. They also talk about sharing state across pages in Next.js.</p><p>Topics include:</p><ul><li>0:00 – Intro</li><li>1:08 – Sharing state across pages in Next.js</li><li>9:03 – Confronting JS object identity up-front in React, and buiding consistent trees of different versions of your UI in parallel</li><li>25:55 – How Suspense lets you represent async UI with sync code</li><li>42:00 – Interruptibility and push vs. pull</li><li>49:20 – The problem of invalidation, and the Suspense cache</li></ul><p>Links:</p><ul><li><a href="https://github.com/facebook/react/issues/17526#issuecomment-769151686">Suspense’s contract</a></li><li><a href="https://github.com/reactwg/react-18/discussions/37">New Suspense SSR Architecture in React 18</a></li><li><a href="https://github.com/reactwg/react-18/discussions/25">Built-in Suspense Cache</a></li></ul>
]]></content:encoded>
      <enclosure length="59063493" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/d8044c31-90d0-440f-8457-fa094bef3f79/audio/8b75786b-8432-44ee-b8aa-bca5ae40ca1f/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Sync code, async UI</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:58:33</itunes:duration>
      <itunes:summary>Sam and Ryan continue to put some more pieces of the Suspense puzzle together as they talk about how throwing promises enables devs to write synchronous code while still building asynchronous (non-blocking) UI. They also talk about sharing state across pages in Next.js.</itunes:summary>
      <itunes:subtitle>Sam and Ryan continue to put some more pieces of the Suspense puzzle together as they talk about how throwing promises enables devs to write synchronous code while still building asynchronous (non-blocking) UI. They also talk about sharing state across pages in Next.js.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>124</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">ba506f53-a969-4150-afb4-c34c8d29011c</guid>
      <title>Using Suspense</title>
      <description><![CDATA[<p>Sam tells Ryan about his experience adding Suspense to his Fitness app and how it improved the app’s UX. They also discuss some problems with skeleton screens and the pros and cons of nested routing.</p><p>Topics include:</p><ul><li><p>0:00 - Intro</p></li><li><p>3:50 - URLs and nested routing</p></li><li><p>13:48 - Suspense, skeletons, and data fetching</p></li></ul><p>Links:</p><ul><li><p><a href="https://designdetails.fm/episodes/KGOhvhAE">Design Details podcast</a></p></li><li><p><a href="https://reactjs.org/docs/concurrent-mode-suspense.html">React Suspense</a></p></li><li><p><a href="https://nextjs.org/">Next.js</a></p></li></ul>
]]></description>
      <pubDate>Mon, 21 Jun 2021 13:02:18 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam tells Ryan about his experience adding Suspense to his Fitness app and how it improved the app’s UX. They also discuss some problems with skeleton screens and the pros and cons of nested routing.</p><p>Topics include:</p><ul><li><p>0:00 - Intro</p></li><li><p>3:50 - URLs and nested routing</p></li><li><p>13:48 - Suspense, skeletons, and data fetching</p></li></ul><p>Links:</p><ul><li><p><a href="https://designdetails.fm/episodes/KGOhvhAE">Design Details podcast</a></p></li><li><p><a href="https://reactjs.org/docs/concurrent-mode-suspense.html">React Suspense</a></p></li><li><p><a href="https://nextjs.org/">Next.js</a></p></li></ul>
]]></content:encoded>
      <enclosure length="45624327" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/9752e3f0-082e-4bce-b80a-2118b2d66a91/audio/99262fa3-91b3-4fe7-a4b7-5fdfb1d004d6/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Using Suspense</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:47:31</itunes:duration>
      <itunes:summary>Sam tells Ryan about his experience adding Suspense to his Fitness app and how it improved the app’s UX. They also discuss some problems with skeleton screens and the pros and cons of nested routing.</itunes:summary>
      <itunes:subtitle>Sam tells Ryan about his experience adding Suspense to his Fitness app and how it improved the app’s UX. They also discuss some problems with skeleton screens and the pros and cons of nested routing.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>123</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">40e3dfc3-3900-4986-83f6-d683b08726ab</guid>
      <title>Talkin’ Bout Suspense</title>
      <description><![CDATA[<p>Prompted by the new React 18 alpha release, Sam and Ryan chat about Suspense and what data-fetching issues they’re excited about it solving. They also talk about some Twitter conversation around premature optimization.</p><p>Topics include:</p><ul><li>2:05 – Suspense and data-fetching</li><li>31:05 – Tweets of the week: Preoptimzation</li></ul><p>Links: </p><ul><li><a href="https://twitter.com/samselikoff">Sam on Twitter</a></li><li><a href="https://twitter.com/ryantotweets">Ryan on Twitter</a></li><li><a href="https://twitter.com/samselikoff/status/1402081710917967874">Sam’s tweet about routing in Next.js</a></li><li><a href="https://twitter.com/rauchg/status/1402613437683822597">Guillermo Rauch’s tweet on scalable APIs</a></li><li><a href="https://twitter.com/garybernhardt/status/1402671949180964874">Gary Bernhardt’s tweet on premature optimization</a></li></ul>
]]></description>
      <pubDate>Mon, 14 Jun 2021 14:21:51 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Prompted by the new React 18 alpha release, Sam and Ryan chat about Suspense and what data-fetching issues they’re excited about it solving. They also talk about some Twitter conversation around premature optimization.</p><p>Topics include:</p><ul><li>2:05 – Suspense and data-fetching</li><li>31:05 – Tweets of the week: Preoptimzation</li></ul><p>Links: </p><ul><li><a href="https://twitter.com/samselikoff">Sam on Twitter</a></li><li><a href="https://twitter.com/ryantotweets">Ryan on Twitter</a></li><li><a href="https://twitter.com/samselikoff/status/1402081710917967874">Sam’s tweet about routing in Next.js</a></li><li><a href="https://twitter.com/rauchg/status/1402613437683822597">Guillermo Rauch’s tweet on scalable APIs</a></li><li><a href="https://twitter.com/garybernhardt/status/1402671949180964874">Gary Bernhardt’s tweet on premature optimization</a></li></ul>
]]></content:encoded>
      <enclosure length="46312267" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/8a328132-0d05-4e45-b644-9050e2d964b0/audio/bc9faf09-ff55-4647-b287-d85cabd23f2b/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Talkin’ Bout Suspense</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:45:50</itunes:duration>
      <itunes:summary>Prompted by the new React 18 alpha release, Sam and Ryan chat about Suspense and what data-fetching issues they’re excited about it solving. They also talk about some Twitter conversation around premature optimization.
</itunes:summary>
      <itunes:subtitle>Prompted by the new React 18 alpha release, Sam and Ryan chat about Suspense and what data-fetching issues they’re excited about it solving. They also talk about some Twitter conversation around premature optimization.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>122</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">492a5b9c-1982-4d29-8f01-01f139f5a61f</guid>
      <title>Building headlessui.dev (fixed)</title>
      <description><![CDATA[<p>Sam and Ryan talk about their experience building the headlessui.dev website with the folks from Tailwind Labs. They chat about the team’s deadline-driven development process, some new Figma workflow tips when implementing a design that was built with Tailwind CSS in mind, and some tech takeaways from building a docs site with Next.js. They also chat about some testing conversation that was happening on Twitter this week.</p><p>Topics include:</p><ul><li>1:46 – The power of shipping with a deadline</li><li>12:22 – What is Headless UI?</li><li>16:39 – Design / dev handoff tips with Figma and Tailwind</li><li>28:00 – Tech learnings from building a docs site with Next.js</li><li>52:47 – Tweets of the Week: Unit vs. Integration testing</li></ul><p>Links: </p><ul><li><a href="https://twitter.com/samselikoff">Sam on Twitter</a></li><li><a href="https://twitter.com/ryantotweets">Ryan on Twitter</a></li><li><a href="https://headlessui.dev">Headless UI</a></li><li><a href="https://twitter.com/jeffrey_way/status/1398291646953951239">Jeffrey Way’s testing tweet</a></li><li><a href="https://twitter.com/garybernhardt/status/1400135299452309505">Gary Bernhardt’s testing tweet</a></li></ul>
]]></description>
      <pubDate>Mon, 7 Jun 2021 14:09:56 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about their experience building the headlessui.dev website with the folks from Tailwind Labs. They chat about the team’s deadline-driven development process, some new Figma workflow tips when implementing a design that was built with Tailwind CSS in mind, and some tech takeaways from building a docs site with Next.js. They also chat about some testing conversation that was happening on Twitter this week.</p><p>Topics include:</p><ul><li>1:46 – The power of shipping with a deadline</li><li>12:22 – What is Headless UI?</li><li>16:39 – Design / dev handoff tips with Figma and Tailwind</li><li>28:00 – Tech learnings from building a docs site with Next.js</li><li>52:47 – Tweets of the Week: Unit vs. Integration testing</li></ul><p>Links: </p><ul><li><a href="https://twitter.com/samselikoff">Sam on Twitter</a></li><li><a href="https://twitter.com/ryantotweets">Ryan on Twitter</a></li><li><a href="https://headlessui.dev">Headless UI</a></li><li><a href="https://twitter.com/jeffrey_way/status/1398291646953951239">Jeffrey Way’s testing tweet</a></li><li><a href="https://twitter.com/garybernhardt/status/1400135299452309505">Gary Bernhardt’s testing tweet</a></li></ul>
]]></content:encoded>
      <enclosure length="66112727" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/faf6ed50-a337-4a77-af55-d5c287a1ad12/audio/96b72c8a-f7ee-4d47-84ed-461b72fec276/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Building headlessui.dev (fixed)</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:05:29</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>121</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">e8a75b90-e617-469a-a42f-b0e7e79a09d5</guid>
      <title>Should frontend development drive backend design?</title>
      <description><![CDATA[<p>Sam and Ryan talk about how visual design typically drives frontend app development, and whether or not this implies that frontend development should drive backend development in a similar way. They also discuss a tricky UI issue involving keeping a React app consistent with both the URL and server-side auth state.</p><p>Topics include:</p><ul><li>2:02 - How the URL makes it hard to keep your app consistent with changes to server-side state</li><li>34:20 - Pros and cons of uncontrolled forms</li><li>37:51 - Whether frontend development should drive backend design</li></ul><p>Links: </p><ul><li><a href="https://twitter.com/samselikoff">Sam on Twitter</a></li><li><a href="https://twitter.com/ryantotweets">Ryan on Twitter</a></li><li><a href="https://reactjs.org/docs/uncontrolled-components.html">Uncontrolled Components in React</a></li></ul>
]]></description>
      <pubDate>Fri, 28 May 2021 21:21:14 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about how visual design typically drives frontend app development, and whether or not this implies that frontend development should drive backend development in a similar way. They also discuss a tricky UI issue involving keeping a React app consistent with both the URL and server-side auth state.</p><p>Topics include:</p><ul><li>2:02 - How the URL makes it hard to keep your app consistent with changes to server-side state</li><li>34:20 - Pros and cons of uncontrolled forms</li><li>37:51 - Whether frontend development should drive backend design</li></ul><p>Links: </p><ul><li><a href="https://twitter.com/samselikoff">Sam on Twitter</a></li><li><a href="https://twitter.com/ryantotweets">Ryan on Twitter</a></li><li><a href="https://reactjs.org/docs/uncontrolled-components.html">Uncontrolled Components in React</a></li></ul>
]]></content:encoded>
      <enclosure length="60834493" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/d21dc199-e386-4991-8e9f-79b8410698a0/audio/070b739b-f093-4a24-9be4-633f3d9dbb73/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Should frontend development drive backend design?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:00:15</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>120</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">5d217b54-ce3b-4df2-8eaf-86c5a802aeb9</guid>
      <title>Is Tailwind really an alternative to Bootstrap?</title>
      <description><![CDATA[<p>Sam and Ryan discuss building a library with TSDX, as well as some hiccups they ran into with node’s module resolution algorithm. They also talk about how even though Tailwind and Bootstrap are both considered CSS frameworks, they’re actually used to solve very different problems.</p><p>Topics include:</p><ul><li>0:00 Intro</li><li>2:55 Building a library with TSDX</li><li>11:56 Writing docs with MDX</li><li>21:15 Node resolutions with npm link</li><li>37:50 Tweet of the week: Redux</li><li>43:54 Tweet of the week: Feature flags</li><li>46:35 Tailwind vs Bootstrap</li></ul><p>Links:</p><ul><li><a href="https://tsdx.io/">TSDX</a></li><li><a href="https://github.com/jaredpalmer/tsdx-monorepo">TSDX monorepo</a></li><li><a href="https://github.com/atlassian/changesets">Changesets</a></li><li><a href="https://mdxjs.com/">MDX</a></li><li><a href="https://github.com/tailwindlabs/tailwindcss-typography">Tailwind typography</a></li><li><a href="https://twitter.com/floydophone/status/1365824299060273153">Pete Hunt on redux</a></li><li><a href="https://twitter.com/codingintherain/status/1362911280504299522">Dave Wilson on release and deployment</a></li><li><a href="https://twitter.com/samselikoff/">Sam’s Twitter</a></li></ul>
]]></description>
      <pubDate>Thu, 18 Mar 2021 07:26:57 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan discuss building a library with TSDX, as well as some hiccups they ran into with node’s module resolution algorithm. They also talk about how even though Tailwind and Bootstrap are both considered CSS frameworks, they’re actually used to solve very different problems.</p><p>Topics include:</p><ul><li>0:00 Intro</li><li>2:55 Building a library with TSDX</li><li>11:56 Writing docs with MDX</li><li>21:15 Node resolutions with npm link</li><li>37:50 Tweet of the week: Redux</li><li>43:54 Tweet of the week: Feature flags</li><li>46:35 Tailwind vs Bootstrap</li></ul><p>Links:</p><ul><li><a href="https://tsdx.io/">TSDX</a></li><li><a href="https://github.com/jaredpalmer/tsdx-monorepo">TSDX monorepo</a></li><li><a href="https://github.com/atlassian/changesets">Changesets</a></li><li><a href="https://mdxjs.com/">MDX</a></li><li><a href="https://github.com/tailwindlabs/tailwindcss-typography">Tailwind typography</a></li><li><a href="https://twitter.com/floydophone/status/1365824299060273153">Pete Hunt on redux</a></li><li><a href="https://twitter.com/codingintherain/status/1362911280504299522">Dave Wilson on release and deployment</a></li><li><a href="https://twitter.com/samselikoff/">Sam’s Twitter</a></li></ul>
]]></content:encoded>
      <enclosure length="62914463" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/fa35310a-e224-4e88-9971-52f919d3c822/audio/2d1a2569-68f2-43a9-b242-f1d0061c8739/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Is Tailwind really an alternative to Bootstrap?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:05:33</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>119</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">a63e25c3-64f0-41e2-999a-9a9b7248d536</guid>
      <title>Does server-side generation make loading states more complex?</title>
      <description><![CDATA[<p>Sam and Ryan discuss how loading states, data fetching, and skeleton screens can change the architecture of an SSG application. They also talk about Apollo’s cache and various query re-fetching strategies.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:35 - Image cropper dampening</li><li>4:00 - Learning library abstractions</li><li>10:00 - Loading states with SSG</li><li>28:00 - Server side cache</li><li>38:30 - Tweet of the week</li><li>46:00 - Apollo’s cache</li><li>58:50 - Stale while revalidate</li></ul><p>Links:</p><ul><li><a href="https://www.youtube.com/watch?v=YYgvL9XkKUg">Sam’s Image cropper dampening video</a></li><li><a href="https://nextjs.org/">Next.js</a></li><li><a href="https://www.quora.com/What-is-fan-out-write-and-fan-out-read-in-scalability">Fan out on write</a></li><li><a href="https://twitter.com/joshwcomeau/status/1357709696032002049">Tweet of the week</a></li><li><a href="https://stateofcss.com/">State of CSS survey</a></li><li><a href="https://www.apollographql.com/">Apollo</a></li><li><a href="https://formidable.com/open-source/urql/">URQL</a></li><li><a href="https://swr.vercel.app/">SWR</a></li></ul>
]]></description>
      <pubDate>Tue, 23 Feb 2021 00:21:28 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan discuss how loading states, data fetching, and skeleton screens can change the architecture of an SSG application. They also talk about Apollo’s cache and various query re-fetching strategies.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>2:35 - Image cropper dampening</li><li>4:00 - Learning library abstractions</li><li>10:00 - Loading states with SSG</li><li>28:00 - Server side cache</li><li>38:30 - Tweet of the week</li><li>46:00 - Apollo’s cache</li><li>58:50 - Stale while revalidate</li></ul><p>Links:</p><ul><li><a href="https://www.youtube.com/watch?v=YYgvL9XkKUg">Sam’s Image cropper dampening video</a></li><li><a href="https://nextjs.org/">Next.js</a></li><li><a href="https://www.quora.com/What-is-fan-out-write-and-fan-out-read-in-scalability">Fan out on write</a></li><li><a href="https://twitter.com/joshwcomeau/status/1357709696032002049">Tweet of the week</a></li><li><a href="https://stateofcss.com/">State of CSS survey</a></li><li><a href="https://www.apollographql.com/">Apollo</a></li><li><a href="https://formidable.com/open-source/urql/">URQL</a></li><li><a href="https://swr.vercel.app/">SWR</a></li></ul>
]]></content:encoded>
      <enclosure length="62997219" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/1fddbf7e-642a-4ceb-a9e8-0a87dc2990cc/audio/f39d649e-6a46-425e-9414-3ae9d37065ff/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Does server-side generation make loading states more complex?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:05:37</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>118</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">2e7af1b5-4e35-4caa-9dba-df716efcfd43</guid>
      <title>Best Practices for Imperative APIs in React</title>
      <description><![CDATA[<p>Ryan shares his first impressions using Supabase and talks about a new app he’s building to manage users in Hasura. Sam talks about how to responsibly go outside of React’s rendering cycle when using imperative APIs.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>3:40 - Supabase first thoughts</li><li>13:50 - Building an auth layer for Hasura</li><li>30:40 - Apollo server</li><li>37:50 - Framer Motion’s MotionValue and imperative APIs</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/samselikoff/status/1356404439540756482">Sam’s snow photos</a></li><li><a href="https://www.youtube.com/watch?v=SBRUuMyAYw0">Image Cropper Ep. 4</a></li><li><a href="https://supabase.io/">Supabase</a></li><li><a href="https://github.com/netlify/gotrue">Netlify’s GoTrue User management</a></li><li><a href="https://hasura.io/">Hasura</a></li><li><a href="https://cloud.google.com/">Google Cloud Platform</a></li><li><a href="https://www.apollographql.com/docs/apollo-server/">Apollo Server</a></li><li><a href="https://www.framer.com/motion/">Framer Motion</a></li></ul>
]]></description>
      <pubDate>Fri, 5 Feb 2021 18:36:34 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Ryan shares his first impressions using Supabase and talks about a new app he’s building to manage users in Hasura. Sam talks about how to responsibly go outside of React’s rendering cycle when using imperative APIs.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>3:40 - Supabase first thoughts</li><li>13:50 - Building an auth layer for Hasura</li><li>30:40 - Apollo server</li><li>37:50 - Framer Motion’s MotionValue and imperative APIs</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/samselikoff/status/1356404439540756482">Sam’s snow photos</a></li><li><a href="https://www.youtube.com/watch?v=SBRUuMyAYw0">Image Cropper Ep. 4</a></li><li><a href="https://supabase.io/">Supabase</a></li><li><a href="https://github.com/netlify/gotrue">Netlify’s GoTrue User management</a></li><li><a href="https://hasura.io/">Hasura</a></li><li><a href="https://cloud.google.com/">Google Cloud Platform</a></li><li><a href="https://www.apollographql.com/docs/apollo-server/">Apollo Server</a></li><li><a href="https://www.framer.com/motion/">Framer Motion</a></li></ul>
]]></content:encoded>
      <enclosure length="59415726" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/8e377bff-f3b4-4903-98f7-f5786034cc98/audio/71dd8e72-a4ed-4585-81bc-96bb382c208c/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Best Practices for Imperative APIs in React</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:01:53</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>117</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">e96481a4-bc18-492e-9a14-6e50f1285c70</guid>
      <title>Auth: The Momentum Killer</title>
      <description><![CDATA[<p>Ryan shares his experience setting up authentication in a new project with Sam. They also discuss some of the tradeoffs that client apps face when consuming raw JSON vs. passing data through a model layer like an ORM.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:00 - Visual programming in the video game Factorio</li><li>9:00 - Setting up auth in a new project</li><li>22:40 - Checking out Supabase</li><li>30:00 - Consuming APIs</li></ul><p>Links:</p><ul><li><a href="https://factorio.com/">Factorio</a></li><li><a href="https://firebase.google.com/">Firebase</a></li><li><a href="https://supabase.io/">Supabase</a></li><li><a href="https://hasura.io/">Hasura</a></li></ul>
]]></description>
      <pubDate>Fri, 22 Jan 2021 18:34:17 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Ryan shares his experience setting up authentication in a new project with Sam. They also discuss some of the tradeoffs that client apps face when consuming raw JSON vs. passing data through a model layer like an ORM.</p><p>Topics include:</p><ul><li>0:00 - Intro</li><li>1:00 - Visual programming in the video game Factorio</li><li>9:00 - Setting up auth in a new project</li><li>22:40 - Checking out Supabase</li><li>30:00 - Consuming APIs</li></ul><p>Links:</p><ul><li><a href="https://factorio.com/">Factorio</a></li><li><a href="https://firebase.google.com/">Firebase</a></li><li><a href="https://supabase.io/">Supabase</a></li><li><a href="https://hasura.io/">Hasura</a></li></ul>
]]></content:encoded>
      <enclosure length="45739684" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/0a55824f-4846-4f46-a53b-7da6e8f72b4a/audio/f3a645b2-7a4c-47f0-8bde-5cd05b378669/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Auth: The Momentum Killer</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:47:39</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>116</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">9ff9d643-25e6-4779-81ef-4e1d8d2f7aba</guid>
      <title>Gestures and Animations with React Use Gesture and Framer Motion</title>
      <description><![CDATA[<p>Sam tells Ryan about what he’s been learning using the React Use Gesture and Framer Motion libraries to build an Image Cropper for his YouTube series. They also chat about their first impressions of React’s new Server Components, as well as the Tailwind 2.0 launch.</p><p>Topics include:</p><ul><li>1:40 - First impressions of React server components  </li><li>12:10 - Tailwind 2 launch  </li><li>16:15 - React gesture with framer motion</li></ul><p>Links:</p><ul><li><a href="https://use-gesture.netlify.app/">React UseGesture</a>  </li><li><a href="https://www.framer.com/motion/">Framer Motion</a>  </li><li><a href="https://tailwindcss.com/">Tailwind</a>  </li><li><a href="https://www.youtube.com/watch?v=dBWhAGhw7wM">Pan and Pinch to Zoom with React Use Gesture – Image Cropper, Ep. 1</a>  </li><li><a href="https://www.youtube.com/c/SamSelikoff/featured">Sam’s YouTube channel</a></li></ul>
]]></description>
      <pubDate>Thu, 14 Jan 2021 11:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam tells Ryan about what he’s been learning using the React Use Gesture and Framer Motion libraries to build an Image Cropper for his YouTube series. They also chat about their first impressions of React’s new Server Components, as well as the Tailwind 2.0 launch.</p><p>Topics include:</p><ul><li>1:40 - First impressions of React server components  </li><li>12:10 - Tailwind 2 launch  </li><li>16:15 - React gesture with framer motion</li></ul><p>Links:</p><ul><li><a href="https://use-gesture.netlify.app/">React UseGesture</a>  </li><li><a href="https://www.framer.com/motion/">Framer Motion</a>  </li><li><a href="https://tailwindcss.com/">Tailwind</a>  </li><li><a href="https://www.youtube.com/watch?v=dBWhAGhw7wM">Pan and Pinch to Zoom with React Use Gesture – Image Cropper, Ep. 1</a>  </li><li><a href="https://www.youtube.com/c/SamSelikoff/featured">Sam’s YouTube channel</a></li></ul>
]]></content:encoded>
      <enclosure length="35499266" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/3ef48ccc-496a-4996-bcd3-7171d70c83af/audio/4f2b1ab9-4fb8-43fa-a1e5-e236ba1c9d93/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Gestures and Animations with React Use Gesture and Framer Motion</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:36:59</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>115</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">5b373d92-3c45-4fdb-b12c-548b6af5762c</guid>
      <title>Bundling client-server communication with packages for Next.js</title>
      <description><![CDATA[<p>Ryan tells Sam about an image uploading solution he built for one of his Next.js apps. They discuss how Next.js's integrated frontend and backend allow for much more convenient packages, and they brainstorm other packages that would fit well within Next's architecture. Ryan also shares how parser combinators helped him write robust text-parsing code for his poker app.</p><p>Topics include:</p><ul><li>0:54 – Server and client image uploading in Next.js</li><li>21:19 – Other packages that cross the client/server divide for Next.js</li><li>32:18 – Parser combinators</li></ul><p>Links:</p><ul><li><a href="https://github.com/jneen/parsimmon">Parsimmon</a></li></ul>
]]></description>
      <pubDate>Wed, 18 Nov 2020 14:19:32 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Ryan tells Sam about an image uploading solution he built for one of his Next.js apps. They discuss how Next.js's integrated frontend and backend allow for much more convenient packages, and they brainstorm other packages that would fit well within Next's architecture. Ryan also shares how parser combinators helped him write robust text-parsing code for his poker app.</p><p>Topics include:</p><ul><li>0:54 – Server and client image uploading in Next.js</li><li>21:19 – Other packages that cross the client/server divide for Next.js</li><li>32:18 – Parser combinators</li></ul><p>Links:</p><ul><li><a href="https://github.com/jneen/parsimmon">Parsimmon</a></li></ul>
]]></content:encoded>
      <enclosure length="52263694" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/2888c332-2a02-4c0f-9234-b608fa29396c/audio/cfd33ea2-b79e-40d9-befa-5a59c1201e95/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Bundling client-server communication with packages for Next.js</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:54:26</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>114</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">b8b91de7-f52e-4389-90ac-49db8bd98943</guid>
      <title>Is GraphQL an implementation detail?</title>
      <description><![CDATA[<p>Sam and Ryan talk about whether GraphQL affects the architecture of an app, and what sort of UI code a well-implemented GraphQL server can replace. They also talk about Sam's experience working on a new side project using Next, Hasura, GraphQL and SWR.</p><p>Topics include:</p><ul><li>2:34 – Finally feeling good about our tech stack. How easy GraphQL makes it to get or update aggregate data.</li><li>13:42 – Giving frontend developers a query language</li><li>19:46 - Does GraphQL encourage your JavaScript frontend to become more of a dumb view layer?</li><li>35:22 – Should you worry about unnecessary requests if they're abstracted behind your data-fetching library?</li><li>51:58 – Is GraphQL an implementation detail?</li></ul>
]]></description>
      <pubDate>Wed, 11 Nov 2020 18:36:06 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about whether GraphQL affects the architecture of an app, and what sort of UI code a well-implemented GraphQL server can replace. They also talk about Sam's experience working on a new side project using Next, Hasura, GraphQL and SWR.</p><p>Topics include:</p><ul><li>2:34 – Finally feeling good about our tech stack. How easy GraphQL makes it to get or update aggregate data.</li><li>13:42 – Giving frontend developers a query language</li><li>19:46 - Does GraphQL encourage your JavaScript frontend to become more of a dumb view layer?</li><li>35:22 – Should you worry about unnecessary requests if they're abstracted behind your data-fetching library?</li><li>51:58 – Is GraphQL an implementation detail?</li></ul>
]]></content:encoded>
      <enclosure length="62450830" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/15b276f3-b9a3-4218-a0e7-ed4293d00cff/audio/15c6f855-c6be-4c48-918b-51b020edd8ca/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Is GraphQL an implementation detail?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:05:03</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>113</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">fcc06e1c-9793-4d0e-b1ff-4fead034d7fa</guid>
      <title>The convergence of frontend and backend frameworks</title>
      <description><![CDATA[<p>Sam and Ryan talk about how frontend and backend frameworks are converging towards similar UI patterns and developer experiences, even though they're coming at it from different starting points. They also talk about the new Next.js 10 release and whether React should document more opinions held by the core team.</p><p>Topics include:</p><ul><li>3:22 – New features in Next.js 10</li><li>20:40 – How frontend and backend frameworks are converging</li><li>28:47 – Opinions in React that fall outside of its API</li><li>35:33 – Next.js' new Image component</li><li>49:00 – Q: Why is SASS not trendy? How can you replace it with PostCSS?</li><li>52:12 – Q: How do you edit your videos?</li></ul><p>Links:</p><ul><li><a href="https://www.youtube.com/watch?v=iSmkqocn0oQ">Simon Peyton Jones - Haskell is useless</a></li><li><a href="https://gist.github.com/sebmarkbage/75f0838967cd003cd7f9ab938eb1958f">Sebastian Markbage's Gist: The Rules of React</a></li><li><a href="https://fullstackradio.com/150">Full Stack Radio episode on Screencasting Tips</a></li></ul>
]]></description>
      <pubDate>Wed, 4 Nov 2020 14:43:52 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about how frontend and backend frameworks are converging towards similar UI patterns and developer experiences, even though they're coming at it from different starting points. They also talk about the new Next.js 10 release and whether React should document more opinions held by the core team.</p><p>Topics include:</p><ul><li>3:22 – New features in Next.js 10</li><li>20:40 – How frontend and backend frameworks are converging</li><li>28:47 – Opinions in React that fall outside of its API</li><li>35:33 – Next.js' new Image component</li><li>49:00 – Q: Why is SASS not trendy? How can you replace it with PostCSS?</li><li>52:12 – Q: How do you edit your videos?</li></ul><p>Links:</p><ul><li><a href="https://www.youtube.com/watch?v=iSmkqocn0oQ">Simon Peyton Jones - Haskell is useless</a></li><li><a href="https://gist.github.com/sebmarkbage/75f0838967cd003cd7f9ab938eb1958f">Sebastian Markbage's Gist: The Rules of React</a></li><li><a href="https://fullstackradio.com/150">Full Stack Radio episode on Screencasting Tips</a></li></ul>
]]></content:encoded>
      <enclosure length="55834510" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/43ab7392-8652-40dc-bd06-b1f59a5af112/audio/9315c349-d1fe-42bf-a14c-64140550462b/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>The convergence of frontend and backend frameworks</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:58:10</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>112</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">bb067d99-88c6-477b-9d3f-edb403cc1e2d</guid>
      <title>Key props vs. effects</title>
      <description><![CDATA[<p>Sam and Ryan talk about how both the key prop and useEffect can be used to solve similar problems, and discuss which approach is better. They also talk about the difference between handling data using models with methods vs. using POJOs with pure functions. </p><p>Topics include:</p><ul><li>0:34 – Model with methods vs POJOs with functions</li><li>16:44 – Comparing explicit, verbose code in React vs. other frameworks</li><li>29:34 – Dumb vs. smart components, and using keys vs. effects</li><li>47:47 – If a high-level API misses enough use cases, should it even exist?</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/sebmarkbage/status/1262937670444974081">Sebastian's tweet about using the key prop</a></li><li><a href="https://www.youtube.com/watch?v=DGORMj_i6rA&t=1329s">Sam and Ryan's video hacking on the REPL</a></li></ul>
]]></description>
      <pubDate>Wed, 28 Oct 2020 10:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about how both the key prop and useEffect can be used to solve similar problems, and discuss which approach is better. They also talk about the difference between handling data using models with methods vs. using POJOs with pure functions. </p><p>Topics include:</p><ul><li>0:34 – Model with methods vs POJOs with functions</li><li>16:44 – Comparing explicit, verbose code in React vs. other frameworks</li><li>29:34 – Dumb vs. smart components, and using keys vs. effects</li><li>47:47 – If a high-level API misses enough use cases, should it even exist?</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/sebmarkbage/status/1262937670444974081">Sebastian's tweet about using the key prop</a></li><li><a href="https://www.youtube.com/watch?v=DGORMj_i6rA&t=1329s">Sam and Ryan's video hacking on the REPL</a></li></ul>
]]></content:encoded>
      <enclosure length="66520078" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/0d89fe30-0a38-436d-bb4b-89e4806dddbf/audio/f18dd5b3-36ca-43dd-b584-d5c6a73747da/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Key props vs. effects</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:09:17</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>true</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>111</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">1c6be28e-e4e4-40ae-ab08-98592e843feb</guid>
      <title>How to test apps built on third-party services</title>
      <description><![CDATA[<p>Sam and Ryan talk more about their recent experience using Hasura and Amplify, and more generally how best to test apps that are built on third-party services. They also talk about Mirage JS GraphQL.</p><p>Topics include:</p><ul><li>7:39 – Testing a Hasura-backed app with Mirage</li><li>16:03 – Modeling and querying data with Amplify and Dynamo</li><li>31:09 – Auth, Amplify and Hasura, and testing services</li></ul>
]]></description>
      <pubDate>Thu, 15 Oct 2020 17:36:53 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk more about their recent experience using Hasura and Amplify, and more generally how best to test apps that are built on third-party services. They also talk about Mirage JS GraphQL.</p><p>Topics include:</p><ul><li>7:39 – Testing a Hasura-backed app with Mirage</li><li>16:03 – Modeling and querying data with Amplify and Dynamo</li><li>31:09 – Auth, Amplify and Hasura, and testing services</li></ul>
]]></content:encoded>
      <enclosure length="57363382" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/997613d5-61a2-418c-b7e6-a454a40e987c/audio/78152912-17e3-4449-8888-bc5667dc23dc/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>How to test apps built on third-party services</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:59:45</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>110</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">5d361702-522f-4dbc-ba1a-d3624a498306</guid>
      <title>Singleton components</title>
      <description><![CDATA[<p>Sam and Ryan talk about a tricky integration between some asynchronous third-party JavaScript code and React's render cycles. They also talk about how powerful the getStaticProps hook from Next.js is, and share some thoughts on whether Firebase's features justify the fact that by using it you lose out on the GraphQL community's standard libraries and tooling.</p><p>Topics include:</p><ul><li>0:50 – How to robustly integrate 3rd-party async code into React's render cycles</li><li>38:08 – How Next.js lets you easily prioritize consistency or availability</li><li>57:45 – Reflecting on Firebase</li></ul><p>Links:</p><ul><li><a href="https://www.youtube.com/watch?v=BtJAsvJOlhM">168 AWS Services in 2 minutes</a></li></ul>
]]></description>
      <pubDate>Thu, 17 Sep 2020 20:42:23 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about a tricky integration between some asynchronous third-party JavaScript code and React's render cycles. They also talk about how powerful the getStaticProps hook from Next.js is, and share some thoughts on whether Firebase's features justify the fact that by using it you lose out on the GraphQL community's standard libraries and tooling.</p><p>Topics include:</p><ul><li>0:50 – How to robustly integrate 3rd-party async code into React's render cycles</li><li>38:08 – How Next.js lets you easily prioritize consistency or availability</li><li>57:45 – Reflecting on Firebase</li></ul><p>Links:</p><ul><li><a href="https://www.youtube.com/watch?v=BtJAsvJOlhM">168 AWS Services in 2 minutes</a></li></ul>
]]></content:encoded>
      <enclosure length="63719040" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aebea-91aa-4070-84b0-f8d21a4be43d/episodes/8db9d3e2-fd01-47b2-9e5f-29a7d71d93ee/audio/fe70a6e0-4647-4c0d-8366-b6bad928363e/128/default_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Singleton components</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:06:22</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>109</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">9900ad90-9f44-4039-959b-e877e5e4fc4c</guid>
      <title>Next.js vs. Gatsby, revisited</title>
      <description><![CDATA[<p>Sam talks about his recent experience working with Next.js on his personal site. He and Ryan also compare Gatsby and Next, and discuss how much Next's updates over the past year have curbed Gatsby's advantages. They also talk about the best way to make frontend developers more autonomous.</p><p> </p><p>Topics include:</p><p>- 8:30 - Working on moving samselikoff.com to Next.js</p><p>- 39:04 – The best way to make frontend teams more autonomous</p>
]]></description>
      <pubDate>Wed, 26 Aug 2020 14:29:44 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam talks about his recent experience working with Next.js on his personal site. He and Ryan also compare Gatsby and Next, and discuss how much Next's updates over the past year have curbed Gatsby's advantages. They also talk about the best way to make frontend developers more autonomous.</p><p> </p><p>Topics include:</p><p>- 8:30 - Working on moving samselikoff.com to Next.js</p><p>- 39:04 – The best way to make frontend teams more autonomous</p>
]]></content:encoded>
      <enclosure length="50638873" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/3a590fbc-2d23-4bc6-b592-b45d9dbf769d/feature-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Next.js vs. Gatsby, revisited</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:48:47</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>108</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">cab9f62d-baad-4f1b-901c-eb2aee94d81a</guid>
      <title>Adventures with Amplify</title>
      <description><![CDATA[<p>Sam and Ryan talk about Ryan's recent experience using Amplify on a side project. They chat about the tradeoffs between using services and writing your own backend code, and how backend services let you do more at the cost of not understanding as much about how the system works.</p><p>Topics include:</p><ul><li>9:10 – Why Gatsby's content mesh is so good</li><li>23:00 – How much of your backend is your product</li><li>35:00 – Auth in Amplify</li><li>44:00 – Using Mirage with an Amplify app</li><li>56:00 – Firebase/Amplify/Hasura comparison</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/ryantotweets/status/1289994599939809282">Ryan's Amplify tweet</a></li></ul>
]]></description>
      <pubDate>Wed, 12 Aug 2020 18:27:49 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about Ryan's recent experience using Amplify on a side project. They chat about the tradeoffs between using services and writing your own backend code, and how backend services let you do more at the cost of not understanding as much about how the system works.</p><p>Topics include:</p><ul><li>9:10 – Why Gatsby's content mesh is so good</li><li>23:00 – How much of your backend is your product</li><li>35:00 – Auth in Amplify</li><li>44:00 – Using Mirage with an Amplify app</li><li>56:00 – Firebase/Amplify/Hasura comparison</li></ul><p>Links:</p><ul><li><a href="https://twitter.com/ryantotweets/status/1289994599939809282">Ryan's Amplify tweet</a></li></ul>
]]></content:encoded>
      <enclosure length="67934507" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/8d965c93-4afe-4a91-bf0c-a3e7731879b5/feature-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Adventures with Amplify</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:06:54</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>107</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">dc9f4b47-91be-4615-9c95-9f44c8606a7a</guid>
      <title>Does code splitting negate the benefits of building an SPA?</title>
      <description><![CDATA[<p>Sam and Ryan talk about how route-based code splitting makes SPAs more like traditional server-rendered apps, potentially negating many of their benefits. They also talk about how the intrinsic width of text affects flexbox-based layouts.</p><p> </p><p>Topics include:</p><p>- 4:20 – Flexbox and intrinsic width</p><p>- 27:40 – Does route splitting negate the benefits of an SPA?</p><p> </p><p>Links:</p><p>- <a href="https://www.youtube.com/user/Znqt">Daniel Schiffer on YouTube</a></p><p>- <a href="https://youtu.be/Ra5SUzeXOac">Sam's YouTube video on building a Twitter clone</a></p><p>- <a href="https://www.fullstackradio.com/episodes/143">Rich Harris on Full Stack Radio</a></p>
]]></description>
      <pubDate>Wed, 29 Jul 2020 14:04:29 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about how route-based code splitting makes SPAs more like traditional server-rendered apps, potentially negating many of their benefits. They also talk about how the intrinsic width of text affects flexbox-based layouts.</p><p> </p><p>Topics include:</p><p>- 4:20 – Flexbox and intrinsic width</p><p>- 27:40 – Does route splitting negate the benefits of an SPA?</p><p> </p><p>Links:</p><p>- <a href="https://www.youtube.com/user/Znqt">Daniel Schiffer on YouTube</a></p><p>- <a href="https://youtu.be/Ra5SUzeXOac">Sam's YouTube video on building a Twitter clone</a></p><p>- <a href="https://www.fullstackradio.com/episodes/143">Rich Harris on Full Stack Radio</a></p>
]]></content:encoded>
      <enclosure length="51888370" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/f19eb1eb-4d66-4e2a-b55a-21809410012f/podcast-106-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Does code splitting negate the benefits of building an SPA?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:50:40</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>106</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">521af837-5919-449c-9df7-912a9ad0d688</guid>
      <title>Stop Energy</title>
      <description><![CDATA[<p>Sam and Ryan talk about a post from 2002 discussing Stop Energy, which the author defines as a certain kind of feedback that is thoughtless and can halt forward motion on a project. They also talk about Ryan's adventures with Amplify, and brainstorm how to automate Sam's work journal.</p><p>Topics include:</p><ul><li>6:05 – Stop Energy</li><li>27:55 – Amplify</li><li>44:27 – Automating a Work Journal</li></ul><p>Links:</p><ul><li><a href="http://www.userland.com/whatIsStopEnergy">What is Stop Energy</a></li><li><a href="https://aws.amazon.com/amplify/">Amplify</a></li><li><a href="https://substack.com/">Substack</a></li><li><a href="https://samselikoff.com/work-journal">Sam's work journal</a></li></ul>
]]></description>
      <pubDate>Thu, 16 Jul 2020 13:34:02 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about a post from 2002 discussing Stop Energy, which the author defines as a certain kind of feedback that is thoughtless and can halt forward motion on a project. They also talk about Ryan's adventures with Amplify, and brainstorm how to automate Sam's work journal.</p><p>Topics include:</p><ul><li>6:05 – Stop Energy</li><li>27:55 – Amplify</li><li>44:27 – Automating a Work Journal</li></ul><p>Links:</p><ul><li><a href="http://www.userland.com/whatIsStopEnergy">What is Stop Energy</a></li><li><a href="https://aws.amazon.com/amplify/">Amplify</a></li><li><a href="https://substack.com/">Substack</a></li><li><a href="https://samselikoff.com/work-journal">Sam's work journal</a></li></ul>
]]></content:encoded>
      <enclosure length="56290079" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/e3f15770-58e1-49b1-8447-494ce365fd66/podcast-105-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Stop Energy</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:55:14</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>105</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">b31af4ce-2bd9-45de-b473-d2c6b71bfe17</guid>
      <title>Tech debt vs. platform risk</title>
      <description><![CDATA[<p>Sam and Ryan talk about adding an authenticated backend to miragejs.com using Hasura, Heroku and Netlify. They also talk about the differences in risk between using paid third-party services vs. depending on open-source libraries.</p><p> </p><p>Topics include:</p><p>- 3:47 – Adding a backend to miragejs.com</p><p>- 13:03 – Environment variables in frontend apps</p><p>- 20:48 – Adding privileges to the anonymous role</p><p>- 28:00 – Should Hasura let you configure permissions for unauthenticated requests?</p><p>- 31:36 – Setting up a webhook using Netlify cloud function</p><p>- 37:19 – Risk profile of paid services vs. OSS libraries</p><p> </p><p>Links:</p><p>- <a href="https://hasura.io">Hasura</a></p><p>- <a href="https://formidable.com/open-source/urql/">URQL</a></p><p>- <a href="https://www.netlify.com/products/functions">Netlify Functions</a></p>
]]></description>
      <pubDate>Thu, 2 Jul 2020 18:01:19 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about adding an authenticated backend to miragejs.com using Hasura, Heroku and Netlify. They also talk about the differences in risk between using paid third-party services vs. depending on open-source libraries.</p><p> </p><p>Topics include:</p><p>- 3:47 – Adding a backend to miragejs.com</p><p>- 13:03 – Environment variables in frontend apps</p><p>- 20:48 – Adding privileges to the anonymous role</p><p>- 28:00 – Should Hasura let you configure permissions for unauthenticated requests?</p><p>- 31:36 – Setting up a webhook using Netlify cloud function</p><p>- 37:19 – Risk profile of paid services vs. OSS libraries</p><p> </p><p>Links:</p><p>- <a href="https://hasura.io">Hasura</a></p><p>- <a href="https://formidable.com/open-source/urql/">URQL</a></p><p>- <a href="https://www.netlify.com/products/functions">Netlify Functions</a></p>
]]></content:encoded>
      <enclosure length="68021892" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/bcbc195e-99bc-47a6-a96b-d55a92213df3/podcast-104_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Tech debt vs. platform risk</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:07:36</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>104</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">f2ec869c-6a49-48cb-bb7e-ac692d51282e</guid>
      <title>Safety and idempotence</title>
      <description><![CDATA[<p>Sam and Ryan talk – again – about the best way to write side effects in React applications. Ryan shares his approach based on his recent work in several React apps, and talks about the pitfalls of using useEffect's dependency array as a mechanism for control flow. Sam also talks about his recent video on React Router and why it's important to use the entire route hierarchy when determining whether a link is active.</p><p> </p><p>Topics include:</p><p>- 0:00 – Processes, workflow and deadlines</p><p>- 12:00 – How should you think of useEffect's dependency array</p><p>- 38:00 – Routing in React Router v6</p><p> </p><p>Links:</p><p>- <a href="https://youtu.be/F5eDWtJRYaI">Sam's YouTube video on React Router v6</a></p>
]]></description>
      <pubDate>Wed, 24 Jun 2020 15:56:53 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk – again – about the best way to write side effects in React applications. Ryan shares his approach based on his recent work in several React apps, and talks about the pitfalls of using useEffect's dependency array as a mechanism for control flow. Sam also talks about his recent video on React Router and why it's important to use the entire route hierarchy when determining whether a link is active.</p><p> </p><p>Topics include:</p><p>- 0:00 – Processes, workflow and deadlines</p><p>- 12:00 – How should you think of useEffect's dependency array</p><p>- 38:00 – Routing in React Router v6</p><p> </p><p>Links:</p><p>- <a href="https://youtu.be/F5eDWtJRYaI">Sam's YouTube video on React Router v6</a></p>
]]></content:encoded>
      <enclosure length="67473050" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/3b5c304d-88a0-48d2-b6aa-5593cee82a7e/pod-103_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Safety and idempotence</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:06:07</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>103</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">2fe94d60-9872-4063-9b58-9f3b132f5db5</guid>
      <title>Drew Powers on How Pika&apos;s Making the Web Faster</title>
      <description><![CDATA[<p>Drew Powers, one of two full-time engineers working at Pika, joins Sam to talk about Pika's mission to make the web faster. Drew talks about how Pika is focused on building tools that meet developers where they're at, his work on Snowpack, and the company's vision for Pika CDN.</p><p>Topics include:</p><ul><li><p>0:00 – What do you do at Pika?</p></li><li><p>4:54 – What is Pika's mission and where is it coming from?</p></li><li><p>10:45 – What does speed mean from Pika's perspective?</p></li><li><p>13:50 – What are some ideas for Pika's sustainability model?</p></li><li><p>17:20 – What's going on in Snowpack?</p></li><li><p>21:43 – What does it look like to use or migrate to Snowpack today?</p></li><li><p>24:50 – How does Snowpack actually work?</p></li><li><p>36:44 – How do you deal with dependencies that can't be deduplicated?</p></li><li><p>48:14 – Snowpack's React App template</p></li><li><p>49:49 – Can you migrate off of Snowpack if you need to fall back to something like Webpack?</p></li><li><p>53:09 – How do ES modules affect dependency resolution?</p></li><li><p>1:05:50 – What's in your roadmap?</p></li></ul><p>Links:</p><ul><li><p><a href="https://twitter.com/drwpow">Drew on Twitter</a></p></li><li><p><a href="https://www.snowpack.dev">Snowpack</a></p></li><li><p><a href="https://blog.npmjs.org/post/618653678433435649/npm-v7-series-arborist-deep-dive">Arborist Deep Dive</a></p></li><li><p><a href="https://www.esnextconf.com">ESNEXT Conf</a></p></li><li><p><a href="https://github.com/pikapkg/pack">Pika pack</a></p></li></ul>
]]></description>
      <pubDate>Fri, 19 Jun 2020 11:22:25 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Drew Powers, one of two full-time engineers working at Pika, joins Sam to talk about Pika's mission to make the web faster. Drew talks about how Pika is focused on building tools that meet developers where they're at, his work on Snowpack, and the company's vision for Pika CDN.</p><p>Topics include:</p><ul><li><p>0:00 – What do you do at Pika?</p></li><li><p>4:54 – What is Pika's mission and where is it coming from?</p></li><li><p>10:45 – What does speed mean from Pika's perspective?</p></li><li><p>13:50 – What are some ideas for Pika's sustainability model?</p></li><li><p>17:20 – What's going on in Snowpack?</p></li><li><p>21:43 – What does it look like to use or migrate to Snowpack today?</p></li><li><p>24:50 – How does Snowpack actually work?</p></li><li><p>36:44 – How do you deal with dependencies that can't be deduplicated?</p></li><li><p>48:14 – Snowpack's React App template</p></li><li><p>49:49 – Can you migrate off of Snowpack if you need to fall back to something like Webpack?</p></li><li><p>53:09 – How do ES modules affect dependency resolution?</p></li><li><p>1:05:50 – What's in your roadmap?</p></li></ul><p>Links:</p><ul><li><p><a href="https://twitter.com/drwpow">Drew on Twitter</a></p></li><li><p><a href="https://www.snowpack.dev">Snowpack</a></p></li><li><p><a href="https://blog.npmjs.org/post/618653678433435649/npm-v7-series-arborist-deep-dive">Arborist Deep Dive</a></p></li><li><p><a href="https://www.esnextconf.com">ESNEXT Conf</a></p></li><li><p><a href="https://github.com/pikapkg/pack">Pika pack</a></p></li></ul>
]]></content:encoded>
      <enclosure length="69925620" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/ae18113f-7bf5-4101-8239-3632cb0b4e2d/feature-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Drew Powers on How Pika&apos;s Making the Web Faster</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:10:10</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>102</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">fb810071-a00a-4ecf-b697-48463e7e5eab</guid>
      <title>Tom Preston-Werner on Architecture Decisions in Redwood JS</title>
      <description><![CDATA[<p>Tom Preston-Werner joins Sam and Ryan to talk about some of the architecture decisions behind Redwood JS, a recently released full-stack JS framework he's been working on for more than a year. Tom talks about how Redwood's Services provide a first-class layer of abstraction on top of your backend data models for your application's business logic, why Redwood went all-in on GraphQL, and how the framework is poised to take advantage of future improvements coming to serverless infrastructure.</p><p> </p><p>Topics include:</p><p>- 0:00 – Rails' influence on Redwood</p><p>- 8:00 – How Redwood Services keep your backend code organized</p><p>- 12:04 – The decisions driven by the desire to write React on the frontend</p><p>- 22:57 – Deep dive into Redwood Services</p><p>- 30:58 – Why Redwood uses GraphQL</p><p>- 44:37 – Caches & invalidation</p><p>- 55:52 – Why Cells are more than Hooks</p><p>- 1:07:02 – How databases can make their way into the JAMStack</p><p> </p><p>Links:</p><p>- [Redwood JS](https://redwoodjs.com/)</p><p>- [Tom on Twitter](https://twitter.com/mojombo)</p>
]]></description>
      <pubDate>Wed, 10 Jun 2020 10:00:07 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Tom Preston-Werner joins Sam and Ryan to talk about some of the architecture decisions behind Redwood JS, a recently released full-stack JS framework he's been working on for more than a year. Tom talks about how Redwood's Services provide a first-class layer of abstraction on top of your backend data models for your application's business logic, why Redwood went all-in on GraphQL, and how the framework is poised to take advantage of future improvements coming to serverless infrastructure.</p><p> </p><p>Topics include:</p><p>- 0:00 – Rails' influence on Redwood</p><p>- 8:00 – How Redwood Services keep your backend code organized</p><p>- 12:04 – The decisions driven by the desire to write React on the frontend</p><p>- 22:57 – Deep dive into Redwood Services</p><p>- 30:58 – Why Redwood uses GraphQL</p><p>- 44:37 – Caches & invalidation</p><p>- 55:52 – Why Cells are more than Hooks</p><p>- 1:07:02 – How databases can make their way into the JAMStack</p><p> </p><p>Links:</p><p>- [Redwood JS](https://redwoodjs.com/)</p><p>- [Tom on Twitter](https://twitter.com/mojombo)</p>
]]></content:encoded>
      <enclosure length="76162586" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/a1b9009b-1375-448a-a775-e7880a8f2432/feature-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Tom Preston-Werner on Architecture Decisions in Redwood JS</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:18:12</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>101</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">afdc698e-5f8c-46bb-afa8-9d04bc665fe9</guid>
      <title>Why the browser is the most complex runtime environment</title>
      <description><![CDATA[<p>Sam and Ryan talk about the unique aspects of ES modules that have driven the recent explosion of innovation in the frontend build tooling space, giving rise to tools like Snowpack and Vite. They also chat about their desire for a more integrated frontend ecosystem that would make adding things like auth to frontend apps easier, as well the impressive web-based drawing tool Excalidraw.</p><p> </p><p>Topics include:</p><p>- 1:16 – ES modules</p><p>- 14:09 – Why do we bundle?</p><p>- 20:47 – Modules are stateful singletons, and the benefits of dependency injection</p><p>- 35:12 – Desire for an integrated JS environment</p><p>- 50:41 – Excalidraw</p><p> </p><p>Links:</p><p>- [Sam's video on ES modules](https://youtu.be/5F_k9q9HbAc)</p><p>- [Guillermo Rauch on Static First using Serverless Frontends](https://www.serverlesschats.com/50)</p><p>- [Excalidraw](https://excalidraw.com)</p>
]]></description>
      <pubDate>Thu, 28 May 2020 13:38:31 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about the unique aspects of ES modules that have driven the recent explosion of innovation in the frontend build tooling space, giving rise to tools like Snowpack and Vite. They also chat about their desire for a more integrated frontend ecosystem that would make adding things like auth to frontend apps easier, as well the impressive web-based drawing tool Excalidraw.</p><p> </p><p>Topics include:</p><p>- 1:16 – ES modules</p><p>- 14:09 – Why do we bundle?</p><p>- 20:47 – Modules are stateful singletons, and the benefits of dependency injection</p><p>- 35:12 – Desire for an integrated JS environment</p><p>- 50:41 – Excalidraw</p><p> </p><p>Links:</p><p>- [Sam's video on ES modules](https://youtu.be/5F_k9q9HbAc)</p><p>- [Guillermo Rauch on Static First using Serverless Frontends](https://www.serverlesschats.com/50)</p><p>- [Excalidraw](https://excalidraw.com)</p>
]]></content:encoded>
      <enclosure length="63384538" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/dc449dbb-384e-45dd-a925-414e49a27d7b/feature-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Why the browser is the most complex runtime environment</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:02:39</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>100</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">cbe0e6b7-2e80-4dbf-93ab-10a093560ea5</guid>
      <title>Read and Discuss: &quot;Second-guessing the modern web&quot;</title>
      <description><![CDATA[<p>Sam and Ryan read and discuss Tom MacWright's recent article "Second-guessing the modern web," as well as Rich Harris's response "In defense of the modern web." The articles respectively argue against and for the JavaScript-centric approach to building websites that has taken root over the past ten years and debate issues of performance, architectural complexity, and user experience.</p><p> </p><p>Topics include:</p><p>- 6:30 – "Second-guessing the modern web" by Tom MacWright</p><p>- 52:27 – Dan Abramov's thoughts on Twitter</p><p>- 58:50 – "In defense of the modern web" by Rich Harris</p><p> </p><p>Links:</p><p>- ["Second-guessing the modern web" by Tom MacWright](https://macwright.org/2020/05/10/spa-fatigue.html)</p><p>- [Dan Abramov's thoughts on Twitter](https://twitter.com/dan_abramov/status/1259614150386425858)</p><p>- ["In defense of the modern web" by Rich Harris](https://dev.to/richharris/in-defense-of-the-modern-web-2nia)</p><p> </p>
]]></description>
      <pubDate>Wed, 20 May 2020 10:00:10 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan read and discuss Tom MacWright's recent article "Second-guessing the modern web," as well as Rich Harris's response "In defense of the modern web." The articles respectively argue against and for the JavaScript-centric approach to building websites that has taken root over the past ten years and debate issues of performance, architectural complexity, and user experience.</p><p> </p><p>Topics include:</p><p>- 6:30 – "Second-guessing the modern web" by Tom MacWright</p><p>- 52:27 – Dan Abramov's thoughts on Twitter</p><p>- 58:50 – "In defense of the modern web" by Rich Harris</p><p> </p><p>Links:</p><p>- ["Second-guessing the modern web" by Tom MacWright](https://macwright.org/2020/05/10/spa-fatigue.html)</p><p>- [Dan Abramov's thoughts on Twitter](https://twitter.com/dan_abramov/status/1259614150386425858)</p><p>- ["In defense of the modern web" by Rich Harris](https://dev.to/richharris/in-defense-of-the-modern-web-2nia)</p><p> </p>
]]></content:encoded>
      <enclosure length="77110498" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/d42eaad4-4ff9-4727-8726-adb93f2d85b9/feature-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Read and Discuss: &quot;Second-guessing the modern web&quot;</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:16:59</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>99</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">4ec4f2e6-9e03-406b-9667-acaab6f3d461</guid>
      <title>Everyone&apos;s sidestepping useEffect. Is everyone wrong, or is it React?</title>
      <description><![CDATA[<p>Sam and Ryan grapple with the way useEffect nudges you to build UIs. They discuss whether JavaScript object identity is a good proxy to use for business logic equivalence, whether useEffect leads to more correct code, and then they chat about some of the ways React developers sidestep useEffect when the declarative programming model that Hooks impose upon them is not a good fit with their app's business logic.</p><p> </p><p>Topics include:</p><p>- 11:39 – JavaScript identity vs. business logic identity when working with useEffect</p>
]]></description>
      <pubDate>Thu, 14 May 2020 10:00:12 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan grapple with the way useEffect nudges you to build UIs. They discuss whether JavaScript object identity is a good proxy to use for business logic equivalence, whether useEffect leads to more correct code, and then they chat about some of the ways React developers sidestep useEffect when the declarative programming model that Hooks impose upon them is not a good fit with their app's business logic.</p><p> </p><p>Topics include:</p><p>- 11:39 – JavaScript identity vs. business logic identity when working with useEffect</p>
]]></content:encoded>
      <enclosure length="68111318" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/68bcaadd-31af-48fe-b2c0-23945466881a/podcast-98-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Everyone&apos;s sidestepping useEffect. Is everyone wrong, or is it React?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:07:06</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>98</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">4c593683-9bc3-441a-868b-3bda3b608606</guid>
      <title>When APIs get misused, who&apos;s to blame?</title>
      <description><![CDATA[<p>Sam and Ryan chat about how and why framework APIs get used and abused. Ryan also shares his experience working with AWS Amplify on a side project.</p><p> </p><p>Topics include:</p><p>- 3:17 – How useEffect can be confusing in high-level app code</p><p>- 21:05 – Immediate mode GUIs</p><p>- 32:40 – Who's responsible when developers misuse framework APIs?</p><p>- 46:40 – AWS Amplify</p><p>- 1:14:25 – Our ideal stack</p><p> </p><p>Links:</p><p>- [Immediate mode GUIs - Go Time #128](https://changelog.com/gotime/128)</p><p>- [AWS Amplify](https://aws.amazon.com/amplify/)</p><p>- [Begin.com learn](https://learn.begin.com/)</p><p> </p>
]]></description>
      <pubDate>Thu, 7 May 2020 10:00:19 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan chat about how and why framework APIs get used and abused. Ryan also shares his experience working with AWS Amplify on a side project.</p><p> </p><p>Topics include:</p><p>- 3:17 – How useEffect can be confusing in high-level app code</p><p>- 21:05 – Immediate mode GUIs</p><p>- 32:40 – Who's responsible when developers misuse framework APIs?</p><p>- 46:40 – AWS Amplify</p><p>- 1:14:25 – Our ideal stack</p><p> </p><p>Links:</p><p>- [Immediate mode GUIs - Go Time #128](https://changelog.com/gotime/128)</p><p>- [AWS Amplify](https://aws.amazon.com/amplify/)</p><p>- [Begin.com learn](https://learn.begin.com/)</p><p> </p>
]]></content:encoded>
      <enclosure length="84573761" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/589b745c-b6e4-4cb3-88f1-c87aa0e1d517/feature-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>When APIs get misused, who&apos;s to blame?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:23:56</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>97</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">f6334ba5-ab9d-41f9-9010-f03a73bbde54</guid>
      <title>WTF is the JAMstack?</title>
      <description><![CDATA[<p>Sam and Ryan try to unpack the meaning of JAMstack. They discuss the constraints of the architecture, why it's confusing to think of it as an application stack, the implications it has for app cachability, and whether the Twelve Factor App that Heroku introduced in the Rails-dominated era of web development might be a better way to think about this new paradigm.</p><p> </p><p>Topics include:</p><p>- 0:00 – Building Optimistic UIs</p><p>- 13:45 – Immutable assets vs. mutable HTML</p><p>- 36:05 – JAMstack, Twelve Factor Apps, and leveraging CDNs</p><p> </p><p>Links:</p><p>- [Sam's Free Egghead Collection: Create an Optimistic UI in React with SWR](https://egghead.io/lessons/react-optimistically-update-swr-s-cache-with-client-side-data?pl=create-an-optimistic-ui-in-react-with-swr-1024)</p><p>- [SWR on GitHub](https://github.com/zeit/swr)</p><p>- [The Twelve Factor App](https://12factor.net/)</p>
]]></description>
      <pubDate>Fri, 1 May 2020 10:00:05 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan try to unpack the meaning of JAMstack. They discuss the constraints of the architecture, why it's confusing to think of it as an application stack, the implications it has for app cachability, and whether the Twelve Factor App that Heroku introduced in the Rails-dominated era of web development might be a better way to think about this new paradigm.</p><p> </p><p>Topics include:</p><p>- 0:00 – Building Optimistic UIs</p><p>- 13:45 – Immutable assets vs. mutable HTML</p><p>- 36:05 – JAMstack, Twelve Factor Apps, and leveraging CDNs</p><p> </p><p>Links:</p><p>- [Sam's Free Egghead Collection: Create an Optimistic UI in React with SWR](https://egghead.io/lessons/react-optimistically-update-swr-s-cache-with-client-side-data?pl=create-an-optimistic-ui-in-react-with-swr-1024)</p><p>- [SWR on GitHub](https://github.com/zeit/swr)</p><p>- [The Twelve Factor App](https://12factor.net/)</p>
]]></content:encoded>
      <enclosure length="79329180" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/8d17c556-c90c-4a06-a5b2-bf6dc5db3287/feature-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>WTF is the JAMstack?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:18:58</itunes:duration>
      <itunes:summary></itunes:summary>
      <itunes:subtitle></itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>96</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">27004e13-f25e-446c-bd55-d3be88d8fa31</guid>
      <title>Introducing: Frontend First</title>
      <description><![CDATA[<p>Topics include:</p><ul><li>5:30 - Gatsby, six months later</li><li>8:10 - Mirage REPL</li><li>11:50 - Next Link</li><li>15:10 - Render props vs. Hooks</li><li>24:05 - Vercel</li><li>27:47 - Twin.macro</li><li>38:50 - Learning CSS grid through Tailwind</li><li>48:59 - Node deps, devDeps, and peerDeps</li></ul><p>Links:</p><ul><li><a href="https://miragejs.com/repl/">Mirage REPL</a></li><li><a href="https://nextjs.org/docs/api-reference/next/link">Next Link API docs</a></li><li><a href="https://vercel.com/">Vercel</a></li><li><a href="https://github.com/ben-rogerson/twin.macro">Twin.macro</a></li><li><a href="https://tailwindcss.com/docs/grid-template-columns">Tailwind CSS grid</a></li></ul>
]]></description>
      <pubDate>Fri, 24 Apr 2020 10:00:03 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Topics include:</p><ul><li>5:30 - Gatsby, six months later</li><li>8:10 - Mirage REPL</li><li>11:50 - Next Link</li><li>15:10 - Render props vs. Hooks</li><li>24:05 - Vercel</li><li>27:47 - Twin.macro</li><li>38:50 - Learning CSS grid through Tailwind</li><li>48:59 - Node deps, devDeps, and peerDeps</li></ul><p>Links:</p><ul><li><a href="https://miragejs.com/repl/">Mirage REPL</a></li><li><a href="https://nextjs.org/docs/api-reference/next/link">Next Link API docs</a></li><li><a href="https://vercel.com/">Vercel</a></li><li><a href="https://github.com/ben-rogerson/twin.macro">Twin.macro</a></li><li><a href="https://tailwindcss.com/docs/grid-template-columns">Tailwind CSS grid</a></li></ul>
]]></content:encoded>
      <enclosure length="61810214" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/ecc99d8d-edb0-4139-bef1-b1d931f89613/audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Introducing: Frontend First</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:04:23</itunes:duration>
      <itunes:summary>Sam and Ryan kick off the first episode of Frontend First by doing what they do best – talking about frontend development! They chat about a variety of topics including how their use of Tailwind has lead to a better understanding of CSS, as well as whether they regret using Gatsby to buid miragejs.com six months since the site&apos;s release.</itunes:summary>
      <itunes:subtitle>Sam and Ryan kick off the first episode of Frontend First by doing what they do best – talking about frontend development! They chat about a variety of topics including how their use of Tailwind has lead to a better understanding of CSS, as well as whether they regret using Gatsby to buid miragejs.com six months since the site&apos;s release.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>95</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">40b51e33-7c55-4726-b8a9-ff3f412377e8</guid>
      <title>Coming soon: Frontend First</title>
      <description><![CDATA[]]></description>
      <pubDate>Mon, 20 Apr 2020 15:05:58 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[]]></content:encoded>
      <enclosure length="17813209" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/9e3a4984-c11f-45b0-9cf0-b98446158905/feature-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Coming soon: Frontend First</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:14:52</itunes:duration>
      <itunes:summary>Sam and Ryan tell listeners about the upcoming rebrand of the EmberMap Podcast.</itunes:summary>
      <itunes:subtitle>Sam and Ryan tell listeners about the upcoming rebrand of the EmberMap Podcast.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>94</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">5c04a694-accb-4482-83a5-27358062dadc</guid>
      <title>What&apos;s the fastest way to deliver an app?</title>
      <description><![CDATA[<p>Topics include:</p><ul><li>6:00 – Adding Cypress tests to the Mirage Inspector</li><li>14:00 – Lazy page generation, incremental rebuilds and cache stampedes with Next.js</li><li>24:51 – CDNs & surrogate keys</li><li>38:00 – Will global databases obviate the need for CDNs?</li><li>42:23 – Gatsby Cloud's ability to build surrogate keys from GraphQL queries</li><li>48:48 – Gatsby Cloud's Preview Mode</li><li>50:30 – Will hosting-only platforms like Netlify and Heroku become too generic?</li><li>53:43 – Is there a tension between Next/Gatsby's per-page model and SPAs?</li></ul><p>Links:</p><ul><li><a href="https://www.youtube.com/watch?v=tTSrhmUVky0">Working on the Mirage Inspector Apr 7, 2020</a></li><li><a href="https://www.youtube.com/watch?v=WwuOKw1kj-g">Working on the Mirage Inspector Apr 14, 2020</a></li><li><a href="http://www.fullstackradio.com/137">FullStack Radio #137: Tim Neutkens - Continuing to Innovate with Next.js 9.3</a></li><li><a href="https://changelog.com/jsparty/122">JS Party #122: What's new and what's Next.js with Guillermo Rauch from ZEIT</a></li><li><a href="https://changelog.com/jsparty/117">JS Party #117: Catching up with Gatsby with Dustin Schau</a></li></ul>
]]></description>
      <pubDate>Thu, 16 Apr 2020 10:00:09 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Topics include:</p><ul><li>6:00 – Adding Cypress tests to the Mirage Inspector</li><li>14:00 – Lazy page generation, incremental rebuilds and cache stampedes with Next.js</li><li>24:51 – CDNs & surrogate keys</li><li>38:00 – Will global databases obviate the need for CDNs?</li><li>42:23 – Gatsby Cloud's ability to build surrogate keys from GraphQL queries</li><li>48:48 – Gatsby Cloud's Preview Mode</li><li>50:30 – Will hosting-only platforms like Netlify and Heroku become too generic?</li><li>53:43 – Is there a tension between Next/Gatsby's per-page model and SPAs?</li></ul><p>Links:</p><ul><li><a href="https://www.youtube.com/watch?v=tTSrhmUVky0">Working on the Mirage Inspector Apr 7, 2020</a></li><li><a href="https://www.youtube.com/watch?v=WwuOKw1kj-g">Working on the Mirage Inspector Apr 14, 2020</a></li><li><a href="http://www.fullstackradio.com/137">FullStack Radio #137: Tim Neutkens - Continuing to Innovate with Next.js 9.3</a></li><li><a href="https://changelog.com/jsparty/122">JS Party #122: What's new and what's Next.js with Guillermo Rauch from ZEIT</a></li><li><a href="https://changelog.com/jsparty/117">JS Party #117: Catching up with Gatsby with Dustin Schau</a></li></ul>
]]></content:encoded>
      <enclosure length="70305653" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/93ce2a5a-b49d-47fe-b9b3-025d8aee2db7/feature-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>What&apos;s the fastest way to deliver an app?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:13:14</itunes:duration>
      <itunes:summary>Sam and Ryan discuss current approaches frameworks are taking for leveraging CDNs to quickly deliver JS apps. They talk about incremental rebuilds, lazy page generation, cache stampedes, surrogate keys, and new database technologies like Fauna that might even obviate the need for CDNs altogether.</itunes:summary>
      <itunes:subtitle>Sam and Ryan discuss current approaches frameworks are taking for leveraging CDNs to quickly deliver JS apps. They talk about incremental rebuilds, lazy page generation, cache stampedes, surrogate keys, and new database technologies like Fauna that might even obviate the need for CDNs altogether.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>93</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">19f742c8-33a1-4ec7-a34f-1d8e4e238fc3</guid>
      <title>What&apos;s been the primary driver of JavaScript adoption?</title>
      <description><![CDATA[<p>Sam and Ryan discuss what has driven JavaScript adoption on the web over the past 5-10 years, and what implications those drivers have had for the tools and frameworks we work with today. They also talk about why it's still so hard to build good SPA experiences on the web.</p><p> </p><p>Topics include:</p><p>- 5:10 – Finding real-world pain points</p><p>- 8:44 – Mirage Inspector's serverless backend</p><p>- 15:30 – Not being happy with our stack</p><p>- 18:38 – Why on SPAs on the web tend to be so awful?</p><p>- 30:37 – What has driven JS adoption?</p><p>- 45:42 - GraphQL vs Rails 5 years in</p><p>- 49:10 – SWR and a useResource hook</p><p> </p><p>Links:</p><p>- [Tailwind CSS Tips, Tricks + Best Practices](https://www.youtube.com/watch?v=nqNIy8HkEQ8)</p><p>- [JavaScript Deployments with Brian LeRoux](https://softwareengineeringdaily.com/2020/03/04/javascript-deployments-with-brian-leroux/)</p><p>- [SWR, Zeit's data-fetching library for React](https://github.com/zeit/swr)</p>
]]></description>
      <pubDate>Wed, 8 Apr 2020 13:57:12 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://embermap.com/podcast/what-s-been-the-primary-driver-of-javascript-adoption</link>
      <content:encoded><![CDATA[<p>Sam and Ryan discuss what has driven JavaScript adoption on the web over the past 5-10 years, and what implications those drivers have had for the tools and frameworks we work with today. They also talk about why it's still so hard to build good SPA experiences on the web.</p><p> </p><p>Topics include:</p><p>- 5:10 – Finding real-world pain points</p><p>- 8:44 – Mirage Inspector's serverless backend</p><p>- 15:30 – Not being happy with our stack</p><p>- 18:38 – Why on SPAs on the web tend to be so awful?</p><p>- 30:37 – What has driven JS adoption?</p><p>- 45:42 - GraphQL vs Rails 5 years in</p><p>- 49:10 – SWR and a useResource hook</p><p> </p><p>Links:</p><p>- [Tailwind CSS Tips, Tricks + Best Practices](https://www.youtube.com/watch?v=nqNIy8HkEQ8)</p><p>- [JavaScript Deployments with Brian LeRoux](https://softwareengineeringdaily.com/2020/03/04/javascript-deployments-with-brian-leroux/)</p><p>- [SWR, Zeit's data-fetching library for React](https://github.com/zeit/swr)</p>
]]></content:encoded>
      <enclosure length="64572925" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/8fe78b20-2bb8-4010-a9ba-73b8997cf807/feature-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>What&apos;s been the primary driver of JavaScript adoption?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:07:16</itunes:duration>
      <itunes:summary>Sam and Ryan discuss what has driven JavaScript adoption on the web over the past 5-10 years, and what implications those drivers have had for the tools and frameworks we work with today. They also talk about why it&apos;s still so hard to build good SPA experiences on the web.</itunes:summary>
      <itunes:subtitle>Sam and Ryan discuss what has driven JavaScript adoption on the web over the past 5-10 years, and what implications those drivers have had for the tools and frameworks we work with today. They also talk about why it&apos;s still so hard to build good SPA experiences on the web.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>92</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">777331b1-30bc-48ec-8de4-dc9e27116caf</guid>
      <title>Does route-based code splitting make UX worse?</title>
      <description><![CDATA[<p>Sam and Ryan talk about the tradeoffs between shipping a single bundle of code vs. the route-based code splitting approach used by many tools like Gatsby and Next. They also talk about their recent experiences building with React, and whether web developers should compete with native experiences or embrace what the web has to offer.</p><p> </p><p>Topics include:</p><p>- 2:38 – In React, there are no components</p><p>- 13:45 – The feeling of momentum in React</p><p>- 23:33 – SPA bundles vs. per-page code splitting</p><p>- 45:33 - Conceptual code splitting, and web experiences vs. native experiences</p><p>- 1:06:30 – React.Children utilities</p><p> </p><p>Links:</p><p>- [Domain Modeling with Mirage JS training](https://www.youtube.com/watch?v=lfDBb0Ar-rc)</p><p>- [Mirage JS Inspector Livestream 1](https://www.youtube.com/watch?v=WTDj7MXzejc)</p><p>- [Mirage JS Inspector Livestream 2](https://www.youtube.com/watch?v=odcfQAwYGrc)</p><p>- [Mirage JS Inspector Livestream 3](https://www.youtube.com/watch?v=knSI60CTZ-U)</p>
]]></description>
      <pubDate>Wed, 1 Apr 2020 11:56:35 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://embermap.com/podcast/does-route-based-code-splitting-make-ux-worse</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about the tradeoffs between shipping a single bundle of code vs. the route-based code splitting approach used by many tools like Gatsby and Next. They also talk about their recent experiences building with React, and whether web developers should compete with native experiences or embrace what the web has to offer.</p><p> </p><p>Topics include:</p><p>- 2:38 – In React, there are no components</p><p>- 13:45 – The feeling of momentum in React</p><p>- 23:33 – SPA bundles vs. per-page code splitting</p><p>- 45:33 - Conceptual code splitting, and web experiences vs. native experiences</p><p>- 1:06:30 – React.Children utilities</p><p> </p><p>Links:</p><p>- [Domain Modeling with Mirage JS training](https://www.youtube.com/watch?v=lfDBb0Ar-rc)</p><p>- [Mirage JS Inspector Livestream 1](https://www.youtube.com/watch?v=WTDj7MXzejc)</p><p>- [Mirage JS Inspector Livestream 2](https://www.youtube.com/watch?v=odcfQAwYGrc)</p><p>- [Mirage JS Inspector Livestream 3](https://www.youtube.com/watch?v=knSI60CTZ-U)</p>
]]></content:encoded>
      <enclosure length="85358035" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/668d3de1-c140-4978-b031-2719530c6332/feature-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Does route-based code splitting make UX worse?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:28:55</itunes:duration>
      <itunes:summary>Sam and Ryan talk about the tradeoffs between shipping a single bundle of code vs. the route-based code splitting approach used by many tools like Gatsby and Next. They also talk about their recent experiences building with React, and whether web developers should compete with native experiences or embrace what the web has to offer.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about the tradeoffs between shipping a single bundle of code vs. the route-based code splitting approach used by many tools like Gatsby and Next. They also talk about their recent experiences building with React, and whether web developers should compete with native experiences or embrace what the web has to offer.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>91</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">b3203642-6a38-4914-aae2-31479c9b4ff2</guid>
      <title>We can&apos;t stop talking about edge deploys</title>
      <description><![CDATA[<p>Topics include:</p><ul><li>0:44 - Tailwind UI</li><li>4:27 - Framework-agnostic tools</li><li>11:44 - Logux</li><li>33:31 - Next, code on the edge, static websites, and caching</li></ul><p>Links:</p><ul><li><a href="https://softwareengineeringdaily.com/category/all-episodes/exclusive-content/Podcast/">Software Engineering Daily</a></li><li><a href="https://tailwindui.com/">Tailwind UI</a></li><li><a href="https://logux.io/">Logux</a></li><li><a href="https://nextjs.org/blog/next-9-3">Next.js 9.3</a></li></ul>
]]></description>
      <pubDate>Wed, 25 Mar 2020 14:49:22 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Topics include:</p><ul><li>0:44 - Tailwind UI</li><li>4:27 - Framework-agnostic tools</li><li>11:44 - Logux</li><li>33:31 - Next, code on the edge, static websites, and caching</li></ul><p>Links:</p><ul><li><a href="https://softwareengineeringdaily.com/category/all-episodes/exclusive-content/Podcast/">Software Engineering Daily</a></li><li><a href="https://tailwindui.com/">Tailwind UI</a></li><li><a href="https://logux.io/">Logux</a></li><li><a href="https://nextjs.org/blog/next-9-3">Next.js 9.3</a></li></ul>
]]></content:encoded>
      <enclosure length="82417274" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/02a7e661-62a8-41e0-9199-8b383cf81beb/audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>We can&apos;t stop talking about edge deploys</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:25:51</itunes:duration>
      <itunes:summary>Sam and Ryan continue their discussion on deploying SPAs to the edge. They talk about how the newest features in the latest Next.js release can better help developers think through server-side, client-side, and build-time data-fetching scenarios. They also discuss building an application with Logux and Tailwind UI.</itunes:summary>
      <itunes:subtitle>Sam and Ryan continue their discussion on deploying SPAs to the edge. They talk about how the newest features in the latest Next.js release can better help developers think through server-side, client-side, and build-time data-fetching scenarios. They also discuss building an application with Logux and Tailwind UI.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>90</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">1c026f84-0248-43af-af34-eb7491a0e3d8</guid>
      <title>Yehuda Katz on Thinking Long Term about Experimentation vs. Fragmentation in OSS</title>
      <description><![CDATA[<p>Yehuda Katz joins Sam to talk about the strategies Ember's developed to keep the majority of the community on recent versions of the framework for more than 8 years. He talks about lessons learned from the 1.13 upgrade, how the core team thinks about API experimentation vs. community fragmentation, and the approach Octane is taking to enable frontend developers that know HTML and CSS to ship interactive sites with Ember.</p><p> </p><p>Topics include:</p><p>- 5:15 – What experiences led Ember to prioritize bringing the entire community along for upgrades and changes to the programming model</p><p>- 21:22 – Why open source libraries shouldn't couple breaking changes to conceptual changes</p><p>- 31:30 – How to think about the tradeoff between fragmentation and experimentation</p><p>- 40:00 – How Ember is exposing more low-level primitives while still emphasizing its higher-level APIs</p><p>- 45:01 – What mattered to Yehuda when he became a programmer, and how he's bringing that to the Ember community</p><p>- 1:02:20 – Why Octane embraces HTML</p><p>- 1:12:04 – What type of developer Octane targets</p><p>- 1:24:22 – What the modern version of Rails' blog in 15 minutes could look like</p><p> </p><p>Links:</p><p>- [Together: The Merb Story](https://yehudakatz.com/2020/02/19/together-the-merb-story/), Yehuda Katz</p><p>- ["We're the Together Framework"](https://yehudakatz.com/2020/03/09/the-together-framework/), Yehuda Katz</p><p>- [Coronavirus will also cause a loneliness epidemic](https://www.vox.com/2020/3/12/21173938/coronavirus-covid-19-social-distancing-elderly-epidemic-isolation-quarantine)</p>
]]></description>
      <pubDate>Fri, 20 Mar 2020 13:42:49 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://embermap.com/podcast/yehuda-katz-on-thinking-long-term-about-experimentation-vs-fragmentation-in-oss</link>
      <content:encoded><![CDATA[<p>Yehuda Katz joins Sam to talk about the strategies Ember's developed to keep the majority of the community on recent versions of the framework for more than 8 years. He talks about lessons learned from the 1.13 upgrade, how the core team thinks about API experimentation vs. community fragmentation, and the approach Octane is taking to enable frontend developers that know HTML and CSS to ship interactive sites with Ember.</p><p> </p><p>Topics include:</p><p>- 5:15 – What experiences led Ember to prioritize bringing the entire community along for upgrades and changes to the programming model</p><p>- 21:22 – Why open source libraries shouldn't couple breaking changes to conceptual changes</p><p>- 31:30 – How to think about the tradeoff between fragmentation and experimentation</p><p>- 40:00 – How Ember is exposing more low-level primitives while still emphasizing its higher-level APIs</p><p>- 45:01 – What mattered to Yehuda when he became a programmer, and how he's bringing that to the Ember community</p><p>- 1:02:20 – Why Octane embraces HTML</p><p>- 1:12:04 – What type of developer Octane targets</p><p>- 1:24:22 – What the modern version of Rails' blog in 15 minutes could look like</p><p> </p><p>Links:</p><p>- [Together: The Merb Story](https://yehudakatz.com/2020/02/19/together-the-merb-story/), Yehuda Katz</p><p>- ["We're the Together Framework"](https://yehudakatz.com/2020/03/09/the-together-framework/), Yehuda Katz</p><p>- [Coronavirus will also cause a loneliness epidemic](https://www.vox.com/2020/3/12/21173938/coronavirus-covid-19-social-distancing-elderly-epidemic-isolation-quarantine)</p>
]]></content:encoded>
      <enclosure length="97062146" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/8290487e-79fd-4f81-a3a4-ae39bd5fbb3d/feature-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Yehuda Katz on Thinking Long Term about Experimentation vs. Fragmentation in OSS</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:41:06</itunes:duration>
      <itunes:summary>Yehuda Katz joins Sam to talk about the strategies Ember&apos;s developed to keep the majority of the community on recent versions of the framework for more than 8 years. He talks about lessons learned from the 1.13 upgrade, how the core team thinks about API experimentation vs. community fragmentation, and the approach Octane is taking to enable frontend developers that know HTML and CSS to ship interactive sites with Ember.</itunes:summary>
      <itunes:subtitle>Yehuda Katz joins Sam to talk about the strategies Ember&apos;s developed to keep the majority of the community on recent versions of the framework for more than 8 years. He talks about lessons learned from the 1.13 upgrade, how the core team thinks about API experimentation vs. community fragmentation, and the approach Octane is taking to enable frontend developers that know HTML and CSS to ship interactive sites with Ember.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>89</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">33b8ed8c-934e-4a85-abf1-383534870ede</guid>
      <title>Mike Perham on Sustaining Open Source with Sidekiq and Faktory</title>
      <description><![CDATA[<p>Topics include:</p><p>- 0:00 - What is Faktory?</p><p>- 2:28 – Why might I need a background job?</p><p>- 13:26 – Why did you make Sidekiq?</p><p>- 16:15 – What lead to Faktory?</p><p>- 24:02 – Why'd you use Go to implement Faktory's server?</p><p>- 25:36 – Who is Faktory for?</p><p>- 31:58 – What's the most interesting thing you've learned about architecting background job systems?</p><p>- 36:24 – How do you see job queuing work in a serverless world?</p><p>- 41:23 – What are some of your thoughts on open source sustainability?</p><p>- 46:48 – What makes a library productizable?</p><p>- 48:30 – Were you thinking entrepreneurially when starting Sidekiq?</p><p>- 53:30 – Could open source sustainability be solved by a marketplace or middleman?</p><p>- 55:14 – How has your business model and financial incentives affected the development of your open source libraries?</p><p>- 1:00:30 – How do you think about API additions and feature requests to Sidekiq?</p><p> </p><p>Links:</p><p>- [Faktory](https://github.com/contribsys/faktory)</p><p>- [Sidekiq](https://sidekiq.org)</p><p>- [Mike on Twitter](https://twitter.com/getajobmike)</p><p>- [Mike's blog](https://www.mikeperham.com)</p><p>- [Building a $1 Million Business Solo with Mike Perham of Sidekiq](https://www.indiehackers.com/podcast/016-mike-perham-of-sidekiq)</p>
]]></description>
      <pubDate>Wed, 11 Mar 2020 10:00:11 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://embermap.com/podcast/mike-perham-on-sustaining-open-source-with-sidekiq-and-faktory</link>
      <content:encoded><![CDATA[<p>Topics include:</p><p>- 0:00 - What is Faktory?</p><p>- 2:28 – Why might I need a background job?</p><p>- 13:26 – Why did you make Sidekiq?</p><p>- 16:15 – What lead to Faktory?</p><p>- 24:02 – Why'd you use Go to implement Faktory's server?</p><p>- 25:36 – Who is Faktory for?</p><p>- 31:58 – What's the most interesting thing you've learned about architecting background job systems?</p><p>- 36:24 – How do you see job queuing work in a serverless world?</p><p>- 41:23 – What are some of your thoughts on open source sustainability?</p><p>- 46:48 – What makes a library productizable?</p><p>- 48:30 – Were you thinking entrepreneurially when starting Sidekiq?</p><p>- 53:30 – Could open source sustainability be solved by a marketplace or middleman?</p><p>- 55:14 – How has your business model and financial incentives affected the development of your open source libraries?</p><p>- 1:00:30 – How do you think about API additions and feature requests to Sidekiq?</p><p> </p><p>Links:</p><p>- [Faktory](https://github.com/contribsys/faktory)</p><p>- [Sidekiq](https://sidekiq.org)</p><p>- [Mike on Twitter](https://twitter.com/getajobmike)</p><p>- [Mike's blog](https://www.mikeperham.com)</p><p>- [Building a $1 Million Business Solo with Mike Perham of Sidekiq](https://www.indiehackers.com/podcast/016-mike-perham-of-sidekiq)</p>
]]></content:encoded>
      <enclosure length="66826563" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/2a2e1f01-5699-4ed2-8904-88dfc691e5d7/feature-2-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Mike Perham on Sustaining Open Source with Sidekiq and Faktory</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:09:37</itunes:duration>
      <itunes:summary>Mike Perham joins Sam and Ryan to talk about Sidekiq, his popular background job library for Ruby developers, and his new project Faktory which brings the same capabilities to developers working in any language including JavaScript. He also talks about the business he&apos;s formed around his projects which provides his main source of income and has sustained his open source development for more than 10 years.</itunes:summary>
      <itunes:subtitle>Mike Perham joins Sam and Ryan to talk about Sidekiq, his popular background job library for Ruby developers, and his new project Faktory which brings the same capabilities to developers working in any language including JavaScript. He also talks about the business he&apos;s formed around his projects which provides his main source of income and has sustained his open source development for more than 10 years.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>88</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">c1179ba3-06f7-4066-a6a9-213ecfa01d3e</guid>
      <title>What&apos;s the best SPA architecture for edge deploys?</title>
      <description><![CDATA[<p>Topics include:</p><p>- 6:00 - Exploring Next.js's architecture</p><p>- 22:33 - Is runtime SSR an antipattern?</p><p>- 44:04 - Are there any downsides to this architecture?</p><p>- 1:11:25 - React's single shot SSR vs. Ember's asynchronous FastBoot rendering</p><p> </p><p>Links:</p><p>- [CAP theorem](https://en.wikipedia.org/wiki/CAP_theorem)</p><p>- [Tweet from Guillermo: "Most use cases of SSR are better served by SSG"](https://twitter.com/rauchg/status/1226353359759634432)</p>
]]></description>
      <pubDate>Wed, 19 Feb 2020 14:35:10 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://embermap.com/podcast/what-s-the-best-spa-architecture-for-edge-deploys</link>
      <content:encoded><![CDATA[<p>Topics include:</p><p>- 6:00 - Exploring Next.js's architecture</p><p>- 22:33 - Is runtime SSR an antipattern?</p><p>- 44:04 - Are there any downsides to this architecture?</p><p>- 1:11:25 - React's single shot SSR vs. Ember's asynchronous FastBoot rendering</p><p> </p><p>Links:</p><p>- [CAP theorem](https://en.wikipedia.org/wiki/CAP_theorem)</p><p>- [Tweet from Guillermo: "Most use cases of SSR are better served by SSG"](https://twitter.com/rauchg/status/1226353359759634432)</p>
]]></content:encoded>
      <enclosure length="129979357" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/ced3dd62-9350-4f76-bc93-40b9ceb28a2a/feature-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>What&apos;s the best SPA architecture for edge deploys?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>02:15:24</itunes:duration>
      <itunes:summary>Sam and Ryan talk about the architecture of Zeit&apos;s Next.js framework and the concept of edge deploys. They discuss the difference between data that must be fetched at runtime vs. data that can be cached, and how application developers might best express which parts of their apps can tolerate stale data.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about the architecture of Zeit&apos;s Next.js framework and the concept of edge deploys. They discuss the difference between data that must be fetched at runtime vs. data that can be cached, and how application developers might best express which parts of their apps can tolerate stale data.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>87</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">24708205-2988-406c-89f1-235c7ddadf89</guid>
      <title>Declarative Code and DevOps</title>
      <description><![CDATA[<p>Topics include:</p><p>- 3:33 – Is usePrevious a bad hook?</p><p>- 14:13 – Does declarative code make sense for app logic that's about state transitions, like animations?</p><p>- 40:04 – Dependabot shifts some of the app maintenance burden from the app developer to the ops team. How might CI providers help solve these new devops issues?</p><p>- 51:43 – GitHub actions</p><p> </p><p>Links:</p><p>- [React Spring](https://www.react-spring.io)</p><p>- [Framer Motion](https://www.framer.com/motion/)</p><p>- [Dependabot](https://dependabot.com)</p><p>- [GitHub Actions](https://github.com/features/actions)</p>
]]></description>
      <pubDate>Wed, 12 Feb 2020 11:00:13 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://embermap.com/podcast/declarative-code-and-devops</link>
      <content:encoded><![CDATA[<p>Topics include:</p><p>- 3:33 – Is usePrevious a bad hook?</p><p>- 14:13 – Does declarative code make sense for app logic that's about state transitions, like animations?</p><p>- 40:04 – Dependabot shifts some of the app maintenance burden from the app developer to the ops team. How might CI providers help solve these new devops issues?</p><p>- 51:43 – GitHub actions</p><p> </p><p>Links:</p><p>- [React Spring](https://www.react-spring.io)</p><p>- [Framer Motion](https://www.framer.com/motion/)</p><p>- [Dependabot](https://dependabot.com)</p><p>- [GitHub Actions](https://github.com/features/actions)</p>
]]></content:encoded>
      <enclosure length="64389023" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/c9b30649-8ba8-4e68-8103-c68dc745e682/feature-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Declarative Code and DevOps</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:07:04</itunes:duration>
      <itunes:summary>Sam and Ryan talk about whether it makes sense to code state transitions declaratively, and the implictions that question has for writing React code. They also talk about scaling problems that arise from using Dependabot, and how CI services might fix them.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about whether it makes sense to code state transitions declaratively, and the implictions that question has for writing React code. They also talk about scaling problems that arise from using Dependabot, and how CI services might fix them.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>86</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">6872b47d-7cd7-4418-9228-de47ed956bb6</guid>
      <title>Launching Mirage JS!</title>
      <description><![CDATA[<p>Topics include:</p><p>- 2:46 – Launching Mirage JS!</p><p>- 10:17 – Feeling empowered bringing Mirage to the wider JS ecosystem, and what's next for Mirage</p><p>- 19:40 – A Mirage tutorial + video series</p><p>- 19:30 – GraphQL support in Mirage</p><p>- 30:13 – TypeScript support in Mirage</p><p>- 37:25 – Node support in Mirage</p><p> </p><p>Links:</p><p>- [Mirage's new homepage](https://miragejs.com)</p>
]]></description>
      <pubDate>Wed, 29 Jan 2020 11:00:04 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Topics include:</p><p>- 2:46 – Launching Mirage JS!</p><p>- 10:17 – Feeling empowered bringing Mirage to the wider JS ecosystem, and what's next for Mirage</p><p>- 19:40 – A Mirage tutorial + video series</p><p>- 19:30 – GraphQL support in Mirage</p><p>- 30:13 – TypeScript support in Mirage</p><p>- 37:25 – Node support in Mirage</p><p> </p><p>Links:</p><p>- [Mirage's new homepage](https://miragejs.com)</p>
]]></content:encoded>
      <enclosure length="42043253" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/439f4aa6-54fd-483d-a0d5-960ebcbb5e4c/feature-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Launching Mirage JS!</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:43:48</itunes:duration>
      <itunes:summary>Sam and Ryan reflect on the launch of Mirage JS, talk about a planned tutorial and video series for the project, and discuss the most-requested features like GraphQL and TypeScript.</itunes:summary>
      <itunes:subtitle>Sam and Ryan reflect on the launch of Mirage JS, talk about a planned tutorial and video series for the project, and discuss the most-requested features like GraphQL and TypeScript.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>85</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">545aadc3-fd47-419b-a38a-ed532849cbab</guid>
      <title>When UI isn&apos;t a function of state</title>
      <description><![CDATA[<p>Topics include:</p><p>- 4:45 - Building out Mirage's new homepage. SVG positioning.</p><p>- 15:42 - CSS Grid for layouts</p><p>- 19:36 - Update on launching Mirage JS. Adding types to Mirage.</p><p>- 24:09 - Learning about idempotence through React Spring. What to do when UI isn't a function of state.</p><p>- 52:40 - Sharp tools vs. high-level APIs</p><p> </p><p>Links:</p><p>- [React Spring](https://www.react-spring.io)</p><p>- [Small, Sharp Tools](https://brandur.org/small-sharp-tools)</p>
]]></description>
      <pubDate>Wed, 22 Jan 2020 11:00:22 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://embermap.com/podcast/when-ui-isn-t-a-function-of-state</link>
      <content:encoded><![CDATA[<p>Topics include:</p><p>- 4:45 - Building out Mirage's new homepage. SVG positioning.</p><p>- 15:42 - CSS Grid for layouts</p><p>- 19:36 - Update on launching Mirage JS. Adding types to Mirage.</p><p>- 24:09 - Learning about idempotence through React Spring. What to do when UI isn't a function of state.</p><p>- 52:40 - Sharp tools vs. high-level APIs</p><p> </p><p>Links:</p><p>- [React Spring](https://www.react-spring.io)</p><p>- [Small, Sharp Tools](https://brandur.org/small-sharp-tools)</p>
]]></content:encoded>
      <enclosure length="62722619" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/e8b7ea91-47af-4caf-940d-22f3ebcc867e/feature-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>When UI isn&apos;t a function of state</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:05:20</itunes:duration>
      <itunes:summary>Sam and Ryan discuss how transitions in a JavaScript app are typically not exhaustively coded as functions of state, and how that can make them difficult to build. They also talk about different ways to work with complex SVG assets in the browser, using CSS grid for page layouts, and the differences in the React and Ember ecosystems when it comes to small vs. large tools.</itunes:summary>
      <itunes:subtitle>Sam and Ryan discuss how transitions in a JavaScript app are typically not exhaustively coded as functions of state, and how that can make them difficult to build. They also talk about different ways to work with complex SVG assets in the browser, using CSS grid for page layouts, and the differences in the React and Ember ecosystems when it comes to small vs. large tools.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>84</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">407a9434-0ff3-4b57-a63a-9f1571ee7887</guid>
      <title>How should we style the stuff in between components?</title>
      <description><![CDATA[<p>Topics include:</p><ul><li>3:17 - Refactoring to Tailwind defaults</li><li>11:17 - What exactly are Container components?</li><li>17:35 - Marginless components</li><li>23:40 - Grids</li><li>25:50 - What you can learn by using Tailwind defaults</li><li>41:00 - Using Mirage tests to re-create development scenarios</li><li>50:45 - Frontend First</li></ul><p>Links:</p><ul><li><a href="https://tailwindcss.com/">Tailwind CSS</a></li><li><a href="https://www.youtube.com/watch?v=jnV1u67_yVg">ReactiveConf 2019 - Mark Dalgleish: Rethinking Design Practices</a></li><li><a href="https://www.frontendfirstdevelopment.com/">Frontend First Development</a></li></ul>
]]></description>
      <pubDate>Wed, 8 Jan 2020 11:00:04 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Topics include:</p><ul><li>3:17 - Refactoring to Tailwind defaults</li><li>11:17 - What exactly are Container components?</li><li>17:35 - Marginless components</li><li>23:40 - Grids</li><li>25:50 - What you can learn by using Tailwind defaults</li><li>41:00 - Using Mirage tests to re-create development scenarios</li><li>50:45 - Frontend First</li></ul><p>Links:</p><ul><li><a href="https://tailwindcss.com/">Tailwind CSS</a></li><li><a href="https://www.youtube.com/watch?v=jnV1u67_yVg">ReactiveConf 2019 - Mark Dalgleish: Rethinking Design Practices</a></li><li><a href="https://www.frontendfirstdevelopment.com/">Frontend First Development</a></li></ul>
]]></content:encoded>
      <enclosure length="57348500" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/76b72545-e1b5-4856-8f16-923667367371/audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>How should we style the stuff in between components?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:59:44</itunes:duration>
      <itunes:summary>Sam tells Ryan about his insights from refactoring EmberMap&apos;s frontend codebase to use Tailwind 1.0&apos;s default styles. They also discuss how to think about container, grid, and marginless components, as well as the benefits of using Mirage testing scenarios to recreate development environments.</itunes:summary>
      <itunes:subtitle>Sam tells Ryan about his insights from refactoring EmberMap&apos;s frontend codebase to use Tailwind 1.0&apos;s default styles. They also discuss how to think about container, grid, and marginless components, as well as the benefits of using Mirage testing scenarios to recreate development environments.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>83</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">4be83134-377f-4581-8aaa-48d225aa2071</guid>
      <title>Which concepts should a framework teach?</title>
      <description><![CDATA[<p>Topics include:</p><p>- 0:40 – Which concepts should a framework be responsible for teaching?</p><p>- 7:20 – What does it actually take for someone to start using a framework? And Vue's multiparadigm approach.</p><p>- 16:32 – What if Ember Data wasn't part of Ember?</p><p>- 29:50 – Functional digression</p><p>- 37:00 – Back to Ember Data!</p><p>- 43:34 – When paradigms conflict with each other</p><p>- 49:46 – Back to Ember Data, again!</p><p> </p><p>Links:</p><p>- [Vue composition API](https://vue-composition-api-rfc.netlify.com)</p><p>- [MobX](https://mobx.js.org/README.html)</p>
]]></description>
      <pubDate>Fri, 20 Dec 2019 11:00:01 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://embermap.com/podcast/which-concepts-should-a-framework-teach</link>
      <content:encoded><![CDATA[<p>Topics include:</p><p>- 0:40 – Which concepts should a framework be responsible for teaching?</p><p>- 7:20 – What does it actually take for someone to start using a framework? And Vue's multiparadigm approach.</p><p>- 16:32 – What if Ember Data wasn't part of Ember?</p><p>- 29:50 – Functional digression</p><p>- 37:00 – Back to Ember Data!</p><p>- 43:34 – When paradigms conflict with each other</p><p>- 49:46 – Back to Ember Data, again!</p><p> </p><p>Links:</p><p>- [Vue composition API](https://vue-composition-api-rfc.netlify.com)</p><p>- [MobX](https://mobx.js.org/README.html)</p>
]]></content:encoded>
      <enclosure length="66991654" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/2ba0c202-6b05-4f15-9a1c-1946924811d7/feature-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Which concepts should a framework teach?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:09:47</itunes:duration>
      <itunes:summary>Sam and Ryan talk about the actual vs. perceived boundaries between Ember and Ember Data, and what it would look like if Ember Data were more separate from Ember than it has been historically. They also chat more generally about which concepts should be taught by official framework documentation, as well as a digression into APIs that appear impure but that are actually functionally pure.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about the actual vs. perceived boundaries between Ember and Ember Data, and what it would look like if Ember Data were more separate from Ember than it has been historically. They also chat more generally about which concepts should be taught by official framework documentation, as well as a digression into APIs that appear impure but that are actually functionally pure.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>82</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">222fdc1f-0525-420e-87af-3d6f201344be</guid>
      <title>An ORM by any other name</title>
      <description><![CDATA[<p>Topics include:</p><p>- 5:41 – Hasura, React, URQL + Formik = Nutrition app</p><p>- 44:51 – React to the Future by Jordan Walke</p><p> </p><p>Links:</p><p>- [URQL](https://formidable.com/open-source/urql/)</p><p>- [Formik](https://jaredpalmer.com/formik)</p><p>- [Reach Dialog](https://reacttraining.com/reach-ui/dialog)</p><p>- [Dan Abramov's tweet on controlled/uncontrolled components](https://twitter.com/dan_abramov/status/1200436185426006017)</p><p>- [React to the Future - Jordan Walke](https://www.youtube.com/watch?v=5fG_lyNuEAw)</p><p>- [Let's Program Like It's 1999 - Lee Byron](https://www.youtube.com/watch?v=vG8WpLr6y_U)</p><p>- [Functional Programming in 40 Minutes - Russ Olsen](https://www.youtube.com/watch?v=0if71HOyVjY)</p><p>- [Reason ML](https://reasonml.github.io)</p>
]]></description>
      <pubDate>Thu, 5 Dec 2019 11:00:18 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://embermap.com/podcast/an-orm-by-any-other-name</link>
      <content:encoded><![CDATA[<p>Topics include:</p><p>- 5:41 – Hasura, React, URQL + Formik = Nutrition app</p><p>- 44:51 – React to the Future by Jordan Walke</p><p> </p><p>Links:</p><p>- [URQL](https://formidable.com/open-source/urql/)</p><p>- [Formik](https://jaredpalmer.com/formik)</p><p>- [Reach Dialog](https://reacttraining.com/reach-ui/dialog)</p><p>- [Dan Abramov's tweet on controlled/uncontrolled components](https://twitter.com/dan_abramov/status/1200436185426006017)</p><p>- [React to the Future - Jordan Walke](https://www.youtube.com/watch?v=5fG_lyNuEAw)</p><p>- [Let's Program Like It's 1999 - Lee Byron](https://www.youtube.com/watch?v=vG8WpLr6y_U)</p><p>- [Functional Programming in 40 Minutes - Russ Olsen](https://www.youtube.com/watch?v=0if71HOyVjY)</p><p>- [Reason ML](https://reasonml.github.io)</p>
]]></content:encoded>
      <enclosure length="81598074" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/c7031be9-135b-4f82-a41f-29cd5ae3ea93/feature-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>An ORM by any other name</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:25:00</itunes:duration>
      <itunes:summary>Sam and Ryan talk about how the URQL GraphQL library gives you an ORM-like experience in React – despite ORMs being generally eschewed by the community. They also chat about Jordan Walke&apos;s recent talk from ReasonConf, and whether they agree with his conclusion that functional programming is the reason React became popular.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about how the URQL GraphQL library gives you an ORM-like experience in React – despite ORMs being generally eschewed by the community. They also chat about Jordan Walke&apos;s recent talk from ReasonConf, and whether they agree with his conclusion that functional programming is the reason React became popular.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>81</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">16ea5064-82eb-4070-b552-27aead289358</guid>
      <title>When composability is not the answer</title>
      <description><![CDATA[<p>Topics include:</p><ul><li>0:00 – Livable code with Ember</li><li>3:09 – Speeding up Ember builds, and bugs with React rebuilds</li><li>7:09 – Undoing bad abstractions</li><li>11:30 – Building a mobile nav with React Spring + Reach Modal</li><li>18:48 – Documentation: Guides vs. How-tos vs. Examples</li><li>34:40 – Composability, and awareness of React's children vs. Ember's yield</li><li>38:30 – Structural vs. reusable components</li><li>54:54 – UI Testing</li><li>1:03:04 – Does advice for building good libraries transfer to buiding good apps?</li></ul><p>Links:</p><ul><li><a href="https://www.divio.com/blog/documentation/">What nobody tells you about documentation</a>, by Daniele Procida</li><li><a href="https://www.react-spring.io/">React Spring</a></li><li><a href="https://www.youtube.com/watch?v=3XaXKiXtNjw">Using Composition in React to Avoid "Prop Drilling"</a>, by Michael Jackson</li><li><a href="https://miragejs.com/quickstarts/vue/cypress">Mirage and Cypress Quickstart</a></li></ul>
]]></description>
      <pubDate>Wed, 27 Nov 2019 11:00:18 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Topics include:</p><ul><li>0:00 – Livable code with Ember</li><li>3:09 – Speeding up Ember builds, and bugs with React rebuilds</li><li>7:09 – Undoing bad abstractions</li><li>11:30 – Building a mobile nav with React Spring + Reach Modal</li><li>18:48 – Documentation: Guides vs. How-tos vs. Examples</li><li>34:40 – Composability, and awareness of React's children vs. Ember's yield</li><li>38:30 – Structural vs. reusable components</li><li>54:54 – UI Testing</li><li>1:03:04 – Does advice for building good libraries transfer to buiding good apps?</li></ul><p>Links:</p><ul><li><a href="https://www.divio.com/blog/documentation/">What nobody tells you about documentation</a>, by Daniele Procida</li><li><a href="https://www.react-spring.io/">React Spring</a></li><li><a href="https://www.youtube.com/watch?v=3XaXKiXtNjw">Using Composition in React to Avoid "Prop Drilling"</a>, by Michael Jackson</li><li><a href="https://miragejs.com/quickstarts/vue/cypress">Mirage and Cypress Quickstart</a></li></ul>
]]></content:encoded>
      <enclosure length="73357591" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/0286f61a-d2b5-439d-b7f3-0c7416d04fec/feature3-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>When composability is not the answer</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:16:25</itunes:duration>
      <itunes:summary>Sam and Ryan chat about composability, and situations where it gets in the way of development. They also discuss adding animations to a React app and why application developers shouldn&apos;t always follow the advice of library authors.</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about composability, and situations where it gets in the way of development. They also discuss adding animations to a React app and why application developers shouldn&apos;t always follow the advice of library authors.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>80</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">3f69ff2e-4cc1-436a-b4cc-a72a7f4856cf</guid>
      <title>Yehuda Katz on Paradigms vs. Abstractions in UI Development</title>
      <description><![CDATA[<p>Topics include:</p><p>- 1:46 – Exploring the React paradigm</p><p>- 11:45 – How have your opinions on UI dev changed since starting Ember?</p><p>- 16:00 – How React's render functions and Ember's templates both solve the same problem: how to restrict the rendering code that users write</p><p>- 34:03 – JavaScript's multiparadigm approach: OOP + functional</p><p>- 40:13 - Hooks and the importance of lifecycle entanglement</p><p>- 46:15 – Do Hooks succeed in bringing the ideas of declarative rendering to our JavaScript code?</p><p>- 53:58 – The ES module spec, ES imports, and ES modules vs. CJS modules</p><p>- 1:04:55 – Are TypeScript users at risk of the same kinds of syntax collisions that CoffeeScript users once were?</p><p>- 1:10:10 – TypeScript now doesn't ship unstable features. (e.g. Optional chaining is stage 3)</p><p>- 1:15:35 – Yehuda's take on stage 0 through stage 4 ECMAScript proposals</p><p>- 1:23:39 – What's missing from UI development? And the difference between paradigms and abstractions.</p><p>- 1:31:00 – Ember's original sin was push-based reactivity. Pull-based is how programs work.</p><p>- 1:40:30 – Ember needs a new lifecycle entanglement primitive, that borrows concepts from both Hooks and Ember Concurrency tasks</p><p>- 1:57:07 – How do you feel about UI development in 2019?</p><p> </p><p>Links:</p><p>- [No Silver Bullet](http://worrydream.com/refs/Brooks-NoSilverBullet.pdf), by Fred Books</p><p>- [React Hook Pitfalls](https://www.youtube.com/watch?v=VIRcX2X7EUk), by Kent C. Dodds</p>
]]></description>
      <pubDate>Wed, 13 Nov 2019 11:00:26 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://embermap.com/podcast/yehuda-katz-on-paradigms-vs-abstractions-in-ui-development</link>
      <content:encoded><![CDATA[<p>Topics include:</p><p>- 1:46 – Exploring the React paradigm</p><p>- 11:45 – How have your opinions on UI dev changed since starting Ember?</p><p>- 16:00 – How React's render functions and Ember's templates both solve the same problem: how to restrict the rendering code that users write</p><p>- 34:03 – JavaScript's multiparadigm approach: OOP + functional</p><p>- 40:13 - Hooks and the importance of lifecycle entanglement</p><p>- 46:15 – Do Hooks succeed in bringing the ideas of declarative rendering to our JavaScript code?</p><p>- 53:58 – The ES module spec, ES imports, and ES modules vs. CJS modules</p><p>- 1:04:55 – Are TypeScript users at risk of the same kinds of syntax collisions that CoffeeScript users once were?</p><p>- 1:10:10 – TypeScript now doesn't ship unstable features. (e.g. Optional chaining is stage 3)</p><p>- 1:15:35 – Yehuda's take on stage 0 through stage 4 ECMAScript proposals</p><p>- 1:23:39 – What's missing from UI development? And the difference between paradigms and abstractions.</p><p>- 1:31:00 – Ember's original sin was push-based reactivity. Pull-based is how programs work.</p><p>- 1:40:30 – Ember needs a new lifecycle entanglement primitive, that borrows concepts from both Hooks and Ember Concurrency tasks</p><p>- 1:57:07 – How do you feel about UI development in 2019?</p><p> </p><p>Links:</p><p>- [No Silver Bullet](http://worrydream.com/refs/Brooks-NoSilverBullet.pdf), by Fred Books</p><p>- [React Hook Pitfalls](https://www.youtube.com/watch?v=VIRcX2X7EUk), by Kent C. Dodds</p>
]]></content:encoded>
      <enclosure length="118449953" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/d90ea5c5-4e36-4017-bec1-93850547fc81/feature-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Yehuda Katz on Paradigms vs. Abstractions in UI Development</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>02:03:23</itunes:duration>
      <itunes:summary>Yehuda Katz joins Sam and Ryan to talk about modern JavaScript UI development. He discusses the most important ideas React brought to the JS community, whether programming paradigms are as important as developers are led to believe, the design of ES modules and classes, the multiparadigm nature of JavaScript, the past and future of Ember, and his excitement over the future of JavaScript UI development.</itunes:summary>
      <itunes:subtitle>Yehuda Katz joins Sam and Ryan to talk about modern JavaScript UI development. He discusses the most important ideas React brought to the JS community, whether programming paradigms are as important as developers are led to believe, the design of ES modules and classes, the multiparadigm nature of JavaScript, the past and future of Ember, and his excitement over the future of JavaScript UI development.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>79</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">f71c031f-0b59-4f12-98a6-f3a2d4216730</guid>
      <title>React is hard!</title>
      <description><![CDATA[<p>Topics include:</p><p>- 0:32 – React is hard!</p><p>- 7:55 – Should we be thinking about render cycles while writing React?</p><p>- 30:08 – How much objective coding advice is there?</p><p>- 39:23 – The Dark language + platform, and how concurrent languages can work against serverless architecture</p><p>- 57:57 – Deployless architecture</p><p>- 1:02:25 – Auth in Hasura</p><p> </p><p>Links:</p><p>- [Dark Lang with Ellen Chisa and Paul Biggar](https://softwareengineeringdaily.com/2019/10/21/dark-lang-with-ellen-chisa-and-paul-biggar/), on the Software Engineering Daily podcast</p><p>- [The Dark language + editor](https://darklang.com/)</p>
]]></description>
      <pubDate>Thu, 31 Oct 2019 10:00:09 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://embermap.com/podcast/react-is-hard</link>
      <content:encoded><![CDATA[<p>Topics include:</p><p>- 0:32 – React is hard!</p><p>- 7:55 – Should we be thinking about render cycles while writing React?</p><p>- 30:08 – How much objective coding advice is there?</p><p>- 39:23 – The Dark language + platform, and how concurrent languages can work against serverless architecture</p><p>- 57:57 – Deployless architecture</p><p>- 1:02:25 – Auth in Hasura</p><p> </p><p>Links:</p><p>- [Dark Lang with Ellen Chisa and Paul Biggar](https://softwareengineeringdaily.com/2019/10/21/dark-lang-with-ellen-chisa-and-paul-biggar/), on the Software Engineering Daily podcast</p><p>- [The Dark language + editor](https://darklang.com/)</p>
]]></content:encoded>
      <enclosure length="74301761" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/026a782d-488d-482e-829d-fe812b8946bf/feature-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>React is hard!</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:17:24</itunes:duration>
      <itunes:summary>Sam and Ryan talk about the challenges they&apos;ve encountered when working with asynchronous code in React. They also talk about the Dark programming language + platform, and the idea of deployless architecture.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about the challenges they&apos;ve encountered when working with asynchronous code in React. They also talk about the Dark programming language + platform, and the idea of deployless architecture.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>78</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">c1749829-01f0-4c3e-9446-45dfb01861bc</guid>
      <title>Does technology get popular for the right reasons?</title>
      <description><![CDATA[<p>Topics include:</p><p>- 0:57 – Wanting to learn more about GraphQL</p><p>- 14:41 – Constraints, theory and reality in GraphQL and REST APIs</p><p>- 21:54 – What matters when choosing technology?</p><p>- 35:06 – Can GraphQL queries and types replace traditional ORMs?</p><p>- 48:47 – Why did Rails and other technologies become popular? Does it matter?</p><p>- 1:00:48 – Is there objectively true advice in programming?</p><p> </p><p>Links:</p><p>- [The Bike Shed # 215: Start With People](https://bikeshed.fm/episodes/215)</p>
]]></description>
      <pubDate>Wed, 23 Oct 2019 10:00:28 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://embermap.com/podcast/does-technology-get-popular-for-the-right-reasons</link>
      <content:encoded><![CDATA[<p>Topics include:</p><p>- 0:57 – Wanting to learn more about GraphQL</p><p>- 14:41 – Constraints, theory and reality in GraphQL and REST APIs</p><p>- 21:54 – What matters when choosing technology?</p><p>- 35:06 – Can GraphQL queries and types replace traditional ORMs?</p><p>- 48:47 – Why did Rails and other technologies become popular? Does it matter?</p><p>- 1:00:48 – Is there objectively true advice in programming?</p><p> </p><p>Links:</p><p>- [The Bike Shed # 215: Start With People](https://bikeshed.fm/episodes/215)</p>
]]></content:encoded>
      <enclosure length="68379697" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/ad962536-d0b2-483d-945e-463049c579ff/feature-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Does technology get popular for the right reasons?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:11:14</itunes:duration>
      <itunes:summary>Sam and Ryan chat about how much popularity matters when it comes to choosing and recommending technology, as well as whether a tool is responsible for its users&apos; success or failure with it. They also talk about REST and GraphQL.</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about how much popularity matters when it comes to choosing and recommending technology, as well as whether a tool is responsible for its users&apos; success or failure with it. They also talk about REST and GraphQL.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>77</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">fc5b423e-bdf1-4c0c-8ac3-c30f50394734</guid>
      <title>Imports are not code – they&apos;re declarations</title>
      <description><![CDATA[<p>Topics include:</p><p>- 2:31 – Tailwind, PostCSS, and low-level vs. high-level tools</p><p>- 13:12 – Mirage JS and Cypress</p><p>- 13:55 – Ember 3.13 and Octane</p><p>- 15:28 – Ryan's experiencing upgrading EmberMap from 3.4 to 3.12</p><p>- 20:19 - ES Modules, and learning that imports are not code</p><p>- 42:12 – React and useEffect, and the difference between reads and writes vs. rendering and event handlers</p><p>- 1:00:50 – Object-oriented vs. functional programming in JavaScript</p><p> </p><p>Links:</p><p>- [Ember 3.13 Release (Octane Preview)](https://blog.emberjs.com/2019/09/25/ember-3-13-released.html)</p><p>- [How to upgrade an Ember App or Addon](https://embermap.com/video/how-to-upgrade-an-ember-app-or-addon)</p><p>- [Rich Harris and Edward Faulkner Twitter thread about ES module design](https://twitter.com/Rich_Harris/status/1176509180951322624)</p><p>- [Twitter thread about ES module execution order](https://twitter.com/samselikoff/status/1182485014815993856)</p><p>- [Sam Selikoff on Twitter](https://twitter.com/samselikoff)</p><p>- [Ryan Toronto on Twitter](https://twitter.com/ryantotweets)</p>
]]></description>
      <pubDate>Fri, 11 Oct 2019 18:09:47 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Topics include:</p><p>- 2:31 – Tailwind, PostCSS, and low-level vs. high-level tools</p><p>- 13:12 – Mirage JS and Cypress</p><p>- 13:55 – Ember 3.13 and Octane</p><p>- 15:28 – Ryan's experiencing upgrading EmberMap from 3.4 to 3.12</p><p>- 20:19 - ES Modules, and learning that imports are not code</p><p>- 42:12 – React and useEffect, and the difference between reads and writes vs. rendering and event handlers</p><p>- 1:00:50 – Object-oriented vs. functional programming in JavaScript</p><p> </p><p>Links:</p><p>- [Ember 3.13 Release (Octane Preview)](https://blog.emberjs.com/2019/09/25/ember-3-13-released.html)</p><p>- [How to upgrade an Ember App or Addon](https://embermap.com/video/how-to-upgrade-an-ember-app-or-addon)</p><p>- [Rich Harris and Edward Faulkner Twitter thread about ES module design](https://twitter.com/Rich_Harris/status/1176509180951322624)</p><p>- [Twitter thread about ES module execution order](https://twitter.com/samselikoff/status/1182485014815993856)</p><p>- [Sam Selikoff on Twitter](https://twitter.com/samselikoff)</p><p>- [Ryan Toronto on Twitter](https://twitter.com/ryantotweets)</p>
]]></content:encoded>
      <enclosure length="64218913" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/1557feaf-7516-455b-9a39-5c68bbcad158/feature-2-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Imports are not code – they&apos;re declarations</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:06:54</itunes:duration>
      <itunes:summary>Sam and Ryan talk about a confusing situation where moving code into an ES module changed the execution order of a program. They also talk about conflicting advice over whether React&apos;s useEffect is appropriate for writing data, and chat about PostCSS, Tailwind and build tools.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about a confusing situation where moving code into an ES module changed the execution order of a program. They also talk about conflicting advice over whether React&apos;s useEffect is appropriate for writing data, and chat about PostCSS, Tailwind and build tools.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>76</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">5340e9df-472d-4604-bb4e-614126c792a0</guid>
      <title>Server-side state means global resource identity</title>
      <description><![CDATA[<p>Topics include:</p><p>- 0:00 – Dealing with asynchrony and persistence in Vue</p><p>- 8:56 – Thoughts on Vue's APIs, and how they compare with React and Ember</p><p>- 22:20 – "Magic" in UI frameworks vs. server-side frameworks</p><p>- 27:17 – Build work in Mirage JS, and a new passthrough API</p><p>- 38:26 - How opinionated should project documentation be?</p><p>- 50:40 - Edward Faulkner's talk on compilers, abstractions, ES modules, and Embroider</p><p> </p><p>Sponsors:</p><p>- [Next Release](https://www.nextrelease.io/ember/), mention EmberMap when you sign up for a trial and get 10% off</p><p> </p><p>Links:</p><p>- [Mirage JS at ReactNYC S3:E8, Nov 7](https://www.meetup.com/ReactNYC/events/264933125/)</p><p>- [Mirage JS](https://miragejs.com)</p><p>- [Ember NYC September 2019 - Octane, Blockchain & Concurrency, Compiling Ember](https://www.youtube.com/watch?v=QClGEoHdQKk)</p><p>- [Sam Selikoff on Twitter](https://twitter.com/samselikoff)</p><p>- [Ryan Toronto on Twitter](https://twitter.com/ryantotweets)</p><p> </p>
]]></description>
      <pubDate>Fri, 4 Oct 2019 10:00:06 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://embermap.com/podcast/server-side-state-means-global-resource-identity</link>
      <content:encoded><![CDATA[<p>Topics include:</p><p>- 0:00 – Dealing with asynchrony and persistence in Vue</p><p>- 8:56 – Thoughts on Vue's APIs, and how they compare with React and Ember</p><p>- 22:20 – "Magic" in UI frameworks vs. server-side frameworks</p><p>- 27:17 – Build work in Mirage JS, and a new passthrough API</p><p>- 38:26 - How opinionated should project documentation be?</p><p>- 50:40 - Edward Faulkner's talk on compilers, abstractions, ES modules, and Embroider</p><p> </p><p>Sponsors:</p><p>- [Next Release](https://www.nextrelease.io/ember/), mention EmberMap when you sign up for a trial and get 10% off</p><p> </p><p>Links:</p><p>- [Mirage JS at ReactNYC S3:E8, Nov 7](https://www.meetup.com/ReactNYC/events/264933125/)</p><p>- [Mirage JS](https://miragejs.com)</p><p>- [Ember NYC September 2019 - Octane, Blockchain & Concurrency, Compiling Ember](https://www.youtube.com/watch?v=QClGEoHdQKk)</p><p>- [Sam Selikoff on Twitter](https://twitter.com/samselikoff)</p><p>- [Ryan Toronto on Twitter](https://twitter.com/ryantotweets)</p><p> </p>
]]></content:encoded>
      <enclosure length="70620794" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/2f92a34d-84d4-4212-8e6c-3974f0504254/feature-v2-audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Server-side state means global resource identity</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:13:34</itunes:duration>
      <itunes:summary>Sam and Ryan chat about building a Vue app with Mirage, and how quickly they ran into a need for a global resource store. They also talk about their recent work on Mirage JS and discuss an Ember NYC talk about how compilers enable abstractions.</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about building a Vue app with Mirage, and how quickly they ran into a need for a global resource store. They also talk about their recent work on Mirage JS and discuss an Ember NYC talk about how compilers enable abstractions.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>75</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">b2b659c2-fd56-45d1-9610-531fcf170050</guid>
      <title>The Weekend Warrior Adoption Hypothesis</title>
      <description><![CDATA[<p>Topics include:</p><p>- 0:39 – The "Weekend Warrior" technology adoption hypothesis</p><p>- 6:55 – Gatsby as a soft intro to GraphQL</p><p>- 8:55 – Building a GraphQL backend with Hasura</p><p>- 18:08 – GraphQL mutations</p><p>- 21:47 – Mocking out GraphQL in Mirage</p><p>- 45:03 – Gotchas when using backends as a service</p><p>- 49:47 – DX and user success vs. "correct" technology choices</p><p> </p><p>Sponsors:</p><p>- [Next Release](https://www.nextrelease.io/ember/), mention EmberMap when you sign up for a trial and get 10% off</p><p> </p><p>Links:</p><p>- [Hasura](https://hasura.io)</p><p>- [graphql-js](https://graphql.org/graphql-js/)</p><p>- [darklang](https://darklang.com)</p><p> </p>
]]></description>
      <pubDate>Thu, 19 Sep 2019 10:00:10 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://embermap.com/podcast/the-weekend-warrior-adoption-hypothesis</link>
      <content:encoded><![CDATA[<p>Topics include:</p><p>- 0:39 – The "Weekend Warrior" technology adoption hypothesis</p><p>- 6:55 – Gatsby as a soft intro to GraphQL</p><p>- 8:55 – Building a GraphQL backend with Hasura</p><p>- 18:08 – GraphQL mutations</p><p>- 21:47 – Mocking out GraphQL in Mirage</p><p>- 45:03 – Gotchas when using backends as a service</p><p>- 49:47 – DX and user success vs. "correct" technology choices</p><p> </p><p>Sponsors:</p><p>- [Next Release](https://www.nextrelease.io/ember/), mention EmberMap when you sign up for a trial and get 10% off</p><p> </p><p>Links:</p><p>- [Hasura](https://hasura.io)</p><p>- [graphql-js](https://graphql.org/graphql-js/)</p><p>- [darklang](https://darklang.com)</p><p> </p>
]]></content:encoded>
      <enclosure length="66120210" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/5c53d608-029b-4450-9c8e-d9120d54005a/feature_audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>The Weekend Warrior Adoption Hypothesis</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:08:52</itunes:duration>
      <itunes:summary>Sam tells Ryan about his recipes side project built with React, GraphQL and Hasura. They chat about how small &quot;magic moments&quot; that developers experience lead to new technologies getting adopted at organizations, how to use Mirage with GraphQL, and why developer experience and user success can trump architectural correctness when it comes to making choices between technologies.
</itunes:summary>
      <itunes:subtitle>Sam tells Ryan about his recipes side project built with React, GraphQL and Hasura. They chat about how small &quot;magic moments&quot; that developers experience lead to new technologies getting adopted at organizations, how to use Mirage with GraphQL, and why developer experience and user success can trump architectural correctness when it comes to making choices between technologies.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>74</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">c49728ae-8c6f-46dc-b4bf-241f9fadda3c</guid>
      <title>Side effects aren&apos;t declarative. What if they were?</title>
      <description><![CDATA[<p>Topics include:</p>
<ul>
<li>0:53 – Metaphysics and JavaScript by Rich Harris, and declarative side effects</li>
<li>15:26 – An Ember example that would be improved by hooks and declarative side effects</li>
<li>23:46 – Pitfalls and escape hatches when using hooks</li>
<li>35:40 – Rich's argument that rendering isn't even a declarative function of state, let alone side effects</li>
<li>41:42 – Deeper dive into useEffect docs</li>
<li>1:01:41 – Thought experiment on effects that sync with different data stores</li>
</ul>
<p>Sponsors:</p>
<ul>
<li><a href="https://www.nextrelease.io/ember/">Next Release</a>, mention EmberMap when you sign up for a trial and get 10% off</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://docs.google.com/presentation/d/1PUvpXMBEDS45rd0wHu6tF3j_8wmGC6cOLtOw2hzU-mw/edit#slide=id.p">Metaphysics and JavaScript</a>, by <a href="https://twitter.com/Rich_Harris">Rich Harris</a></li>
<li><a href="https://reactjs.org/docs/hooks-effect.html">React's useEffect</a></li>
</ul>
]]></description>
      <pubDate>Wed, 11 Sep 2019 10:00:07 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://embermap.com/podcast/side-effects-aren-t-declarative-what-if-they-were</link>
      <content:encoded><![CDATA[<p>Topics include:</p>
<ul>
<li>0:53 – Metaphysics and JavaScript by Rich Harris, and declarative side effects</li>
<li>15:26 – An Ember example that would be improved by hooks and declarative side effects</li>
<li>23:46 – Pitfalls and escape hatches when using hooks</li>
<li>35:40 – Rich's argument that rendering isn't even a declarative function of state, let alone side effects</li>
<li>41:42 – Deeper dive into useEffect docs</li>
<li>1:01:41 – Thought experiment on effects that sync with different data stores</li>
</ul>
<p>Sponsors:</p>
<ul>
<li><a href="https://www.nextrelease.io/ember/">Next Release</a>, mention EmberMap when you sign up for a trial and get 10% off</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://docs.google.com/presentation/d/1PUvpXMBEDS45rd0wHu6tF3j_8wmGC6cOLtOw2hzU-mw/edit#slide=id.p">Metaphysics and JavaScript</a>, by <a href="https://twitter.com/Rich_Harris">Rich Harris</a></li>
<li><a href="https://reactjs.org/docs/hooks-effect.html">React's useEffect</a></li>
</ul>
]]></content:encoded>
      <enclosure length="69008725" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/4ac982b4-e8fb-4fed-a9f7-2bd019014997/feature_audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Side effects aren&apos;t declarative. What if they were?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:11:53</itunes:duration>
      <itunes:summary>Sam and Ryan talk more about their recent experience working with React Hooks. They dive into useEffect, talk about how the hooks paradigm encourages UI developers to think about their application&apos;s side effects declaratively, discuss whether the paradigm is too much of a departure from real-world stateful UI development, and compare it to working with side effects in Ember applications.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk more about their recent experience working with React Hooks. They dive into useEffect, talk about how the hooks paradigm encourages UI developers to think about their application&apos;s side effects declaratively, discuss whether the paradigm is too much of a departure from real-world stateful UI development, and compare it to working with side effects in Ember applications.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>73</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">f9ea7ba3-7428-4755-894e-119d020d2df5</guid>
      <title>What should be abstracted?</title>
      <description><![CDATA[<p>Topics include:</p>
<ul>
<li>2:41 – Playing with Typescript</li>
<li>10:13 – Thoughts on Ember's decision to expose Properties vs. Attributes</li>
<li>32:09 – &quot;How long will this take?&quot;</li>
<li>45:15 – Debugging slow Mirage factories</li>
</ul>
<p>Sponsors:</p>
<ul>
<li><a href="https://www.nextrelease.io/ember/">Next Release</a>, mention EmberMap when you sign up for a trial and get 10% off</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://basecamp.com/shapeup">Shape Up</a></li>
<li><a href="https://podcasts.apple.com/us/podcast/copy-paste-repeat/id1448815461">Copy, Paste, Repeat Podcast</a></li>
</ul>
]]></description>
      <pubDate>Wed, 28 Aug 2019 10:00:14 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://embermap.com/podcast/what-should-be-abstracted</link>
      <content:encoded><![CDATA[<p>Topics include:</p>
<ul>
<li>2:41 – Playing with Typescript</li>
<li>10:13 – Thoughts on Ember's decision to expose Properties vs. Attributes</li>
<li>32:09 – &quot;How long will this take?&quot;</li>
<li>45:15 – Debugging slow Mirage factories</li>
</ul>
<p>Sponsors:</p>
<ul>
<li><a href="https://www.nextrelease.io/ember/">Next Release</a>, mention EmberMap when you sign up for a trial and get 10% off</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://basecamp.com/shapeup">Shape Up</a></li>
<li><a href="https://podcasts.apple.com/us/podcast/copy-paste-repeat/id1448815461">Copy, Paste, Repeat Podcast</a></li>
</ul>
]]></content:encoded>
      <enclosure length="53742348" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/2719df7d-3791-4343-8022-985a5e5829f0/feature_audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>What should be abstracted?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:55:59</itunes:duration>
      <itunes:summary>Sam and Ryan talk about properties and attributes in Ember&apos;s new component model, how the distinction compares to other frameworks, and what tradeoffs come with the new API. They also talk about TypeScript, how to answer the biggest question in project management, and what to do with slow Mirage factories.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about properties and attributes in Ember&apos;s new component model, how the distinction compares to other frameworks, and what tradeoffs come with the new API. They also talk about TypeScript, how to answer the biggest question in project management, and what to do with slow Mirage factories.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>72</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">110dd38f-3e8b-4601-9dc9-10db77556d0b</guid>
      <title>APIs are about Policy</title>
      <description><![CDATA[<p>Topics include:</p>
<ul>
<li>1:37 – APIs are about Policy, by Steven Wittens</li>
<li>5:47 – Part 1: RESTless API</li>
<li>49:16 – Part 2: Regressive Web Apps</li>
<li>1:08:19 – Part 3: GraftQL</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://acko.net/blog/apis-are-about-policy/">APIs are about Policy</a>, by Steven Wittens</li>
</ul>
]]></description>
      <pubDate>Wed, 21 Aug 2019 12:59:11 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://embermap.com/podcast/apis-are-about-policy</link>
      <content:encoded><![CDATA[<p>Topics include:</p>
<ul>
<li>1:37 – APIs are about Policy, by Steven Wittens</li>
<li>5:47 – Part 1: RESTless API</li>
<li>49:16 – Part 2: Regressive Web Apps</li>
<li>1:08:19 – Part 3: GraftQL</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://acko.net/blog/apis-are-about-policy/">APIs are about Policy</a>, by Steven Wittens</li>
</ul>
]]></content:encoded>
      <enclosure length="93144196" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/821bc2ca-6544-4c4e-8ff6-0b1837ae9fd0/feature_audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>APIs are about Policy</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:37:01</itunes:duration>
      <itunes:summary>Sam and Ryan read and discuss an article by Steven Wittens that explores the nature of HTTP APIs. Wittens argues that in practice, most APIs violate REST, but they do so because APIs are more about policy than they are about empowering clients with access to a data store. He then talks about what our APIs might look like if we embraced this fact, noting that GraphQL doesn&apos;t address these crucial issues of policy.</itunes:summary>
      <itunes:subtitle>Sam and Ryan read and discuss an article by Steven Wittens that explores the nature of HTTP APIs. Wittens argues that in practice, most APIs violate REST, but they do so because APIs are more about policy than they are about empowering clients with access to a data store. He then talks about what our APIs might look like if we embraced this fact, noting that GraphQL doesn&apos;t address these crucial issues of policy.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>71</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">009e8f16-5e45-4b58-904d-7319641f878b</guid>
      <title>Object references considered helpful</title>
      <description><![CDATA[<p>Topics include:</p>
<ul>
<li>0:00 – Unique keys for lists in React and Ember</li>
<li>8:40 – Why Handlebars feels safe</li>
<li>9:34 – Solving a stale state React hooks bug, and how Ember avoids this via object references</li>
<li>24:29 – ESPN's website and self-imposed technical constraints</li>
<li>28:10 – React in Codesandbox</li>
<li>36:53 – Tradeoffs between &quot;magic&quot; in a framework vs. learning how to wire things up yourself - especially in a fast-moving ecosystem like JavaScript</li>
<li>50:35 – Hooks vs. components, and clarity in boundaries</li>
<li>53:29 – Pairing with Tuple experience</li>
</ul>
<p>Listener questions:</p>
<ul>
<li>55:43 – How can you limit FastBoot from turning user-specific bugs into bugs that take down your entire production app? (<a href="https://twitter.com/davewasmer/status/1154070641810608129">@davewasmer</a>)</li>
<li>1:10:47 – What's the future of web components? (<a href="https://twitter.com/selbyk/status/1154570514964373504">selbyk</a>)</li>
</ul>
<p>Sponsors:</p>
<ul>
<li><a href="https://truecoach.co">TrueCoach</a>, check out their <a href="http://www.bitly.com/truecoachdev">engineering culture</a> and <a href="https://truecoach.co/careers/">hiring</a> pages</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://twitter.com/samselikoff/status/1156939503556268032">Sam's tweet on list keys in React</a></li>
<li><a href="https://codesandbox.io/">Codesandbox</a></li>
<li><a href="https://statickit.com/">StaticKit.com</a></li>
<li><a href="https://tuple.app/">Tuple, an app for remote pairing</a></li>
<li><a href="https://stenciljs.com/">Stencil.js</a></li>
<li><a href="https://acko.net/blog/apis-are-about-policy/">APIs are about policy</a></li>
</ul>
]]></description>
      <pubDate>Wed, 7 Aug 2019 10:00:14 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://embermap.com/podcast/object-references-considered-helpful</link>
      <content:encoded><![CDATA[<p>Topics include:</p>
<ul>
<li>0:00 – Unique keys for lists in React and Ember</li>
<li>8:40 – Why Handlebars feels safe</li>
<li>9:34 – Solving a stale state React hooks bug, and how Ember avoids this via object references</li>
<li>24:29 – ESPN's website and self-imposed technical constraints</li>
<li>28:10 – React in Codesandbox</li>
<li>36:53 – Tradeoffs between &quot;magic&quot; in a framework vs. learning how to wire things up yourself - especially in a fast-moving ecosystem like JavaScript</li>
<li>50:35 – Hooks vs. components, and clarity in boundaries</li>
<li>53:29 – Pairing with Tuple experience</li>
</ul>
<p>Listener questions:</p>
<ul>
<li>55:43 – How can you limit FastBoot from turning user-specific bugs into bugs that take down your entire production app? (<a href="https://twitter.com/davewasmer/status/1154070641810608129">@davewasmer</a>)</li>
<li>1:10:47 – What's the future of web components? (<a href="https://twitter.com/selbyk/status/1154570514964373504">selbyk</a>)</li>
</ul>
<p>Sponsors:</p>
<ul>
<li><a href="https://truecoach.co">TrueCoach</a>, check out their <a href="http://www.bitly.com/truecoachdev">engineering culture</a> and <a href="https://truecoach.co/careers/">hiring</a> pages</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://twitter.com/samselikoff/status/1156939503556268032">Sam's tweet on list keys in React</a></li>
<li><a href="https://codesandbox.io/">Codesandbox</a></li>
<li><a href="https://statickit.com/">StaticKit.com</a></li>
<li><a href="https://tuple.app/">Tuple, an app for remote pairing</a></li>
<li><a href="https://stenciljs.com/">Stencil.js</a></li>
<li><a href="https://acko.net/blog/apis-are-about-policy/">APIs are about policy</a></li>
</ul>
]]></content:encoded>
      <enclosure length="76030858" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/301a2daf-28e6-4d2f-a2d4-a4affb98350e/feature_audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Object references considered helpful</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:19:12</itunes:duration>
      <itunes:summary>Sam and Ryan talk about a stale state bug in a React app, and how Ember&apos;s decision to use object references helps developers avoid these sorts of bugs. They also talk about how Ember&apos;s framework magic can sometimes make folks feel ill-equipped to work in the larger JavaScript ecosystem, despite being extremely pleasant. Then they answer some listener questions.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about a stale state bug in a React app, and how Ember&apos;s decision to use object references helps developers avoid these sorts of bugs. They also talk about how Ember&apos;s framework magic can sometimes make folks feel ill-equipped to work in the larger JavaScript ecosystem, despite being extremely pleasant. Then they answer some listener questions.
</itunes:subtitle>
      <itunes:explicit>true</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>70</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">12885722-b433-492a-a5bf-ae8b043c1ddf</guid>
      <title>You gotta feel the pain</title>
      <description><![CDATA[<p>Topics include:</p>
<ul>
<li>5:26 – Bringing Mirage to a wider JavaScript audience</li>
<li>17:14 – Setting up tests in Gatsby, and why wiring up boilerplate code is not always bad</li>
<li>28:56 – React's children API, MDX, and template imports in Ember</li>
<li>39:17 – How extracting things in React feels compared to extracting things in Ember</li>
<li>42:30 – React's children, and constraints vs. flexibility</li>
<li>1:05:52 – API design, and letting someone feel the pain rather than telling them they can't do something</li>
<li>1:23:16 - Dynamic vs. static children</li>
</ul>
<p>Sponsors:</p>
<ul>
<li><a href="https://truecoach.co">TrueCoach</a>, check out their <a href="http://www.bitly.com/truecoachdev">engineering culture</a> and <a href="https://truecoach.co/careers/">hiring</a> pages</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://miragejs.com">Mirage.js</a></li>
<li><a href="https://twitter.com/tomdale/status/1153309794226147330">Tom Dale's tweet on web components</a></li>
</ul>
]]></description>
      <pubDate>Wed, 31 Jul 2019 10:00:03 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://embermap.com/podcast/you-gotta-feel-the-pain</link>
      <content:encoded><![CDATA[<p>Topics include:</p>
<ul>
<li>5:26 – Bringing Mirage to a wider JavaScript audience</li>
<li>17:14 – Setting up tests in Gatsby, and why wiring up boilerplate code is not always bad</li>
<li>28:56 – React's children API, MDX, and template imports in Ember</li>
<li>39:17 – How extracting things in React feels compared to extracting things in Ember</li>
<li>42:30 – React's children, and constraints vs. flexibility</li>
<li>1:05:52 – API design, and letting someone feel the pain rather than telling them they can't do something</li>
<li>1:23:16 - Dynamic vs. static children</li>
</ul>
<p>Sponsors:</p>
<ul>
<li><a href="https://truecoach.co">TrueCoach</a>, check out their <a href="http://www.bitly.com/truecoachdev">engineering culture</a> and <a href="https://truecoach.co/careers/">hiring</a> pages</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://miragejs.com">Mirage.js</a></li>
<li><a href="https://twitter.com/tomdale/status/1153309794226147330">Tom Dale's tweet on web components</a></li>
</ul>
]]></content:encoded>
      <enclosure length="90313777" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/36388e3d-a0a7-4b84-98d0-79be96c2c304/feature_audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>You gotta feel the pain</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:34:05</itunes:duration>
      <itunes:summary>Sam and Ryan talk about APIs that empower developers, even if it means giving them enough freedom to make mistakes. They also talk about building a component with dynamic children in both Ember and React.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about APIs that empower developers, even if it means giving them enough freedom to make mistakes. They also talk about building a component with dynamic children in both Ember and React.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>69</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">1e157379-13a7-4169-82c0-362ae00a40a5</guid>
      <title>The burden of high-level APIs</title>
      <description><![CDATA[<p>Topics include:</p>
<ul>
<li>2:45 – Using Gatsby to build miragejs.com</li>
<li>12:05 – Tradeoffs between low-level and high-level APIs</li>
<li>30:21 – Writing Gatsby data providers, and using GraphQL to query Gatsby's content mesh</li>
<li>41:33 – GraphQL vs. REST is wrong</li>
<li>44:16 – API design</li>
<li>58:45 – What's the best architecture for building modern UIs on the web?</li>
</ul>
<p>Sponsors:</p>
<ul>
<li><a href="https://truecoach.co">TrueCoach</a>, check out their <a href="http://www.bitly.com/truecoachdev">engineering culture</a> and <a href="https://truecoach.co/careers/">hiring</a> pages</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://miragejs.com">Mirage.js</a></li>
<li><a href="https://www.gatsbyjs.org">Gatsby</a></li>
<li><a href="https://graphql.org">GraphQL</a></li>
</ul>
]]></description>
      <pubDate>Thu, 18 Jul 2019 16:14:25 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://embermap.com/podcast/the-burden-of-high-level-apis</link>
      <content:encoded><![CDATA[<p>Topics include:</p>
<ul>
<li>2:45 – Using Gatsby to build miragejs.com</li>
<li>12:05 – Tradeoffs between low-level and high-level APIs</li>
<li>30:21 – Writing Gatsby data providers, and using GraphQL to query Gatsby's content mesh</li>
<li>41:33 – GraphQL vs. REST is wrong</li>
<li>44:16 – API design</li>
<li>58:45 – What's the best architecture for building modern UIs on the web?</li>
</ul>
<p>Sponsors:</p>
<ul>
<li><a href="https://truecoach.co">TrueCoach</a>, check out their <a href="http://www.bitly.com/truecoachdev">engineering culture</a> and <a href="https://truecoach.co/careers/">hiring</a> pages</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://miragejs.com">Mirage.js</a></li>
<li><a href="https://www.gatsbyjs.org">Gatsby</a></li>
<li><a href="https://graphql.org">GraphQL</a></li>
</ul>
]]></content:encoded>
      <enclosure length="65835579" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/64b0f419-54b0-4dfc-a31b-be67248e60f3/feature_audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>The burden of high-level APIs</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>01:08:35</itunes:duration>
      <itunes:summary>Sam and Ryan talk about the tradeoffs between high-level and low-level APIs, and why projects that focus on lower-level APIs tend to be both more sustainable and more popular. They also talk about their experience building Mirage&apos;s new landing page using Gatsby.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about the tradeoffs between high-level and low-level APIs, and why projects that focus on lower-level APIs tend to be both more sustainable and more popular. They also talk about their experience building Mirage&apos;s new landing page using Gatsby.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>68</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">a024511c-4db1-4b13-88a8-cf61eedbb043</guid>
      <title>Are staging environments an anti-pattern?</title>
      <description><![CDATA[<p>Topics include:</p>
<ul>
<li>1:35 – The benefit of no staging environments</li>
<li>10:14 – Using FastBoot without a runtime dependency, and pre-rendered SPAs</li>
<li>17:30 – Sponsor: TrueCoach is hiring!</li>
<li>23:02 – UI feedback, and Designing Fluid Interfaces by Apple</li>
<li>39:24 – Working with custom fonts, and typography lessons learned</li>
</ul>
<p>Sponsors:</p>
<ul>
<li><a href="https://truecoach.co">TrueCoach</a>, check out their <a href="http://www.bitly.com/truecoachdev">engineering culture</a> and <a href="https://truecoach.co/careers/">hiring</a> pages</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://percy.io">Percy Visual Regression Testing</a></li>
<li><a href="https://launchdarkly.com">Launch Darkly</a></li>
<li><a href="https://developer.apple.com/videos/play/wwdc2018/803/">Designing Fluid Interfaces</a>, from Apple, WWDC 2018</li>
<li><a href="https://rsms.me/inter/">The Inter typeface</a></li>
<li><a href="https://refactoringui.com/book/">Refactoring UI</a></li>
</ul>
]]></description>
      <pubDate>Thu, 11 Jul 2019 10:00:11 +0000</pubDate>
      <author>sam@samselikoff.com (Frontend First)</author>
      <link>https://embermap.com/podcast/are-staging-environments-an-anti-pattern</link>
      <content:encoded><![CDATA[<p>Topics include:</p>
<ul>
<li>1:35 – The benefit of no staging environments</li>
<li>10:14 – Using FastBoot without a runtime dependency, and pre-rendered SPAs</li>
<li>17:30 – Sponsor: TrueCoach is hiring!</li>
<li>23:02 – UI feedback, and Designing Fluid Interfaces by Apple</li>
<li>39:24 – Working with custom fonts, and typography lessons learned</li>
</ul>
<p>Sponsors:</p>
<ul>
<li><a href="https://truecoach.co">TrueCoach</a>, check out their <a href="http://www.bitly.com/truecoachdev">engineering culture</a> and <a href="https://truecoach.co/careers/">hiring</a> pages</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://percy.io">Percy Visual Regression Testing</a></li>
<li><a href="https://launchdarkly.com">Launch Darkly</a></li>
<li><a href="https://developer.apple.com/videos/play/wwdc2018/803/">Designing Fluid Interfaces</a>, from Apple, WWDC 2018</li>
<li><a href="https://rsms.me/inter/">The Inter typeface</a></li>
<li><a href="https://refactoringui.com/book/">Refactoring UI</a></li>
</ul>
]]></content:encoded>
      <enclosure length="52594214" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/f4d385ca-4972-470a-b444-1983628fe23e/feature_audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Are staging environments an anti-pattern?</itunes:title>
      <itunes:author>Frontend First</itunes:author>
      <itunes:duration>00:54:47</itunes:duration>
      <itunes:summary>Sam and Ryan chat about whether staging environments encourage bad practices around test coverage, dev ops processes and more. They also talk about Apple&apos;s talk on &quot;Designing Fluid Interfaces&quot;, using FastBoot with no runtime dependencies, and how to work with custom fonts.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about whether staging environments encourage bad practices around test coverage, dev ops processes and more. They also talk about Apple&apos;s talk on &quot;Designing Fluid Interfaces&quot;, using FastBoot with no runtime dependencies, and how to work with custom fonts.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>67</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">35d57ac9-9f5d-4fb1-a74e-8ca8c072da7f</guid>
      <title>When libraries go unmaintained</title>
      <description><![CDATA[<p>Topics include:</p>
<ul>
<li>2:44 – What to do if your app depends on an unmaintained addon</li>
<li>26:15 – The workflow of designers who are also coders</li>
<li>32:31 – Why the status quo of web tooling is insufficient for multi-app workflows</li>
<li>41:46 – Side effects in React and Ember, and how Hooks help authors avoid making API mistakes</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://github.com/mixonic/ember-cli-deprecation-workflow">Ember CLI Deprecation Workflow</a></li>
<li><a href="https://github.com/adopted-ember-addons">Adopted Ember Addons</a></li>
<li><a href="https://twitter.com/mixonic/status/1141740051333885956">Matthew Beale's tweet on improving library APIs</a></li>
</ul>
]]></description>
      <pubDate>Wed, 26 Jun 2019 10:00:12 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://embermap.com/podcast/when-libraries-go-unmaintained</link>
      <content:encoded><![CDATA[<p>Topics include:</p>
<ul>
<li>2:44 – What to do if your app depends on an unmaintained addon</li>
<li>26:15 – The workflow of designers who are also coders</li>
<li>32:31 – Why the status quo of web tooling is insufficient for multi-app workflows</li>
<li>41:46 – Side effects in React and Ember, and how Hooks help authors avoid making API mistakes</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://github.com/mixonic/ember-cli-deprecation-workflow">Ember CLI Deprecation Workflow</a></li>
<li><a href="https://github.com/adopted-ember-addons">Adopted Ember Addons</a></li>
<li><a href="https://twitter.com/mixonic/status/1141740051333885956">Matthew Beale's tweet on improving library APIs</a></li>
</ul>
]]></content:encoded>
      <enclosure length="58104588" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/0fb03a27-9823-46a4-9513-8ad0d1d5f65b/feature_audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>When libraries go unmaintained</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:duration>01:00:31</itunes:duration>
      <itunes:summary>Sam and Ryan talk about what to do when one of your application&apos;s dependencies becomes an unmaintained library. They also chat about how current tools for building and deploying web apps are underserving the modern multi-app workflow, as well as some lessons learned in API design from experimenting with React hooks.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about what to do when one of your application&apos;s dependencies becomes an unmaintained library. They also chat about how current tools for building and deploying web apps are underserving the modern multi-app workflow, as well as some lessons learned in API design from experimenting with React hooks.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>66</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">16ebdf72-8149-4abc-8d25-16f950cf81ee</guid>
      <title>Microscopic Frontends</title>
      <description><![CDATA[<p>Topics include:</p>
<ul>
<li>
<p>0:00 – Playing with React JS</p>
<ul>
<li>Using React after working with Ember for 5 years</li>
<li>React's onboarding experience</li>
<li>Why early success matters for OSS adoption</li>
</ul>
</li>
<li>
<p>15:44 – Micro Frontends</p>
<ul>
<li>Comparison with service-oriented architecture</li>
<li>Our experience using micro frontends at TED</li>
<li>The tradeoffs that matter most to us</li>
</ul>
</li>
<li>
<p>47:56 – Call for conversation: Ember-turned-React dev</p>
</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://www.martinfowler.com/articles/micro-frontends.html">Micro Frontends</a>, by Cam Jackson</li>
</ul>
]]></description>
      <pubDate>Wed, 19 Jun 2019 10:00:09 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://embermap.com/podcast/microscopic-frontends</link>
      <content:encoded><![CDATA[<p>Topics include:</p>
<ul>
<li>
<p>0:00 – Playing with React JS</p>
<ul>
<li>Using React after working with Ember for 5 years</li>
<li>React's onboarding experience</li>
<li>Why early success matters for OSS adoption</li>
</ul>
</li>
<li>
<p>15:44 – Micro Frontends</p>
<ul>
<li>Comparison with service-oriented architecture</li>
<li>Our experience using micro frontends at TED</li>
<li>The tradeoffs that matter most to us</li>
</ul>
</li>
<li>
<p>47:56 – Call for conversation: Ember-turned-React dev</p>
</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://www.martinfowler.com/articles/micro-frontends.html">Micro Frontends</a>, by Cam Jackson</li>
</ul>
]]></content:encoded>
      <enclosure length="49544366" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/c5aa3a67-4869-4d8c-b978-d408b322c3fc/feature_audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Microscopic Frontends</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:duration>00:51:36</itunes:duration>
      <itunes:summary>Sam and Ryan chat about their experience using aspects of the Micro Frontend architecture at different jobs over the past several years. They also talk about Sam&apos;s recent experience using ReactJS for the first time on a real application.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about their experience using aspects of the Micro Frontend architecture at different jobs over the past several years. They also talk about Sam&apos;s recent experience using ReactJS for the first time on a real application.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>65</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">1b1a0f78-cb99-4990-97b5-b918dca9e72e</guid>
      <title>Open source isn&apos;t free</title>
      <description><![CDATA[<p>Topics include:</p>
<ul>
<li>3:50 – Opinions on DHH's 2019 RailsConf keynote about sustainable open source</li>
<li>23:28 – Keeping tests dumb, dynamic tests, and TDD workflow tradeoffs</li>
<li>36:31 – Octane is not ready, and our conservative approach to adopting new tech</li>
<li>47:50 – Tailwind 1.0</li>
<li>53:23 – New series: Ember Animated</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=VBwWbFpkltg">DHH's 2019 RailsConf keynote</a></li>
<li><a href="https://crashlog.transistor.fm">Crash Log podcast</a></li>
<li><a href="https://www.rwjblue.com/2019/05/30/ember-js-2019-roadmap-wishes-packaging-improvements/">Robert Jackson's #EmberJS2019 blog post</a></li>
<li><a href="https://embermap.com/topics/ember-animated">EmberMap's new series on Ember Animated series</a></li>
</ul>
]]></description>
      <pubDate>Wed, 5 Jun 2019 10:00:15 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://embermap.com/podcast/open-source-isn-t-free</link>
      <content:encoded><![CDATA[<p>Topics include:</p>
<ul>
<li>3:50 – Opinions on DHH's 2019 RailsConf keynote about sustainable open source</li>
<li>23:28 – Keeping tests dumb, dynamic tests, and TDD workflow tradeoffs</li>
<li>36:31 – Octane is not ready, and our conservative approach to adopting new tech</li>
<li>47:50 – Tailwind 1.0</li>
<li>53:23 – New series: Ember Animated</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=VBwWbFpkltg">DHH's 2019 RailsConf keynote</a></li>
<li><a href="https://crashlog.transistor.fm">Crash Log podcast</a></li>
<li><a href="https://www.rwjblue.com/2019/05/30/ember-js-2019-roadmap-wishes-packaging-improvements/">Robert Jackson's #EmberJS2019 blog post</a></li>
<li><a href="https://embermap.com/topics/ember-animated">EmberMap's new series on Ember Animated series</a></li>
</ul>
]]></content:encoded>
      <enclosure length="54043697" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/f19b3b74-99b1-4ed2-b5c2-22fa6934904b/Feature_audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Open source isn&apos;t free</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:duration>00:56:18</itunes:duration>
      <itunes:summary>Sam and Ryan talk about DHH&apos;s 2019 RailsConf keynote, and whether or not open source needs to be sustained. They also chat about keeping tests dumb, when to adopt Ember Octane, and a new EmberMap series on Ember Animated.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about DHH&apos;s 2019 RailsConf keynote, and whether or not open source needs to be sustained. They also chat about keeping tests dumb, when to adopt Ember Octane, and a new EmberMap series on Ember Animated.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>64</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">2dfe47ae-adb5-4cb3-8bfa-ff8af00424a9</guid>
      <title>Katie Gengler on the tech and processes that power the Ember community</title>
      <description><![CDATA[<p>Topics include:</p>
<ul>
<li>2:26 - Ember's 2019 Call for Blog Posts, and a retro on last year's call</li>
<li>7:50 - Why Katie's looking forward to Embroider, Ember Data, and updates to the Router</li>
<li>10:52 - What the process is for &quot;finishing&quot; Octane</li>
<li>14:37 - Katie's experience on the Steering Committee</li>
<li>18:02 - The infrastructure behind Ember Try and Ember Observer</li>
<li>34:18 - Common anti-patterns in apps, like deeply nested components</li>
<li>39:18 - Katie's preference for acceptance tests over unit tests in UI development</li>
<li>42:50 - Katie's stack of choice for a brand new app</li>
<li>44:58 - A look into Ember Observer's Code Search feature</li>
<li>58:06 - How much test coverage there is across Ember's OSS Addons</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://twitter.com/katiegengler">Katie on Twitter</a></li>
<li><a href="http://codeallday.com">Code All Day</a>, Katie's consultancy</li>
<li><a href="https://blog.emberjs.com/2019/05/20/ember-2019-roadmap-call-for-posts.html">Ember's 2019 Roadmap: Call for Blog Posts</a></li>
<li><a href="https://emberobserver.com">Ember Observer</a></li>
<li><a href="http://codeallday.com/blog/code-search-in-ember-observer/">Ember Observer's Code Search</a> by Michelle Santarsiero</li>
<li><a href="https://github.com/google/codesearch">google/codesearch</a></li>
</ul>
]]></description>
      <pubDate>Wed, 29 May 2019 10:00:09 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://embermap.com/podcast/katie-gengler-on-the-tech-and-processes-that-power-the-ember-community</link>
      <content:encoded><![CDATA[<p>Topics include:</p>
<ul>
<li>2:26 - Ember's 2019 Call for Blog Posts, and a retro on last year's call</li>
<li>7:50 - Why Katie's looking forward to Embroider, Ember Data, and updates to the Router</li>
<li>10:52 - What the process is for &quot;finishing&quot; Octane</li>
<li>14:37 - Katie's experience on the Steering Committee</li>
<li>18:02 - The infrastructure behind Ember Try and Ember Observer</li>
<li>34:18 - Common anti-patterns in apps, like deeply nested components</li>
<li>39:18 - Katie's preference for acceptance tests over unit tests in UI development</li>
<li>42:50 - Katie's stack of choice for a brand new app</li>
<li>44:58 - A look into Ember Observer's Code Search feature</li>
<li>58:06 - How much test coverage there is across Ember's OSS Addons</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://twitter.com/katiegengler">Katie on Twitter</a></li>
<li><a href="http://codeallday.com">Code All Day</a>, Katie's consultancy</li>
<li><a href="https://blog.emberjs.com/2019/05/20/ember-2019-roadmap-call-for-posts.html">Ember's 2019 Roadmap: Call for Blog Posts</a></li>
<li><a href="https://emberobserver.com">Ember Observer</a></li>
<li><a href="http://codeallday.com/blog/code-search-in-ember-observer/">Ember Observer's Code Search</a> by Michelle Santarsiero</li>
<li><a href="https://github.com/google/codesearch">google/codesearch</a></li>
</ul>
]]></content:encoded>
      <enclosure length="57108427" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/8f42aa39-7016-4ce8-9825-9347a8d5a3f0/feature_audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Katie Gengler on the tech and processes that power the Ember community</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:duration>01:05:56</itunes:duration>
      <itunes:summary>Katie Gengler joins Sam and Ryan to talk about the important work she&apos;s done for the Ember project, from her creation and maintenance of community tools like Ember Try and Ember Observer to her role on Ember&apos;s Steering Committee. She also talks about lessons learned from doing custom app development for her consulting clients.
</itunes:summary>
      <itunes:subtitle>Katie Gengler joins Sam and Ryan to talk about the important work she&apos;s done for the Ember project, from her creation and maintenance of community tools like Ember Try and Ember Observer to her role on Ember&apos;s Steering Committee. She also talks about lessons learned from doing custom app development for her consulting clients.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>63</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">f2761bea-5a57-40d7-b397-cf6769082812</guid>
      <title>Stateless development environments</title>
      <description><![CDATA[<p>Topics include:</p>
<ul>
<li>4:25 – Causes of burnout other than overwork</li>
<li>9:02 – Finalizing Mirage 1.0</li>
<li>10:42 – Keeping your development environment stateless</li>
<li>21:00 - Unified APIs for backend and frontend data queries</li>
<li>42:28 – Tailwind 1.0</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://copypasterepeat.simplecast.com/episodes/thanks-for-burning-out-heres-a-statue">Copy Paste Repeat Ep. 18</a></li>
<li><a href="https://twitter.com/trek/status/1125485523617890309">Twitter conversation between Trek and Sam on shared UI models</a></li>
<li><a href="https://twitter.com/samselikoff">Sam on Twitter</a></li>
<li><a href="https://twitter.com/ryantotweets">Ryan on Twitter</a></li>
</ul>
]]></description>
      <pubDate>Wed, 22 May 2019 10:00:08 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://embermap.com/podcast/stateless-development-environments</link>
      <content:encoded><![CDATA[<p>Topics include:</p>
<ul>
<li>4:25 – Causes of burnout other than overwork</li>
<li>9:02 – Finalizing Mirage 1.0</li>
<li>10:42 – Keeping your development environment stateless</li>
<li>21:00 - Unified APIs for backend and frontend data queries</li>
<li>42:28 – Tailwind 1.0</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://copypasterepeat.simplecast.com/episodes/thanks-for-burning-out-heres-a-statue">Copy Paste Repeat Ep. 18</a></li>
<li><a href="https://twitter.com/trek/status/1125485523617890309">Twitter conversation between Trek and Sam on shared UI models</a></li>
<li><a href="https://twitter.com/samselikoff">Sam on Twitter</a></li>
<li><a href="https://twitter.com/ryantotweets">Ryan on Twitter</a></li>
</ul>
]]></content:encoded>
      <enclosure length="47598612" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/258c837c-074b-4d30-a17d-53ec3bc6c066/Feature1080_audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Stateless development environments</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:duration>00:48:57</itunes:duration>
      <itunes:summary>Sam and Ryan chat about the benefits of keeping your development environment stateless, using tools like Mirage in Ember and database seeds in Rails. They also brainstorm some data-querying APIs that explicitly acknowledge the existence of both sever-side and client-side models.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about the benefits of keeping your development environment stateless, using tools like Mirage in Ember and database seeds in Rails. They also brainstorm some data-querying APIs that explicitly acknowledge the existence of both sever-side and client-side models.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>62</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">013ce817-8787-4fbc-aa7c-f26e8751635f</guid>
      <title>Nathan Selikoff on Omnimodal&apos;s real-time tech stack</title>
      <description><![CDATA[<p>Topics include:</p>
<ul>
<li>4:23 – Overview of Omnimodal's tech stack</li>
<li>6:38 – Omnimodal's mission: to help cities manage transportation demand</li>
<li>16:10 – How to ingest open transportation data and present it in real time</li>
<li>21:43 – How graphics-heavy OpenGL and C++ apps can benefit from web tooling</li>
<li>31:06 – Why state machines are used in both video game and web development</li>
<li>34:55 – How JavaScript UI development compares to other paradigms</li>
<li>38:46 – Why Ember and Rails were chosen for Omnimodal's technology needs</li>
<li>42:09 – Using a prediction engine to improve on transportation schedules</li>
<li>44:56 - How Omnimodal gets data from its hardware trackers to the Rails server</li>
<li>50:55 – How services like Heroku and PubNub, custom AWS code, and the concept of a Data Lake help address scalability issues</li>
<li>56:40 – How deploys are coordinated across multiple services</li>
<li>59:47 - What the development process looks like for a multi-service tech stack</li>
<li>1:02:10 – What the complexity breakdown is between Omnimodal's frontend and backend</li>
<li>1:04:07 – Lessons learned on authentication while using Auth0</li>
<li>1:09:31 - Lessons learned on data modeling</li>
<li>1:12:21 – Tech choices, escape hatches, what's worked, and what hasn't</li>
<li>1:20:15 – Things Nathan loves about Ember, and things that are challenging</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://twitter.com/nselikoff">Nathan on Twitter</a></li>
<li><a href="https://omnimodal.io">Omnimodal.io</a></li>
<li><a href="https://www.pubnub.com">PubNub</a></li>
<li><a href="https://developers.google.com/transit/gtfs/">GTFS feed specification</a></li>
<li><a href="https://aws.amazon.com/kinesis/">Amazon Kinesis</a></li>
<li><a href="https://aws.amazon.com/elasticache/">Amazon ElastiCache</a></li>
<li><a href="https://aws.amazon.com/appsync/">AWS AppSync</a></li>
<li><a href="https://auth0.com">Auth0</a></li>
</ul>
]]></description>
      <pubDate>Wed, 8 May 2019 10:00:08 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://embermap.com/podcast/nathan-selikoff-on-omnimodal-s-real-time-tech-stack</link>
      <content:encoded><![CDATA[<p>Topics include:</p>
<ul>
<li>4:23 – Overview of Omnimodal's tech stack</li>
<li>6:38 – Omnimodal's mission: to help cities manage transportation demand</li>
<li>16:10 – How to ingest open transportation data and present it in real time</li>
<li>21:43 – How graphics-heavy OpenGL and C++ apps can benefit from web tooling</li>
<li>31:06 – Why state machines are used in both video game and web development</li>
<li>34:55 – How JavaScript UI development compares to other paradigms</li>
<li>38:46 – Why Ember and Rails were chosen for Omnimodal's technology needs</li>
<li>42:09 – Using a prediction engine to improve on transportation schedules</li>
<li>44:56 - How Omnimodal gets data from its hardware trackers to the Rails server</li>
<li>50:55 – How services like Heroku and PubNub, custom AWS code, and the concept of a Data Lake help address scalability issues</li>
<li>56:40 – How deploys are coordinated across multiple services</li>
<li>59:47 - What the development process looks like for a multi-service tech stack</li>
<li>1:02:10 – What the complexity breakdown is between Omnimodal's frontend and backend</li>
<li>1:04:07 – Lessons learned on authentication while using Auth0</li>
<li>1:09:31 - Lessons learned on data modeling</li>
<li>1:12:21 – Tech choices, escape hatches, what's worked, and what hasn't</li>
<li>1:20:15 – Things Nathan loves about Ember, and things that are challenging</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://twitter.com/nselikoff">Nathan on Twitter</a></li>
<li><a href="https://omnimodal.io">Omnimodal.io</a></li>
<li><a href="https://www.pubnub.com">PubNub</a></li>
<li><a href="https://developers.google.com/transit/gtfs/">GTFS feed specification</a></li>
<li><a href="https://aws.amazon.com/kinesis/">Amazon Kinesis</a></li>
<li><a href="https://aws.amazon.com/elasticache/">Amazon ElastiCache</a></li>
<li><a href="https://aws.amazon.com/appsync/">AWS AppSync</a></li>
<li><a href="https://auth0.com">Auth0</a></li>
</ul>
]]></content:encoded>
      <enclosure length="81383832" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/4a8b7193-61f1-497e-9f0e-2408b557dc7c/Feature1080_audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Nathan Selikoff on Omnimodal&apos;s real-time tech stack</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:duration>01:27:53</itunes:duration>
      <itunes:summary>Nathan joins Sam and Ryan to talk about how he&apos;s using Ember, Rails, Node, and AWS infrastructure to build Omnimodal, the startup he co-founded to help cities manage their transportation demand in real time.
</itunes:summary>
      <itunes:subtitle>Nathan joins Sam and Ryan to talk about how he&apos;s using Ember, Rails, Node, and AWS infrastructure to build Omnimodal, the startup he co-founded to help cities manage their transportation demand in real time.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>61</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">7050482d-3603-42eb-b076-b03c5fccab85</guid>
      <title>Frontend developers like us do things like this</title>
      <description><![CDATA[<p>Topics include:</p>
<ul>
<li>3:12 – Getting Mirage 1.0 out the door, Mirage's roadmap, and how other communities treat domain modeling</li>
<li>15:18 – Seth Godin's blog post on tribal marketing</li>
<li>27:08 – Sustainability and project management in open source</li>
<li>48:06 – What benefits do products actually unlock?</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://github.com/samselikoff/ember-cli-mirage/releases/tag/v1.0.0-beta.1">Ember CLI v1.0.0-beta.1 released</a></li>
<li><a href="https://seths.blog/2013/07/people-like-us-do-stuff-like-this/">&quot;People like us do things like this&quot; by Seth Godin</a></li>
<li><a href="http://www.fullstackradio.com/113">Justin Jackson on Full Stack Radio</a></li>
<li><a href="https://transistor.fm/">Transistor.fm</a></li>
</ul>
]]></description>
      <pubDate>Wed, 1 May 2019 10:00:02 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://embermap.com/podcast/frontend-developers-like-us-do-things-like-this</link>
      <content:encoded><![CDATA[<p>Topics include:</p>
<ul>
<li>3:12 – Getting Mirage 1.0 out the door, Mirage's roadmap, and how other communities treat domain modeling</li>
<li>15:18 – Seth Godin's blog post on tribal marketing</li>
<li>27:08 – Sustainability and project management in open source</li>
<li>48:06 – What benefits do products actually unlock?</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://github.com/samselikoff/ember-cli-mirage/releases/tag/v1.0.0-beta.1">Ember CLI v1.0.0-beta.1 released</a></li>
<li><a href="https://seths.blog/2013/07/people-like-us-do-stuff-like-this/">&quot;People like us do things like this&quot; by Seth Godin</a></li>
<li><a href="http://www.fullstackradio.com/113">Justin Jackson on Full Stack Radio</a></li>
<li><a href="https://transistor.fm/">Transistor.fm</a></li>
</ul>
]]></content:encoded>
      <enclosure length="51650615" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/e23c6a13-2ebe-40db-9237-f1d409b543a4/Feature_audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Frontend developers like us do things like this</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:duration>00:54:03</itunes:duration>
      <itunes:summary>Sam and Ryan talk about how to segment the audience of frontend developers. They also talk about unsustainable open-source development, Mirage 1.0, and what&apos;s in store for Mirage&apos;s future.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about how to segment the audience of frontend developers. They also talk about unsustainable open-source development, Mirage 1.0, and what&apos;s in store for Mirage&apos;s future.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>60</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">cead22d1-a1a5-4b0b-ab24-4be9b9934ae6</guid>
      <title>Hark! The Halting problem sings</title>
      <description><![CDATA[<p>Topics include:</p>
<ul>
<li>0:00 – Letting your yes be yes, following through on your commitments, and paying attention to opportunity cost</li>
<li>6:40 – When Ember releases actually become LTS versions</li>
<li>9:13 – Why we need &quot;test apps&quot; when developing Addons</li>
<li>16:50 – How to use newer syntax when authoring Addons that support older Ember versions</li>
<li>22:07 – How angle brackets change our component implementations</li>
<li>31:46 – How to make the APIs of our domain components more portable</li>
<li>38:45 – How to reuse code that has implicit data dependencies, and the Halting problem</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://github.com/samselikoff/ember-cli-mirage/tree/master/test-projects">Mirage's example test apps</a></li>
<li><a href="https://github.com/embermap/ember-cli-tailwind/tree/master/test-projects">Ember CLI Tailwind's example test apps</a></li>
<li><a href="https://embermap.com/video/angle-bracket-components-a-first-look">Nested Angle Bracket video</a></li>
<li><a href="https://github.com/adopted-ember-addons/ember-collapsible-panel">Ember Collapsible Panel</a></li>
</ul>
]]></description>
      <pubDate>Wed, 24 Apr 2019 10:00:03 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://embermap.com/podcast/hark-the-halting-problem-sings</link>
      <content:encoded><![CDATA[<p>Topics include:</p>
<ul>
<li>0:00 – Letting your yes be yes, following through on your commitments, and paying attention to opportunity cost</li>
<li>6:40 – When Ember releases actually become LTS versions</li>
<li>9:13 – Why we need &quot;test apps&quot; when developing Addons</li>
<li>16:50 – How to use newer syntax when authoring Addons that support older Ember versions</li>
<li>22:07 – How angle brackets change our component implementations</li>
<li>31:46 – How to make the APIs of our domain components more portable</li>
<li>38:45 – How to reuse code that has implicit data dependencies, and the Halting problem</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://github.com/samselikoff/ember-cli-mirage/tree/master/test-projects">Mirage's example test apps</a></li>
<li><a href="https://github.com/embermap/ember-cli-tailwind/tree/master/test-projects">Ember CLI Tailwind's example test apps</a></li>
<li><a href="https://embermap.com/video/angle-bracket-components-a-first-look">Nested Angle Bracket video</a></li>
<li><a href="https://github.com/adopted-ember-addons/ember-collapsible-panel">Ember Collapsible Panel</a></li>
</ul>
]]></content:encoded>
      <enclosure length="59233812" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/100a30f8-95ef-4cf5-9013-b44efb8ac969/Feature_audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Hark! The Halting problem sings</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:duration>01:02:08</itunes:duration>
      <itunes:summary>Sam and Ryan chat about the explicit and implicit data dependencies in our components, and how that affects our ability to refactor and reuse them. They also talk about several other topics including Ember LTS versions and angle bracket invocation syntax.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about the explicit and implicit data dependencies in our components, and how that affects our ability to refactor and reuse them. They also talk about several other topics including Ember LTS versions and angle bracket invocation syntax.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>59</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">bb111426-2c04-4479-a68d-9397053a340d</guid>
      <title>Edward Faulkner on Embroider, Ember CLI&apos;s modern build system</title>
      <description><![CDATA[<p>Edward Faulkner joins Sam and Ryan to chat about his work on Embroider, a new three-stage architecture that will power the next generation of the Ember CLI ecosystem. They also talk about myriad other topics, including Yarn Plug'n'Play, the benefits of debugging other people's code, how Ember is embracing the larger JavaScript ecosystem, and more.</p>
<p>Topics include:</p>
<ul>
<li>0:00 – What's hard about programming, why schools are bad at teaching math, and more</li>
<li>10:47 – Why computers should empower ordinary people, and how we can close the gap that exists between the technologically skilled and unskilled</li>
<li>22:12 – How the experience level of the median JavaScript developer affects tech choices made by the community</li>
<li>27:54 - The npm dependency graph and Yarn plug-n-play</li>
<li>36:24 – How to avoid making too big of a leap when improving software</li>
<li>41:58 – What Embroider is, and what problems it's focused on solving</li>
<li>46:10 – The three stages of Embroider and the V2 Addon format</li>
<li>1:00:15 – What Embroider enables, like tree-shaking unused Addon modules and route-level code splitting</li>
<li>1:21:08 – How to try Embroider out in your projects today</li>
<li>1:34:39 – How Ember is embracing the larger JavaScript ecosystem</li>
<li>1:39:35 - Why debugging other people's code is a great way to level up as a developer</li>
<li>1:48:28 - What Embroider's next steps are</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://twitter.com/samselikoff/status/1118315935666974722">Ed on Twitter</a></li>
<li><a href="https://github.com/embroider-build/embroider">Embroider</a></li>
<li><a href="https://yarnpkg.com/lang/en/docs/pnp/">Yarn Plug'n'Play</a></li>
</ul>
]]></description>
      <pubDate>Wed, 17 Apr 2019 10:00:16 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://embermap.com/podcast/edward-faulkner-on-embroider-ember-cli-s-modern-build-system</link>
      <content:encoded><![CDATA[<p>Edward Faulkner joins Sam and Ryan to chat about his work on Embroider, a new three-stage architecture that will power the next generation of the Ember CLI ecosystem. They also talk about myriad other topics, including Yarn Plug'n'Play, the benefits of debugging other people's code, how Ember is embracing the larger JavaScript ecosystem, and more.</p>
<p>Topics include:</p>
<ul>
<li>0:00 – What's hard about programming, why schools are bad at teaching math, and more</li>
<li>10:47 – Why computers should empower ordinary people, and how we can close the gap that exists between the technologically skilled and unskilled</li>
<li>22:12 – How the experience level of the median JavaScript developer affects tech choices made by the community</li>
<li>27:54 - The npm dependency graph and Yarn plug-n-play</li>
<li>36:24 – How to avoid making too big of a leap when improving software</li>
<li>41:58 – What Embroider is, and what problems it's focused on solving</li>
<li>46:10 – The three stages of Embroider and the V2 Addon format</li>
<li>1:00:15 – What Embroider enables, like tree-shaking unused Addon modules and route-level code splitting</li>
<li>1:21:08 – How to try Embroider out in your projects today</li>
<li>1:34:39 – How Ember is embracing the larger JavaScript ecosystem</li>
<li>1:39:35 - Why debugging other people's code is a great way to level up as a developer</li>
<li>1:48:28 - What Embroider's next steps are</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://twitter.com/samselikoff/status/1118315935666974722">Ed on Twitter</a></li>
<li><a href="https://github.com/embroider-build/embroider">Embroider</a></li>
<li><a href="https://yarnpkg.com/lang/en/docs/pnp/">Yarn Plug'n'Play</a></li>
</ul>
]]></content:encoded>
      <enclosure length="99982046" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/ee364ca2-1bc4-48d8-a85a-4135ac5b6752/Feature_1080_audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Edward Faulkner on Embroider, Ember CLI&apos;s modern build system</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:duration>01:53:40</itunes:duration>
      <itunes:summary>Edward Faulkner joins Sam and Ryan to chat about his work on Embroider, a new three-stage architecture that will power the next generation of the Ember CLI ecosystem. They also talk about myriad other topics, including Yarn Plug&apos;n&apos;Play, the benefits of debugging other people&apos;s code, how Ember is embracing the larger JavaScript ecosystem, and more.
</itunes:summary>
      <itunes:subtitle>Edward Faulkner joins Sam and Ryan to chat about his work on Embroider, a new three-stage architecture that will power the next generation of the Ember CLI ecosystem. They also talk about myriad other topics, including Yarn Plug&apos;n&apos;Play, the benefits of debugging other people&apos;s code, how Ember is embracing the larger JavaScript ecosystem, and more.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>58</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">9c4f37f7-6111-4413-b00e-7565460678e8</guid>
      <title>Derrick Reimer on SPA architecture with Elm and GraphQL</title>
      <description><![CDATA[<p>Derrick Reimer joins Sam and Ryan to chat about building his new real-time chat product Level as an SPA using Elm, Phoenix and GraphQL. He covers domain modeling in Phoenix, his experience building his first GraphQL API, type safety in Elm, and the data fetching patterns he's using to support his application's real-time functionality.</p>
<p>Topics include:</p>
<ul>
<li>2:01 – What is Level? What tech stack are you using to build it?</li>
<li>14:34 – Building the GraphQL API with Phoenix and Absinthe</li>
<li>37:40 – Building the frontend with Elm</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://twitter.com/derrickreimer">Derrick on Twitter</a></li>
<li><a href="https://level.app">Level</a></li>
<li><a href="https://phoenixframework.org">The Phoenix framework</a></li>
<li><a href="https://graphql.org">GraphQL</a></li>
<li><a href="https://github.com/absinthe-graphql/absinthe">Absinthe, GraphQL for Elixir</a></li>
<li><a href="https://elm-lang.org">The Elm language</a></li>
</ul>
]]></description>
      <pubDate>Wed, 10 Apr 2019 10:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Derrick Reimer joins Sam and Ryan to chat about building his new real-time chat product Level as an SPA using Elm, Phoenix and GraphQL. He covers domain modeling in Phoenix, his experience building his first GraphQL API, type safety in Elm, and the data fetching patterns he's using to support his application's real-time functionality.</p>
<p>Topics include:</p>
<ul>
<li>2:01 – What is Level? What tech stack are you using to build it?</li>
<li>14:34 – Building the GraphQL API with Phoenix and Absinthe</li>
<li>37:40 – Building the frontend with Elm</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://twitter.com/derrickreimer">Derrick on Twitter</a></li>
<li><a href="https://level.app">Level</a></li>
<li><a href="https://phoenixframework.org">The Phoenix framework</a></li>
<li><a href="https://graphql.org">GraphQL</a></li>
<li><a href="https://github.com/absinthe-graphql/absinthe">Absinthe, GraphQL for Elixir</a></li>
<li><a href="https://elm-lang.org">The Elm language</a></li>
</ul>
]]></content:encoded>
      <enclosure length="88623446" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/031ddc6d-76c0-45a2-8142-c739a79a0183/e75c26f2_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Derrick Reimer on SPA architecture with Elm and GraphQL</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/031ddc6d-76c0-45a2-8142-c739a79a0183/3000x3000/1554876649artwork.jpg?aid=rss_feed"/>
      <itunes:duration>01:32:15</itunes:duration>
      <itunes:summary>Derrick Reimer joins Sam and Ryan to chat about building his new real-time chat product Level as an SPA using Elm, Phoenix and GraphQL. He covers domain modeling in Phoenix, his experience building his first GraphQL API, type safety in Elm, and the data fetching patterns he&apos;s using to support his application&apos;s real-time functionality.
</itunes:summary>
      <itunes:subtitle>Derrick Reimer joins Sam and Ryan to chat about building his new real-time chat product Level as an SPA using Elm, Phoenix and GraphQL. He covers domain modeling in Phoenix, his experience building his first GraphQL API, type safety in Elm, and the data fetching patterns he&apos;s using to support his application&apos;s real-time functionality.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>57</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">4f40969b-48b5-4a80-916d-061a0e367cc3</guid>
      <title>Do you trust your test suite?</title>
      <description><![CDATA[<p>Sam and Ryan continue their discussion from the end of Episode 54 about how much we actually rely on our test suites versus how much implicit trust we place in semver. They also talk about some new Ember Octane features as well as a data-fetching issue.</p>
<p>Topics include:</p>
<ul>
<li>2:00 – Do we trust our test suites?</li>
<li>10:00 – Breaking APIs in a changelog vs. in code</li>
<li>20:27 – Modifiers – they're kinda like mixins</li>
<li>37:17 – Named blocks</li>
<li>38:29 – Ember Octane &amp; EmberConf trainings</li>
<li>43:15 – Fetching user-specific data in EmberMap's Video Views series</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://www.pzuraq.com/coming-soon-in-ember-octane-part-4-modifiers/">Chris Garrett's post on Modifiers</a></li>
<li><a href="https://github.com/emberjs/rfcs/pull/460">Yehuda's Yieldable named blocks RFC</a></li>
<li><a href="https://github.com/embermap/emberconf2019-real-world-animations">Our Real-world Animations training repo</a></li>
<li><a href="https://github.com/embermap/emberconf2019-robust-data-fetching">Our Robust Data Fetching training repo</a></li>
</ul>
]]></description>
      <pubDate>Thu, 4 Apr 2019 10:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan continue their discussion from the end of Episode 54 about how much we actually rely on our test suites versus how much implicit trust we place in semver. They also talk about some new Ember Octane features as well as a data-fetching issue.</p>
<p>Topics include:</p>
<ul>
<li>2:00 – Do we trust our test suites?</li>
<li>10:00 – Breaking APIs in a changelog vs. in code</li>
<li>20:27 – Modifiers – they're kinda like mixins</li>
<li>37:17 – Named blocks</li>
<li>38:29 – Ember Octane &amp; EmberConf trainings</li>
<li>43:15 – Fetching user-specific data in EmberMap's Video Views series</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://www.pzuraq.com/coming-soon-in-ember-octane-part-4-modifiers/">Chris Garrett's post on Modifiers</a></li>
<li><a href="https://github.com/emberjs/rfcs/pull/460">Yehuda's Yieldable named blocks RFC</a></li>
<li><a href="https://github.com/embermap/emberconf2019-real-world-animations">Our Real-world Animations training repo</a></li>
<li><a href="https://github.com/embermap/emberconf2019-robust-data-fetching">Our Robust Data Fetching training repo</a></li>
</ul>
]]></content:encoded>
      <enclosure length="54800935" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/d571fc4b-96c7-4622-b88d-846ddef025d5/79bd757c_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Do you trust your test suite?</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/d571fc4b-96c7-4622-b88d-846ddef025d5/3000x3000/1554345867artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:57:01</itunes:duration>
      <itunes:summary>Sam and Ryan continue their discussion from the end of Episode 54 about how much we actually rely on our test suites versus how much implicit trust we place in semver. They also talk about some new Ember Octane features as well as a data-fetching issue.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan continue their discussion from the end of Episode 54 about how much we actually rely on our test suites versus how much implicit trust we place in semver. They also talk about some new Ember Octane features as well as a data-fetching issue.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>56</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">5e3f208c-7772-4876-8cc0-a7e309e3f619</guid>
      <title>Chris Garrett on Ember Octane</title>
      <description><![CDATA[<p>Chris Garrett joins Sam and Ryan to chat about what's coming to Ember in Octane, its first edition. Chris talks about how module unification, decorators, ES6 classes, named args, angle-bracket components, template imports, modifiers, and Glimmer components offer a cohesive new programming model for Ember.js developers.</p>
<p>Topics include:</p>
<ul>
<li>1:18 – De-scoping Module Unification from Octane</li>
<li>2:25 – Run-time APIs are coming to Octane, build-time APIs are being worked on</li>
<li>5:04 – What's the vision behind Ember Editions, and Octane in particular?</li>
<li>9:41 – What's the state of decorators?</li>
<li>15:43 – What can't you do with static decorators that you can with dynamic decorators?</li>
<li>19:18 – Why do we need decorators to use ES6 classes in Ember?</li>
<li>20:50 – Is it possible to lint for correct usage of named args and this-dot property access?</li>
<li>29:30 – How did Modifiers come about, and how do they obviate the need for lifecycle methods?</li>
<li>38:00 – Are you concerned that a player as big as React has abandoned ES6 Classes in favor of functions? Do you think there's anything to their argument that classes are fundamentally confusing?</li>
<li>43:49 – What's the thinking behind the Modifier Manager API that just landed?</li>
<li>52:04 - Could you expand on a point you made in your blog post about how Ember.set leaks state management all across your app?</li>
<li>58:50 – What's the status of Glimmer components?</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://twitter.com/pzuraq">Chris Garrett on Twitter</a></li>
<li><a href="https://www.pzuraq.com">Chris's blog</a></li>
<li><a href="https://github.com/emberjs/rfcs/pull/373">Modifier managers RFC</a></li>
<li><a href="https://github.com/tc39/proposal-decorators">Decorators for JavaScript TC39 proposal</a></li>
<li><a href="https://github.com/buschtoens/ember-on-modifier">ember-on-modifier</a></li>
</ul>
]]></description>
      <pubDate>Wed, 13 Mar 2019 14:26:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Chris Garrett joins Sam and Ryan to chat about what's coming to Ember in Octane, its first edition. Chris talks about how module unification, decorators, ES6 classes, named args, angle-bracket components, template imports, modifiers, and Glimmer components offer a cohesive new programming model for Ember.js developers.</p>
<p>Topics include:</p>
<ul>
<li>1:18 – De-scoping Module Unification from Octane</li>
<li>2:25 – Run-time APIs are coming to Octane, build-time APIs are being worked on</li>
<li>5:04 – What's the vision behind Ember Editions, and Octane in particular?</li>
<li>9:41 – What's the state of decorators?</li>
<li>15:43 – What can't you do with static decorators that you can with dynamic decorators?</li>
<li>19:18 – Why do we need decorators to use ES6 classes in Ember?</li>
<li>20:50 – Is it possible to lint for correct usage of named args and this-dot property access?</li>
<li>29:30 – How did Modifiers come about, and how do they obviate the need for lifecycle methods?</li>
<li>38:00 – Are you concerned that a player as big as React has abandoned ES6 Classes in favor of functions? Do you think there's anything to their argument that classes are fundamentally confusing?</li>
<li>43:49 – What's the thinking behind the Modifier Manager API that just landed?</li>
<li>52:04 - Could you expand on a point you made in your blog post about how Ember.set leaks state management all across your app?</li>
<li>58:50 – What's the status of Glimmer components?</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://twitter.com/pzuraq">Chris Garrett on Twitter</a></li>
<li><a href="https://www.pzuraq.com">Chris's blog</a></li>
<li><a href="https://github.com/emberjs/rfcs/pull/373">Modifier managers RFC</a></li>
<li><a href="https://github.com/tc39/proposal-decorators">Decorators for JavaScript TC39 proposal</a></li>
<li><a href="https://github.com/buschtoens/ember-on-modifier">ember-on-modifier</a></li>
</ul>
]]></content:encoded>
      <enclosure length="63217797" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/c6606067-4dc5-4521-8ce8-2fa54d312160/cc544b65_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Chris Garrett on Ember Octane</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/c6606067-4dc5-4521-8ce8-2fa54d312160/3000x3000/1552487400artwork.jpg?aid=rss_feed"/>
      <itunes:duration>01:05:48</itunes:duration>
      <itunes:summary>Chris Garrett joins Sam and Ryan to chat about what&apos;s coming to Ember in Octane, its first edition. Chris talks about how module unification, decorators, ES6 classes, named args, angle-bracket components, template imports, modifiers, and Glimmer components offer a cohesive new programming model for Ember.js developers.</itunes:summary>
      <itunes:subtitle>Chris Garrett joins Sam and Ryan to chat about what&apos;s coming to Ember in Octane, its first edition. Chris talks about how module unification, decorators, ES6 classes, named args, angle-bracket components, template imports, modifiers, and Glimmer components offer a cohesive new programming model for Ember.js developers.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>55</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">1053c22b-a560-4ddb-99d6-ae9239151dae</guid>
      <title>SPAs should do more than server-rendered apps, not less</title>
      <description><![CDATA[<p>Topics include:</p>
<ul>
<li>
<p>0:00 - Module unification</p>
<ul>
<li>1:20 - Component resolution</li>
<li>5:45 - Why we don't use angle brackets</li>
</ul>
</li>
<li>
<p>9:35 - SPAs should do everything a server app can do</p>
<ul>
<li>10:15 - Ember's Router</li>
<li>11:00 - Replicating the server's &quot;fresh data&quot; behavior</li>
<li>17:15 - Reloading stale data</li>
</ul>
</li>
<li>
<p>23:50 - Fetching data</p>
<ul>
<li>23:50 - Getting Mirage working with React and Vue</li>
<li>26:10 - Data loading components</li>
<li>29:41 - Knowing what queries are currently rendered</li>
<li>32:15 - Using cache keys to track what data is loaded</li>
<li>35:00 - Pushing data into the client with web sockets</li>
<li>39:00 - Describing Twitter's UI in queries</li>
<li>44:00 - When will data loading be abstracted away?</li>
</ul>
</li>
<li>
<p>49:45 - Dependabot workflow</p>
<ul>
<li>50:20 - Can you merge a PR from a bot if all the tests pass?</li>
<li>53:20 - Trust, but verify</li>
</ul>
</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://www.emberjs.com/ember-community-survey-2019/">Ember Community Survey</a></li>
<li><a href="https://github.com/crashco/ember-template-component-import">ember-template-component-import</a></li>
<li><a href="https://twitter.com/samselikoff">Sam Selikoff on Twitter</a></li>
<li><a href="https://twitter.com/ryantotweets">Ryan Toronto on Twitter</a></li>
</ul>
]]></description>
      <pubDate>Wed, 6 Mar 2019 11:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Topics include:</p>
<ul>
<li>
<p>0:00 - Module unification</p>
<ul>
<li>1:20 - Component resolution</li>
<li>5:45 - Why we don't use angle brackets</li>
</ul>
</li>
<li>
<p>9:35 - SPAs should do everything a server app can do</p>
<ul>
<li>10:15 - Ember's Router</li>
<li>11:00 - Replicating the server's &quot;fresh data&quot; behavior</li>
<li>17:15 - Reloading stale data</li>
</ul>
</li>
<li>
<p>23:50 - Fetching data</p>
<ul>
<li>23:50 - Getting Mirage working with React and Vue</li>
<li>26:10 - Data loading components</li>
<li>29:41 - Knowing what queries are currently rendered</li>
<li>32:15 - Using cache keys to track what data is loaded</li>
<li>35:00 - Pushing data into the client with web sockets</li>
<li>39:00 - Describing Twitter's UI in queries</li>
<li>44:00 - When will data loading be abstracted away?</li>
</ul>
</li>
<li>
<p>49:45 - Dependabot workflow</p>
<ul>
<li>50:20 - Can you merge a PR from a bot if all the tests pass?</li>
<li>53:20 - Trust, but verify</li>
</ul>
</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://www.emberjs.com/ember-community-survey-2019/">Ember Community Survey</a></li>
<li><a href="https://github.com/crashco/ember-template-component-import">ember-template-component-import</a></li>
<li><a href="https://twitter.com/samselikoff">Sam Selikoff on Twitter</a></li>
<li><a href="https://twitter.com/ryantotweets">Ryan Toronto on Twitter</a></li>
</ul>
]]></content:encoded>
      <enclosure length="53578785" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/bcfbf98d-79ba-415d-baee-ec88f2bbbdb5/2856c3a8_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>SPAs should do more than server-rendered apps, not less</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/bcfbf98d-79ba-415d-baee-ec88f2bbbdb5/3000x3000/1551850374artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:55:45</itunes:duration>
      <itunes:summary>Sam and Ryan chat about why frontend frameworks should make it easy for SPAs to replicate the behavior of a server-rendered web app. They also discuss various data-fetching scenarios, how a client-side app can stay in sync with the server&apos;s database, and share a few thoughts on module unification and dependency management.</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about why frontend frameworks should make it easy for SPAs to replicate the behavior of a server-rendered web app. They also discuss various data-fetching scenarios, how a client-side app can stay in sync with the server&apos;s database, and share a few thoughts on module unification and dependency management.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>54</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">8168e8ed-5de1-4bb3-8179-2d699052ba4a</guid>
      <title>You still have to build two apps</title>
      <description><![CDATA[<p>Topics include:</p>
<ul>
<li>
<p>0:00 - Refreshing an Ember app when a new version is deployed</p>
</li>
<li>
<p>11:05 - When SPAs become too difficult</p>
<ul>
<li>14:50 - Building an SPA never got as quick as we'd hoped</li>
<li>19:20 - You're now responsible for two applications</li>
<li>28:00 - Integration costs</li>
<li>32:00 - Architecture is easier within a single monolith</li>
</ul>
</li>
<li>
<p>40:20 - Beginners should use the same tools as experts</p>
<ul>
<li>40:50 - Rolling advanced solutions back into the framework</li>
<li>47:41 - Services that are used by both beginners and experts</li>
<li>52:32 - Can you start an SPA without making an API server decision?</li>
</ul>
</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://github.com/rails/rails/pull/34052">Rails PR for multi database support</a></li>
<li><a href="https://twitter.com/samselikoff">Sam Selikoff on Twitter</a></li>
<li><a href="https://twitter.com/ryantotweets">Ryan Toronto on Twitter</a></li>
</ul>
]]></description>
      <pubDate>Wed, 27 Feb 2019 11:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Topics include:</p>
<ul>
<li>
<p>0:00 - Refreshing an Ember app when a new version is deployed</p>
</li>
<li>
<p>11:05 - When SPAs become too difficult</p>
<ul>
<li>14:50 - Building an SPA never got as quick as we'd hoped</li>
<li>19:20 - You're now responsible for two applications</li>
<li>28:00 - Integration costs</li>
<li>32:00 - Architecture is easier within a single monolith</li>
</ul>
</li>
<li>
<p>40:20 - Beginners should use the same tools as experts</p>
<ul>
<li>40:50 - Rolling advanced solutions back into the framework</li>
<li>47:41 - Services that are used by both beginners and experts</li>
<li>52:32 - Can you start an SPA without making an API server decision?</li>
</ul>
</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://github.com/rails/rails/pull/34052">Rails PR for multi database support</a></li>
<li><a href="https://twitter.com/samselikoff">Sam Selikoff on Twitter</a></li>
<li><a href="https://twitter.com/ryantotweets">Ryan Toronto on Twitter</a></li>
</ul>
]]></content:encoded>
      <enclosure length="58768037" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/3b932b16-8565-4dda-9292-f2e409227d5f/901189b7_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>You still have to build two apps</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/3b932b16-8565-4dda-9292-f2e409227d5f/3000x3000/1551224310artwork.jpg?aid=rss_feed"/>
      <itunes:duration>01:01:05</itunes:duration>
      <itunes:summary>Sam and Ryan chat about the integration costs that make developing an SPA so difficult. They also talk about different ways to reload an Ember application while people are actively using it, as well as why it&apos;s important for beginners to use the same tools as experts.</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about the integration costs that make developing an SPA so difficult. They also talk about different ways to reload an Ember application while people are actively using it, as well as why it&apos;s important for beginners to use the same tools as experts.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>53</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">3939e251-9793-4699-a90a-e2e765be3a59</guid>
      <title>From build-time to run-time</title>
      <description><![CDATA[<p>Topics include:</p>
<ul>
<li>01:15 - Implementing Mirage's AddonDocs blog with GitHub issues
<ul>
<li>15:30 - Discussion forum vs. GitHub issues vs. blog comments</li>
<li>18:18 - Moving the blog post source to a GitHub issue</li>
<li>23:30 - Dynamic vs. static data, and implications for changing build-time data to run-time data.</li>
<li>27:40 - Downsides of run-time data</li>
</ul>
</li>
<li>37:00 - SPA architecture and distributed systems. How does React/Vue &quot;happy path&quot; architecture differ from Ember's?</li>
<li>41:45 - Testing is the only true way to know if your dependencies work.</li>
<li>43:31 - Where does Ember pass the Celery Test, and where does it fail?</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="http://artsy.github.io/blog/2017/07/15/Comments-are-on/">Artsy Engineering's blog post on using GitHub issues for blog post comments</a></li>
<li><a href="https://utteranc.es/">Utterances</a></li>
<li><a href="https://github.com/tailwindcss/discuss">Tailwind's discussion forum</a></li>
<li><a href="https://github.com/basecamp/handbook/blob/master/vocabulary.md">Basecamp's vocabulary doc, from their handbook</a></li>
</ul>
]]></description>
      <pubDate>Wed, 13 Feb 2019 11:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Topics include:</p>
<ul>
<li>01:15 - Implementing Mirage's AddonDocs blog with GitHub issues
<ul>
<li>15:30 - Discussion forum vs. GitHub issues vs. blog comments</li>
<li>18:18 - Moving the blog post source to a GitHub issue</li>
<li>23:30 - Dynamic vs. static data, and implications for changing build-time data to run-time data.</li>
<li>27:40 - Downsides of run-time data</li>
</ul>
</li>
<li>37:00 - SPA architecture and distributed systems. How does React/Vue &quot;happy path&quot; architecture differ from Ember's?</li>
<li>41:45 - Testing is the only true way to know if your dependencies work.</li>
<li>43:31 - Where does Ember pass the Celery Test, and where does it fail?</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="http://artsy.github.io/blog/2017/07/15/Comments-are-on/">Artsy Engineering's blog post on using GitHub issues for blog post comments</a></li>
<li><a href="https://utteranc.es/">Utterances</a></li>
<li><a href="https://github.com/tailwindcss/discuss">Tailwind's discussion forum</a></li>
<li><a href="https://github.com/basecamp/handbook/blob/master/vocabulary.md">Basecamp's vocabulary doc, from their handbook</a></li>
</ul>
]]></content:encoded>
      <enclosure length="62140384" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/767264e4-c870-46da-ad20-0003526021f1/c16a84e3_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>From build-time to run-time</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/767264e4-c870-46da-ad20-0003526021f1/3000x3000/1550030246artwork.jpg?aid=rss_feed"/>
      <itunes:duration>01:04:37</itunes:duration>
      <itunes:summary>Sam and Ryan chat about using GitHub Issues to power Mirage&apos;s blog, and what implications run-time and build-time data have for the architecture of the AddonDocs site. They also discuss Simon Sinek&apos;s &quot;Celery Test&quot; in the context of Ember.js.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about using GitHub Issues to power Mirage&apos;s blog, and what implications run-time and build-time data have for the architecture of the AddonDocs site. They also discuss Simon Sinek&apos;s &quot;Celery Test&quot; in the context of Ember.js.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>52</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">c4ef2c0f-c7f6-4625-99ed-9aa3b46e5961</guid>
      <title>Lenient libraries, strict applications</title>
      <description><![CDATA[<p>Topics include:</p>
<ul>
<li>04:01: Welcome to Node Dependency Hell.</li>
<li>14:00: How should the way we declare dependencies change if an addon is an implementation detail of another addon?</li>
<li>21:45: Can Ember CLI address these problems a layer above Yarn/npm?</li>
<li>23:25: Is JavaScript's fractured module ecosystem (CommonJS in node vs. ES6 modules in the frontend) contributing to the problem?</li>
<li>26:21: Someone's app broke when they installed their dependencies due to a Mirage dependency changing. How can we reliably solve this for users?</li>
<li>35:05: Even if the tooling were better, there's a cultural problem where JS library authors don't consider the dependencies they bring in.</li>
<li>39:04: Lessons learned:
<ul>
<li>apps should specify strict dependencies, libraries (including addons) should specify lenient dependencies</li>
<li>apps should use lockfiles</li>
<li>ember-dependency-lint &amp; yarn resolutions are a good top-level escape hatch</li>
<li>addons should use the <code>dependencies</code> key &amp; <code>ember-auto-import</code> for most of their dependencies</li>
</ul>
</li>
<li>41:12: Ember Auto Import attempts some deduplication of dependencies. If you're writing an addon that has a dependency the host app cares a lot about, you can use <code>addPackagesToProject</code> to put the burden on host app.</li>
<li>48:33: Would you build Ember CLI Tailwind the same if you were building it from scratch today?</li>
<li>54:55: Call for input. What are any best practices that we've missed? What did we get wrong?</li>
<li>59:20: Mirage blog using GitHub issues teaser</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://github.com/ef4/ember-auto-import">Ember Auto Import</a></li>
<li><a href="https://discuss.emberjs.com/t/how-should-we-resolve-conflicting-addons-and-dependencies/14523">Discourse topic on conflicting dependencies</a></li>
<li><a href="https://github.com/salsify/ember-cli-dependency-lint">Dependency Lint</a></li>
<li><a href="https://github.com/ember-learn/ember-cli-addon-docs">Ember CLI Addon Docs</a></li>
<li><a href="https://github.com/embermap/ember-cli-tailwind">Ember CLI Tailwind</a></li>
</ul>
]]></description>
      <pubDate>Wed, 6 Feb 2019 11:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Topics include:</p>
<ul>
<li>04:01: Welcome to Node Dependency Hell.</li>
<li>14:00: How should the way we declare dependencies change if an addon is an implementation detail of another addon?</li>
<li>21:45: Can Ember CLI address these problems a layer above Yarn/npm?</li>
<li>23:25: Is JavaScript's fractured module ecosystem (CommonJS in node vs. ES6 modules in the frontend) contributing to the problem?</li>
<li>26:21: Someone's app broke when they installed their dependencies due to a Mirage dependency changing. How can we reliably solve this for users?</li>
<li>35:05: Even if the tooling were better, there's a cultural problem where JS library authors don't consider the dependencies they bring in.</li>
<li>39:04: Lessons learned:
<ul>
<li>apps should specify strict dependencies, libraries (including addons) should specify lenient dependencies</li>
<li>apps should use lockfiles</li>
<li>ember-dependency-lint &amp; yarn resolutions are a good top-level escape hatch</li>
<li>addons should use the <code>dependencies</code> key &amp; <code>ember-auto-import</code> for most of their dependencies</li>
</ul>
</li>
<li>41:12: Ember Auto Import attempts some deduplication of dependencies. If you're writing an addon that has a dependency the host app cares a lot about, you can use <code>addPackagesToProject</code> to put the burden on host app.</li>
<li>48:33: Would you build Ember CLI Tailwind the same if you were building it from scratch today?</li>
<li>54:55: Call for input. What are any best practices that we've missed? What did we get wrong?</li>
<li>59:20: Mirage blog using GitHub issues teaser</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://github.com/ef4/ember-auto-import">Ember Auto Import</a></li>
<li><a href="https://discuss.emberjs.com/t/how-should-we-resolve-conflicting-addons-and-dependencies/14523">Discourse topic on conflicting dependencies</a></li>
<li><a href="https://github.com/salsify/ember-cli-dependency-lint">Dependency Lint</a></li>
<li><a href="https://github.com/ember-learn/ember-cli-addon-docs">Ember CLI Addon Docs</a></li>
<li><a href="https://github.com/embermap/ember-cli-tailwind">Ember CLI Tailwind</a></li>
</ul>
]]></content:encoded>
      <enclosure length="59233812" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/24c059d7-2357-4add-af23-9ebd7bdbd1db/Feature_audio_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Lenient libraries, strict applications</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/24c059d7-2357-4add-af23-9ebd7bdbd1db/3000x3000/1549412568artwork.jpg?aid=rss_feed"/>
      <itunes:duration>01:02:08</itunes:duration>
      <itunes:summary>Sam and Ryan discuss the current state of frontend dependency management, and the areas where it leaves much to be desired. They talk about best practices for how applications and libraries should specify their dependencies, and also what happens when those practices aren&apos;t followed.</itunes:summary>
      <itunes:subtitle>Sam and Ryan discuss the current state of frontend dependency management, and the areas where it leaves much to be desired. They talk about best practices for how applications and libraries should specify their dependencies, and also what happens when those practices aren&apos;t followed.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>51</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">9ff8eb66-bed9-48b5-8200-af55a5f5f079</guid>
      <title>Mirage, meet Addon Docs!</title>
      <description><![CDATA[<p>Topics include:</p>
<ul>
<li>01:17: Mirage's new Addon Docs site</li>
<li>35:55: Ember Bind Helper</li>
<li>45:23: Why start with Acceptance Tests?</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://www.ember-cli-mirage.com">EmberCLI Mirage</a></li>
<li><a href="https://github.com/Serabe/ember-bind-helper/tree/master/addon">Ember Bind Helper</a></li>
<li><a href="https://twitter.com/samselikoff">Sam Selikoff on Twitter</a></li>
<li><a href="https://twitter.com/ryantotweets">Ryan Toronto on Twitter</a></li>
</ul>
]]></description>
      <pubDate>Wed, 30 Jan 2019 11:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Topics include:</p>
<ul>
<li>01:17: Mirage's new Addon Docs site</li>
<li>35:55: Ember Bind Helper</li>
<li>45:23: Why start with Acceptance Tests?</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://www.ember-cli-mirage.com">EmberCLI Mirage</a></li>
<li><a href="https://github.com/Serabe/ember-bind-helper/tree/master/addon">Ember Bind Helper</a></li>
<li><a href="https://twitter.com/samselikoff">Sam Selikoff on Twitter</a></li>
<li><a href="https://twitter.com/ryantotweets">Ryan Toronto on Twitter</a></li>
</ul>
]]></content:encoded>
      <enclosure length="67933438" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/5015d88d-902b-4de3-af39-d67aa8009955/3623adbf_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Mirage, meet Addon Docs!</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/5015d88d-902b-4de3-af39-d67aa8009955/3000x3000/1548819183artwork.jpg?aid=rss_feed"/>
      <itunes:duration>01:10:35</itunes:duration>
      <itunes:summary>Sam and Ryan discuss the process of converting Mirage&apos;s docs from a Jekyll app into an Addon Docs site. They also talk about the Ember Bind Helper addon, as well as their approach to test-driven development with Acceptance Tests.</itunes:summary>
      <itunes:subtitle>Sam and Ryan discuss the process of converting Mirage&apos;s docs from a Jekyll app into an Addon Docs site. They also talk about the Ember Bind Helper addon, as well as their approach to test-driven development with Acceptance Tests.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>50</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">c613d4a4-ecdd-464a-9a1d-126296a7d5a0</guid>
      <title>There&apos;s a bug in my FastBoot</title>
      <description><![CDATA[<p>Topics include:</p>
<ul>
<li>0:00 Housekeeping: Upgrades, trainings, and nested dropdowns</li>
<li>12:24: FastBoot bug 1: How HTML responses turn into DOM nodes</li>
<li>37:22: FastBoot bug 2: XMLHTTPRequest and redirects</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://twitter.com/samselikoff">Sam Selikoff on Twitter</a></li>
<li><a href="https://twitter.com/ryantotweets">Ryan Toronto on Twitter</a></li>
</ul>
]]></description>
      <pubDate>Wed, 23 Jan 2019 11:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Topics include:</p>
<ul>
<li>0:00 Housekeeping: Upgrades, trainings, and nested dropdowns</li>
<li>12:24: FastBoot bug 1: How HTML responses turn into DOM nodes</li>
<li>37:22: FastBoot bug 2: XMLHTTPRequest and redirects</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://twitter.com/samselikoff">Sam Selikoff on Twitter</a></li>
<li><a href="https://twitter.com/ryantotweets">Ryan Toronto on Twitter</a></li>
</ul>
]]></content:encoded>
      <enclosure length="58017161" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/a7605739-e60c-45ec-883e-29ff85f3fd94/ef301ea0_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>There&apos;s a bug in my FastBoot</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/a7605739-e60c-45ec-883e-29ff85f3fd94/3000x3000/1548198399artwork.jpg?aid=rss_feed"/>
      <itunes:duration>01:00:17</itunes:duration>
      <itunes:summary>Sam and Ryan discuss two FastBoot bugs that recently caused problems on EmberMap. They talk about what testing strategies could have prevented these bugs, and how they would go about setting up these tests.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan discuss two FastBoot bugs that recently caused problems on EmberMap. They talk about what testing strategies could have prevented these bugs, and how they would go about setting up these tests.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>49</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">998ad055-a868-477c-9739-5fc6b3084452</guid>
      <title>The forgotten middle class</title>
      <description><![CDATA[<p>Topics include:</p>
<ul>
<li>03:16: Incidental complexity in SPA development</li>
<li>33:04: Dealing with undocumented but relied-upon behavior in OSS libraries</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://twitter.com/samselikoff">Sam Selikoff on Twitter</a></li>
<li><a href="https://twitter.com/ryantotweets">Ryan Toronto on Twitter</a></li>
</ul>
]]></description>
      <pubDate>Wed, 16 Jan 2019 11:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Topics include:</p>
<ul>
<li>03:16: Incidental complexity in SPA development</li>
<li>33:04: Dealing with undocumented but relied-upon behavior in OSS libraries</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://twitter.com/samselikoff">Sam Selikoff on Twitter</a></li>
<li><a href="https://twitter.com/ryantotweets">Ryan Toronto on Twitter</a></li>
</ul>
]]></content:encoded>
      <enclosure length="52529262" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/7b1c7fa0-8523-4168-901a-ebf1b1ee9618/332b167f_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>The forgotten middle class</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/7b1c7fa0-8523-4168-901a-ebf1b1ee9618/3000x3000/1547593074artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:54:36</itunes:duration>
      <itunes:summary>Sam and Ryan discuss theory vs. practice in modern SPA development. They talk about whether business logic in the frontend makes UI development easier, or if it ends up creating too much incidental complexity.</itunes:summary>
      <itunes:subtitle>Sam and Ryan discuss theory vs. practice in modern SPA development. They talk about whether business logic in the frontend makes UI development easier, or if it ends up creating too much incidental complexity.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>48</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">cc790bbf-9f93-484f-9600-60c31e4085d0</guid>
      <title>Grab bag: Web vs Native, stale data, and build environments</title>
      <description><![CDATA[<p>Topics include:</p>
<ul>
<li>0:00: Making movies</li>
<li>05:08: Ryan Florence's tweet about Twitter App</li>
<li>18:08: Ember Data stores across browsers</li>
<li>32:58: Laravel's ascending option</li>
<li>35:51: YouTube transition to UI pattern</li>
<li>42:15: Ember's build environments</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://twitter.com/samselikoff/status/1079846073840078848">Sam's Star Wars movie</a></li>
<li><a href="https://twitter.com/ryanflorence/status/1079077919337541632">Ryan Florence on Twitter's PWA</a></li>
</ul>
]]></description>
      <pubDate>Wed, 9 Jan 2019 11:31:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Topics include:</p>
<ul>
<li>0:00: Making movies</li>
<li>05:08: Ryan Florence's tweet about Twitter App</li>
<li>18:08: Ember Data stores across browsers</li>
<li>32:58: Laravel's ascending option</li>
<li>35:51: YouTube transition to UI pattern</li>
<li>42:15: Ember's build environments</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://twitter.com/samselikoff/status/1079846073840078848">Sam's Star Wars movie</a></li>
<li><a href="https://twitter.com/ryanflorence/status/1079077919337541632">Ryan Florence on Twitter's PWA</a></li>
</ul>
]]></content:encoded>
      <enclosure length="53695515" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/ccdf7492-b03e-41e1-a3e8-c908259bb572/db680902_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Grab bag: Web vs Native, stale data, and build environments</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/ccdf7492-b03e-41e1-a3e8-c908259bb572/3000x3000/1546997591artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:55:49</itunes:duration>
      <itunes:summary>Sam and Ryan discuss a handful of different topics in this grab bag episode, including tradeoffs between web and native applications, stale data across different Ember Data stores, and Ember&apos;s three build environments.</itunes:summary>
      <itunes:subtitle>Sam and Ryan discuss a handful of different topics in this grab bag episode, including tradeoffs between web and native applications, stale data across different Ember Data stores, and Ember&apos;s three build environments.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>47</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">74363727-3722-47c8-9aee-f1445d190443</guid>
      <title>Thoughts on tracked properties</title>
      <description><![CDATA[<p>Sam and Ryan discuss the wording behind the proposed &quot;@tracked&quot; syntax and how it shapes their understanding of Ember's new programming model. They also talk about 404 pages, data ownership, and their upcoming EmberConf trainings.</p>
<p>Topics include:</p>
<ul>
<li>0:00: Tracked properties</li>
<li>13:27: 404 pages</li>
<li>26:38: Smart components</li>
<li>41:00: EmberConf trainings</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://emberconf.com/index.html">Ember Conf</a></li>
<li><a href="https://embermap.com/topics/component-side-effects">Component Side Effects</a></li>
<li><a href="https://github.com/embermap/ember-data-storefront">EmberData Storefront</a></li>
<li><a href="https://www.youtube.com/watch?v=4JofVQ3nGrw">Ember Animation</a></li>
<li><a href="https://github.com/ember-animation/liquid-fire">Liquid Fire</a></li>
</ul>
]]></description>
      <pubDate>Wed, 19 Dec 2018 11:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan discuss the wording behind the proposed &quot;@tracked&quot; syntax and how it shapes their understanding of Ember's new programming model. They also talk about 404 pages, data ownership, and their upcoming EmberConf trainings.</p>
<p>Topics include:</p>
<ul>
<li>0:00: Tracked properties</li>
<li>13:27: 404 pages</li>
<li>26:38: Smart components</li>
<li>41:00: EmberConf trainings</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://emberconf.com/index.html">Ember Conf</a></li>
<li><a href="https://embermap.com/topics/component-side-effects">Component Side Effects</a></li>
<li><a href="https://github.com/embermap/ember-data-storefront">EmberData Storefront</a></li>
<li><a href="https://www.youtube.com/watch?v=4JofVQ3nGrw">Ember Animation</a></li>
<li><a href="https://github.com/ember-animation/liquid-fire">Liquid Fire</a></li>
</ul>
]]></content:encoded>
      <enclosure length="54152251" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/5336d14e-8014-4cb8-a978-ae730cfc1630/c363827a_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Thoughts on tracked properties</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/5336d14e-8014-4cb8-a978-ae730cfc1630/3000x3000/1545170206artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:56:24</itunes:duration>
      <itunes:summary>Sam and Ryan discuss the wording behind the proposed &quot;@tracked&quot; syntax and how it shapes their understanding of Ember&apos;s new programming model. They also talk about 404 pages, data ownership, and their upcoming EmberConf trainings.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan discuss the wording behind the proposed &quot;@tracked&quot; syntax and how it shapes their understanding of Ember&apos;s new programming model. They also talk about 404 pages, data ownership, and their upcoming EmberConf trainings.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>46</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">6a4352b7-88a5-4747-8e55-31f56acb7140</guid>
      <title>Incremental Ember upgrades</title>
      <description><![CDATA[<p>Sam and Ryan discuss a new process for upgrading Ember apps and Sam's experience using it on EmberMap's codebase. They also talk about leadership in Open Source projects and lessons learned from Mirage.</p>
<p>Topics include:</p>
<ul>
<li>04:45: What is a leader's job?</li>
<li>13:17: Step-by-Step: Upgrading EmberMap</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=RyTQ5-SQYTo">Most leaders don't even know the game they are in</a></li>
<li><a href="https://github.com/ember-cli/ember-cli-update">ember-cli-update</a></li>
<li><a href="https://dependabot.com/">Dependabot</a></li>
</ul>
]]></description>
      <pubDate>Wed, 12 Dec 2018 11:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan discuss a new process for upgrading Ember apps and Sam's experience using it on EmberMap's codebase. They also talk about leadership in Open Source projects and lessons learned from Mirage.</p>
<p>Topics include:</p>
<ul>
<li>04:45: What is a leader's job?</li>
<li>13:17: Step-by-Step: Upgrading EmberMap</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=RyTQ5-SQYTo">Most leaders don't even know the game they are in</a></li>
<li><a href="https://github.com/ember-cli/ember-cli-update">ember-cli-update</a></li>
<li><a href="https://dependabot.com/">Dependabot</a></li>
</ul>
]]></content:encoded>
      <enclosure length="56540262" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/02417c1e-1770-4b0a-9980-71acaa15e857/3cc3c3b2_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Incremental Ember upgrades</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/02417c1e-1770-4b0a-9980-71acaa15e857/3000x3000/1544567201artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:58:47</itunes:duration>
      <itunes:summary>Sam and Ryan discuss a new process for upgrading Ember apps and Sam&apos;s experience using it on EmberMap&apos;s codebase. They also talk about leadership in Open Source projects and lessons learned from Mirage.</itunes:summary>
      <itunes:subtitle>Sam and Ryan discuss a new process for upgrading Ember apps and Sam&apos;s experience using it on EmberMap&apos;s codebase. They also talk about leadership in Open Source projects and lessons learned from Mirage.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>45</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">a470e466-2f8a-4109-9f02-9fc709354d77</guid>
      <title>The elephant in the room</title>
      <description><![CDATA[<p>Sam and Ryan discuss the difficulty of working with a design system that doesn't have good escape hatches, how implementing HTML and CSS can be more complex and time-consuming than coding user behavior, and some creative approaches to ensuring JSON:API payloads represent canonical server-side state.</p>
<p>Topics include:</p>
<ul>
<li>04:15: Design systems and when they break down</li>
<li>22:38: The complexity of implementing designs in HTML and CSS</li>
<li>34:38: JSON:API mutations. How incomplete response payloads can put your Ember app into an impossible state.</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://embermap.com/topics/forms">Forms</a></li>
<li><a href="https://jsonapi.org/format/">JSON API Spec</a></li>
<li><a href="https://en.wikipedia.org/wiki/Conway%27s_law">Conway’s Law</a></li>
</ul>
]]></description>
      <pubDate>Wed, 5 Dec 2018 13:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan discuss the difficulty of working with a design system that doesn't have good escape hatches, how implementing HTML and CSS can be more complex and time-consuming than coding user behavior, and some creative approaches to ensuring JSON:API payloads represent canonical server-side state.</p>
<p>Topics include:</p>
<ul>
<li>04:15: Design systems and when they break down</li>
<li>22:38: The complexity of implementing designs in HTML and CSS</li>
<li>34:38: JSON:API mutations. How incomplete response payloads can put your Ember app into an impossible state.</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://embermap.com/topics/forms">Forms</a></li>
<li><a href="https://jsonapi.org/format/">JSON API Spec</a></li>
<li><a href="https://en.wikipedia.org/wiki/Conway%27s_law">Conway’s Law</a></li>
</ul>
]]></content:encoded>
      <enclosure length="62209243" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/a71e78f1-efdb-404c-bf96-8f2535a2bd5d/36ce98c3_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>The elephant in the room</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/a71e78f1-efdb-404c-bf96-8f2535a2bd5d/3000x3000/1543950923artwork.jpg?aid=rss_feed"/>
      <itunes:duration>01:04:40</itunes:duration>
      <itunes:summary>Sam and Ryan discuss the difficulty of working with a design system that doesn&apos;t have good escape hatches, how implementing HTML and CSS can be more complex and time-consuming than coding user behavior, and some creative approaches to ensuring JSON:API payloads represent canonical server-side state.</itunes:summary>
      <itunes:subtitle>Sam and Ryan discuss the difficulty of working with a design system that doesn&apos;t have good escape hatches, how implementing HTML and CSS can be more complex and time-consuming than coding user behavior, and some creative approaches to ensuring JSON:API payloads represent canonical server-side state.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>44</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">f2f6386c-62e6-4050-86ad-8917189a3a71</guid>
      <title>Going all in on &quot;outside in&quot;</title>
      <description><![CDATA[<p>Sam and Ryan discuss getting Mirage and Ember to work in CodeSandbox, how FastBoot affects different approaches to rendering responsive content, and different ways an outside-in mindset can benefit product teams and open-source software projects.</p>
<p>Topics include:</p>
<ul>
<li>2:50: Getting Ember and Mirage working on CodeSandbox. Coding in the browser.</li>
<li>10:30: How FastBoot affects the use of screen width services</li>
<li>24:40: Going all-in on outside-in development. Starting at the end.</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://codesandbox.io/">CodeSandbox</a></li>
<li><a href="https://codesandbox.io/s/003o6pq34n">Mirage boilerplate in CodeSandbox</a></li>
<li><a href="https://embermap.com/ember-component-patterns">EmberMap Email Course</a></li>
<li><a href="https://en.wikipedia.org/wiki/Conway%27s_law">Conway's Law</a></li>
</ul>
]]></description>
      <pubDate>Wed, 28 Nov 2018 13:50:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan discuss getting Mirage and Ember to work in CodeSandbox, how FastBoot affects different approaches to rendering responsive content, and different ways an outside-in mindset can benefit product teams and open-source software projects.</p>
<p>Topics include:</p>
<ul>
<li>2:50: Getting Ember and Mirage working on CodeSandbox. Coding in the browser.</li>
<li>10:30: How FastBoot affects the use of screen width services</li>
<li>24:40: Going all-in on outside-in development. Starting at the end.</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://codesandbox.io/">CodeSandbox</a></li>
<li><a href="https://codesandbox.io/s/003o6pq34n">Mirage boilerplate in CodeSandbox</a></li>
<li><a href="https://embermap.com/ember-component-patterns">EmberMap Email Course</a></li>
<li><a href="https://en.wikipedia.org/wiki/Conway%27s_law">Conway's Law</a></li>
</ul>
]]></content:encoded>
      <enclosure length="39932872" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/e306dfac-2696-432e-aaa0-d33344501f8f/4884a047_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Going all in on &quot;outside in&quot;</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/e306dfac-2696-432e-aaa0-d33344501f8f/3000x3000/1543412714artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:41:32</itunes:duration>
      <itunes:summary>Sam and Ryan discuss getting Mirage and Ember to work in CodeSandbox, how FastBoot affects different approaches to rendering responsive content, and different ways an outside-in mindset can benefit product teams and open-source software projects.</itunes:summary>
      <itunes:subtitle>Sam and Ryan discuss getting Mirage and Ember to work in CodeSandbox, how FastBoot affects different approaches to rendering responsive content, and different ways an outside-in mindset can benefit product teams and open-source software projects.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>43</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">97d5ffc3-15cf-4886-8994-5477bd5c4147</guid>
      <title>A less constrained environment</title>
      <description><![CDATA[<p>Sam and Ryan discuss new videos on async testing and declarative form validations. They also talk about why it's so hard to create good abstractions in Ember, or more generally the front-end landscape. They discuss constraints versus flexibility, and how the size of a library's problem space affects the likelihood of arriving at a good abstraction.</p>
<p>Topics include:</p>
<ul>
<li>01:14: Lessons learned from the Async Testing series</li>
<li>06:20: Forms: declarative validations, building blocks &amp; escape hatches</li>
<li>12:56: Why building forms in UI libraries is hard – unconstrained environments</li>
<li>30:45: Philosophical differences, and over- vs. under-abstracting</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://embermap.com/topics/async-testing">EmberMap's premium series on Async Testing</a></li>
<li><a href="https://twitter.com/acdlite">Andrew Clark on Twitter</a></li>
</ul>
]]></description>
      <pubDate>Wed, 21 Nov 2018 13:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan discuss new videos on async testing and declarative form validations. They also talk about why it's so hard to create good abstractions in Ember, or more generally the front-end landscape. They discuss constraints versus flexibility, and how the size of a library's problem space affects the likelihood of arriving at a good abstraction.</p>
<p>Topics include:</p>
<ul>
<li>01:14: Lessons learned from the Async Testing series</li>
<li>06:20: Forms: declarative validations, building blocks &amp; escape hatches</li>
<li>12:56: Why building forms in UI libraries is hard – unconstrained environments</li>
<li>30:45: Philosophical differences, and over- vs. under-abstracting</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://embermap.com/topics/async-testing">EmberMap's premium series on Async Testing</a></li>
<li><a href="https://twitter.com/acdlite">Andrew Clark on Twitter</a></li>
</ul>
]]></content:encoded>
      <enclosure length="39915331" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/aa99b1c2-76c1-45b5-a45d-16bb0d89f946/3fbd5099_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>A less constrained environment</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/aa99b1c2-76c1-45b5-a45d-16bb0d89f946/3000x3000/1542748417artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:41:28</itunes:duration>
      <itunes:summary>Sam and Ryan discuss new videos on async testing and declarative form validations. They also talk about why it&apos;s so hard to create good abstractions in Ember, or more generally the front-end landscape. They discuss constraints versus flexibility, and how the size of a library&apos;s problem space affects the likelihood of arriving at a good abstraction.</itunes:summary>
      <itunes:subtitle>Sam and Ryan discuss new videos on async testing and declarative form validations. They also talk about why it&apos;s so hard to create good abstractions in Ember, or more generally the front-end landscape. They discuss constraints versus flexibility, and how the size of a library&apos;s problem space affects the likelihood of arriving at a good abstraction.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>42</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">c9c9bc88-f8c8-4f82-8bea-3cfac2e00170</guid>
      <title>Recursive partial application</title>
      <description><![CDATA[<p>Sam and Ryan discuss an elegant solution to the async nested dropdown problem, a FastBoot success story regarding inlined CSS, pre-warming FastBoot's cache, and implementing a new design alongside an existing design language.</p>
<p>Topics include:</p>
<ul>
<li>01:11: Solving the nested dropdown by recursively currying an action</li>
<li>25:00: Inlined CSS and caching with FastBoot</li>
<li>40:22: Challenges implementing a new design in an existing design language</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://github.com/FullHuman/purgecss">PurgeCSS</a></li>
</ul>
]]></description>
      <pubDate>Wed, 14 Nov 2018 13:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan discuss an elegant solution to the async nested dropdown problem, a FastBoot success story regarding inlined CSS, pre-warming FastBoot's cache, and implementing a new design alongside an existing design language.</p>
<p>Topics include:</p>
<ul>
<li>01:11: Solving the nested dropdown by recursively currying an action</li>
<li>25:00: Inlined CSS and caching with FastBoot</li>
<li>40:22: Challenges implementing a new design in an existing design language</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://github.com/FullHuman/purgecss">PurgeCSS</a></li>
</ul>
]]></content:encoded>
      <enclosure length="59439577" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/3a8a7adf-3226-4883-abaf-66db4f3cd769/49ffe913_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Recursive partial application</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/3a8a7adf-3226-4883-abaf-66db4f3cd769/3000x3000/1542162983artwork.jpg?aid=rss_feed"/>
      <itunes:duration>01:01:48</itunes:duration>
      <itunes:summary>Sam and Ryan discuss an elegant solution to the async nested dropdown problem, a FastBoot success story regarding inlined CSS, pre-warming FastBoot&apos;s cache, and implementing a new design alongside an existing design language.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan discuss an elegant solution to the async nested dropdown problem, a FastBoot success story regarding inlined CSS, pre-warming FastBoot&apos;s cache, and implementing a new design alongside an existing design language.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>41</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">595f20a7-7461-41b1-9d80-07bf0a483739</guid>
      <title>Compose wisely</title>
      <description><![CDATA[<p>Sam and Ryan chat about the challenges of testing custom asynchronous code. They also talk about React's new Hooks API, and discuss situations where hooks might be more composable than yields and contextual components.</p>
<p>Topics include:</p>
<ul>
<li>00:00 – Testing custom asynchronous code, like an animated bar chart</li>
<li>25:23 – React's new Hooks API</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://embermap.com/topics/async-testing">EmberMap Async testing series</a></li>
<li><a href="https://github.com/emberjs/ember-test-helpers/blob/master/API.md#wait-helpers">API docs for Ember's testing helpers</a></li>
<li><a href="https://www.youtube.com/watch?v=V-QO-KO90iQ">Overview of React Hooks with Dan Abramov and Sophie Alpert</a></li>
<li><a href="https://www.youtube.com/watch?v=wXLf18DsV-I">90% Cleaner React with Hooks – Ryan Florence</a></li>
<li><a href="https://twitter.com/samselikoff">Sam Selikoff on Twitter</a></li>
<li><a href="https://twitter.com/ryantotweets">Ryan Toronto on Twitter</a></li>
</ul>
]]></description>
      <pubDate>Tue, 6 Nov 2018 13:17:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan chat about the challenges of testing custom asynchronous code. They also talk about React's new Hooks API, and discuss situations where hooks might be more composable than yields and contextual components.</p>
<p>Topics include:</p>
<ul>
<li>00:00 – Testing custom asynchronous code, like an animated bar chart</li>
<li>25:23 – React's new Hooks API</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://embermap.com/topics/async-testing">EmberMap Async testing series</a></li>
<li><a href="https://github.com/emberjs/ember-test-helpers/blob/master/API.md#wait-helpers">API docs for Ember's testing helpers</a></li>
<li><a href="https://www.youtube.com/watch?v=V-QO-KO90iQ">Overview of React Hooks with Dan Abramov and Sophie Alpert</a></li>
<li><a href="https://www.youtube.com/watch?v=wXLf18DsV-I">90% Cleaner React with Hooks – Ryan Florence</a></li>
<li><a href="https://twitter.com/samselikoff">Sam Selikoff on Twitter</a></li>
<li><a href="https://twitter.com/ryantotweets">Ryan Toronto on Twitter</a></li>
</ul>
]]></content:encoded>
      <enclosure length="56416663" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/d39cf76f-6bc9-4210-b89a-ec3602321eea/bd56eab2_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Compose wisely</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/d39cf76f-6bc9-4210-b89a-ec3602321eea/3000x3000/1541510396artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:58:39</itunes:duration>
      <itunes:summary>Sam and Ryan chat about the challenges of testing custom asynchronous code. They also talk about React&apos;s new Hooks API, and discuss situations where hooks might be more composable than yields and contextual components.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about the challenges of testing custom asynchronous code. They also talk about React&apos;s new Hooks API, and discuss situations where hooks might be more composable than yields and contextual components.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>40</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">c18f134c-f042-4d77-8aa0-bd09912526b2</guid>
      <title>A dropdown nest</title>
      <description><![CDATA[<p>Sam and Ryan talk about the challenges of building nested dropdowns, whether a component reading data from its children is an anti-pattern, how angle-bracket syntax encourages new components, and whether “CSS best practices” exist.</p>
<p>Topics include:</p>
<ul>
<li>00:40 – Thinking through a nested drop-down navigation menu</li>
<li>35:15 – Building an  component &amp; angle-bracket syntax</li>
<li>45:00 – Layout UI primitives</li>
<li>46:35 – What are CSS best practices? How might Tailwind encourage these?</li>
<li>52:17 – &quot;Semantic&quot; classes. Should developers have to name every UI element, if designers don't?</li>
</ul>
]]></description>
      <pubDate>Tue, 30 Oct 2018 18:10:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about the challenges of building nested dropdowns, whether a component reading data from its children is an anti-pattern, how angle-bracket syntax encourages new components, and whether “CSS best practices” exist.</p>
<p>Topics include:</p>
<ul>
<li>00:40 – Thinking through a nested drop-down navigation menu</li>
<li>35:15 – Building an  component &amp; angle-bracket syntax</li>
<li>45:00 – Layout UI primitives</li>
<li>46:35 – What are CSS best practices? How might Tailwind encourage these?</li>
<li>52:17 – &quot;Semantic&quot; classes. Should developers have to name every UI element, if designers don't?</li>
</ul>
]]></content:encoded>
      <enclosure length="53464328" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/110d97de-0311-4a65-973a-cfbd45fc4088/f88f4c41_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>A dropdown nest</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/110d97de-0311-4a65-973a-cfbd45fc4088/3000x3000/1540923168artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:55:35</itunes:duration>
      <itunes:summary>Sam and Ryan talk about the challenges of building nested dropdowns, whether a component reading data from its children is an anti-pattern, how angle-bracket syntax encourages new components, and whether “CSS best practices” exist.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about the challenges of building nested dropdowns, whether a component reading data from its children is an anti-pattern, how angle-bracket syntax encourages new components, and whether “CSS best practices” exist.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>39</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">f5053e2d-0466-4750-97b0-69f58d3a41a9</guid>
      <title>Your frontend is ready for production</title>
      <description><![CDATA[<p>Sam and Ryan talk about their upcoming email course on Ember component patterns, wrapping up their EmberMap series on Functional CSS, refactoring some FastBoot code in Node, and how Mirage might be useful if it could run as a real server.</p>
<p>Topics include:</p>
<ul>
<li>0:30 - Email course in Ember Component Design</li>
<li>8:00 - EmberMap course on Functional CSS with Ember
<ul>
<li>Do you have a preferred API for styled component variants? See Sam's tweet below.</li>
</ul>
</li>
<li>14:00 - FastBoot, and refactoring and testing Node code</li>
<li>31:10 - Pushing Mirage to run as a non-production server</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://embermap.com/topics/using-functional-css-with-ember">Using Functional CSS with Ember</a></li>
<li><a href="https://twitter.com/samselikoff/status/1051661770321002496">Sam's tweet on styled variants</a></li>
<li><a href="https://artofproductpodcast.com">Art of Product Podcast</a></li>
</ul>
]]></description>
      <pubDate>Fri, 19 Oct 2018 19:13:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about their upcoming email course on Ember component patterns, wrapping up their EmberMap series on Functional CSS, refactoring some FastBoot code in Node, and how Mirage might be useful if it could run as a real server.</p>
<p>Topics include:</p>
<ul>
<li>0:30 - Email course in Ember Component Design</li>
<li>8:00 - EmberMap course on Functional CSS with Ember
<ul>
<li>Do you have a preferred API for styled component variants? See Sam's tweet below.</li>
</ul>
</li>
<li>14:00 - FastBoot, and refactoring and testing Node code</li>
<li>31:10 - Pushing Mirage to run as a non-production server</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://embermap.com/topics/using-functional-css-with-ember">Using Functional CSS with Ember</a></li>
<li><a href="https://twitter.com/samselikoff/status/1051661770321002496">Sam's tweet on styled variants</a></li>
<li><a href="https://artofproductpodcast.com">Art of Product Podcast</a></li>
</ul>
]]></content:encoded>
      <enclosure length="52381870" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/4a6abcbd-ebe2-4d8d-836e-0d149a23449f/96bc3074_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Your frontend is ready for production</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/4a6abcbd-ebe2-4d8d-836e-0d149a23449f/3000x3000/1539976737artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:54:30</itunes:duration>
      <itunes:summary>Sam and Ryan talk about their upcoming email course on Ember component patterns, wrapping up their EmberMap series on Functional CSS, refactoring some FastBoot code in Node, and how Mirage might be useful if it could run as a real server.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about their upcoming email course on Ember component patterns, wrapping up their EmberMap series on Functional CSS, refactoring some FastBoot code in Node, and how Mirage might be useful if it could run as a real server.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>38</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">a17b7fae-5fd1-42a6-97a5-e988704bfbe8</guid>
      <title>Scope down!</title>
      <description><![CDATA[<p>Sam and Ryan talk about lessons from Jason Fried's Q&amp;A about scoping down product features, and how that applies to our open-source work. They also talk about inlining critical-path CSS with FastBoot.</p>
<p>Topics include:</p>
<ul>
<li>Inlining CSS with FastBoot (0:08)</li>
<li>Scoping down (14:26)
<ul>
<li>Jason Fried's Q&amp;A at Laracon</li>
<li>Scoping down at work and in OSS</li>
<li>How to handle OSS contributors who add scope</li>
<li>How bugs indicate a larger-than-expected problem space</li>
<li>How to say no to new features you can't commit to supporting</li>
<li>Are there projects that can't be scoped down?</li>
<li>Using OSS checkpoints to avoid burnout</li>
</ul>
</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=Pie8o03qT6w">Jason Fried Q&amp;A at Laracon</a></li>
</ul>
]]></description>
      <pubDate>Fri, 12 Oct 2018 19:16:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about lessons from Jason Fried's Q&amp;A about scoping down product features, and how that applies to our open-source work. They also talk about inlining critical-path CSS with FastBoot.</p>
<p>Topics include:</p>
<ul>
<li>Inlining CSS with FastBoot (0:08)</li>
<li>Scoping down (14:26)
<ul>
<li>Jason Fried's Q&amp;A at Laracon</li>
<li>Scoping down at work and in OSS</li>
<li>How to handle OSS contributors who add scope</li>
<li>How bugs indicate a larger-than-expected problem space</li>
<li>How to say no to new features you can't commit to supporting</li>
<li>Are there projects that can't be scoped down?</li>
<li>Using OSS checkpoints to avoid burnout</li>
</ul>
</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=Pie8o03qT6w">Jason Fried Q&amp;A at Laracon</a></li>
</ul>
]]></content:encoded>
      <enclosure length="58956703" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/8a30d284-4bf9-4050-9874-5ab505eaa2fd/d1b5f62a_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Scope down!</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/8a30d284-4bf9-4050-9874-5ab505eaa2fd/3000x3000/1539371727artwork.jpg?aid=rss_feed"/>
      <itunes:duration>01:01:21</itunes:duration>
      <itunes:summary>Sam and Ryan talk about lessons from Jason Fried&apos;s Q&amp;A about scoping down product features, and how that applies to our open-source work. They also talk about inlining critical-path CSS with FastBoot.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about lessons from Jason Fried&apos;s Q&amp;A about scoping down product features, and how that applies to our open-source work. They also talk about inlining critical-path CSS with FastBoot.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>37</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">d6f5e3b8-8a32-4fc9-b493-f98399c5b25e</guid>
      <title>Can small libraries be conventional?</title>
      <description><![CDATA[<p>Sam and Ryan chat about two new EmberMap series, Forms and Async testing, as well as Sam's keynote at EmberCamp and the best way to avoid product gaps in open-source software. They also answer some listener questions.</p>
<p>Topics include:</p>
<ul>
<li>Forms (1:18)</li>
<li>Splitting forms into containers and presenters</li>
<li>Avoiding premature abstractions (7:03)</li>
<li>Which components do you carry from project to project?</li>
<li>Asynchronous testing (14:47)</li>
<li>Testing animations</li>
<li>Sam's keynote at EmberCamp on Product gaps (19:04)</li>
<li>Product gaps at companies vs. in OSS</li>
<li>Are small packages and convention over configuration at odds with each other?</li>
<li>Convention over configuration that decomposes well</li>
<li>The risk of bad high-level abstractions in OSS</li>
<li>How to &quot;finish&quot; an OSS project</li>
</ul>
<p>Questions:</p>
<ul>
<li>What's the state of TypeScript support in Ember? (48:15)</li>
<li>When are observers actually appropriate to use? (54:57)</li>
<li>Any tips on refactoring async relationships? (59:34)</li>
</ul>
]]></description>
      <pubDate>Wed, 3 Oct 2018 18:08:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan chat about two new EmberMap series, Forms and Async testing, as well as Sam's keynote at EmberCamp and the best way to avoid product gaps in open-source software. They also answer some listener questions.</p>
<p>Topics include:</p>
<ul>
<li>Forms (1:18)</li>
<li>Splitting forms into containers and presenters</li>
<li>Avoiding premature abstractions (7:03)</li>
<li>Which components do you carry from project to project?</li>
<li>Asynchronous testing (14:47)</li>
<li>Testing animations</li>
<li>Sam's keynote at EmberCamp on Product gaps (19:04)</li>
<li>Product gaps at companies vs. in OSS</li>
<li>Are small packages and convention over configuration at odds with each other?</li>
<li>Convention over configuration that decomposes well</li>
<li>The risk of bad high-level abstractions in OSS</li>
<li>How to &quot;finish&quot; an OSS project</li>
</ul>
<p>Questions:</p>
<ul>
<li>What's the state of TypeScript support in Ember? (48:15)</li>
<li>When are observers actually appropriate to use? (54:57)</li>
<li>Any tips on refactoring async relationships? (59:34)</li>
</ul>
]]></content:encoded>
      <enclosure length="63307664" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/9fb7ca2b-3e39-4cb5-a6d3-0dde2a207ccc/4ceff26d_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Can small libraries be conventional?</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/9fb7ca2b-3e39-4cb5-a6d3-0dde2a207ccc/3000x3000/1538590079artwork.jpg?aid=rss_feed"/>
      <itunes:duration>01:05:53</itunes:duration>
      <itunes:summary>Sam and Ryan chat about two new EmberMap series, Forms and Async testing, as well as Sam&apos;s keynote at EmberCamp and the best way to avoid product gaps in open-source software. They also answer some listener questions.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about two new EmberMap series, Forms and Async testing, as well as Sam&apos;s keynote at EmberCamp and the best way to avoid product gaps in open-source software. They also answer some listener questions.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>36</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">27d0351c-6b94-47aa-9822-f41f86e7ce63</guid>
      <title>The Product Gap</title>
      <description><![CDATA[<p>Sam and Ryan continue their discussion about the role of product in an engineer's daily working life. They talk about what product gaps are, the symptoms of product gaps on tech teams, and what you can do about product gaps if you're on a team with no product manager.</p>
<p>Topics:</p>
<ul>
<li>2:05 – All about product
<ul>
<li>More product responsibilities fall on engineers than ever before</li>
<li>Coders can help surface valuable info to business teams about the tradeoffs of their product decisions</li>
<li>Learning product makes coders better because it influences what they code, it increases their chance of building software that will actually be used, and it helps them focus at work</li>
<li>The symptoms of a product gap drives engineers to think that they need to code more</li>
<li>Product gaps often creep up on medium-size teams that don't have dedicated product managers</li>
<li>Symptoms of a product gap:
<ul>
<li>Having three number one priorities</li>
<li>Coding after hours</li>
<li>Tons of work being done, but feeling like you're moving an inch in every direction</li>
<li>Hard time estimating</li>
<li>You finish a sprint, and you're not sure what the value was</li>
<li>&quot;We just need more engineers&quot;</li>
</ul>
</li>
<li>If you're on a team with no product manager, and you have a product gap, what can you do?
<ul>
<li>Ask a lot of questions, and push the product decisions up.</li>
<li>Let the whole organization feel the pain of the product decisions that aren't being made.</li>
<li>Surface the tradeoffs being made.</li>
</ul>
</li>
<li>&quot;But this is not my job, I'm an engineer! I just want to code.&quot;
<ul>
<li>If you ignore this stuff, your &quot;just coding&quot; won't be sustainable</li>
</ul>
</li>
<li>How to get your engineers out of meetings and firing on all cylinders: a product roadmap
<ul>
<li>Make sure your product cards are not about implementation details</li>
</ul>
</li>
<li>How to recognize which decisions you can make as an engineer, and which you can't</li>
<li>Why you shouldn't say yes to every work request</li>
<li>How doubling your estimates can surface product issues</li>
</ul>
</li>
</ul>
]]></description>
      <pubDate>Thu, 27 Sep 2018 10:53:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan continue their discussion about the role of product in an engineer's daily working life. They talk about what product gaps are, the symptoms of product gaps on tech teams, and what you can do about product gaps if you're on a team with no product manager.</p>
<p>Topics:</p>
<ul>
<li>2:05 – All about product
<ul>
<li>More product responsibilities fall on engineers than ever before</li>
<li>Coders can help surface valuable info to business teams about the tradeoffs of their product decisions</li>
<li>Learning product makes coders better because it influences what they code, it increases their chance of building software that will actually be used, and it helps them focus at work</li>
<li>The symptoms of a product gap drives engineers to think that they need to code more</li>
<li>Product gaps often creep up on medium-size teams that don't have dedicated product managers</li>
<li>Symptoms of a product gap:
<ul>
<li>Having three number one priorities</li>
<li>Coding after hours</li>
<li>Tons of work being done, but feeling like you're moving an inch in every direction</li>
<li>Hard time estimating</li>
<li>You finish a sprint, and you're not sure what the value was</li>
<li>&quot;We just need more engineers&quot;</li>
</ul>
</li>
<li>If you're on a team with no product manager, and you have a product gap, what can you do?
<ul>
<li>Ask a lot of questions, and push the product decisions up.</li>
<li>Let the whole organization feel the pain of the product decisions that aren't being made.</li>
<li>Surface the tradeoffs being made.</li>
</ul>
</li>
<li>&quot;But this is not my job, I'm an engineer! I just want to code.&quot;
<ul>
<li>If you ignore this stuff, your &quot;just coding&quot; won't be sustainable</li>
</ul>
</li>
<li>How to get your engineers out of meetings and firing on all cylinders: a product roadmap
<ul>
<li>Make sure your product cards are not about implementation details</li>
</ul>
</li>
<li>How to recognize which decisions you can make as an engineer, and which you can't</li>
<li>Why you shouldn't say yes to every work request</li>
<li>How doubling your estimates can surface product issues</li>
</ul>
</li>
</ul>
]]></content:encoded>
      <enclosure length="60115286" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/b776a97a-5d16-4604-b43e-719291c0da7a/5f40eaf7_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>The Product Gap</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/b776a97a-5d16-4604-b43e-719291c0da7a/3000x3000/1538045748artwork.jpg?aid=rss_feed"/>
      <itunes:duration>01:02:34</itunes:duration>
      <itunes:summary>Sam and Ryan continue their discussion about the role of product in an engineer&apos;s daily working life. They talk about what product gaps are, the symptoms of product gaps on tech teams, and what you can do about product gaps if you&apos;re on a team with no product manager.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan continue their discussion about the role of product in an engineer&apos;s daily working life. They talk about what product gaps are, the symptoms of product gaps on tech teams, and what you can do about product gaps if you&apos;re on a team with no product manager.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>35</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">383dcadc-c945-4bfe-bf3c-203311c1d913</guid>
      <title>80% done, 80% to go</title>
      <description><![CDATA[<p>Sam and Ryan talk about the cost of using engineering as discovery, the consequences of embedding product decisions throughout the design and development phases of a project, and other lessons that software engineers can learn from product developers. They also chat about how they categorize Github issues.</p>
<p>Topics:</p>
<ul>
<li>
<p>0:00 – GitHub issue categorization</p>
<ul>
<li>The importance of issue triage</li>
<li>Prioritizing bugs over features</li>
<li>Getting Things Done</li>
</ul>
</li>
<li>
<p>7:53 – Managing product</p>
<ul>
<li>7:53 - Engineering issues as a symptom of product/process issues</li>
<li>13:05 - The 3 phases of a software feature: product, design, engineering</li>
<li>16:04 - What happens when you embed product decisions in the design/engineering phases of a project</li>
<li>29:27 – Who's the head of product? Design? Engineering? Who is the decision-maker?</li>
<li>31:22 – Falsely believing that all decisions are final. Stakeholder PTSD.</li>
<li>34:07 – Product and marketing decisions are getting made, whether you are making them explicitly or not.</li>
<li>37:00 – If we care about people being successful with Ember, we need to understand the product decisions that are being made on behalf of Ember. In OSS, we are making product decisions whether we realize it or not. Are we making them as a side effect of our work? If so, we could create better software by thinking explicitly about these decisions.</li>
<li>41:04 - What do you do when you've gone through this phase and you learn something new?</li>
<li>41:55 - Small batches (Lean startup). Envelope example. Unknown complexity at the end of software projects.</li>
<li>45:28 - Getting a cross-discipline team in the same room. Having a decision-maker to avoid design by committee.</li>
</ul>
</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://www.amazon.com/Lean-Startup-Entrepreneurs-Continuous-Innovation/dp/0307887898/ref=sr_1_3?ie=UTF8&amp;qid=1536770044&amp;sr=8-3&amp;keywords=lean+startup">The Lean Startup</a> by Eric Ries</li>
</ul>
]]></description>
      <pubDate>Wed, 12 Sep 2018 17:47:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about the cost of using engineering as discovery, the consequences of embedding product decisions throughout the design and development phases of a project, and other lessons that software engineers can learn from product developers. They also chat about how they categorize Github issues.</p>
<p>Topics:</p>
<ul>
<li>
<p>0:00 – GitHub issue categorization</p>
<ul>
<li>The importance of issue triage</li>
<li>Prioritizing bugs over features</li>
<li>Getting Things Done</li>
</ul>
</li>
<li>
<p>7:53 – Managing product</p>
<ul>
<li>7:53 - Engineering issues as a symptom of product/process issues</li>
<li>13:05 - The 3 phases of a software feature: product, design, engineering</li>
<li>16:04 - What happens when you embed product decisions in the design/engineering phases of a project</li>
<li>29:27 – Who's the head of product? Design? Engineering? Who is the decision-maker?</li>
<li>31:22 – Falsely believing that all decisions are final. Stakeholder PTSD.</li>
<li>34:07 – Product and marketing decisions are getting made, whether you are making them explicitly or not.</li>
<li>37:00 – If we care about people being successful with Ember, we need to understand the product decisions that are being made on behalf of Ember. In OSS, we are making product decisions whether we realize it or not. Are we making them as a side effect of our work? If so, we could create better software by thinking explicitly about these decisions.</li>
<li>41:04 - What do you do when you've gone through this phase and you learn something new?</li>
<li>41:55 - Small batches (Lean startup). Envelope example. Unknown complexity at the end of software projects.</li>
<li>45:28 - Getting a cross-discipline team in the same room. Having a decision-maker to avoid design by committee.</li>
</ul>
</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://www.amazon.com/Lean-Startup-Entrepreneurs-Continuous-Innovation/dp/0307887898/ref=sr_1_3?ie=UTF8&amp;qid=1536770044&amp;sr=8-3&amp;keywords=lean+startup">The Lean Startup</a> by Eric Ries</li>
</ul>
]]></content:encoded>
      <enclosure length="52381369" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/4e6d9847-e0d9-4fc3-a395-3087e6a0ff5d/e78a8d21_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>80% done, 80% to go</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/4e6d9847-e0d9-4fc3-a395-3087e6a0ff5d/3000x3000/1536774616artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:54:30</itunes:duration>
      <itunes:summary>Sam and Ryan talk about the cost of using engineering as discovery, the consequences of embedding product decisions throughout the design and development phases of a project, and other lessons that software engineers can learn from product developers. They also chat about how they categorize Github issues.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about the cost of using engineering as discovery, the consequences of embedding product decisions throughout the design and development phases of a project, and other lessons that software engineers can learn from product developers. They also chat about how they categorize Github issues.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>34</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">9e509d72-f478-4fa4-a9e9-c08dca61aa37</guid>
      <title>Ember Octane</title>
      <description><![CDATA[<p>Sam and Ryan talk about the Ember 2018 Roadmap RFC and its focus on improving communication, completing in-progress work, and shipping Ember Octane. They also talk about how to verify complex addon behavior by using full-blown test apps and addons.</p>
<p>Topics:</p>
<ul>
<li>
<p>0:00 – Test apps</p>
<ul>
<li>Using full apps and addons in a subdirectory of an addon to facilitate testing complicated scenarios</li>
<li>Avoiding implementation details of the build pipeline in testing</li>
</ul>
</li>
<li>
<p>12:14 – Ember Octane</p>
<ul>
<li>The Ember 2018 Roadmap RFC</li>
<li>The concept of Ember Editions &amp; the first edition, Ember Octane</li>
<li>Discussing the areas of focus from the RFC: better communication, shipping a ton of in-progress work, shipping Ember Octane</li>
<li>Discussing non-goals for the year</li>
</ul>
</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://github.com/emberjs/rfcs/pull/364">Ember 2018 Roadmap RFC</a></li>
<li><a href="https://github.com/mixonic/rfcs/blob/mu-packages/text/0000-module-unification-packages.md#the-use-helper">Matthew Beale's MU RFC with the {{use}} helper</a></li>
</ul>
]]></description>
      <pubDate>Wed, 29 Aug 2018 18:42:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about the Ember 2018 Roadmap RFC and its focus on improving communication, completing in-progress work, and shipping Ember Octane. They also talk about how to verify complex addon behavior by using full-blown test apps and addons.</p>
<p>Topics:</p>
<ul>
<li>
<p>0:00 – Test apps</p>
<ul>
<li>Using full apps and addons in a subdirectory of an addon to facilitate testing complicated scenarios</li>
<li>Avoiding implementation details of the build pipeline in testing</li>
</ul>
</li>
<li>
<p>12:14 – Ember Octane</p>
<ul>
<li>The Ember 2018 Roadmap RFC</li>
<li>The concept of Ember Editions &amp; the first edition, Ember Octane</li>
<li>Discussing the areas of focus from the RFC: better communication, shipping a ton of in-progress work, shipping Ember Octane</li>
<li>Discussing non-goals for the year</li>
</ul>
</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://github.com/emberjs/rfcs/pull/364">Ember 2018 Roadmap RFC</a></li>
<li><a href="https://github.com/mixonic/rfcs/blob/mu-packages/text/0000-module-unification-packages.md#the-use-helper">Matthew Beale's MU RFC with the {{use}} helper</a></li>
</ul>
]]></content:encoded>
      <enclosure length="41655282" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/bc24a41b-d49b-445f-b03b-31d606326853/3349ef6a_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Ember Octane</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/bc24a41b-d49b-445f-b03b-31d606326853/3000x3000/1535568295artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:43:20</itunes:duration>
      <itunes:summary>Sam and Ryan talk about the Ember 2018 Roadmap RFC and its focus on improving communication, completing in-progress work, and shipping Ember Octane. They also talk about how to verify complex addon behavior by using full-blown test apps and addons.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about the Ember 2018 Roadmap RFC and its focus on improving communication, completing in-progress work, and shipping Ember Octane. They also talk about how to verify complex addon behavior by using full-blown test apps and addons.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>33</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">fd9777ac-da41-497d-9c8e-95cdf3bf49ed</guid>
      <title>Melanie Sumner on empowering JavaScript engineers</title>
      <description><![CDATA[<p>Mel chats with Sam about getting into Ember, lessons learned from collaborating at work an in open source, and how to make it easier for JavaScript engineers to use better UI patterns.</p>
<p>Topics:</p>
<ul>
<li>0:00 – How Mel got into Ember at JPMorgan</li>
<li>4:45 – Feeling welcome in the Ember community</li>
<li>7:45 – Investing in Ember for the long-term</li>
<li>9:00 – Communicating vision, removing our ego, and empowering others to do work</li>
<li>17:07 – Learning team projects</li>
<li>19:30 – Improving the native accessibility story for Ember</li>
<li>27:25 – Making it easier for JavaScript engineers to use better UI patterns</li>
<li>34:55 – Ember Styleguide and Ember OSS infrastructure</li>
<li>49:10 – EmberCamp Chicago</li>
<li>51:20 – Leveling up in the Ember community</li>
</ul>
<p>Links:</p>
<ul>
<li>Melanie on Twitter: <a href="https://twitter.com/melaniersumner">@melaniersumner</a></li>
<li>EmberCamp, September 21, Chicago: <a href="http://embercamp.com">http://embercamp.com</a></li>
<li><a href="https://github.com/MelSumner/trex/blob/master/app/templates/index.hbs">Melanie's FizzBuzz in HBS</a></li>
<li><a href="https://www.amazon.com/How-Talk-Kids-Will-Listen/dp/1451663889/ref=sr_1_1?ie=UTF8&amp;qid=1534949581&amp;sr=8-1&amp;keywords=How+to+talk+so+kids+will+listen%2C+and+listen+so+kids+will+talk">How to talk so kids will listen &amp; listen so kids will talk</a></li>
</ul>
]]></description>
      <pubDate>Wed, 22 Aug 2018 15:11:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Mel chats with Sam about getting into Ember, lessons learned from collaborating at work an in open source, and how to make it easier for JavaScript engineers to use better UI patterns.</p>
<p>Topics:</p>
<ul>
<li>0:00 – How Mel got into Ember at JPMorgan</li>
<li>4:45 – Feeling welcome in the Ember community</li>
<li>7:45 – Investing in Ember for the long-term</li>
<li>9:00 – Communicating vision, removing our ego, and empowering others to do work</li>
<li>17:07 – Learning team projects</li>
<li>19:30 – Improving the native accessibility story for Ember</li>
<li>27:25 – Making it easier for JavaScript engineers to use better UI patterns</li>
<li>34:55 – Ember Styleguide and Ember OSS infrastructure</li>
<li>49:10 – EmberCamp Chicago</li>
<li>51:20 – Leveling up in the Ember community</li>
</ul>
<p>Links:</p>
<ul>
<li>Melanie on Twitter: <a href="https://twitter.com/melaniersumner">@melaniersumner</a></li>
<li>EmberCamp, September 21, Chicago: <a href="http://embercamp.com">http://embercamp.com</a></li>
<li><a href="https://github.com/MelSumner/trex/blob/master/app/templates/index.hbs">Melanie's FizzBuzz in HBS</a></li>
<li><a href="https://www.amazon.com/How-Talk-Kids-Will-Listen/dp/1451663889/ref=sr_1_1?ie=UTF8&amp;qid=1534949581&amp;sr=8-1&amp;keywords=How+to+talk+so+kids+will+listen%2C+and+listen+so+kids+will+talk">How to talk so kids will listen &amp; listen so kids will talk</a></li>
</ul>
]]></content:encoded>
      <enclosure length="52858556" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/ed43d8b8-c86f-40f0-93f1-889ecd56cb0b/6f80df6f_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Melanie Sumner on empowering JavaScript engineers</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/ed43d8b8-c86f-40f0-93f1-889ecd56cb0b/3000x3000/1534950876artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:53:28</itunes:duration>
      <itunes:summary>Mel chats with Sam about getting into Ember, lessons learned from collaborating at work and in open source, and how to make it easier for JavaScript engineers to use better UI patterns.
</itunes:summary>
      <itunes:subtitle>Mel chats with Sam about getting into Ember, lessons learned from collaborating at work and in open source, and how to make it easier for JavaScript engineers to use better UI patterns.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>32</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">cfba5677-6e3d-4e0a-9987-64e4a9925eaf</guid>
      <title>I am a lighthouse</title>
      <description><![CDATA[<p>Sam and Ryan chat (on new mics!) about Ryan's recent video on declarative keyboard events, changes to EmberMap's FastBoot architecture, and some of Ryan's recent work on FastBoot testing.</p>
<p>Topics:</p>
<ul>
<li>0:00 – Ryan's video on declarative keyboard events; other declarative components that haven't been discovered</li>
<li>9:52 – Our evolving FastBoot architecture; which parts can be generalized; a high Lighthouse score; a long uncanny valley</li>
<li>29:11 – Sam's Mirage work, fixing bugs, approaching 1.0; Mirage as a tool to show off work; question for listeners, how do you show your work to your team?</li>
<li>34:51 – Ryan's work on FastBoot testing; how Mirage could work with FastBoot testing; the joy of ES6 classes and async/await in Node</li>
</ul>
<p>Links:</p>
<ul>
<li>Ryan's video on Declarative keyboard navigation: <a href="https://embermap.com/video/declarative-keyboard-navigation">https://embermap.com/video/declarative-keyboard-navigation</a></li>
<li>Ryan's WIP FastBoot testing addon: <a href="https://github.com/embermap/ember-cli-fastboot-testing">https://github.com/embermap/ember-cli-fastboot-testing</a></li>
</ul>
]]></description>
      <pubDate>Wed, 15 Aug 2018 11:14:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan chat (on new mics!) about Ryan's recent video on declarative keyboard events, changes to EmberMap's FastBoot architecture, and some of Ryan's recent work on FastBoot testing.</p>
<p>Topics:</p>
<ul>
<li>0:00 – Ryan's video on declarative keyboard events; other declarative components that haven't been discovered</li>
<li>9:52 – Our evolving FastBoot architecture; which parts can be generalized; a high Lighthouse score; a long uncanny valley</li>
<li>29:11 – Sam's Mirage work, fixing bugs, approaching 1.0; Mirage as a tool to show off work; question for listeners, how do you show your work to your team?</li>
<li>34:51 – Ryan's work on FastBoot testing; how Mirage could work with FastBoot testing; the joy of ES6 classes and async/await in Node</li>
</ul>
<p>Links:</p>
<ul>
<li>Ryan's video on Declarative keyboard navigation: <a href="https://embermap.com/video/declarative-keyboard-navigation">https://embermap.com/video/declarative-keyboard-navigation</a></li>
<li>Ryan's WIP FastBoot testing addon: <a href="https://github.com/embermap/ember-cli-fastboot-testing">https://github.com/embermap/ember-cli-fastboot-testing</a></li>
</ul>
]]></content:encoded>
      <enclosure length="61335035" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/5b7d4a69-19ff-457a-a3a7-91d78a41677f/b78b0761_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>I am a lighthouse</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/5b7d4a69-19ff-457a-a3a7-91d78a41677f/3000x3000/1534332334artwork.jpg?aid=rss_feed"/>
      <itunes:duration>01:02:20</itunes:duration>
      <itunes:summary>Sam and Ryan chat (on new mics!) about Ryan&apos;s recent video on declarative keyboard events, changes to EmberMap&apos;s FastBoot architecture, and some of Ryan&apos;s recent work on FastBoot testing.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat (on new mics!) about Ryan&apos;s recent video on declarative keyboard events, changes to EmberMap&apos;s FastBoot architecture, and some of Ryan&apos;s recent work on FastBoot testing.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>31</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">58cb5bed-3eb0-4579-8233-c17575cdd89f</guid>
      <title>Jonathan Jackson on FastBoot Rehydration and Codemods</title>
      <description><![CDATA[<p>Jon joins Sam and Ryan to talk about his recent work on rehydration in FastBoot and all the creative ways we can use Codemods to automate the routine parts of our jobs.</p>
<p>Topics:</p>
<ul>
<li>0:00 – How Jon got into Ember at HashRocket</li>
<li>4:45 – Jon and Chase starting the EmberWeekend podcast</li>
<li>7:30 – Greenfield vs. brownfield projects at a consultancy</li>
<li>13:30 – Infrastructure complexities in Ember's ecosystem</li>
<li>18:07 – Jon's work on FastBoot rehydration</li>
<li>41:29 – Jon's work on Codemods &amp; the new testing APIs</li>
</ul>
<p>Links:</p>
<ul>
<li>Jon on Twitter https://twitter.com/rondale_sc</li>
<li>Jon's podcast Ember Weekend https://emberweekend.com/episodes</li>
<li>Codemod CLI https://github.com/rwjblue/codemod-cli</li>
</ul>
]]></description>
      <pubDate>Thu, 9 Aug 2018 14:28:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Jon joins Sam and Ryan to talk about his recent work on rehydration in FastBoot and all the creative ways we can use Codemods to automate the routine parts of our jobs.</p>
<p>Topics:</p>
<ul>
<li>0:00 – How Jon got into Ember at HashRocket</li>
<li>4:45 – Jon and Chase starting the EmberWeekend podcast</li>
<li>7:30 – Greenfield vs. brownfield projects at a consultancy</li>
<li>13:30 – Infrastructure complexities in Ember's ecosystem</li>
<li>18:07 – Jon's work on FastBoot rehydration</li>
<li>41:29 – Jon's work on Codemods &amp; the new testing APIs</li>
</ul>
<p>Links:</p>
<ul>
<li>Jon on Twitter https://twitter.com/rondale_sc</li>
<li>Jon's podcast Ember Weekend https://emberweekend.com/episodes</li>
<li>Codemod CLI https://github.com/rwjblue/codemod-cli</li>
</ul>
]]></content:encoded>
      <enclosure length="85771995" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/f6ce6b1a-8082-46b4-8f9c-0a8c30d0b692/ad745ece_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Jonathan Jackson on FastBoot Rehydration and Codemods</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/f6ce6b1a-8082-46b4-8f9c-0a8c30d0b692/3000x3000/1533825311artwork.jpg?aid=rss_feed"/>
      <itunes:duration>01:27:35</itunes:duration>
      <itunes:summary>Jon joins Sam and Ryan to talk about his recent work on rehydration in FastBoot and all the creative ways we can use Codemods to automate the routine parts of our jobs.</itunes:summary>
      <itunes:subtitle>Jon joins Sam and Ryan to talk about his recent work on rehydration in FastBoot and all the creative ways we can use Codemods to automate the routine parts of our jobs.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>30</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">6daf9f0a-70d6-4608-91a1-598f04b2edb0</guid>
      <title>Provide this!</title>
      <description><![CDATA[<p>Sam and Ryan chat about provider components in Ember, including the first renderless components they wrote, the different types of data components can provide, and the patterns of template composition that providers unlock. They also talk about the need for a unified API for styling Ember components.</p>
<p>Topics:</p>
<ul>
<li>0:40 – Our first provider components</li>
<li>10:12 – Using providers to isolate the business logic for a form</li>
<li>27:35 – Patterns of composition in templates</li>
<li>34:35 – How to constrain more flexible interfaces</li>
<li>39:55 – APIs for styling components</li>
</ul>
]]></description>
      <pubDate>Fri, 20 Jul 2018 16:01:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan chat about provider components in Ember, including the first renderless components they wrote, the different types of data components can provide, and the patterns of template composition that providers unlock. They also talk about the need for a unified API for styling Ember components.</p>
<p>Topics:</p>
<ul>
<li>0:40 – Our first provider components</li>
<li>10:12 – Using providers to isolate the business logic for a form</li>
<li>27:35 – Patterns of composition in templates</li>
<li>34:35 – How to constrain more flexible interfaces</li>
<li>39:55 – APIs for styling components</li>
</ul>
]]></content:encoded>
      <enclosure length="51725898" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/d8545b47-d757-4a4d-9d53-226f5df14bc0/fb602f5a_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Provide this!</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/d8545b47-d757-4a4d-9d53-226f5df14bc0/3000x3000/1532102673artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:52:13</itunes:duration>
      <itunes:summary>Sam and Ryan chat about provider components in Ember, including the first renderless components they wrote, the different types of data components can provide, and the patterns of template composition that providers unlock. They also talk about the need for a unified API for styling Ember components.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about provider components in Ember, including the first renderless components they wrote, the different types of data components can provide, and the patterns of template composition that providers unlock. They also talk about the need for a unified API for styling Ember components.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>29</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">93f0946a-82cd-4167-908b-066bc062cfa0</guid>
      <title>Jen Weber on imaginary bars</title>
      <description><![CDATA[<p>Jen talks to Sam and Ryan about her journey learning from and giving back to Ember, and how she keeps her community contributions sustainable by tying them back to personal goals and rewards.</p>
<p>Topics:</p>
<ul>
<li>7:00 – Learning Ember at General Assembly</li>
<li>9:00 – How did you go from learner to contributor?</li>
<li>13:25 – Thoughts on Slack, Stack Overflow and Discourse</li>
<li>18:12 – What advice do you have for folks looking to contribute back to Ember?</li>
<li>24:66 – What are some things you'd like to see change about Ember?</li>
<li>30:39 – What personal projects are you working on right now?</li>
<li>35:10 – Why do you think someone should start using Ember today?</li>
</ul>
<p>Links:</p>
<ul>
<li>Jen on Twitter: @jwwweber(https://twitter.com/jwwweber)</li>
<li>The Ember Times: <a href="https://the-emberjs-times.ongoodbits.com">site</a></li>
</ul>
]]></description>
      <pubDate>Fri, 13 Jul 2018 22:11:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Jen talks to Sam and Ryan about her journey learning from and giving back to Ember, and how she keeps her community contributions sustainable by tying them back to personal goals and rewards.</p>
<p>Topics:</p>
<ul>
<li>7:00 – Learning Ember at General Assembly</li>
<li>9:00 – How did you go from learner to contributor?</li>
<li>13:25 – Thoughts on Slack, Stack Overflow and Discourse</li>
<li>18:12 – What advice do you have for folks looking to contribute back to Ember?</li>
<li>24:66 – What are some things you'd like to see change about Ember?</li>
<li>30:39 – What personal projects are you working on right now?</li>
<li>35:10 – Why do you think someone should start using Ember today?</li>
</ul>
<p>Links:</p>
<ul>
<li>Jen on Twitter: @jwwweber(https://twitter.com/jwwweber)</li>
<li>The Ember Times: <a href="https://the-emberjs-times.ongoodbits.com">site</a></li>
</ul>
]]></content:encoded>
      <enclosure length="37114787" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/7afd192a-aa13-4fe1-9587-f20479e39943/32e2fcad_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Jen Weber on imaginary bars</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/7afd192a-aa13-4fe1-9587-f20479e39943/3000x3000/1531520030artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:37:33</itunes:duration>
      <itunes:summary>Jen talks to Sam and Ryan about her journey learning from and giving back to Ember, and how she keeps her community contributions sustainable by tying them back to personal goals and rewards.</itunes:summary>
      <itunes:subtitle>Jen talks to Sam and Ryan about her journey learning from and giving back to Ember, and how she keeps her community contributions sustainable by tying them back to personal goals and rewards.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>28</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">16768d5d-258e-4abf-8c12-7002ec33453e</guid>
      <title>Mirage, meet Node</title>
      <description><![CDATA[<p>Sam and Ryan talk about their initial attempts to get Mirage running in Node, the benefits and workflows that it will unlock, some different approaches for using code in both the browser and Node, and how we might test FastBoot apps in the future.</p>
<p>Topics:</p>
<ul>
<li>4:28 – Getting Mirage to run in Express</li>
<li>21:58 – How to use addons like Mirage work in Node</li>
<li>42:53 – Testing FastBoot apps</li>
</ul>
]]></description>
      <pubDate>Fri, 6 Jul 2018 13:24:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about their initial attempts to get Mirage running in Node, the benefits and workflows that it will unlock, some different approaches for using code in both the browser and Node, and how we might test FastBoot apps in the future.</p>
<p>Topics:</p>
<ul>
<li>4:28 – Getting Mirage to run in Express</li>
<li>21:58 – How to use addons like Mirage work in Node</li>
<li>42:53 – Testing FastBoot apps</li>
</ul>
]]></content:encoded>
      <enclosure length="54745821" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/4c5939a6-3908-473a-830a-529f80ed211f/bbd422f1_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Mirage, meet Node</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/4c5939a6-3908-473a-830a-529f80ed211f/3000x3000/1530883662artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:55:15</itunes:duration>
      <itunes:summary>Sam and Ryan talk about their initial attempts to get Mirage running in Node, the benefits and workflows that it will unlock, some different approaches for using code in both the browser and Node, and how we might test FastBoot apps in the future.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about their initial attempts to get Mirage running in Node, the benefits and workflows that it will unlock, some different approaches for using code in both the browser and Node, and how we might test FastBoot apps in the future.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>27</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">36c0d8ad-9a8b-4155-9311-13d01bdb7305</guid>
      <title>Let&apos;s be optimistic</title>
      <description><![CDATA[<p>Sam and Ryan talk about how to deal with building non-optimistic UIs using Ember and Ember Data, and how constrained visual design tools might help us build better UIs. They also answer some questions and talk about their current series on Functional CSS and Rendering tests.</p>
<p>Topics:</p>
<ul>
<li>0:00 – What's new on EmberMap</li>
<li>8:06 – Options for non-optimistic UI in Ember Data</li>
<li>22:34 – Visual programming</li>
</ul>
<p>Questions:</p>
<ul>
<li>34:08 – What techniques do you have for authorization (not authentication)?</li>
<li>40:42 - How might you improve the developer experience of working with Ember Data?</li>
<li>50:14 – When can we get TypeScript in Mirage?</li>
</ul>
]]></description>
      <pubDate>Sat, 30 Jun 2018 15:37:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about how to deal with building non-optimistic UIs using Ember and Ember Data, and how constrained visual design tools might help us build better UIs. They also answer some questions and talk about their current series on Functional CSS and Rendering tests.</p>
<p>Topics:</p>
<ul>
<li>0:00 – What's new on EmberMap</li>
<li>8:06 – Options for non-optimistic UI in Ember Data</li>
<li>22:34 – Visual programming</li>
</ul>
<p>Questions:</p>
<ul>
<li>34:08 – What techniques do you have for authorization (not authentication)?</li>
<li>40:42 - How might you improve the developer experience of working with Ember Data?</li>
<li>50:14 – When can we get TypeScript in Mirage?</li>
</ul>
]]></content:encoded>
      <enclosure length="52438213" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/7df88cbb-7375-4881-ac37-d0a2a5028a8b/09977ceb_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Let&apos;s be optimistic</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/7df88cbb-7375-4881-ac37-d0a2a5028a8b/3000x3000/1530373241artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:53:06</itunes:duration>
      <itunes:summary>Sam and Ryan talk about how to deal with building non-optimistic UIs using Ember and Ember Data, and how constrained visual design tools might help us build better UIs. They also answer some questions and talk about their current series on Functional CSS and Rendering tests.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about how to deal with building non-optimistic UIs using Ember and Ember Data, and how constrained visual design tools might help us build better UIs. They also answer some questions and talk about their current series on Functional CSS and Rendering tests.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>26</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">24e965cf-8b15-4289-a1ca-51df1717de9f</guid>
      <title>A man can dream</title>
      <description><![CDATA[<p>Sam and Ryan talk about bringing the ideas of declarative rendering over to our data layers, how easy it is for data to become stale in SPAs, and more stories from their recent adventures in FastBoot land.</p>
<p>Topics:</p>
<ul>
<li>0:00 – Declarative data fetching</li>
<li>18:50 – Stale data in SPAs</li>
<li>30:46 – FastBoot</li>
</ul>
]]></description>
      <pubDate>Sat, 23 Jun 2018 01:02:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about bringing the ideas of declarative rendering over to our data layers, how easy it is for data to become stale in SPAs, and more stories from their recent adventures in FastBoot land.</p>
<p>Topics:</p>
<ul>
<li>0:00 – Declarative data fetching</li>
<li>18:50 – Stale data in SPAs</li>
<li>30:46 – FastBoot</li>
</ul>
]]></content:encoded>
      <enclosure length="49640590" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/87a52415-a88a-450b-a551-7680d17b9baa/cbc2c687_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>A man can dream</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/87a52415-a88a-450b-a551-7680d17b9baa/3000x3000/1529716113artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:50:09</itunes:duration>
      <itunes:summary>Sam and Ryan talk about bringing the ideas of declarative rendering over to our data layers, how easy it is for data to become stale in SPAs, and more stories from their recent adventures in FastBoot land.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about bringing the ideas of declarative rendering over to our data layers, how easy it is for data to become stale in SPAs, and more stories from their recent adventures in FastBoot land.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>25</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">175b4944-4c38-4cee-96a8-c0f80f678980</guid>
      <title>Wrapping libraries reponsibly</title>
      <description><![CDATA[<p>Sam and Ryan chat about what to do when a node module breaks in FastBoot, how to best wrap 3rd-party libraries in an Ember Addon, and how to test the filesystem. They also answer some listener questions.</p>
<p>Topics:</p>
<ul>
<li>0:00 – Node modules in FastBoot</li>
<li>13:55 – Ember Addons that wrap 3rd-party libraries</li>
<li>19:07 – Testing the filesystem with Broccoli Test Helpers</li>
</ul>
<p>Q&amp;A:</p>
<ul>
<li>32:11 – How can I speed up my Ember CLI build times?</li>
<li>38:31 – What do you think about the Angle Bracket Polyfill? Would you use it?</li>
<li>42:08 – I'm building an app and I need to build it with skeleton screens. Do I use a model hook with loading states, do I use Ember Concurrency tasks? What approach should I take?</li>
<li>46:44 – I'm building a table, and each row has a bunch of CRUD actions – edit, delete, view. What are the best UI patterns for this? A few I'm considering: a cog that you click that exposes a dropdown menu; icons in the row; buttons in the row.</li>
</ul>
]]></description>
      <pubDate>Fri, 15 Jun 2018 14:05:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan chat about what to do when a node module breaks in FastBoot, how to best wrap 3rd-party libraries in an Ember Addon, and how to test the filesystem. They also answer some listener questions.</p>
<p>Topics:</p>
<ul>
<li>0:00 – Node modules in FastBoot</li>
<li>13:55 – Ember Addons that wrap 3rd-party libraries</li>
<li>19:07 – Testing the filesystem with Broccoli Test Helpers</li>
</ul>
<p>Q&amp;A:</p>
<ul>
<li>32:11 – How can I speed up my Ember CLI build times?</li>
<li>38:31 – What do you think about the Angle Bracket Polyfill? Would you use it?</li>
<li>42:08 – I'm building an app and I need to build it with skeleton screens. Do I use a model hook with loading states, do I use Ember Concurrency tasks? What approach should I take?</li>
<li>46:44 – I'm building a table, and each row has a bunch of CRUD actions – edit, delete, view. What are the best UI patterns for this? A few I'm considering: a cog that you click that exposes a dropdown menu; icons in the row; buttons in the row.</li>
</ul>
]]></content:encoded>
      <enclosure length="51504962" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/ef1879fb-6208-499d-9dd5-5cc3ee8887b6/c4965b71_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Wrapping libraries reponsibly</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/ef1879fb-6208-499d-9dd5-5cc3ee8887b6/3000x3000/1529071700artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:51:59</itunes:duration>
      <itunes:summary>Sam and Ryan chat about what to do when a node module breaks in FastBoot, how to best wrap 3rd-party libraries in an Ember Addon, and how to test the filesystem. They also answer some listener questions.</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about what to do when a node module breaks in FastBoot, how to best wrap 3rd-party libraries in an Ember Addon, and how to test the filesystem. They also answer some listener questions.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>24</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">64986afc-2249-4871-80b5-ec144a2cc2df</guid>
      <title>Bugs vs. features</title>
      <description><![CDATA[<p>Sam and Ryan chat about some ideas around caching in FastBoot, different ways of prioritizing work, and the difference between easy things and hard things in Ember.</p>
<p>Topics</p>
<ul>
<li>0:00 – Caching &amp; FastBoot</li>
<li>16:18 – Project process, workflow, bugs, features, and issue urgency</li>
<li>37:47 – Easy vs. hard things in Ember. Ember focusing on its strengths.</li>
</ul>
]]></description>
      <pubDate>Thu, 7 Jun 2018 19:28:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan chat about some ideas around caching in FastBoot, different ways of prioritizing work, and the difference between easy things and hard things in Ember.</p>
<p>Topics</p>
<ul>
<li>0:00 – Caching &amp; FastBoot</li>
<li>16:18 – Project process, workflow, bugs, features, and issue urgency</li>
<li>37:47 – Easy vs. hard things in Ember. Ember focusing on its strengths.</li>
</ul>
]]></content:encoded>
      <enclosure length="67128938" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/7bd371d7-284a-4406-b619-5bd54c66e6c1/d2f8568b_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Bugs vs. features</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/7bd371d7-284a-4406-b619-5bd54c66e6c1/3000x3000/1528399893artwork.jpg?aid=rss_feed"/>
      <itunes:duration>01:08:25</itunes:duration>
      <itunes:summary>Sam and Ryan chat about some ideas around caching in FastBoot, different ways of prioritizing work, and the difference between easy things and hard things in Ember.</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about some ideas around caching in FastBoot, different ways of prioritizing work, and the difference between easy things and hard things in Ember.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>23</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">2c670d07-0b3b-4066-91e6-50d7d7b3391b</guid>
      <title>Toran Billups on Hot Reloading</title>
      <description><![CDATA[<p>Toran talks to Sam and Ryan about his project Ember CLI Hot Loader, which is an implementation of component-based hot module reloading for Ember apps.</p>
<p><strong>Topics:</strong></p>
<ul>
<li>0:00 – Losing hot reloading when moving from handwritten CSS to functional css</li>
<li>2:16 – Why Toran wrote the Hot Reloader</li>
<li>4:45 – How the hot reloader leverages Ember CLI to reload components</li>
<li>8:31 – The need for hot reloading</li>
<li>14:56 – Are there situations where you don’t want to use the hot reloader?</li>
<li>19:05 – What’s the easiest way to try using the hot reloader today?</li>
<li>21:05 – Design vs. build mindset</li>
<li>22:30 – Engines aren’t currently supported</li>
<li>23:53 – How local state affects hot reloading</li>
<li>27:50 – Fast feedback is the primary motivation</li>
<li>34:05 – What are the next steps for Ember CLI Hot Reloader?</li>
<li>37:51 – What happens to a component’s transient state if it’s hot reloaded?</li>
<li>39:44 – How to help if you’re interested in hot reloading in Ember</li>
</ul>
<p><strong>Links:</strong></p>
<ul>
<li><a href="https://github.com/toranb/ember-cli-hot-loader">Ember CLI Hot Loader</a></li>
<li><a href="https://vimeo.com/180477839">Toran’s side-by-side hot reloading demo</a></li>
<li><a href="https://vimeo.com/36579366">Bret Victor, Inventing on Principle</a></li>
</ul>
]]></description>
      <pubDate>Tue, 29 May 2018 18:44:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Toran talks to Sam and Ryan about his project Ember CLI Hot Loader, which is an implementation of component-based hot module reloading for Ember apps.</p>
<p><strong>Topics:</strong></p>
<ul>
<li>0:00 – Losing hot reloading when moving from handwritten CSS to functional css</li>
<li>2:16 – Why Toran wrote the Hot Reloader</li>
<li>4:45 – How the hot reloader leverages Ember CLI to reload components</li>
<li>8:31 – The need for hot reloading</li>
<li>14:56 – Are there situations where you don’t want to use the hot reloader?</li>
<li>19:05 – What’s the easiest way to try using the hot reloader today?</li>
<li>21:05 – Design vs. build mindset</li>
<li>22:30 – Engines aren’t currently supported</li>
<li>23:53 – How local state affects hot reloading</li>
<li>27:50 – Fast feedback is the primary motivation</li>
<li>34:05 – What are the next steps for Ember CLI Hot Reloader?</li>
<li>37:51 – What happens to a component’s transient state if it’s hot reloaded?</li>
<li>39:44 – How to help if you’re interested in hot reloading in Ember</li>
</ul>
<p><strong>Links:</strong></p>
<ul>
<li><a href="https://github.com/toranb/ember-cli-hot-loader">Ember CLI Hot Loader</a></li>
<li><a href="https://vimeo.com/180477839">Toran’s side-by-side hot reloading demo</a></li>
<li><a href="https://vimeo.com/36579366">Bret Victor, Inventing on Principle</a></li>
</ul>
]]></content:encoded>
      <enclosure length="41015959" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/106af331-6eee-4443-be26-4c0296bb295c/ca08a31e_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Toran Billups on Hot Reloading</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/106af331-6eee-4443-be26-4c0296bb295c/3000x3000/1527619609artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:41:38</itunes:duration>
      <itunes:summary>Toran talks to Sam and Ryan about his project Ember CLI Hot Loader, which is an implementation of component-based hot module reloading for Ember apps.
</itunes:summary>
      <itunes:subtitle>Toran talks to Sam and Ryan about his project Ember CLI Hot Loader, which is an implementation of component-based hot module reloading for Ember apps.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>22</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">87d4d768-7b40-4903-ba8b-edaf8428368d</guid>
      <title>Test before commit</title>
      <description><![CDATA[<p>Sam and Ryan chat about Ember at Microconf, two-way bindings, and TDD vs. &quot;Test before commit&quot;.</p>
<p>Topics:</p>
<ul>
<li>0:00 – When direct state mutations make sense</li>
<li>8:15 – Ember at MicroConf &amp; how other communities think about Ember</li>
<li>29:42 – TDD versus “Test before commit”</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://rauchg.com/2015/pure-ui">Pure UI by Guillermo Rauch</a></li>
</ul>
]]></description>
      <pubDate>Fri, 18 May 2018 14:24:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan chat about Ember at Microconf, two-way bindings, and TDD vs. &quot;Test before commit&quot;.</p>
<p>Topics:</p>
<ul>
<li>0:00 – When direct state mutations make sense</li>
<li>8:15 – Ember at MicroConf &amp; how other communities think about Ember</li>
<li>29:42 – TDD versus “Test before commit”</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://rauchg.com/2015/pure-ui">Pure UI by Guillermo Rauch</a></li>
</ul>
]]></content:encoded>
      <enclosure length="40822826" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/24e2678c-9539-4ea5-be33-ca0cb0042551/baa6a03c_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Test before commit</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/24e2678c-9539-4ea5-be33-ca0cb0042551/3000x3000/1526653566artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:40:55</itunes:duration>
      <itunes:summary>Sam and Ryan chat about Ember at Microconf, two-way bindings, and TDD vs. &quot;Test before commit&quot;.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about Ember at Microconf, two-way bindings, and TDD vs. &quot;Test before commit&quot;.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>21</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">906be3dd-0b7a-44d8-86c7-53fcf4bc8506</guid>
      <title>Adam Wathan on Tailwind CSS</title>
      <description><![CDATA[<p>Adam joins Sam and Ryan to talk about coupling in HTML and CSS, different approaches to styling applications, and his popular open-source library Tailwind CSS.</p>
<p>Topics covered:</p>
<ul>
<li>0:00 – Adam's motivation for creating Tailwind</li>
<li>3:20 – Reusability in CSS</li>
<li>8:20 – Semantics and coupling in HTML and CSS</li>
<li>16:05 – Messy templates in functional CSS</li>
<li>20:52 – CSS patterns in server-rendered apps</li>
<li>24:45 – Component classes in Tailwind</li>
<li>31:20 – CSS patterns in SPAs</li>
<li>39:31 – Experimental design tools</li>
<li>46:00 – What's next for Tailwind</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://tailwindcss.com/">Tailwind CSS</a></li>
<li><a href="https://adamwathan.me/advanced-vue-component-design/">Advanced Vue Component Design</a>, Adam's new course</li>
<li><a href="https://www.modulz.co/">Modulz</a>, the design tool</li>
</ul>
]]></description>
      <pubDate>Fri, 11 May 2018 19:29:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Adam joins Sam and Ryan to talk about coupling in HTML and CSS, different approaches to styling applications, and his popular open-source library Tailwind CSS.</p>
<p>Topics covered:</p>
<ul>
<li>0:00 – Adam's motivation for creating Tailwind</li>
<li>3:20 – Reusability in CSS</li>
<li>8:20 – Semantics and coupling in HTML and CSS</li>
<li>16:05 – Messy templates in functional CSS</li>
<li>20:52 – CSS patterns in server-rendered apps</li>
<li>24:45 – Component classes in Tailwind</li>
<li>31:20 – CSS patterns in SPAs</li>
<li>39:31 – Experimental design tools</li>
<li>46:00 – What's next for Tailwind</li>
</ul>
<p>Links:</p>
<ul>
<li><a href="https://tailwindcss.com/">Tailwind CSS</a></li>
<li><a href="https://adamwathan.me/advanced-vue-component-design/">Advanced Vue Component Design</a>, Adam's new course</li>
<li><a href="https://www.modulz.co/">Modulz</a>, the design tool</li>
</ul>
]]></content:encoded>
      <enclosure length="66035469" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/e608b5ae-eda5-40b1-be48-0f193ef3ae30/050c481b_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Adam Wathan on Tailwind CSS</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/e608b5ae-eda5-40b1-be48-0f193ef3ae30/3000x3000/1526067222artwork.jpg?aid=rss_feed"/>
      <itunes:duration>01:07:00</itunes:duration>
      <itunes:summary>Adam joins Sam and Ryan to talk about coupling in HTML and CSS, different approaches to styling applications, and his popular open-source library Tailwind CSS.</itunes:summary>
      <itunes:subtitle>Adam joins Sam and Ryan to talk about coupling in HTML and CSS, different approaches to styling applications, and his popular open-source library Tailwind CSS.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>20</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">291c9fcb-0c9d-4366-8530-b0a3db8daeb1</guid>
      <title>Robert Jackson and Tom Dale on Ember at LinkedIn</title>
      <description><![CDATA[<p>Robert and Tom join Sam and Ryan to chat about how LinkedIn uses Ember, when teams should use Engines, build optimizations that are coming to Ember CLI and more.</p>
<p>Topics:</p>
<p>0:00 – Engineering challenges of scale at LinkedIn<br />
6:00 – Engines at LinkedIn<br />
8:40 – When should teams use Engines?<br />
15:25 – What are some of the downsides of Engines?<br />
17:38 – Build-time versus AOT library transpilation<br />
21:47 – How just-in-time compilation relates to code-splitting and importing node modules<br />
29:50 – Ember’s philosophy on bringing new JS features to years-old apps<br />
32:55 – How can the community be most helpful when contributing to Ember?<br />
41:32 – Analytics and performance tracking at LinkedIn<br />
46:07 – What are your thoughts on Vue.js? (Question from jamiewhite)<br />
52:18 – How can we help improve the developer experience of using Handlebars templates (autocomplete, error correction, template linting, etc.)?<br />
1:02:40 – Moving questions from Slack to the Discussion forum</p>
]]></description>
      <pubDate>Thu, 3 May 2018 20:44:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Robert and Tom join Sam and Ryan to chat about how LinkedIn uses Ember, when teams should use Engines, build optimizations that are coming to Ember CLI and more.</p>
<p>Topics:</p>
<p>0:00 – Engineering challenges of scale at LinkedIn<br />
6:00 – Engines at LinkedIn<br />
8:40 – When should teams use Engines?<br />
15:25 – What are some of the downsides of Engines?<br />
17:38 – Build-time versus AOT library transpilation<br />
21:47 – How just-in-time compilation relates to code-splitting and importing node modules<br />
29:50 – Ember’s philosophy on bringing new JS features to years-old apps<br />
32:55 – How can the community be most helpful when contributing to Ember?<br />
41:32 – Analytics and performance tracking at LinkedIn<br />
46:07 – What are your thoughts on Vue.js? (Question from jamiewhite)<br />
52:18 – How can we help improve the developer experience of using Handlebars templates (autocomplete, error correction, template linting, etc.)?<br />
1:02:40 – Moving questions from Slack to the Discussion forum</p>
]]></content:encoded>
      <enclosure length="64557419" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/5f143ef8-eec7-46e4-a3b4-9384fcd71566/87e2a22a_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Robert Jackson and Tom Dale on Ember at LinkedIn</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/5f143ef8-eec7-46e4-a3b4-9384fcd71566/3000x3000/1525380493artwork.jpg?aid=rss_feed"/>
      <itunes:duration>01:05:25</itunes:duration>
      <itunes:summary>Robert and Tom join Sam and Ryan to chat about how LinkedIn uses Ember, when teams should use Engines, build optimizations that are coming to Ember CLI and more.</itunes:summary>
      <itunes:subtitle>Robert and Tom join Sam and Ryan to chat about how LinkedIn uses Ember, when teams should use Engines, build optimizations that are coming to Ember CLI and more.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>19</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">48e94e07-9304-4a64-939b-503349b6e041</guid>
      <title>Concretions and abstractions</title>
      <description><![CDATA[<p>Sam and Ryan chat about Tailwind and compilers (again), Ryan's EmberJS homepage teardown, and releasing with git tags. They also answer some listener questions.</p>
<p>Topics covered:</p>
<ul>
<li>0:00 – Compilers, Tailwind, and APIs for styling components</li>
<li>17:00 – Ember.js Homepage teardown</li>
<li>30:48 – git tag for immutable gh references</li>
</ul>
<p>We also answers some listener questions:</p>
<ul>
<li>37:14 – Q: What's the deal with using websockets in Ember? Any good patterns beyond creating some kind of Ember service to listen to the socket and push data into the store? (@yohanishkin on Slack)</li>
<li>40:57 – Not sure if you’ve talked about it at all yet, but the this topic seems worth further exploration: [Should Ember better define its use of Slack?] @mattmcmanus</li>
</ul>
]]></description>
      <pubDate>Thu, 26 Apr 2018 11:58:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan chat about Tailwind and compilers (again), Ryan's EmberJS homepage teardown, and releasing with git tags. They also answer some listener questions.</p>
<p>Topics covered:</p>
<ul>
<li>0:00 – Compilers, Tailwind, and APIs for styling components</li>
<li>17:00 – Ember.js Homepage teardown</li>
<li>30:48 – git tag for immutable gh references</li>
</ul>
<p>We also answers some listener questions:</p>
<ul>
<li>37:14 – Q: What's the deal with using websockets in Ember? Any good patterns beyond creating some kind of Ember service to listen to the socket and push data into the store? (@yohanishkin on Slack)</li>
<li>40:57 – Not sure if you’ve talked about it at all yet, but the this topic seems worth further exploration: [Should Ember better define its use of Slack?] @mattmcmanus</li>
</ul>
]]></content:encoded>
      <enclosure length="47727431" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/0b2bad65-6be6-459a-8d65-9dce609ed39d/795403db_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Concretions and abstractions</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/0b2bad65-6be6-459a-8d65-9dce609ed39d/3000x3000/1524744082artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:48:00</itunes:duration>
      <itunes:summary>Sam and Ryan chat about Tailwind and compilers (again), Ryan&apos;s EmberJS homepage teardown, and releasing with git tags. They also answer some listener questions.</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about Tailwind and compilers (again), Ryan&apos;s EmberJS homepage teardown, and releasing with git tags. They also answer some listener questions.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>18</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">55ad692f-6c2c-4727-9e6c-b3bb72183a7b</guid>
      <title>Sketch Prototyping and Amazon Workspaces</title>
      <description><![CDATA[<p>Sam and Ryan chat about Sketch’s new Prototyping feature, using Amazon Workspaces to develop Ember apps in a Windows environment on a Mac, and how to use git tag to ensure your project’s dependencies don’t disappear. They also answer some listener questions.</p>
<p>Topics</p>
<ul>
<li>Sketch prototyping + design</li>
<li>Ember on Windows</li>
<li>git tag for immutable gh references</li>
</ul>
<p>Questions</p>
<ul>
<li>Q: with the latest Router service it’s possible to transition to another page from everywhere in the code. Before, we created specific actions in the route, just to transition to another page. Is transitioning to other pages from inside components considered a bad practise, or is it totally fine (My co workers feels it’s ‘dirty’ to transition from inside components.)? Do you have any guidelines when and where to transition with the new service? (edited) (@maarten from Slack)</li>
<li>Can you use mirage for other applications as well? (ex: Rails app with same API dependencies as Ember.) (https://twitter.com/keystonelemur/status/979777292745363456)</li>
<li>Can you talk about how to upgrade ember.js smoothly? I always have trouble bumping our ember version, mainly I think due to some add-ons. But the error message are not that useful. (https://twitter.com/tantantanmian/status/980662478374805505)</li>
</ul>
]]></description>
      <pubDate>Thu, 19 Apr 2018 13:25:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan chat about Sketch’s new Prototyping feature, using Amazon Workspaces to develop Ember apps in a Windows environment on a Mac, and how to use git tag to ensure your project’s dependencies don’t disappear. They also answer some listener questions.</p>
<p>Topics</p>
<ul>
<li>Sketch prototyping + design</li>
<li>Ember on Windows</li>
<li>git tag for immutable gh references</li>
</ul>
<p>Questions</p>
<ul>
<li>Q: with the latest Router service it’s possible to transition to another page from everywhere in the code. Before, we created specific actions in the route, just to transition to another page. Is transitioning to other pages from inside components considered a bad practise, or is it totally fine (My co workers feels it’s ‘dirty’ to transition from inside components.)? Do you have any guidelines when and where to transition with the new service? (edited) (@maarten from Slack)</li>
<li>Can you use mirage for other applications as well? (ex: Rails app with same API dependencies as Ember.) (https://twitter.com/keystonelemur/status/979777292745363456)</li>
<li>Can you talk about how to upgrade ember.js smoothly? I always have trouble bumping our ember version, mainly I think due to some add-ons. But the error message are not that useful. (https://twitter.com/tantantanmian/status/980662478374805505)</li>
</ul>
]]></content:encoded>
      <enclosure length="53164351" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/580b95c0-e1a6-45c9-b0a1-ad9cdbc70c7c/aca68b81_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Sketch Prototyping and Amazon Workspaces</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/580b95c0-e1a6-45c9-b0a1-ad9cdbc70c7c/3000x3000/1524144474artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:53:36</itunes:duration>
      <itunes:summary>Sam and Ryan chat about Sketch’s new Prototyping feature, using Amazon Workspaces to develop Ember apps in a Windows environment on a Mac, and how to use git tag to ensure your project’s dependencies don’t disappear. They also answer some listener questions.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about Sketch’s new Prototyping feature, using Amazon Workspaces to develop Ember apps in a Windows environment on a Mac, and how to use git tag to ensure your project’s dependencies don’t disappear. They also answer some listener questions.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>17</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">302cab91-5fce-4b12-a4a7-3d08109f2092</guid>
      <title>Alex Matchneer on Routing Patterns</title>
      <description><![CDATA[<p>Alex Matchneer chats with Sam and Ryan about challenging routing patterns in Ember, his involvement with the Ember community, and what Ember’s next router might look like.</p>
<p>Topics covered:</p>
<ul>
<li>Routing patterns from mobile apps that are difficult with Ember</li>
<li>Lessons learned from community involvement</li>
<li>The concept of timespans</li>
<li>Fighting community conventions</li>
<li>Server-driven state changes</li>
<li>Declarative routing</li>
</ul>
<p>Alex also answers some listener questions:</p>
<ul>
<li>When are you going to release a full album?</li>
<li>If you could improve one thing with Ember, what would it be and why?</li>
<li>Do you have strategies for teaching ember-concurrency to someone who doesn't know about generator functions? Do you try to teach those separately first?</li>
<li>What are some JavaScript patterns you don't see being used as often as you think they should?</li>
<li>What are some concepts/design patterns you wish all developers would know about and internalize?</li>
<li>How do non-ember-core members become more involved in ember-core? What are some ways to bridge the gap between basic contributions and the complicated RFC process? How do you drive community change from only addon code?</li>
</ul>
]]></description>
      <pubDate>Thu, 12 Apr 2018 19:28:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Alex Matchneer chats with Sam and Ryan about challenging routing patterns in Ember, his involvement with the Ember community, and what Ember’s next router might look like.</p>
<p>Topics covered:</p>
<ul>
<li>Routing patterns from mobile apps that are difficult with Ember</li>
<li>Lessons learned from community involvement</li>
<li>The concept of timespans</li>
<li>Fighting community conventions</li>
<li>Server-driven state changes</li>
<li>Declarative routing</li>
</ul>
<p>Alex also answers some listener questions:</p>
<ul>
<li>When are you going to release a full album?</li>
<li>If you could improve one thing with Ember, what would it be and why?</li>
<li>Do you have strategies for teaching ember-concurrency to someone who doesn't know about generator functions? Do you try to teach those separately first?</li>
<li>What are some JavaScript patterns you don't see being used as often as you think they should?</li>
<li>What are some concepts/design patterns you wish all developers would know about and internalize?</li>
<li>How do non-ember-core members become more involved in ember-core? What are some ways to bridge the gap between basic contributions and the complicated RFC process? How do you drive community change from only addon code?</li>
</ul>
]]></content:encoded>
      <enclosure length="87417399" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/c2c9afda-4835-4bbd-8f0a-edb47c930e28/884859bb_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Alex Matchneer on Routing Patterns</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/c2c9afda-4835-4bbd-8f0a-edb47c930e28/3000x3000/1523561499artwork.jpg?aid=rss_feed"/>
      <itunes:duration>01:29:26</itunes:duration>
      <itunes:summary>Alex Matchneer chats with Sam and Ryan about challenging routing patterns in Ember, his involvement with the Ember community, and what Ember’s next router might look like.</itunes:summary>
      <itunes:subtitle>Alex Matchneer chats with Sam and Ryan about challenging routing patterns in Ember, his involvement with the Ember community, and what Ember’s next router might look like.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>16</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">2be13972-e8f1-4f84-94e7-d5155460bde1</guid>
      <title>Steelman vs. strawman</title>
      <description><![CDATA[<p>Sam and Ryan talk about their new series, “Declarative rendering,” and why we should use steelman arguments instead of strawman arguments when talking about technology. They also answer some listener questions.</p>
<p>Topics covered:</p>
<ul>
<li>Declarative rendering, their new series</li>
<li>Steelman versus strawman arguments</li>
</ul>
<p>Listener questions:</p>
<ul>
<li>I care about lazy loading ember code, like routes. My knowledge is that’s its only possible with ember engines, but I’m not sure. Thanks a lot – <a href="https://twitter.com/sommer_gerrit/status/979758811719307264">@sommer_gerrit on Twitter</a></li>
<li>Podcast about ember-engines might be cool – <a href="https://twitter.com/iflask/status/979764113403531266">@iflask on Twitter</a></li>
<li>My question: is it time to pitch PWA <em>instead</em> of native apps for clients wanting a presence on mobile (re: the new Safari release) – <a href="https://twitter.com/real_ate/status/979758210079973376">@real_ate on Twitter</a></li>
<li>Question for the show -&gt; how might writing glimmer components be different in the coming months as we unlock that as first class (thru the eyes of a traditional ember 2 developer) – @toranb on #topic-embermap from Slack</li>
<li>Ember Data can get complicated in a hurry when not using a JSON:API standard API. What are some strategies to work with these kinds of APIs assuming the API cannot be changed? – @localpcguy on #topic-embermap from Slack</li>
</ul>
]]></description>
      <pubDate>Thu, 5 Apr 2018 14:51:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about their new series, “Declarative rendering,” and why we should use steelman arguments instead of strawman arguments when talking about technology. They also answer some listener questions.</p>
<p>Topics covered:</p>
<ul>
<li>Declarative rendering, their new series</li>
<li>Steelman versus strawman arguments</li>
</ul>
<p>Listener questions:</p>
<ul>
<li>I care about lazy loading ember code, like routes. My knowledge is that’s its only possible with ember engines, but I’m not sure. Thanks a lot – <a href="https://twitter.com/sommer_gerrit/status/979758811719307264">@sommer_gerrit on Twitter</a></li>
<li>Podcast about ember-engines might be cool – <a href="https://twitter.com/iflask/status/979764113403531266">@iflask on Twitter</a></li>
<li>My question: is it time to pitch PWA <em>instead</em> of native apps for clients wanting a presence on mobile (re: the new Safari release) – <a href="https://twitter.com/real_ate/status/979758210079973376">@real_ate on Twitter</a></li>
<li>Question for the show -&gt; how might writing glimmer components be different in the coming months as we unlock that as first class (thru the eyes of a traditional ember 2 developer) – @toranb on #topic-embermap from Slack</li>
<li>Ember Data can get complicated in a hurry when not using a JSON:API standard API. What are some strategies to work with these kinds of APIs assuming the API cannot be changed? – @localpcguy on #topic-embermap from Slack</li>
</ul>
]]></content:encoded>
      <enclosure length="46513388" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/344b6b32-c2e3-43a4-88ac-8f56a4636343/b228e0c3_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Steelman vs. strawman</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/344b6b32-c2e3-43a4-88ac-8f56a4636343/3000x3000/1522940047artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:46:53</itunes:duration>
      <itunes:summary>Sam and Ryan talk about their new series, “Declarative rendering,” and why we should use steelman arguments instead of strawman arguments when talking about technology. They also answer some listener questions.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about their new series, “Declarative rendering,” and why we should use steelman arguments instead of strawman arguments when talking about technology. They also answer some listener questions.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>15</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">fe78de53-51de-4947-be05-a7e80890e59c</guid>
      <title>Making the impossible, impossible</title>
      <description><![CDATA[<p>Sam and Ryan talk about</p>
<ul>
<li>Functional CSS training at EmberConf</li>
<li>Some ideas for hiding styling implementation details from templates</li>
<li>A new setup for multiple staging environments</li>
<li>An idea from data modeling called “Making the impossible, impossible”</li>
<li>How to use data down actions up effectively in forms</li>
</ul>
<p>They also answer some listener questions:</p>
<ul>
<li>When should I use polymorphic or reflexive relationships?</li>
<li>When do I need to explicitly name a relationship’s inverse?</li>
<li>When should I reference relationships and when should I embed them?</li>
</ul>
]]></description>
      <pubDate>Fri, 30 Mar 2018 14:12:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about</p>
<ul>
<li>Functional CSS training at EmberConf</li>
<li>Some ideas for hiding styling implementation details from templates</li>
<li>A new setup for multiple staging environments</li>
<li>An idea from data modeling called “Making the impossible, impossible”</li>
<li>How to use data down actions up effectively in forms</li>
</ul>
<p>They also answer some listener questions:</p>
<ul>
<li>When should I use polymorphic or reflexive relationships?</li>
<li>When do I need to explicitly name a relationship’s inverse?</li>
<li>When should I reference relationships and when should I embed them?</li>
</ul>
]]></content:encoded>
      <enclosure length="47759441" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/600a5991-b4da-4f47-858c-e127ad2de35b/54add5f9_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Making the impossible, impossible</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/600a5991-b4da-4f47-858c-e127ad2de35b/3000x3000/1522419657artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:48:13</itunes:duration>
      <itunes:summary>Sam and Ryan talk about their Functional CSS training at EmberConf, some ideas for hiding styling implementation details from templates, a new setup for multiple staging environments, an idea from data modeling called &quot;Making the impossible, impossible&quot;, and how to use data down actions up effectively in forms. They also answer some listener questions.
</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about their Functional CSS training at EmberConf, some ideas for hiding styling implementation details from templates, a new setup for multiple staging environments, an idea from data modeling called &quot;Making the impossible, impossible&quot;, and how to use data down actions up effectively in forms. They also answer some listener questions.
</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>14</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">88c1ed0c-6336-4e14-ba31-a9f72192bd92</guid>
      <title>Oli Griffiths on the Benefits of Static Typing and How Broccoli Works</title>
      <description><![CDATA[<p>Oli Griffiths joins Sam and Ryan to talk about his experience using typed languages, what kinds of benefits static could bring to the Ember developer experience, and his upcoming EmberConf training on Broccoli.js.</p>
]]></description>
      <pubDate>Wed, 7 Mar 2018 17:42:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Oli Griffiths joins Sam and Ryan to talk about his experience using typed languages, what kinds of benefits static could bring to the Ember developer experience, and his upcoming EmberConf training on Broccoli.js.</p>
]]></content:encoded>
      <enclosure length="50931572" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/9813442b-74ba-4185-ba3e-ca0a0a388ca8/7f8db0f8_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Oli Griffiths on the Benefits of Static Typing and How Broccoli Works</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/9813442b-74ba-4185-ba3e-ca0a0a388ca8/3000x3000/1520444675artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:51:29</itunes:duration>
      <itunes:summary>Oli Griffiths joins Sam and Ryan to talk about his experience using typed languages, what kinds of benefits static could bring to the Ember developer experience, and his upcoming EmberConf training on Broccoli.js.</itunes:summary>
      <itunes:subtitle>Oli Griffiths joins Sam and Ryan to talk about his experience using typed languages, what kinds of benefits static could bring to the Ember developer experience, and his upcoming EmberConf training on Broccoli.js.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>13</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">bcb88d64-d36a-4603-a47b-534d49c91a7a</guid>
      <title>JSONAPI Operations, Caching in FastBoot, and Ember&apos;s Strengths</title>
      <description><![CDATA[<p>Sam and Ryan talk about the upcoming Operations addition to the JSON:API spec, adding FastBoot support to Storefront, how to think about caching in Fastboot, and a thought experiment around how Ember might niche down and focus on its strengths.</p>
]]></description>
      <pubDate>Thu, 22 Feb 2018 19:24:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about the upcoming Operations addition to the JSON:API spec, adding FastBoot support to Storefront, how to think about caching in Fastboot, and a thought experiment around how Ember might niche down and focus on its strengths.</p>
]]></content:encoded>
      <enclosure length="44425036" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/be3fd6d4-c65c-4093-a245-19364668543d/5b870303_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>JSONAPI Operations, Caching in FastBoot, and Ember&apos;s Strengths</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/be3fd6d4-c65c-4093-a245-19364668543d/3000x3000/1519327645artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:44:38</itunes:duration>
      <itunes:summary>Sam and Ryan talk about the upcoming Operations addition to the JSON:API spec, adding FastBoot support to Storefront, how to think about caching in Fastboot, and a thought experiment around how Ember might niche down and focus on its strengths.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about the upcoming Operations addition to the JSON:API spec, adding FastBoot support to Storefront, how to think about caching in Fastboot, and a thought experiment around how Ember might niche down and focus on its strengths.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>12</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">85f8c7a1-568b-4cfa-b2e2-24c86447bd49</guid>
      <title>Tom Dale on Static Analysis, Upstreaming Glimmer, and Ember in 2018</title>
      <description><![CDATA[<p>Tom Dale chats with Sam and Ryan about static analysis and compilers, upstreaming learnings from Glimmer, and what sort of size and speed improvements Ember.js will see in 2018.</p>
]]></description>
      <pubDate>Wed, 31 Jan 2018 20:58:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Tom Dale chats with Sam and Ryan about static analysis and compilers, upstreaming learnings from Glimmer, and what sort of size and speed improvements Ember.js will see in 2018.</p>
]]></content:encoded>
      <enclosure length="56199604" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/fe09c43b-4071-4d6b-a350-5e29a3ea5645/fc120485_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Tom Dale on Static Analysis, Upstreaming Glimmer, and Ember in 2018</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/fe09c43b-4071-4d6b-a350-5e29a3ea5645/3000x3000/1517432470artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:56:49</itunes:duration>
      <itunes:summary>Tom Dale chats with Sam and Ryan about static analysis and compilers, upstreaming learnings from Glimmer, and what sort of size and speed improvements Ember.js will see in 2018.</itunes:summary>
      <itunes:subtitle>Tom Dale chats with Sam and Ryan about static analysis and compilers, upstreaming learnings from Glimmer, and what sort of size and speed improvements Ember.js will see in 2018.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>11</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">dd877118-11b5-4c4d-b9f8-80e27bea6fb6</guid>
      <title>Babel Plugins, Compile-time Components, and Extending Integration Tests</title>
      <description><![CDATA[<p>Sam and Ryan talk about writing Babel plugins, components that can be transformed to plain HTML at compile-time, the differences between run-time and compile-time error messaging, and one way to make integration tests more reusable and domain-specific.</p>
]]></description>
      <pubDate>Wed, 24 Jan 2018 17:20:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about writing Babel plugins, components that can be transformed to plain HTML at compile-time, the differences between run-time and compile-time error messaging, and one way to make integration tests more reusable and domain-specific.</p>
]]></content:encoded>
      <enclosure length="49592549" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/aa4e5797-d891-454d-b2f5-16f574a717ca/a261f2ff_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Babel Plugins, Compile-time Components, and Extending Integration Tests</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/aa4e5797-d891-454d-b2f5-16f574a717ca/3000x3000/1516814942artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:50:00</itunes:duration>
      <itunes:summary>Sam and Ryan talk about writing Babel plugins, components that can be transformed to plain HTML at compile-time, the differences between run-time and compile-time error messaging, and one way to make integration tests more reusable and domain-specific.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about writing Babel plugins, components that can be transformed to plain HTML at compile-time, the differences between run-time and compile-time error messaging, and one way to make integration tests more reusable and domain-specific.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>10</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">163bd53a-e23e-4542-809c-e888e0b17d78</guid>
      <title>Avoiding Imperative APIs and Expired Data</title>
      <description><![CDATA[<p>Sam and Ryan chat about Sebastian Markbage’s 2015 React Europe talk “DOM as a Second-Class Citizen” and how to deal with stale data in an Ember app.</p>
<ul>
<li>Sebastian Markbage's talk <a href="https://www.youtube.com/watch?v=Zemce4Y1Y-A">DOM as a Second-Class Citizen</a></li>
</ul>
]]></description>
      <pubDate>Wed, 17 Jan 2018 14:34:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan chat about Sebastian Markbage’s 2015 React Europe talk “DOM as a Second-Class Citizen” and how to deal with stale data in an Ember app.</p>
<ul>
<li>Sebastian Markbage's talk <a href="https://www.youtube.com/watch?v=Zemce4Y1Y-A">DOM as a Second-Class Citizen</a></li>
</ul>
]]></content:encoded>
      <enclosure length="37737991" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/1339d19c-6a67-47d1-92e9-8d260208ff6c/1da166bb_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Avoiding Imperative APIs and Expired Data</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/1339d19c-6a67-47d1-92e9-8d260208ff6c/3000x3000/1516200364artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:37:41</itunes:duration>
      <itunes:summary>Sam and Ryan chat about Sebastian Markbage’s 2015 React Europe talk “DOM as a Second-Class Citizen,” and how to deal with stale data in an Ember app.</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about Sebastian Markbage’s 2015 React Europe talk “DOM as a Second-Class Citizen,” and how to deal with stale data in an Ember app.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>9</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">98620d9d-87ef-4b7b-9cdf-b783ae67ed5f</guid>
      <title>Breaking Production, Functional CSS and UI Components, and Testing Async Errors</title>
      <description><![CDATA[<p>Sam and Ryan chat about all the different ways you can make sure your app is working, some of their latest thoughts on functional CSS and presenter components in Ember, and how to test asynchronous errors in an acceptance test.</p>
]]></description>
      <pubDate>Wed, 10 Jan 2018 16:59:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan chat about all the different ways you can make sure your app is working, some of their latest thoughts on functional CSS and presenter components in Ember, and how to test asynchronous errors in an acceptance test.</p>
]]></content:encoded>
      <enclosure length="46163526" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/f33a3e9a-d6f1-4c83-bacf-ad4c83736976/cfcc12d9_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Breaking Production, Functional CSS and UI Components, and Testing Async Errors</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/f33a3e9a-d6f1-4c83-bacf-ad4c83736976/3000x3000/1515604208artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:47:16</itunes:duration>
      <itunes:summary>Sam and Ryan chat about all the different ways you can make sure your app is working, some of their latest thoughts on functional CSS and presenter components in Ember, and how to test asynchronous errors in an acceptance test.</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about all the different ways you can make sure your app is working, some of their latest thoughts on functional CSS and presenter components in Ember, and how to test asynchronous errors in an acceptance test.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>8</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">7d53687a-d153-4255-a9e9-c1ed1d441026</guid>
      <title>Declarative Data Fetching, Disposable Code, Easier Upgrades, and the Upfront Cost of Ember</title>
      <description><![CDATA[<p>Sam and Ryan talk about a new Storefront API and why routes should declare their data needs, patterns that make your code more disposable, how Ember CLI Update simplifies the process of upgrading your Ember apps, and what teams should consider when choosing Ember for their next project.</p>
]]></description>
      <pubDate>Thu, 7 Dec 2017 15:57:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about a new Storefront API and why routes should declare their data needs, patterns that make your code more disposable, how Ember CLI Update simplifies the process of upgrading your Ember apps, and what teams should consider when choosing Ember for their next project.</p>
]]></content:encoded>
      <enclosure length="38009632" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/038f67ac-3d86-47c4-9d9c-ad2f03696555/91b899bd_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Declarative Data Fetching, Disposable Code, Easier Upgrades, and the Upfront Cost of Ember</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/038f67ac-3d86-47c4-9d9c-ad2f03696555/3000x3000/1512663267artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:37:51</itunes:duration>
      <itunes:summary>Sam and Ryan talk about a new Storefront API and why routes should declare their data needs, patterns that make your code more disposable, how Ember CLI Update simplifies the process of upgrading your Ember apps, and what teams should consider when choosing Ember for their next project.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about a new Storefront API and why routes should declare their data needs, patterns that make your code more disposable, how Ember CLI Update simplifies the process of upgrading your Ember apps, and what teams should consider when choosing Ember for their next project.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>7</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">6a2f7332-5028-4d41-9475-0e1719f502ca</guid>
      <title>Photo Uploads, Server Errors in Ember Data, NPM Dependencies and Ember CLI Addon Docs</title>
      <description><![CDATA[<p>Sam and Ryan talk about uploading images to S3, a new Storefront API for dealing with server errors in Ember Data, how to be a good community citizen when it comes to publishing consumable libraries given that our package managers now use lockfiles, and some ongoing work on the Ember CLI Addon Docs addon.</p>
]]></description>
      <pubDate>Wed, 8 Nov 2017 15:47:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan talk about uploading images to S3, a new Storefront API for dealing with server errors in Ember Data, how to be a good community citizen when it comes to publishing consumable libraries given that our package managers now use lockfiles, and some ongoing work on the Ember CLI Addon Docs addon.</p>
]]></content:encoded>
      <enclosure length="39192850" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/a75805b2-a5e6-4caf-9ef8-e43457eb458a/dd5dd687_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Photo Uploads, Server Errors in Ember Data, NPM Dependencies and Ember CLI Addon Docs</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/a75805b2-a5e6-4caf-9ef8-e43457eb458a/3000x3000/1510156428artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:40:37</itunes:duration>
      <itunes:summary>Sam and Ryan talk about uploading images to S3, a new Storefront API for dealing with server errors in Ember Data, how to be a good community citizen when it comes to publishing consumable libraries given that our package managers now use lockfiles, and some ongoing work on the Ember CLI Addon Docs addon.</itunes:summary>
      <itunes:subtitle>Sam and Ryan talk about uploading images to S3, a new Storefront API for dealing with server errors in Ember Data, how to be a good community citizen when it comes to publishing consumable libraries given that our package managers now use lockfiles, and some ongoing work on the Ember CLI Addon Docs addon.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>6</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">9b80369e-491d-4417-86e6-a9d6bfb82e96</guid>
      <title>Async Relationships, Store Forking, and Batch Saving in Ember Data</title>
      <description><![CDATA[<p>Sam and Ryan discuss community feedback on Ember Data's pain points, including asynchronous relationships, store forking and batch saving.</p>
]]></description>
      <pubDate>Fri, 27 Oct 2017 14:52:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan discuss community feedback on Ember Data's pain points, including asynchronous relationships, store forking and batch saving.</p>
]]></content:encoded>
      <enclosure length="37610876" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/1432beac-fc56-4464-9203-121f1e42d2b8/1e606103_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Async Relationships, Store Forking, and Batch Saving in Ember Data</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/1432beac-fc56-4464-9203-121f1e42d2b8/3000x3000/1509116306artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:38:58</itunes:duration>
      <itunes:summary>Sam and Ryan discuss community feedback on Ember Data&apos;s pain points, including asynchronous relationships, store forking and batch saving.</itunes:summary>
      <itunes:subtitle>Sam and Ryan discuss community feedback on Ember Data&apos;s pain points, including asynchronous relationships, store forking and batch saving.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>5</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">b952e579-baf7-49a5-9585-1f077821028d</guid>
      <title>Forms, Authentication, Ember 3.0, and Liquid Tether</title>
      <description><![CDATA[<p>Sam and Ryan discuss using contextual components to clean up forms, a unique authentication scenario using cookies and JWT, the release blog post about Ember 3.0, and building animations with the Liquid Tether addon.</p>
]]></description>
      <pubDate>Fri, 6 Oct 2017 21:05:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan discuss using contextual components to clean up forms, a unique authentication scenario using cookies and JWT, the release blog post about Ember 3.0, and building animations with the Liquid Tether addon.</p>
]]></content:encoded>
      <enclosure length="31289292" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/c7f92d3b-c802-4e6d-acdc-7aa64b8f6b9b/69b2aa88_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Forms, Authentication, Ember 3.0, and Liquid Tether</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/c7f92d3b-c802-4e6d-acdc-7aa64b8f6b9b/3000x3000/1507324255artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:32:32</itunes:duration>
      <itunes:summary>Sam and Ryan discuss using contextual components to clean up forms, a unique authentication scenario using cookies and JWT, the release blog post about Ember 3.0, and building animations with the Liquid Tether addon.</itunes:summary>
      <itunes:subtitle>Sam and Ryan discuss using contextual components to clean up forms, a unique authentication scenario using cookies and JWT, the release blog post about Ember 3.0, and building animations with the Liquid Tether addon.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>4</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">1faff8b3-fb29-4b7e-b80b-360f51b4375a</guid>
      <title>Luke Melia on Styleguides</title>
      <description><![CDATA[<p>Special guest Luke Melia chats with Sam and Ryan about styleguides, CSS patterns, Ember Freestyle and more.</p>
<p>Links from the episode:</p>
<ul>
<li>Luke Melia on <a href="twitter.com/lukemelia">Twitter</a></li>
<li><a href="https://suitcss.github.io">Suit CSS</a></li>
<li><a href="https://github.com/chrislopresto/ember-freestyle">Ember Freestyle</a></li>
<li><a href="https://github.com/ciena-blueplanet/ember-prop-types">Ember Prop Types</a></li>
<li>Yapp Labs on <a href="https://github.com/yapplabs">Github</a></li>
<li><a href="https://github.com/ember-cli-deploy/ember-cli-deploy">Ember CLI Deploy</a></li>
</ul>
]]></description>
      <pubDate>Thu, 14 Sep 2017 17:44:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Special guest Luke Melia chats with Sam and Ryan about styleguides, CSS patterns, Ember Freestyle and more.</p>
<p>Links from the episode:</p>
<ul>
<li>Luke Melia on <a href="twitter.com/lukemelia">Twitter</a></li>
<li><a href="https://suitcss.github.io">Suit CSS</a></li>
<li><a href="https://github.com/chrislopresto/ember-freestyle">Ember Freestyle</a></li>
<li><a href="https://github.com/ciena-blueplanet/ember-prop-types">Ember Prop Types</a></li>
<li>Yapp Labs on <a href="https://github.com/yapplabs">Github</a></li>
<li><a href="https://github.com/ember-cli-deploy/ember-cli-deploy">Ember CLI Deploy</a></li>
</ul>
]]></content:encoded>
      <enclosure length="38873079" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/5b788185-79ef-4883-abec-184788f8c862/c9e8fc4d_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Luke Melia on Styleguides</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/5b788185-79ef-4883-abec-184788f8c862/3000x3000/1506361665artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:40:26</itunes:duration>
      <itunes:summary>Special guest Luke Melia chats with Sam and Ryan about styleguides, CSS patterns, Ember Freestyle and more.</itunes:summary>
      <itunes:subtitle>Special guest Luke Melia chats with Sam and Ryan about styleguides, CSS patterns, Ember Freestyle and more.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>3</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">a6c4de88-758c-44e1-89a8-9b5fe31c62ac</guid>
      <title>FastBoot, Structural Components and Ember Data Transactions</title>
      <description><![CDATA[<p>Sam and Ryan chat about adding FastBoot to EmberMap's codebase, the difference between reusable and structural components, and the road to adding transactions to Ember Data.</p>
]]></description>
      <pubDate>Tue, 29 Aug 2017 17:16:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Sam and Ryan chat about adding FastBoot to EmberMap's codebase, the difference between reusable and structural components, and the road to adding transactions to Ember Data.</p>
]]></content:encoded>
      <enclosure length="32060763" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/b8c18894-a3b6-499a-a792-201334fd95c9/6793a4fa_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>FastBoot, Structural Components and Ember Data Transactions</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/b8c18894-a3b6-499a-a792-201334fd95c9/3000x3000/1506360063artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:33:20</itunes:duration>
      <itunes:summary>Sam and Ryan chat about adding FastBoot to EmberMap&apos;s codebase, the difference between reusable and structural components, and the road to adding transactions to Ember Data.</itunes:summary>
      <itunes:subtitle>Sam and Ryan chat about adding FastBoot to EmberMap&apos;s codebase, the difference between reusable and structural components, and the road to adding transactions to Ember Data.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>2</itunes:episode>
    </item>
    <item>
      <guid isPermaLink="false">8f77c7b9-b140-4fe9-9c5a-24ca18749e92</guid>
      <title>Glimmer, Ember&apos;s reputation and Tachyons</title>
      <description><![CDATA[<p>Listen to Sam and Ryan chat about their experience using Glimmer, how Ember is perceived in the larger front-end community, and their experience with Tachyons, the functional CSS library.</p>
]]></description>
      <pubDate>Fri, 2 Jun 2017 18:00:00 +0000</pubDate>
      <author>sam@samselikoff.com (EmberMap)</author>
      <link>https://frontendfirst.fm</link>
      <content:encoded><![CDATA[<p>Listen to Sam and Ryan chat about their experience using Glimmer, how Ember is perceived in the larger front-end community, and their experience with Tachyons, the functional CSS library.</p>
]]></content:encoded>
      <enclosure length="25182072" type="audio/mpeg" url="https://cdn.simplecast.com/audio/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/d1d76054-85b4-4daa-b620-764081c84c93/c2574186_tc.mp3?aid=rss_feed&amp;feed=sOJAMohP"/>
      <itunes:title>Glimmer, Ember&apos;s reputation and Tachyons</itunes:title>
      <itunes:author>EmberMap</itunes:author>
      <itunes:image href="https://image.simplecastcdn.com/images/598aeb/598aebea-91aa-4070-84b0-f8d21a4be43d/d1d76054-85b4-4daa-b620-764081c84c93/3000x3000/1506020536artwork.jpg?aid=rss_feed"/>
      <itunes:duration>00:26:10</itunes:duration>
      <itunes:summary>Listen to Sam and Ryan chat about their experience using Glimmer, how Ember is perceived in the larger front-end community, and their experience with Tachyons, the functional CSS library.</itunes:summary>
      <itunes:subtitle>Listen to Sam and Ryan chat about their experience using Glimmer, how Ember is perceived in the larger front-end community, and their experience with Tachyons, the functional CSS library.</itunes:subtitle>
      <itunes:explicit>false</itunes:explicit>
      <itunes:episodeType>full</itunes:episodeType>
      <itunes:episode>1</itunes:episode>
    </item>
  </channel>
</rss>