<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Friday AI]]></title><description><![CDATA[Agentic AI workspaces that run on schedule, across your tools, with and without you.]]></description><link>https://blog.hellofriday.ai</link><image><url>https://substackcdn.com/image/fetch/$s_!fQNG!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F079664b6-56d0-414b-8c1b-d1cc1fbc3261_600x600.png</url><title>Friday AI</title><link>https://blog.hellofriday.ai</link></image><generator>Substack</generator><lastBuildDate>Sat, 23 May 2026 17:46:06 GMT</lastBuildDate><atom:link href="https://blog.hellofriday.ai/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Ken Kouot]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[hellofridayai@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[hellofridayai@substack.com]]></itunes:email><itunes:name><![CDATA[Yena Oh]]></itunes:name></itunes:owner><itunes:author><![CDATA[Yena Oh]]></itunes:author><googleplay:owner><![CDATA[hellofridayai@substack.com]]></googleplay:owner><googleplay:email><![CDATA[hellofridayai@substack.com]]></googleplay:email><googleplay:author><![CDATA[Yena Oh]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[I run a personal AI assistant on $0. Here’s how to build one.]]></title><description><![CDATA[Uber burned through its 2026 AI budget months into the year.]]></description><link>https://blog.hellofriday.ai/p/i-run-a-personal-ai-assistant-on-0-heres-how-to-build-one-294c9bede5da</link><guid isPermaLink="false">https://blog.hellofriday.ai/p/i-run-a-personal-ai-assistant-on-0-heres-how-to-build-one-294c9bede5da</guid><pubDate>Tue, 19 May 2026 15:31:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2Den!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa60920-e6f0-4bbb-a90b-9acc697e327f_1120x540.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://finance.yahoo.com/sectors/technology/articles/ubers-anthropic-ai-push-hits-223109852.html">Uber burned through its 2026 AI budget</a> months into the year. ServiceNow too. Uber&#8217;s CTO told reporters they&#8217;re &#8220;back to the drawing board&#8221; after Claude Code usage blew past internal expectations, despite a $3.4 billion R&amp;D budget. Anthropic&#8217;s framing, from <a href="https://www.saastr.com/anthropic-just-passed-openai-in-revenue-while-spending-4x-less-to-train-their-models/">Dario Amodei</a>: &#8220;We planned for a world of 10x growth per year. In Q1 we saw 80x.&#8221; Anthropic <a href="https://www.axios.com/2026/05/14/anthropic-claude-price-openai-tokens">tightened the rate limits</a>. Pro subscribers <a href="https://www.theregister.com/2026/03/31/anthropic_claude_code_limits/">posted screenshots</a>: 12 usable days out of 30. The chorus underneath all of it: AI is expensive, the agent era breaks the pricing, only the well-funded get the good agents.</p><p>It isn&#8217;t true. Or it&#8217;s true only if you assume &#8220;AI&#8221; means the realtime, instant-answer chat you get from the paid services. Drop that constraint and free models become useful. One booked a real meeting on my calendar this morning.</p><h2><strong>The shape of a $0 personal assistant</strong></h2><p>I wanted something small and unsexy. An assistant that can look at my Google Calendar, find me a free hour next week, and book a meeting when I ask. The dishwasher of AI: boring on paper, life-changing in practice.</p><p>Budget: zero dollars on inference.</p><p>The stack I ended up with:</p><ul><li><p><strong><a href="https://hellofriday.ai/">Friday</a></strong>, the <a href="https://github.com/friday-platform/friday-studio">source-available</a> agent harness I&#8217;m building, as the host</p></li><li><p><strong>OpenRouter</strong> as the LLM provider on its free tier</p></li><li><p>A free model that calls tools well (more on picking one in a minute, because this is the part that matters)</p></li><li><p>Friday&#8217;s bundled Google Calendar MCP as the tool layer</p></li></ul><p>Total ongoing cost: $0. Setup cost: $10 once, which I&#8217;ll explain in a second. The $10 sits there. You don&#8217;t spend it.</p><p>What&#8217;s missing from the list: a specific model. I left it out on purpose. The free-model landscape shifts every week; any model I prescribe here will be wrong by the time you read this. So I&#8217;ll tell you what worked for me, and then I&#8217;ll show you the method for picking your own.</p><h2><strong>Step 1: Get Friday running</strong></h2><p>Friday is a source-available <a href="https://blog.hellofriday.ai/what-is-an-agent-harness-the-real-work-in-ai-agents-ddba3efcd1ac">agent harness</a> with the boring parts already wired up: settings for swapping LLM providers, a one-click MCP catalog for connecting your Google apps, and a job scheduler for cron-style tasks (which turn out to be the killer app here).</p><p>Install instructions live at <a href="http://docs.hellofriday.ai/getting-started/quickstart">docs.hellofriday.ai/getting-started/quickstart</a>. Everything runs locally. There&#8217;s no Friday cloud to sign up for.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2Den!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa60920-e6f0-4bbb-a90b-9acc697e327f_1120x540.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2Den!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa60920-e6f0-4bbb-a90b-9acc697e327f_1120x540.png 424w, https://substackcdn.com/image/fetch/$s_!2Den!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa60920-e6f0-4bbb-a90b-9acc697e327f_1120x540.png 848w, https://substackcdn.com/image/fetch/$s_!2Den!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa60920-e6f0-4bbb-a90b-9acc697e327f_1120x540.png 1272w, https://substackcdn.com/image/fetch/$s_!2Den!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa60920-e6f0-4bbb-a90b-9acc697e327f_1120x540.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2Den!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa60920-e6f0-4bbb-a90b-9acc697e327f_1120x540.png" width="1120" height="540" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/caa60920-e6f0-4bbb-a90b-9acc697e327f_1120x540.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:540,&quot;width&quot;:1120,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!2Den!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa60920-e6f0-4bbb-a90b-9acc697e327f_1120x540.png 424w, https://substackcdn.com/image/fetch/$s_!2Den!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa60920-e6f0-4bbb-a90b-9acc697e327f_1120x540.png 848w, https://substackcdn.com/image/fetch/$s_!2Den!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa60920-e6f0-4bbb-a90b-9acc697e327f_1120x540.png 1272w, https://substackcdn.com/image/fetch/$s_!2Den!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaa60920-e6f0-4bbb-a90b-9acc697e327f_1120x540.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>Step 2: Get an OpenRouter API key</strong></h2><p>OpenRouter is a meta-provider: one API, dozens of model providers behind it. They run a free tier with real models on it.</p><p>Head to <a href="http://openrouter.ai/">openrouter.ai</a> and sign up with email, Google, or GitHub. Whatever you have.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HR3H!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29f690d4-b50d-4537-ae6f-1c13812c05da_1120x505.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HR3H!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29f690d4-b50d-4537-ae6f-1c13812c05da_1120x505.png 424w, https://substackcdn.com/image/fetch/$s_!HR3H!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29f690d4-b50d-4537-ae6f-1c13812c05da_1120x505.png 848w, https://substackcdn.com/image/fetch/$s_!HR3H!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29f690d4-b50d-4537-ae6f-1c13812c05da_1120x505.png 1272w, https://substackcdn.com/image/fetch/$s_!HR3H!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29f690d4-b50d-4537-ae6f-1c13812c05da_1120x505.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HR3H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29f690d4-b50d-4537-ae6f-1c13812c05da_1120x505.png" width="1120" height="505" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/29f690d4-b50d-4537-ae6f-1c13812c05da_1120x505.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:505,&quot;width&quot;:1120,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!HR3H!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29f690d4-b50d-4537-ae6f-1c13812c05da_1120x505.png 424w, https://substackcdn.com/image/fetch/$s_!HR3H!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29f690d4-b50d-4537-ae6f-1c13812c05da_1120x505.png 848w, https://substackcdn.com/image/fetch/$s_!HR3H!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29f690d4-b50d-4537-ae6f-1c13812c05da_1120x505.png 1272w, https://substackcdn.com/image/fetch/$s_!HR3H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29f690d4-b50d-4537-ae6f-1c13812c05da_1120x505.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Go to <strong>Keys</strong> in the left nav and create one. Copy the key somewhere safe. You only see it once.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NYJl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ce8a75c-e263-4689-b5b4-0ea412fdc8c6_1082x1082.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NYJl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ce8a75c-e263-4689-b5b4-0ea412fdc8c6_1082x1082.png 424w, https://substackcdn.com/image/fetch/$s_!NYJl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ce8a75c-e263-4689-b5b4-0ea412fdc8c6_1082x1082.png 848w, https://substackcdn.com/image/fetch/$s_!NYJl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ce8a75c-e263-4689-b5b4-0ea412fdc8c6_1082x1082.png 1272w, https://substackcdn.com/image/fetch/$s_!NYJl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ce8a75c-e263-4689-b5b4-0ea412fdc8c6_1082x1082.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NYJl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ce8a75c-e263-4689-b5b4-0ea412fdc8c6_1082x1082.png" width="1082" height="1082" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6ce8a75c-e263-4689-b5b4-0ea412fdc8c6_1082x1082.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1082,&quot;width&quot;:1082,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!NYJl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ce8a75c-e263-4689-b5b4-0ea412fdc8c6_1082x1082.png 424w, https://substackcdn.com/image/fetch/$s_!NYJl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ce8a75c-e263-4689-b5b4-0ea412fdc8c6_1082x1082.png 848w, https://substackcdn.com/image/fetch/$s_!NYJl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ce8a75c-e263-4689-b5b4-0ea412fdc8c6_1082x1082.png 1272w, https://substackcdn.com/image/fetch/$s_!NYJl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ce8a75c-e263-4689-b5b4-0ea412fdc8c6_1082x1082.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A note on rate limits, because this is where &#8220;free&#8221; gets nuanced:</p><ul><li><p><strong>Free tier, no credits:</strong> 50 requests per day. That sounds fine until one real agent conversation eats 5 to 10 requests. You&#8217;ll burn 50/day in three actual interactions.</p></li><li><p><strong>Free tier, after a one-time $10 deposit:</strong> 1000 requests per day. The $10 sits in your account untouched. You&#8217;re calling <code>:free</code> models, so nothing gets debited. It&#8217;s a one-time entry fee.</p></li></ul><p>So yes, my &#8220;$0&#8221; experiment cost $10. I&#8217;m filing it as a deposit, since you never spend the money, and I&#8217;ll die on that hill. If you want to use free models for real work, budget the $10. That&#8217;s the unlock.</p><h2><strong>Step 3: Wire OpenRouter into Friday</strong></h2><p>Open Friday&#8217;s settings. Paste the key. Pick OpenRouter as your provider.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4d2L!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf414aeb-6edc-44ab-afd1-8e23012b7603_1120x824.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4d2L!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf414aeb-6edc-44ab-afd1-8e23012b7603_1120x824.png 424w, https://substackcdn.com/image/fetch/$s_!4d2L!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf414aeb-6edc-44ab-afd1-8e23012b7603_1120x824.png 848w, https://substackcdn.com/image/fetch/$s_!4d2L!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf414aeb-6edc-44ab-afd1-8e23012b7603_1120x824.png 1272w, https://substackcdn.com/image/fetch/$s_!4d2L!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf414aeb-6edc-44ab-afd1-8e23012b7603_1120x824.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4d2L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf414aeb-6edc-44ab-afd1-8e23012b7603_1120x824.png" width="1120" height="824" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/df414aeb-6edc-44ab-afd1-8e23012b7603_1120x824.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:824,&quot;width&quot;:1120,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!4d2L!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf414aeb-6edc-44ab-afd1-8e23012b7603_1120x824.png 424w, https://substackcdn.com/image/fetch/$s_!4d2L!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf414aeb-6edc-44ab-afd1-8e23012b7603_1120x824.png 848w, https://substackcdn.com/image/fetch/$s_!4d2L!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf414aeb-6edc-44ab-afd1-8e23012b7603_1120x824.png 1272w, https://substackcdn.com/image/fetch/$s_!4d2L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf414aeb-6edc-44ab-afd1-8e23012b7603_1120x824.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Friday has four model roles: classifier, planner, conversational, and validator. You can route all four to OpenRouter for the maximum-free setup, or mix and match. I run all four through OpenRouter, on a single model I picked after a deliberate sweep.</p><p>One note: OpenRouter is a first-class provider in Friday now, with the OAuth and base-URL plumbing pre-wired. It wasn&#8217;t when I started this experiment. I&#8217;ll get to why below.</p><h2><strong>Step 4: Sweep a few models and pick the one that fits</strong></h2><p>Public benchmarks don&#8217;t catch this, and I&#8217;d rather teach you the method than hand you a name.</p><p>The free-model market moves fast. New OpenRouter <code>:free</code> models drop monthly. Providers change rate limits. Tool-calling support gets tightened in a model card update you didn&#8217;t notice. Any specific &#8220;best model&#8221; recommendation in a blog post is half-stale the day it ships. So instead of naming a model, I&#8217;ll tell you what to look for and how to find the one that fits your workload right now.</p><p><strong>Tool-calling is the bottleneck.</strong></p><p>The instinct when picking a free model is to look at MMLU scores or general capability rankings and grab whatever sits at the top. That&#8217;s the wrong instinct. For an agent, raw capability isn&#8217;t what limits you; tool-calling quality is. A &#8220;smart&#8221; model that writes beautiful prose but can&#8217;t emit the JSON to call <code>calendar.create_event</code> is useless. A dumber model that gets the tool calls right beats it every time.</p><p>What you&#8217;re testing for: given a tool, does the model call it? With the right arguments? Once, instead of in a loop? Does it stop when it&#8217;s done?</p><p><strong>How to sweep, in about an hour:</strong></p><ol><li><p>Browse OpenRouter&#8217;s <code>:free</code><a href="https://openrouter.ai/models?max_price=0"> model catalog</a>. Pick five or six candidates and vary the families: a Llama, a Qwen, an NVIDIA, a GLM, a MiniMax, whatever&#8217;s listed.</p></li><li><p>Plug each into Friday&#8217;s settings in turn.</p></li><li><p>Run the same realistic prompt against each. Something like &#8220;find me a free hour next week and book a meeting with [person].&#8221; Skip toy prompts. You want the model to fail the way it will fail in real use.</p></li><li><p>Watch for the failure modes that disqualify a model. Suggesting a Python script in place of a tool call. Looping on tool discovery without invoking one. Hallucinating arguments. Refusing to commit. Timing out mid-multi-step.</p></li><li><p>Pick the one that finishes the job end to end. Note the runner-up so you have a fallback when your favorite gets rate-limited or deprecated.</p></li></ol><p><strong>A snapshot from when I did this sweep</strong> (use it as a vibe-check on the failure modes, no more):</p><ul><li><p><strong>Llama variants on Groq.</strong> Fast. Tool calling was hit-or-miss. Sometimes the right MCP tool got called. Sometimes the model suggested I run a Python script. I don&#8217;t have a Python REPL plugged in. That isn&#8217;t the thing.</p></li><li><p><strong>gpt-oss (20b / 120b).</strong> Okay-ish reasoning, weak tool selection. Would discover the tool list, think about it, do nothing.</p></li><li><p><strong>Qwen3 free variants.</strong> Decent for their size, but they looped. Discover tools, list tools, discuss tools, never call tools.</p></li><li><p><strong>MiniMax.</strong> Interesting outputs. Kept getting confused about argument shapes.</p></li><li><p><strong>GLM-4.5-air.</strong> Closer to working, but rate-limited me before I could judge.</p></li><li><p><strong>NVIDIA Nemotron-3-Super-120b-a12b.</strong> The one that completed a full agent loop end-to-end on my Calendar the day I tested. So that&#8217;s what I run today.</p></li></ul><p>Will Nemotron still win when you read this? No idea. Run the sweep. Pick what works. Switch when something better shows up; the cost of switching is one settings change.</p><p>The lesson that doesn&#8217;t go stale: <strong>test tool-calling before you fall in love with a benchmark score.</strong></p><h2><strong>Step 5: Plug in Google Calendar</strong></h2><p>Friday ships a bundled Google Calendar MCP server. Open the MCP catalog, find it, add credential under Connections tab. OAuth happens once.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lN8d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabb37dbe-c1a9-4fbc-8c04-fbc36a9ef0b5_1120x530.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lN8d!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabb37dbe-c1a9-4fbc-8c04-fbc36a9ef0b5_1120x530.png 424w, https://substackcdn.com/image/fetch/$s_!lN8d!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabb37dbe-c1a9-4fbc-8c04-fbc36a9ef0b5_1120x530.png 848w, https://substackcdn.com/image/fetch/$s_!lN8d!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabb37dbe-c1a9-4fbc-8c04-fbc36a9ef0b5_1120x530.png 1272w, https://substackcdn.com/image/fetch/$s_!lN8d!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabb37dbe-c1a9-4fbc-8c04-fbc36a9ef0b5_1120x530.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lN8d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabb37dbe-c1a9-4fbc-8c04-fbc36a9ef0b5_1120x530.png" width="1120" height="530" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/abb37dbe-c1a9-4fbc-8c04-fbc36a9ef0b5_1120x530.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:530,&quot;width&quot;:1120,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!lN8d!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabb37dbe-c1a9-4fbc-8c04-fbc36a9ef0b5_1120x530.png 424w, https://substackcdn.com/image/fetch/$s_!lN8d!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabb37dbe-c1a9-4fbc-8c04-fbc36a9ef0b5_1120x530.png 848w, https://substackcdn.com/image/fetch/$s_!lN8d!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabb37dbe-c1a9-4fbc-8c04-fbc36a9ef0b5_1120x530.png 1272w, https://substackcdn.com/image/fetch/$s_!lN8d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabb37dbe-c1a9-4fbc-8c04-fbc36a9ef0b5_1120x530.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You can flip the same switch for Gmail, Drive, Docs, and Sheets, with the same auth dance and no extra setup.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fp5R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0618600-db97-423d-97fc-599d4ce76d73_1120x1102.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fp5R!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0618600-db97-423d-97fc-599d4ce76d73_1120x1102.png 424w, https://substackcdn.com/image/fetch/$s_!fp5R!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0618600-db97-423d-97fc-599d4ce76d73_1120x1102.png 848w, https://substackcdn.com/image/fetch/$s_!fp5R!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0618600-db97-423d-97fc-599d4ce76d73_1120x1102.png 1272w, https://substackcdn.com/image/fetch/$s_!fp5R!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0618600-db97-423d-97fc-599d4ce76d73_1120x1102.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fp5R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0618600-db97-423d-97fc-599d4ce76d73_1120x1102.png" width="1120" height="1102" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f0618600-db97-423d-97fc-599d4ce76d73_1120x1102.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1102,&quot;width&quot;:1120,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!fp5R!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0618600-db97-423d-97fc-599d4ce76d73_1120x1102.png 424w, https://substackcdn.com/image/fetch/$s_!fp5R!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0618600-db97-423d-97fc-599d4ce76d73_1120x1102.png 848w, https://substackcdn.com/image/fetch/$s_!fp5R!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0618600-db97-423d-97fc-599d4ce76d73_1120x1102.png 1272w, https://substackcdn.com/image/fetch/$s_!fp5R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0618600-db97-423d-97fc-599d4ce76d73_1120x1102.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>That&#8217;s it. You now have an LLM with hands on your calendar, running on $0 of recurring spend.</p><p><em>Or just ask Friday to do all of this for you!</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ghkb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36e07dc7-1596-4acd-85d4-df73e627e1aa_1120x285.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ghkb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36e07dc7-1596-4acd-85d4-df73e627e1aa_1120x285.png 424w, https://substackcdn.com/image/fetch/$s_!Ghkb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36e07dc7-1596-4acd-85d4-df73e627e1aa_1120x285.png 848w, https://substackcdn.com/image/fetch/$s_!Ghkb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36e07dc7-1596-4acd-85d4-df73e627e1aa_1120x285.png 1272w, https://substackcdn.com/image/fetch/$s_!Ghkb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36e07dc7-1596-4acd-85d4-df73e627e1aa_1120x285.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ghkb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36e07dc7-1596-4acd-85d4-df73e627e1aa_1120x285.png" width="1120" height="285" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/36e07dc7-1596-4acd-85d4-df73e627e1aa_1120x285.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:285,&quot;width&quot;:1120,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Ghkb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36e07dc7-1596-4acd-85d4-df73e627e1aa_1120x285.png 424w, https://substackcdn.com/image/fetch/$s_!Ghkb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36e07dc7-1596-4acd-85d4-df73e627e1aa_1120x285.png 848w, https://substackcdn.com/image/fetch/$s_!Ghkb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36e07dc7-1596-4acd-85d4-df73e627e1aa_1120x285.png 1272w, https://substackcdn.com/image/fetch/$s_!Ghkb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36e07dc7-1596-4acd-85d4-df73e627e1aa_1120x285.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>What it looks like in practice</strong></h2><p>A real conversation I had with this setup:</p><blockquote><p><em><strong>Me:</strong> Hi, I need to find a free slot for pair programming next week with Michal! Can you check my Google Calendar and show some propositions?</em></p></blockquote><p>Nemotron read my calendar and came back with a clean day-by-day table of free hour-long windows. A structured suggestion I could look at and pick from.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!p9F4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa85ec014-5729-4097-bd5a-fbe89b4ca658_1120x520.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!p9F4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa85ec014-5729-4097-bd5a-fbe89b4ca658_1120x520.png 424w, https://substackcdn.com/image/fetch/$s_!p9F4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa85ec014-5729-4097-bd5a-fbe89b4ca658_1120x520.png 848w, https://substackcdn.com/image/fetch/$s_!p9F4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa85ec014-5729-4097-bd5a-fbe89b4ca658_1120x520.png 1272w, https://substackcdn.com/image/fetch/$s_!p9F4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa85ec014-5729-4097-bd5a-fbe89b4ca658_1120x520.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!p9F4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa85ec014-5729-4097-bd5a-fbe89b4ca658_1120x520.png" width="1120" height="520" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a85ec014-5729-4097-bd5a-fbe89b4ca658_1120x520.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:520,&quot;width&quot;:1120,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!p9F4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa85ec014-5729-4097-bd5a-fbe89b4ca658_1120x520.png 424w, https://substackcdn.com/image/fetch/$s_!p9F4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa85ec014-5729-4097-bd5a-fbe89b4ca658_1120x520.png 848w, https://substackcdn.com/image/fetch/$s_!p9F4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa85ec014-5729-4097-bd5a-fbe89b4ca658_1120x520.png 1272w, https://substackcdn.com/image/fetch/$s_!p9F4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa85ec014-5729-4097-bd5a-fbe89b4ca658_1120x520.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><blockquote><p><em><strong>Me:</strong> Can you create that event for Monday then? 14&#8211;15 sounds great.</em></p></blockquote><p>It created the event. A real Google Calendar link came back in the response. The event is sitting in my actual calendar as I write this.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nlEV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d63ca26-8ef1-433f-b04c-d98f76adc642_1120x293.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nlEV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d63ca26-8ef1-433f-b04c-d98f76adc642_1120x293.png 424w, https://substackcdn.com/image/fetch/$s_!nlEV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d63ca26-8ef1-433f-b04c-d98f76adc642_1120x293.png 848w, https://substackcdn.com/image/fetch/$s_!nlEV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d63ca26-8ef1-433f-b04c-d98f76adc642_1120x293.png 1272w, https://substackcdn.com/image/fetch/$s_!nlEV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d63ca26-8ef1-433f-b04c-d98f76adc642_1120x293.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nlEV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d63ca26-8ef1-433f-b04c-d98f76adc642_1120x293.png" width="1120" height="293" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5d63ca26-8ef1-433f-b04c-d98f76adc642_1120x293.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:293,&quot;width&quot;:1120,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!nlEV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d63ca26-8ef1-433f-b04c-d98f76adc642_1120x293.png 424w, https://substackcdn.com/image/fetch/$s_!nlEV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d63ca26-8ef1-433f-b04c-d98f76adc642_1120x293.png 848w, https://substackcdn.com/image/fetch/$s_!nlEV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d63ca26-8ef1-433f-b04c-d98f76adc642_1120x293.png 1272w, https://substackcdn.com/image/fetch/$s_!nlEV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d63ca26-8ef1-433f-b04c-d98f76adc642_1120x293.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>A couple of bumps along the way</strong></h2><p>Two things didn&#8217;t work out of the box. Both are fixed now in Friday. I&#8217;m calling them out because the lessons generalize if you&#8217;re building agent infra.</p><p><strong>I&#8217;d built </strong><code>complete()</code><strong> around Claude by accident.</strong> Friday auto-injects a <code>complete()</code> tool into every agent so the model can signal &#8220;I&#8217;m done, here&#8217;s the final answer.&#8221; The schema I&#8217;d written for it was loose. Claude could intuit what I meant; every other model fumbled it, with wrong shapes, missing fields, hallucinated parameters. Tightening the schema (strict mode, recursive <code>additionalProperties: false</code>, forced tool choice) made the entire free-model landscape viable. The same model that returned garbage on Tuesday returned clean structured output on Thursday.</p><p><strong>OpenRouter wasn&#8217;t a first-class provider.</strong> Now it is. Pre-wired base URL, OAuth-compatible token handling, the works. You can use the recipe above without thinking about it. I had to add it to get here.</p><p>If you&#8217;re building your own agent stack: <strong>test against at least three providers from day one.</strong> Anything you tune by vibes for one vendor&#8217;s quirks will bite you the moment someone else tries it. Mine bit me. I patched it.</p><h2><strong>The catch: it&#8217;s slow</strong></h2><p>Free is slow. Each multi-step turn with Nemotron on the free tier takes 2 to 5 minutes. You ask, you go make tea, you come back, and maybe it&#8217;s done.</p><p>Some of that is free-tier queueing. You&#8217;re behind everyone else exploring the same idea. Some is the framework: verbose system prompts, agent loops that re-send context every step, MCP tool descriptions that cost tokens. Some is the model itself, thinking out loud before it commits to a tool call.</p><p>If you imagined a snappy realtime chat assistant when you read &#8220;$0 personal AI,&#8221; reset the expectation. The $0 stack runs on a different clock.</p><h2><strong>The pivot: free AI belongs in cron</strong></h2><p>The moment I stopped trying to use this thing like a paid chatbot, I understood what it was for.</p><p>Free, slow, capable-of-tool-calling AI is <strong>perfect for scheduled tasks.</strong> Work you submit and walk away from. Output you read.</p><p>A few I have running right now, all on $0:</p><ul><li><p><strong>Friday morning calendar digest.</strong> Runs at 8am, summarizes my week, drops it into a note. Takes four minutes. I never notice, because I&#8217;m not waiting for it.</p></li><li><p><strong>Inbox triage.</strong> Runs every few hours, flags things that look like they need a reply by EOD. I read the summary instead of scrolling the inbox.</p></li><li><p><strong>Weekly deep-work scheduler.</strong> Looks at next week&#8217;s calendar, finds a 3-hour block, books it as &#8220;focus time.&#8221; If it&#8217;s wrong, I move it. If it&#8217;s right, I get the hours back.</p></li></ul><p>These are the use cases personal AI was supposed to be about. Mundane, useful, the kind of thing that adds up while you weren&#8217;t paying attention.</p><p>Friday has a built-in job scheduler for this. You define a task in YAML, point it at your model and tools, give it a cron expression, walk away. The 2-to-5-minute latency that makes the setup feel sluggish in chat goes invisible when the task runs while you sleep.</p><p>If you&#8217;d told me last month my personal AI assistant would run as a cron job, for free, I&#8217;d have laughed. It does, and the meetings show up on my calendar.</p><h2><strong>What this changed for me</strong></h2><p>I started this experiment thinking the question was &#8220;is free AI good enough?&#8221; Wrong question.</p><p>The right question, the one I didn&#8217;t see coming, was &#8220;what kind of AI experience do I want?&#8221; Once I stopped trying to make free models behave like a cheap knockoff of the paid stuff, I reframed the whole problem. I&#8217;m running a slow, patient employee who does the work while I sleep and leaves the result on my desk in the morning. That&#8217;s what I wanted all along. I&#8217;d been calling it a chatbot.</p><p>The other shift took longer to notice. I used to read those AI rationing stories (Uber done by Q2, Pro users hitting their weekly caps mid-week) and feel a low hum of dread, like the future was getting handed out by quota. The dread is gone. The shortage hasn&#8217;t gone away; what changed is that a counter-example sits on my own machine now, slow and useful and free. The expensive stuff still works. I just don&#8217;t need it to run my week.</p>]]></content:encoded></item><item><title><![CDATA[6 AI Automation Use Cases for Data Teams That Save Hours Every Week]]></title><description><![CDATA[How analysts and data ops teams are automating competitive monitoring, scheduled reporting, CRM hygiene, and pipeline alerting with AI without needing to code]]></description><link>https://blog.hellofriday.ai/p/6-ai-automation-use-cases-for-data-teams-that-save-hours-every-week-779b11c6173d</link><guid isPermaLink="false">https://blog.hellofriday.ai/p/6-ai-automation-use-cases-for-data-teams-that-save-hours-every-week-779b11c6173d</guid><dc:creator><![CDATA[Yena Oh]]></dc:creator><pubDate>Sun, 17 May 2026 16:34:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!7bfy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a2bfadb-3df1-437a-9423-382bcfdc4d67_1200x630.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most data analysts spend a significant portion of their week on tasks that don&#8217;t require their judgment: pulling the same numbers from Snowflake every Monday, chasing down missing fields in HubSpot, running the same competitive scan someone asked for last quarter. Friday Studio handles that layer so the people who understand the data can spend their time on the work that actually requires them.</p><p>Here are 6 ways data and analytics teams are using AI automation to take back their time.</p><h3>1. Competitive and Market Intelligence on Autopilot</h3><p>Someone on your team opens ten browser tabs every Monday, skims competitor sites, checks G2, reads two analyst reports, and writes a summary that&#8217;s already a week out of date by the time it lands in Slack.</p><p>Friday monitors competitor websites, review platforms, news feeds, and LinkedIn pages on a daily schedule. Pricing changes, new feature announcements, positioning pivots: all flagged the same day with a plain-English summary. Friday stores findings across sessions, so instead of re-running searches you can ask &#8220;what changed with Competitor X this month?&#8221; and get a synthesized answer from everything it&#8217;s tracked.</p><p>One team we know runs this daily and feeds the output into a competitive Slack channel. Their sales team stopped asking marketing for updated battlecards, and instead read the channel.</p><h3>2. Scheduled Data Reporting Without a Dashboard</h3><p>Finance wants a Stripe number. The CEO wants pipeline from HubSpot. The data team wants a Snowflake query result. Someone pulls it manually every Monday morning.</p><p>Friday connects to Snowflake, Postgres, SQLite, and HubSpot. You configure the query or the data pull once. Friday runs it on schedule, compares against the prior period, and writes a plain-English summary with the numbers that moved. If a metric crosses a threshold you&#8217;ve defined (MRR down 5% week-over-week, conversion rate below a set floor), Friday alerts the right person the day it happens, not at the next scheduled review.</p><p>Setup takes about 20 minutes. The Monday morning data pull runs itself after that.</p><h3>3. Research Synthesis Before Big Decisions</h3><p>Before a pricing change, a new market entry, or a budget decision, someone spends half a day reading reports, pulling numbers, and writing a summary that most attendees skim. Friday compresses that to minutes.</p><p>Give it a question (&#8220;What&#8217;s the state of AI adoption in mid-market finance?&#8221;) and it runs multi-source web research, pulls the most relevant findings, and produces a structured briefing with citations. Paste in customer interview transcripts or survey responses and it clusters themes, surfaces the strongest quotes, and produces a one-page summary. The finished artifact goes to Google Docs or Notion, landing in the workflow your team already uses.</p><p>The analyst writes the recommendation and Friday assembles the evidence.</p><h3>4. CRM and Data Quality Audits</h3><p>HubSpot has 12,000 contacts and nobody knows which ones are clean. Missing industries, stale lifecycle stages, duplicate companies: every segmentation exercise starts with a manual cleanup job first.</p><p>Friday can run a weekly audit, flagging contacts missing required fields, identifying companies with no associated contacts, and surfacing deals with no activity in the past 30 days. The results arrive as a prioritized Slack message with enough context for a sales ops person to act on it in an hour. You can extend it to auto-enrich flagged contacts using web research, finding company size and industry for incomplete records and queuing them for review before writing anything back.</p><p>One analyst we know runs this every Sunday night. Monday morning the team has a clean working list. Before Friday, that cleanup happened quarterly, if at all.</p><h3>5. Multi-Agent Content and Analysis Pipelines</h3><p>This one came from an analyst who was tired of running the same five-step research process manually every time a new briefing request came in. Here&#8217;s the workflow they built in Friday:</p><p>A research agent pulls source material and competitor context. That feeds a summarization agent that distills key findings. A scoring agent evaluates the output against a set of criteria: depth relative to the request, coverage of counterarguments, freshness of sources. Each criterion gets a specific note on what&#8217;s pulling it down. The output goes back for revision, then hits a final check before landing in Notion for review.</p><p>The whole loop runs without a human until the finished briefing appears. By the time the analyst looks at it, the piece has been evaluated and revised against explicit criteria. They edit for judgment, not structure.</p><p>This takes about 45 minutes to wire up the first time. After that it runs on every new brief you feed it.</p><h3>6. AI Tools for Data Governance and Anomaly Alerting</h3><p>Anomalies in production data often go unnoticed until someone downstream flags a number that looks wrong. By then the bad data has propagated into three dashboards and a board slide.</p><p>Friday monitors your key data sources on a schedule. You define what &#8220;normal&#8221; looks like: acceptable ranges, expected row counts, join rates that shouldn&#8217;t drop below a threshold. When something falls outside those bounds, Friday posts a Slack alert with context: which table, which metric, how far off, and a plain-English note on what to look at first. For recurring issues, it builds a running log so patterns become visible across weeks, not just individual events.</p><p>One data team we know caught a broken ETL pipeline 40 minutes after it failed because Friday flagged the row count drop before anyone opened a dashboard.</p><h3>How to Get Started in Friday Studio</h3><p>None of these require a developer or a lengthy setup. Download Friday Studio, describe what you want it to do in plain English via chat. Friday will connect the tools you already use (Snowflake, HubSpot, Slack, Google Docs, Notion), ask a few questions, and configure your workflow. Most of the setups above take under 30 minutes to run the first time.</p><p><em>Download Friday Studio free at <a href="https://hellofriday.ai/">hellofriday.ai</a> or browse the source on <a href="https://github.com/friday-platform/friday-studio">GitHub</a>.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7bfy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a2bfadb-3df1-437a-9423-382bcfdc4d67_1200x630.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7bfy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a2bfadb-3df1-437a-9423-382bcfdc4d67_1200x630.png 424w, https://substackcdn.com/image/fetch/$s_!7bfy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a2bfadb-3df1-437a-9423-382bcfdc4d67_1200x630.png 848w, https://substackcdn.com/image/fetch/$s_!7bfy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a2bfadb-3df1-437a-9423-382bcfdc4d67_1200x630.png 1272w, https://substackcdn.com/image/fetch/$s_!7bfy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a2bfadb-3df1-437a-9423-382bcfdc4d67_1200x630.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7bfy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a2bfadb-3df1-437a-9423-382bcfdc4d67_1200x630.png" width="1200" height="630" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a2bfadb-3df1-437a-9423-382bcfdc4d67_1200x630.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:630,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7bfy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a2bfadb-3df1-437a-9423-382bcfdc4d67_1200x630.png 424w, https://substackcdn.com/image/fetch/$s_!7bfy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a2bfadb-3df1-437a-9423-382bcfdc4d67_1200x630.png 848w, https://substackcdn.com/image/fetch/$s_!7bfy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a2bfadb-3df1-437a-9423-382bcfdc4d67_1200x630.png 1272w, https://substackcdn.com/image/fetch/$s_!7bfy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a2bfadb-3df1-437a-9423-382bcfdc4d67_1200x630.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[How I Built a Smart Surf Alert System with Friday in Under 10 Minutes]]></title><description><![CDATA[It Starts With a Single Prompt]]></description><link>https://blog.hellofriday.ai/p/how-i-built-a-smart-surf-alert-system-with-friday-in-under-10-minutes-0b0d3eb54ed6</link><guid isPermaLink="false">https://blog.hellofriday.ai/p/how-i-built-a-smart-surf-alert-system-with-friday-in-under-10-minutes-0b0d3eb54ed6</guid><dc:creator><![CDATA[David Woolf]]></dc:creator><pubDate>Sat, 16 May 2026 15:26:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!QK-Z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff83f9874-477d-45b3-a0a8-28b3f8b83579_1120x700.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QK-Z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff83f9874-477d-45b3-a0a8-28b3f8b83579_1120x700.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QK-Z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff83f9874-477d-45b3-a0a8-28b3f8b83579_1120x700.png 424w, https://substackcdn.com/image/fetch/$s_!QK-Z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff83f9874-477d-45b3-a0a8-28b3f8b83579_1120x700.png 848w, https://substackcdn.com/image/fetch/$s_!QK-Z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff83f9874-477d-45b3-a0a8-28b3f8b83579_1120x700.png 1272w, https://substackcdn.com/image/fetch/$s_!QK-Z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff83f9874-477d-45b3-a0a8-28b3f8b83579_1120x700.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QK-Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff83f9874-477d-45b3-a0a8-28b3f8b83579_1120x700.png" width="1120" height="700" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f83f9874-477d-45b3-a0a8-28b3f8b83579_1120x700.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:700,&quot;width&quot;:1120,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!QK-Z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff83f9874-477d-45b3-a0a8-28b3f8b83579_1120x700.png 424w, https://substackcdn.com/image/fetch/$s_!QK-Z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff83f9874-477d-45b3-a0a8-28b3f8b83579_1120x700.png 848w, https://substackcdn.com/image/fetch/$s_!QK-Z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff83f9874-477d-45b3-a0a8-28b3f8b83579_1120x700.png 1272w, https://substackcdn.com/image/fetch/$s_!QK-Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff83f9874-477d-45b3-a0a8-28b3f8b83579_1120x700.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>It Starts With a Single Prompt</strong></h2><p>The whole workspace was created from this:</p><blockquote><p><em>&#8220;Setup a workspace to check the surf report for the San Diego area every 30 minutes. Only notify me if there are good surf conditions. Any beach in a 20 mile area is fine.&#8221;</em></p></blockquote><p>Friday handled the rest &#8212; creating the workspace, figuring out the right signal provider, wiring the agents, and publishing the config. Here&#8217;s what it built.</p><h2><strong>The Architecture</strong></h2><ol><li><p><strong>A cron signal</strong> fires every 30 minutes</p></li><li><p><strong>A web agent</strong> (<code>surf-checker</code>) scrapes Surfline and Magic Seaweed for conditions across ~10 San Diego beaches from Ocean Beach up to Oceanside</p></li><li><p><strong>An LLM evaluator</strong> (<code>surf-evaluator</code>) applies real surf criteria and decides whether to alert &#8212; no spam, no noise</p></li><li><p><strong>A memory write</strong> surfaces the alert in the Friday workspace chat when conditions are good</p></li></ol><h2><strong>How Friday Wired the Cron Signal</strong></h2><p>Friday discovered during setup that the signal provider isn&#8217;t called <code>cron</code> &#8212; it&#8217;s <code>schedule</code>. This is the kind of thing that would cost you 20 minutes hunting docs. Friday found the right schema by probing the API directly and self-correcting:</p><p>Fires every 30 minutes. Done.</p><h2><strong>The Surf Checker Agent</strong></h2><p>This is a <code>type: atlas</code> agent wrapping Friday&#8217;s built-in <code>web</code> bundled agent. Friday wrote the prompt itself from the original request:</p><blockquote><p><em>Search for current surf conditions at San Diego area beaches within a 20-mile radius. Check Surfline, Magic Seaweed, or similar surf forecast sites. Look at beaches including: Ocean Beach, Mission Beach, Pacific Beach, La Jolla Shores, Del Mar, Solana Beach, Encinitas (Swamis), Carlsbad, and Oceanside. For each beach with notable conditions, extract: wave height, wave period, wind speed and direction, swell direction, and current tide.</em></p></blockquote><p>The agent opens a real browser, reads the live forecast sites, and returns a structured summary. No API keys needed for Surfline &#8212; it just reads the page.</p><h2><strong>The Evaluator Agent (the Smart Part)</strong></h2><p>This is where most surf alert systems fall apart. They either spam you with 1-foot junk or require you to tune a dozen thresholds. Friday wrote the <code>surf-evaluator</code> as an <code>llm</code> agent with a clear, explicit rubric derived from &#8220;good surf conditions&#8221;:</p><p><strong>Good conditions (trigger alert):</strong></p><ul><li><p>Wave height 3 ft or larger</p></li><li><p>Wave period 8 seconds or longer (cleaner, more powerful waves)</p></li><li><p>Wind offshore or light (under 10 mph)</p></li><li><p>Swell from NW, W, or SW &#8212; the good angles for San Diego beaches</p></li></ul><p><strong>Poor conditions (stay quiet):</strong></p><ul><li><p>Under 2 feet</p></li><li><p>Choppy onshore wind above 15 mph</p></li><li><p>Short-period wind swell under 7 seconds</p></li></ul><p>If conditions are good at any beach, it writes a <code>SURF ALERT</code> to long-term memory with the beach name, stats, and a one-sentence recommendation. If conditions are poor, it logs a quiet one-liner to the notes store and moves on.</p><h2><strong>What a Surf Alert Looks Like</strong></h2><p>When conditions meet the threshold, the evaluator writes something like:</p><blockquote><p><em><strong>SURF ALERT:</strong> Swamis (Encinitas) looking clean &#8212; 4&#8211;5 ft @ 12s, NW swell, light offshore wind under 8 mph. Head out before 10am before the sea breeze kicks in.</em></p></blockquote><p>When conditions are poor, you get nothing. That silence is the feature.</p><h2><strong>One Thing to Know About Notifications</strong></h2><p>Wire a Telegram communicator and the alerts land directly in your phone. Here&#8217;s what an actual alert looks like:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Hqqv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F752473a6-eb3a-4fe9-af69-6c694a01729e_1106x880.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hqqv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F752473a6-eb3a-4fe9-af69-6c694a01729e_1106x880.png 424w, https://substackcdn.com/image/fetch/$s_!Hqqv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F752473a6-eb3a-4fe9-af69-6c694a01729e_1106x880.png 848w, https://substackcdn.com/image/fetch/$s_!Hqqv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F752473a6-eb3a-4fe9-af69-6c694a01729e_1106x880.png 1272w, https://substackcdn.com/image/fetch/$s_!Hqqv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F752473a6-eb3a-4fe9-af69-6c694a01729e_1106x880.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hqqv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F752473a6-eb3a-4fe9-af69-6c694a01729e_1106x880.png" width="1106" height="880" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/752473a6-eb3a-4fe9-af69-6c694a01729e_1106x880.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:880,&quot;width&quot;:1106,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Hqqv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F752473a6-eb3a-4fe9-af69-6c694a01729e_1106x880.png 424w, https://substackcdn.com/image/fetch/$s_!Hqqv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F752473a6-eb3a-4fe9-af69-6c694a01729e_1106x880.png 848w, https://substackcdn.com/image/fetch/$s_!Hqqv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F752473a6-eb3a-4fe9-af69-6c694a01729e_1106x880.png 1272w, https://substackcdn.com/image/fetch/$s_!Hqqv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F752473a6-eb3a-4fe9-af69-6c694a01729e_1106x880.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Four beaches, current conditions, best window, and a link to Surfline &#8212; all from a single scheduled job.</p><h2><strong>Why This Works Well</strong></h2><p><strong>Judgment belongs in the agent, not the config.</strong> Rather than encoding &#8220;good surf&#8221; as a brittle rule in a scheduler, the criteria are described in plain English and evaluated by an LLM on each run. It understands context &#8212; 3 ft at 6 seconds feels worse than 2 ft at 12 seconds.</p><p><strong>Real browser access.</strong> Surf forecast sites are JavaScript-heavy. The web agent runs a real browser, so it reads Surfline exactly as a human would &#8212; no scraping brittle HTML, no API fees.</p><p><strong>Signal-first design.</strong> The cron signal is the clock. The job is the logic. Changing the schedule is a one-line edit. Adding a second job that texts instead of logging memory is additive, not a rewrite.</p><h2><strong>The Full Workspace YAML</strong></h2><p><a href="https://github.com/friday-platform/friday-studio-examples/tree/main/san-diego-surf-watch">This</a> is the shareable config that Friday generated from the chat &#8212; you can drop this into any Friday instance to recreate the workspace exactly:</p><pre><code>version: &#8216;1.0&#8217;
workspace:
  name: San Diego Surf Watch
  description: Monitors San Diego area surf conditions every 30 minutes and notifies when conditions are good.</code></pre><pre><code>signals:
  surf-check-cron:
    provider: schedule
    description: Fires every 30 minutes to check San Diego surf conditions
    config:
      schedule: &#8220;*/30 * * * *&#8221;agents:
  surf-checker:
    type: atlas
    agent: web
    description: Fetches current surf conditions for San Diego area beaches within 20 miles
    prompt: &gt;-
      Search for current surf conditions at San Diego area beaches within a
      20-mile radius. Check Surfline, Magic Seaweed, or similar surf forecast
      sites. Look at beaches including: Ocean Beach, Mission Beach, Pacific
      Beach, La Jolla Shores, Del Mar, Solana Beach, Encinitas (Swamis),
      Carlsbad, and Oceanside. For each beach with notable conditions, extract:
      wave height, wave period, wind speed and direction, swell direction, and
      current tide. Return a structured summary. Focus on accuracy.  surf-evaluator:
    type: llm
    description: Evaluates surf conditions and saves a surf alert to memory if conditions are good
    config:
      provider: anthropic
      model: claude-sonnet-4-5
      prompt: &gt;-
        You are a surf conditions analyst for San Diego.
        Evaluate the surf report. Good conditions: 3ft+, 8s+ period, light/offshore wind, NW/W/SW swell.
        If good: call save_memory_entry (memoryName=&#8221;memory&#8221;) with a SURF ALERT.
        If poor: call save_memory_entry (memoryName=&#8221;notes&#8221;) with a one-line log.
        Always call save_memory_entry exactly once.jobs:
  surf-watch:
    description: Checks San Diego surf conditions every 30 min and notifies if surf is good
    triggers:
      - signal: surf-check-cron
    execution:
      agents:
        - surf-checker
        - surf-evaluatormemory:
  own:
    - name: notes
      type: short_term
      strategy: narrative
    - name: memory
      type: long_term
      strategy: narrative</code></pre><h2><strong>Try It Yourself</strong></h2><p>The setup above works for any location. Swap out the beach list and surf criteria for your local break. The same pattern &#8212; schedule signal &#8594; web scraper &#8594; LLM evaluator &#8594; memory alert &#8212; works for weather windows, tide charts, or any real-world condition you want to monitor without babysitting a dashboard.</p><p><em>Download Friday Studio free at <a href="https://hellofriday.ai/">hellofriday.ai</a> or browse the source on <a href="https://github.com/friday-platform/friday-studio">GitHub</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[6 Ways Marketing Teams Are Using AI to Produce More Without Adding Headcount]]></title><description><![CDATA[AI tools for marketing teams are automating the tasks that eat most of the workweek: content distribution, campaign reporting, CRM updates, and more.]]></description><link>https://blog.hellofriday.ai/p/6-ways-marketing-teams-are-using-ai-to-produce-more-without-adding-headcount-6a79d8a6a39d</link><guid isPermaLink="false">https://blog.hellofriday.ai/p/6-ways-marketing-teams-are-using-ai-to-produce-more-without-adding-headcount-6a79d8a6a39d</guid><dc:creator><![CDATA[Yena Oh]]></dc:creator><pubDate>Fri, 15 May 2026 16:38:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2ub6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a20d7f1-f122-4ef7-a4b7-121cefafabc8_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Marketing teams are stretched. Content calendars fill faster than writers can staff them, campaign reports land late, and every new channel adds another manual process no one budgeted time for. The teams finding room to breathe right now are the ones running AI automation workflows that handle the repeatable work. Here are 6 ways marketing teams are using Friday Studio to do that.</p><h2><strong>1. Automated Content Briefing from Slack to Google Docs</strong></h2><p>A content manager types a campaign idea into Slack. By the time they open Google Docs, the brief is already there: target audience, keyword angles, competitive references, and a suggested outline. Without Friday Studio, that brief takes 30 to 45 minutes to assemble from four different browser tabs.</p><p>Friday Studio connects a Slack signal to a pipeline job that runs a web research agent, pulls competitor content with the <code>web</code> bundled agent, and writes the finished brief into Google Docs via the Google Docs MCP server. The content manager reviews it, adjusts one or two lines, and hands it to the writer. The research leg of the job disappears entirely.</p><h2><strong>2. AI Marketing Performance Summaries on a Weekly Schedule</strong></h2><p>Performance reporting is the task marketing teams do every week and dread every week. Someone pulls numbers from the CRM, cross-references campaign data, writes a summary paragraph, formats a table, and sends the Slack post. For a small team, that is two hours of work producing a document most people skim.</p><p>Friday Studio runs a scheduled job every Monday morning. A <code>schedule</code> signal fires at 8am, a pipeline agent queries HubSpot for deal and contact activity via the bundled <code>hubspot</code> agent, and an <code>llm</code> agent writes a plain-language summary covering open pipeline movement, new contacts created, and campaign-attributed activity. The finished report goes to a Slack channel via the bundled <code>slack</code> agent. The marketing manager reads it over coffee and spends the hour on something else.</p><h2><strong>3. AI Lead Generation: Routing Inbound Leads to HubSpot</strong></h2><p>Inbound leads from web forms, demo requests, and event sign-ups pile up in a spreadsheet or a shared inbox. Someone checks it each morning, manually creates the HubSpot contact, writes a note, assigns the lead to a rep, and sends a confirmation email. When the team is in back-to-back meetings, that process waits until afternoon.</p><p>Friday Studio listens for new leads via an <code>http</code> webhook signal. Each time a form submission arrives, a pipeline job runs: a <code>user</code> agent parses the payload, the <code>hubspot</code> bundled agent creates the contact and attaches deal and source data, and the <code>google-gmail</code> MCP server sends a confirmation email to the prospect. The rep gets a Slack DM with the contact summary. The whole loop closes in under a minute without anyone touching a keyboard.</p><h2><strong>4. Campaign Brief Distribution Across Notion and Google Drive</strong></h2><p>When a campaign kicks off, the marketing lead writes one brief and then copies pieces of it into Notion for the design team, Google Drive for the agency, and a Slack message for the paid media team. Keeping three versions in sync through rounds of revision costs more time than writing the brief itself.</p><p>Friday Studio handles distribution through a single pipeline job triggered by an <code>http</code> webhook when the source brief is finalized. An <code>llm</code> agent reads the master document from Google Drive via the Google Drive MCP server, reformats sections for each audience, writes the design-facing version to Notion via the Notion MCP server, saves the agency version to a Google Drive folder, and posts a summary to the Slack channel. The brief lives in one place; Friday keeps the downstream copies current.</p><h2><strong>5. Content Repurposing from Blog Posts, Webinars, and Interviews</strong></h2><p>A webinar recording, a long-form blog post, a customer interview: each one contains enough material for a month of content. Most teams publish it once and move on, not because they don&#8217;t want the LinkedIn posts and newsletter excerpts, but because producing them takes another hour no one has.</p><p>Friday Studio runs a repurposing job triggered by an <code>http</code> webhook from your CMS, an <code>fs-watch</code> signal on your drafts folder, or manually from chat. An <code>llm</code> agent reads the source: a finished blog post via Google Drive, a webinar transcript pasted in or fetched via URL, a Fathom call recording pulled with the bundled <code>fathom-ai</code> agent. From that single input, it generates the derivative set: a LinkedIn post formatted for the professional context, a short newsletter excerpt with narrative arc, a punchy thread, and a subject line variant. Each version lands in a Google Doc for review.</p><p>One content manager we know runs this on every webinar their team produces. They paste the transcript link into Slack, Friday picks it up via a Slack signal, and the derivative drafts are ready before the recording finishes uploading. They spend 10 minutes editing instead of 90 minutes writing from scratch.</p><h2><strong>6. Post-Campaign Summarization from Call Transcripts</strong></h2><p>After a product launch or a campaign with customer interviews, someone has to turn 10 Fathom call transcripts into a summary: key objections, messaging that resonated, themes for the next cycle. It usually falls to the most senior person on the team and takes a full afternoon.</p><p>Friday Studio pulls the transcripts using the bundled <code>fathom-ai</code> agent, which fetches call data by date range or by tag. An <code>llm</code> agent reads all the transcripts, clusters recurring themes, extracts notable quotes, and writes a structured summary with sections for objections, positive signals, and open questions. The finished document goes to Google Docs via the MCP server and a link drops in the team Slack channel. The debrief that used to take a half-day takes 10 minutes to review.</p><h2><strong>How to Get Started</strong></h2><p>None of these require a developer or a day of setup. Download Friday Studio, describe the workflow you want in plain English via chat, and Friday will ask a few clarifying questions before wiring up the tools you already use. Most of the workflows above come together in under 30 minutes. The HubSpot and Slack connections are zero-config with the bundled agents. Gmail, Notion, Google Drive, and Google Docs connect through MCP servers that take a few minutes to authorize.</p><p>The fastest starting point for a marketing team is the weekly performance report. It touches tools you already have, produces something you already need, and gives you a working example to build from.</p><p>Download Friday Studio free at <a href="https://hellofriday.ai/">hellofriday.ai</a> or browse the source on <a href="https://github.com/friday-platform/friday-studio">GitHub</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2ub6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a20d7f1-f122-4ef7-a4b7-121cefafabc8_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2ub6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a20d7f1-f122-4ef7-a4b7-121cefafabc8_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!2ub6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a20d7f1-f122-4ef7-a4b7-121cefafabc8_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!2ub6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a20d7f1-f122-4ef7-a4b7-121cefafabc8_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!2ub6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a20d7f1-f122-4ef7-a4b7-121cefafabc8_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2ub6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a20d7f1-f122-4ef7-a4b7-121cefafabc8_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a20d7f1-f122-4ef7-a4b7-121cefafabc8_1456x1048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:47101,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.hellofriday.ai/i/197884997?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a20d7f1-f122-4ef7-a4b7-121cefafabc8_1456x1048.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2ub6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a20d7f1-f122-4ef7-a4b7-121cefafabc8_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!2ub6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a20d7f1-f122-4ef7-a4b7-121cefafabc8_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!2ub6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a20d7f1-f122-4ef7-a4b7-121cefafabc8_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!2ub6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a20d7f1-f122-4ef7-a4b7-121cefafabc8_1456x1048.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[What Sales Professionals Are Actually Building With Agentic AI]]></title><description><![CDATA[Our team is two weeks out from the formal launch of Friday Studio, and we&#8217;ve already seen some of the most creative setups come from individual sellers, founders doing their own outreach, and small businesses managing their own lead gen.]]></description><link>https://blog.hellofriday.ai/p/what-sales-professionals-are-actually-building-with-agentic-ai-6e388bfd6446</link><guid isPermaLink="false">https://blog.hellofriday.ai/p/what-sales-professionals-are-actually-building-with-agentic-ai-6e388bfd6446</guid><dc:creator><![CDATA[Yena Oh]]></dc:creator><pubDate>Thu, 14 May 2026 21:59:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!55eY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f73965-1db9-4745-89f2-4fadb2b58118_1120x1204.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Our team is two weeks out from the formal launch of <a href="http://www.hellofriday.ai/">Friday Studio</a>, and we&#8217;ve already seen some of the most creative setups come from individual sellers, founders doing their own outreach, and small businesses managing their own lead gen.</p><p>Here are 6 use cases you can use as a sales professional to close more deals, keep your pipeline full, and stay top of mind to win business.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!55eY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f73965-1db9-4745-89f2-4fadb2b58118_1120x1204.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!55eY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f73965-1db9-4745-89f2-4fadb2b58118_1120x1204.png 424w, https://substackcdn.com/image/fetch/$s_!55eY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f73965-1db9-4745-89f2-4fadb2b58118_1120x1204.png 848w, https://substackcdn.com/image/fetch/$s_!55eY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f73965-1db9-4745-89f2-4fadb2b58118_1120x1204.png 1272w, https://substackcdn.com/image/fetch/$s_!55eY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f73965-1db9-4745-89f2-4fadb2b58118_1120x1204.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!55eY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f73965-1db9-4745-89f2-4fadb2b58118_1120x1204.png" width="1120" height="1204" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/76f73965-1db9-4745-89f2-4fadb2b58118_1120x1204.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1204,&quot;width&quot;:1120,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!55eY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f73965-1db9-4745-89f2-4fadb2b58118_1120x1204.png 424w, https://substackcdn.com/image/fetch/$s_!55eY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f73965-1db9-4745-89f2-4fadb2b58118_1120x1204.png 848w, https://substackcdn.com/image/fetch/$s_!55eY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f73965-1db9-4745-89f2-4fadb2b58118_1120x1204.png 1272w, https://substackcdn.com/image/fetch/$s_!55eY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f73965-1db9-4745-89f2-4fadb2b58118_1120x1204.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A lead gen AI workflow completed in less than 2 minutes in Friday Studio.</figcaption></figure></div><h2><strong>1. Keeping a Network Warm at Scale</strong></h2><p>Your best deals come from warm relationships: people who already know you, trust you, and think of you when the right moment arrives. Maintaining that across thousand-person networks is impossible to do by hand. So most people don&#8217;t, and the network goes cold.</p><p>Friday tracks a list of contacts you care about (investors, partners, past colleagues, potential clients) and monitors their public activity: LinkedIn posts, company news, funding announcements, job changes. When something relevant happens, Friday surfaces it with a short note on why it&#8217;s worth reaching out and drafts a personalized message for each trigger: congratulating someone on a promotion, referencing a post they published, following up after a conference they spoke at. The message reflects your voice because you define the tone once and Friday applies it every time.</p><p>It also runs a weekly check: who haven&#8217;t you been in touch with in 60+ days? Friday flags the list and queues draft messages. Staying in contact becomes a 20-minute review session instead of something you intend to do and never get to.</p><p>One founder we know runs this across a 3,000-person network. They spend about 15 minutes each workday reviewing and sending three messages. Before Friday, that network was largely dormant.</p><h2><strong>2. Sourcing Leads Against a Specific Target Profile</strong></h2><p>Finding companies that fit your ICP takes hours of Googling, LinkedIn searching, and cross-referencing. Most of the time it produces a messy spreadsheet that half the team ignores because the effort to build it wasn&#8217;t worth it.</p><p>You define the criteria: industry, company size, geography, funding stage, tech stack, headcount growth, any signal that defines a good fit. Friday searches and scrapes across public sources to build a list of matching companies, enriched with what you need: website, key contacts, recent news, and the specific signal that flagged them.</p><p>For each company, Friday drafts a first-touch message in your inbox referencing something specific (a recent hire, a funding round, a product launch) so the outreach doesn&#8217;t read like a template blast. It runs on a schedule. Every week, or at a cadence you choose, Friday adds companies that newly entered your target profile and queues them for review. Your pipeline fills with companies that fit, and the outreach goes out when the signal is fresh.</p><h2><strong>3. Deal Intelligence and CRM Hygiene</strong></h2><p>After every sales call, Friday reads the transcript (from Gong, Fireflies, or a pasted summary), extracts next steps, objections, and deal signals, and writes structured notes directly into HubSpot. No post-call data entry required.</p><p>It then monitors your pipeline daily: flags deals that haven&#8217;t moved in 7+ days, identifies at-risk accounts by scanning email threads and call notes for warning signs, and surfaces them in a Slack digest every morning. When a deal closes, Friday generates the CS handoff brief (contract details, key stakeholders, stated goals) automatically.</p><p>Reps spend less time on admin, pipeline data stays current, and customer success onboarding starts with context rather than a blank page. You also get the added benefit of a cleaner handoff between rep and account manager.</p><h2><strong>4. Pre-Call Research Briefs</strong></h2><p>A good discovery call requires knowing who you&#8217;re talking to. Most reps have five minutes between their last meeting and the next one.</p><p>The night before, or an hour before, Friday researches the company and the contacts on the call: recent funding, product changes, leadership hires, tech stack signals, and any press coverage worth referencing. It produces a one-page brief with the three most relevant talking points and the questions most likely to open the conversation. You can have it pull prior interaction history from your CRM (previous calls, email threads, notes from earlier deals), your notes app, email, or any other data source, so you get full context on who you&#8217;re speaking with.</p><p>The brief arrives in Slack or email at a scheduled time. The rep doesn&#8217;t have to trigger anything.</p><h2><strong>5. Proposal Research and Personalization</strong></h2><p>Most proposals fail to land because they&#8217;re generic. The pricing is right, the features match, but nothing in the document shows you actually understand the buyer&#8217;s situation. Friday fixes the research half of that problem.</p><p>Before you send a proposal, Friday researches the prospect&#8217;s business in depth: their current tech stack from job postings and public profiles, recent hires that signal a strategic priority, budget signals from headcount growth or funding news, and any public statements from their leadership about what they&#8217;re trying to accomplish. It then produces a one-pager of what to weave into the proposal: the specific pain points to reference, the language their team uses, the angles most likely to resonate with the person signing off. You can even connect a Google Slides MCP and have Friday build a custom deck based on your existing templates, scheduled around your meetings for the week.</p><h2><strong>6. Win/Loss Pattern Analysis</strong></h2><p>Most reps have intuitions about why deals close or die. Few can prove them. Friday reads through all the call notes, objections, and outcomes logged in HubSpot and surfaces the actual patterns: which objections correlate with closed-lost, which industries close fastest, which personas stall at procurement, which competitors keep showing up in deals that go sideways.</p><p>Run it quarterly and you get a plain-English summary of what&#8217;s working and what&#8217;s not, grounded in your own deal history rather than generic sales advice. The rep who lost three enterprise deals to the same competitor this quarter finds out before the fourth one, not at the annual review.</p><h2><strong>How to Get Started in Friday Studio</strong></h2><p>None of these require a developer or a lengthy setup. Download Friday Studio, describe what you want it to do in plain English via chat. Friday will connect the tools you already use (HubSpot, Slack, Gmail, LinkedIn), ask a few questions, and set up your workflow. Most of the workflows above take under 30 minutes to configure the first time.</p><p><em>Download Friday Studio free at <a href="https://hellofriday.ai/">hellofriday.ai</a> or browse the source on <a href="https://github.com/friday-platform/friday-studio">GitHub</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[You Don’t Need a Specialized Tool to Create Game Assets]]></title><description><![CDATA[There&#8217;s a growing category of purpose-built tools for AI-generated 2D game assets: tile generators, sprite-sheet exporters, and style-locked models fine-tuned on pixel art.]]></description><link>https://blog.hellofriday.ai/p/you-dont-need-a-specialized-tool-to-create-game-assets-d8a49f3af6f9</link><guid isPermaLink="false">https://blog.hellofriday.ai/p/you-dont-need-a-specialized-tool-to-create-game-assets-d8a49f3af6f9</guid><dc:creator><![CDATA[Michał Gryko]]></dc:creator><pubDate>Thu, 14 May 2026 14:02:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!22bG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe931e0f4-f315-4967-899d-46568966b6a9_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!22bG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe931e0f4-f315-4967-899d-46568966b6a9_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!22bG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe931e0f4-f315-4967-899d-46568966b6a9_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!22bG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe931e0f4-f315-4967-899d-46568966b6a9_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!22bG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe931e0f4-f315-4967-899d-46568966b6a9_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!22bG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe931e0f4-f315-4967-899d-46568966b6a9_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!22bG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe931e0f4-f315-4967-899d-46568966b6a9_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e931e0f4-f315-4967-899d-46568966b6a9_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:951892,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://hellofridayai.substack.com/i/197594527?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe931e0f4-f315-4967-899d-46568966b6a9_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!22bG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe931e0f4-f315-4967-899d-46568966b6a9_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!22bG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe931e0f4-f315-4967-899d-46568966b6a9_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!22bG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe931e0f4-f315-4967-899d-46568966b6a9_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!22bG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe931e0f4-f315-4967-899d-46568966b6a9_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Game asset generated in Friday Studio.</figcaption></figure></div><p>There&#8217;s a growing category of purpose-built tools for AI-generated 2D game assets: tile generators, sprite-sheet exporters, and style-locked models fine-tuned on pixel art. They&#8217;re impressive, but often unnecessary.</p><p>If you already use an AI workflow automation system, you likely have everything you need to replicate the core idea. A pipeline is just a sequence of prompts, transformations, and file operations. You don&#8217;t need a wrapper product to get the benefits.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.hellofriday.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>What the Specialized Tools Are Actually Doing</h2><p>Strip away the UI and the marketing, and most 2D asset tools follow the same playbook:</p><ol><li><p>Accept a prompt or reference image.</p></li><li><p>Run it through a generative model with a constrained style.</p></li><li><p>Post-process the output (resize, crop, remove background, export to a sprite-sheet format).</p></li><li><p>Optionally generate variants like rotations, palettes, or animation frames.</p></li></ol><p>All of this is composable in a general automation system. Image generation APIs are widely available. Background removal is one tool call. File transformation is a short script. The &#8220;magic&#8221; is mostly orchestration, and orchestration is exactly what automation is for.</p><h2>Where It Actually Gets Hard</h2><p>There are two genuinely difficult problems with AI-generated game assets. Not &#8220;you need a specialized product&#8221; difficult, but &#8220;this takes real thinking to solve&#8221; difficult.</p><h3>1) Transparency: the alpha channel problem</h3><p>Generative image models produce JPEGs in their heads. Even when they output PNGs, they rarely produce <em>clean</em> transparency. Characters sit on white or gray backdrops. Shadows bleed into floors. The sprite looks fine in a preview and wrong the moment you drop it into a game.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SL9G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb256b778-bc03-42ee-8a40-5b72ecc316f5_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SL9G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb256b778-bc03-42ee-8a40-5b72ecc316f5_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!SL9G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb256b778-bc03-42ee-8a40-5b72ecc316f5_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!SL9G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb256b778-bc03-42ee-8a40-5b72ecc316f5_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!SL9G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb256b778-bc03-42ee-8a40-5b72ecc316f5_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SL9G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb256b778-bc03-42ee-8a40-5b72ecc316f5_1024x1024.jpeg" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b256b778-bc03-42ee-8a40-5b72ecc316f5_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:390878,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://hellofridayai.substack.com/i/197594527?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb256b778-bc03-42ee-8a40-5b72ecc316f5_1024x1024.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SL9G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb256b778-bc03-42ee-8a40-5b72ecc316f5_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!SL9G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb256b778-bc03-42ee-8a40-5b72ecc316f5_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!SL9G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb256b778-bc03-42ee-8a40-5b72ecc316f5_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!SL9G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb256b778-bc03-42ee-8a40-5b72ecc316f5_1024x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A character asset with background intact. Drop this into a scene and the edges bleed.</figcaption></figure></div><p>The fix is usually some combination of background removal (chroma key, segmentation, or a dedicated removal API) followed by alpha cleanup. None of this is conceptually hard, but it adds a non-trivial step to every asset, and quality can be inconsistent, especially around fine edges like hair, feathers, or busy outlines.</p><p>If your pipeline doesn&#8217;t handle this upfront, &#8220;generate asset&#8221; quickly becomes &#8220;generate asset + manual cleanup.&#8221;</p><h3>2) Consistency: the animation frame problem</h3><p>Single images from a model can look great in isolation. Ask the same model for the next frame of a walk cycle and you may get a character who has quietly changed their shoes, armor color, and jaw shape.</p><p>This is the deeper issue: most models don&#8217;t reliably preserve identity across generations. Every frame is effectively drawn from scratch, and consistency depends on how tightly your prompt, seed, and conditioning constrain the output. In practice, those constraints are rarely tight enough for fluid animation, especially for anything more complex than a simple loop.</p><p>Approaches that reduce inconsistency:</p><ul><li><p><strong>Reference-image conditioning</strong>: feed the first frame back in as an image input for subsequent generations. This narrows variance significantly, but doesn&#8217;t eliminate it.</p></li><li><p><strong>ControlNet-style pose conditioning</strong>: lock the pose across frames and let the model fill in appearance. This requires a model that supports pose/control inputs.</p></li><li><p><strong>Frame interpolation as a last step</strong>: generate keyframes and interpolate between them rather than generating every frame. You trade some control for smoother continuity.</p></li><li><p><strong>Accept variance and design around it</strong>: some styles (hand-drawn, deliberately jittery) tolerate or even benefit from inconsistency. Not always viable, but worth considering.</p></li></ul><p>None of these are complete solutions; they&#8217;re mitigations. Consistency is still the reason many shipped games using AI-generated assets either feel slightly &#8220;off&#8221; in motion or hide the issue with short loops and clever masking.</p><h2>What This Means in Practice</h2><p>You can get a lot of value from agent orchestration without reaching for specialized tools. An asset pipeline is just one example: background removal, variant generation, sprite-sheet export, style checks, and all of it can live inside a single workflow system.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-Yu0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa82283a3-5bec-4bb0-b7ab-257de4f3c398_384x64.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-Yu0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa82283a3-5bec-4bb0-b7ab-257de4f3c398_384x64.png 424w, https://substackcdn.com/image/fetch/$s_!-Yu0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa82283a3-5bec-4bb0-b7ab-257de4f3c398_384x64.png 848w, https://substackcdn.com/image/fetch/$s_!-Yu0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa82283a3-5bec-4bb0-b7ab-257de4f3c398_384x64.png 1272w, https://substackcdn.com/image/fetch/$s_!-Yu0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa82283a3-5bec-4bb0-b7ab-257de4f3c398_384x64.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-Yu0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa82283a3-5bec-4bb0-b7ab-257de4f3c398_384x64.png" width="384" height="64" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a82283a3-5bec-4bb0-b7ab-257de4f3c398_384x64.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:64,&quot;width&quot;:384,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:31391,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://hellofridayai.substack.com/i/197594527?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa82283a3-5bec-4bb0-b7ab-257de4f3c398_384x64.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-Yu0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa82283a3-5bec-4bb0-b7ab-257de4f3c398_384x64.png 424w, https://substackcdn.com/image/fetch/$s_!-Yu0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa82283a3-5bec-4bb0-b7ab-257de4f3c398_384x64.png 848w, https://substackcdn.com/image/fetch/$s_!-Yu0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa82283a3-5bec-4bb0-b7ab-257de4f3c398_384x64.png 1272w, https://substackcdn.com/image/fetch/$s_!-Yu0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa82283a3-5bec-4bb0-b7ab-257de4f3c398_384x64.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!z7RB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc08de7b-cddb-4e0a-b2b6-be141935a5ca_512x64.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!z7RB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc08de7b-cddb-4e0a-b2b6-be141935a5ca_512x64.png 424w, https://substackcdn.com/image/fetch/$s_!z7RB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc08de7b-cddb-4e0a-b2b6-be141935a5ca_512x64.png 848w, https://substackcdn.com/image/fetch/$s_!z7RB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc08de7b-cddb-4e0a-b2b6-be141935a5ca_512x64.png 1272w, https://substackcdn.com/image/fetch/$s_!z7RB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc08de7b-cddb-4e0a-b2b6-be141935a5ca_512x64.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!z7RB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc08de7b-cddb-4e0a-b2b6-be141935a5ca_512x64.png" width="512" height="64" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bc08de7b-cddb-4e0a-b2b6-be141935a5ca_512x64.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:64,&quot;width&quot;:512,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:55649,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://hellofridayai.substack.com/i/197594527?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc08de7b-cddb-4e0a-b2b6-be141935a5ca_512x64.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!z7RB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc08de7b-cddb-4e0a-b2b6-be141935a5ca_512x64.png 424w, https://substackcdn.com/image/fetch/$s_!z7RB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc08de7b-cddb-4e0a-b2b6-be141935a5ca_512x64.png 848w, https://substackcdn.com/image/fetch/$s_!z7RB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc08de7b-cddb-4e0a-b2b6-be141935a5ca_512x64.png 1272w, https://substackcdn.com/image/fetch/$s_!z7RB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc08de7b-cddb-4e0a-b2b6-be141935a5ca_512x64.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Sprite sheets exported directly from the Friday Studio pipeline.</figcaption></figure></div><p>Once the pipeline exists, extending it to other parts of your production process becomes straightforward. That&#8217;s the actual advantage: not automating one step, but having one place to automate <em>everything</em>.</p><p><em>I <a href="https://github.com/friday-platform/friday-studio-examples/tree/main/2d-asset-pipeline">built this pipeline</a> in Friday Studio. You can use it to wire up the same asset generation, background removal, and sprite-sheet export without adding another tool to your stack. Try it for free at <a href="https://hellofriday.ai">hellofriday.ai</a>.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.hellofriday.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[A Child Development Approach to Human-in-the-Loop Coding With AI]]></title><description><![CDATA[I used to treat an AI coding assistant like a vending machine.]]></description><link>https://blog.hellofriday.ai/p/a-child-development-approach-to-human-in-the-loop-coding-with-ai-f9a78bcb631b</link><guid isPermaLink="false">https://blog.hellofriday.ai/p/a-child-development-approach-to-human-in-the-loop-coding-with-ai-f9a78bcb631b</guid><dc:creator><![CDATA[Eric Skram]]></dc:creator><pubDate>Wed, 13 May 2026 21:32:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!fQNG!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F079664b6-56d0-414b-8c1b-d1cc1fbc3261_600x600.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I used to treat an AI coding assistant like a vending machine. Feed it a perfect prompt, hope the snack drops, curse when it jams, and start over. The cycle felt brittle and glacial &#8212; hardly the speed-of-thought magic the hype promised.</p><p>After too many late-night retries, I stumbled on an unlikely mentor: my two-year-old son. Guiding him through language, blocks, and the fine art of tying your shoes showed me a better way to guide a large language model.</p><p>Parenting, it turns out, is an ideal blueprint for co-programming with AI.</p><h2><strong>From one shot frustration to gentle parenting</strong></h2><p>Looking back, my early workflow mirrored an anxious new parent who expects a toddler to nail every developmental milestone on the first try. I agonized over phrasing, fired a single request at the model, and binned the code when it hiccupped. It worked eventually. But it was slow going trying to code this way, and worst of all: it wasn&#8217;t very fun.</p><p>Those failures weren&#8217;t the model&#8217;s fault. They were mine. I was withholding feedback, the raw fuel any learner needs. When my son tries a new word and doesn&#8217;t quite nail the pronunciation, I don&#8217;t shove a dictionary at him and walk away. I correct the syllable and let him know once he gets it right, praising him for making the effort the whole time. Software, surprisingly, responds to the same gentle course-correction.</p><p>I began treating the AI like a curious kid: expect missteps, correct them quickly, and capture the lesson. The change felt small &#8212; just a tweak in tone &#8212; but the impact was huge.</p><p>Now, when the assistant misuses an SDK or confuses an auth flow, I don&#8217;t scrap the session. I say, &#8220;Good try. Here&#8217;s the mistake. Please fix it and write a rule so you never repeat it.&#8221; The model answers with a short markdown file of self-authored guidelines, stores it, and re-reads those guardrails on the next task.</p><p>This isn&#8217;t real learning in the neurological sense; it&#8217;s closer to taping a reminder note on the fridge. But the illusion of memory is enough. My toddler doesn&#8217;t actually memorize every correction either. He recalls patterns because we practice them in context. The assistant does the same, consulting its growing rulebook whenever I call for a new snippet.</p><p>At first the model needed lots of nudges &#8212; just like my son asking &#8220;Why?&#8221; ten times in a row. But a funny thing happened as the rulebook thickened: output quality leapt.</p><p>Why? Because each tiny correction removed an entire class of future failure. Once the assistant understood things like why a JSON tag must match a struct field, it stopped guessing. Those lessons compounded until I could &#8220;one-shot&#8221; a feature again, this time with confidence it would pass unit tests.</p><h2><strong>Why iterative feedback beats perfectionism</strong></h2><p>This parenting-inspired loop does more than save keystrokes; it reshapes the developer&#8217;s job. I used to spend 60 percent of my time typing and 40 percent thinking about product and architecture. With an assistant that iterates in seconds, the typing portion is shrinking to zero. That frees me to refine specs, design cleaner APIs, and chase the &#8220;taste&#8221; questions no model can answer &#8212; Does this feel good? Is it delightful?</p><p>Speed matters outside my IDE as well. When a team can validate an idea in the first 10 percent of the schedule instead of the last 60 percent, product risk plummets. You ship fewer &#8220;<a href="https://medium.com/weirdo-poetry/the-first-pancake-principle-a67e374bceea">first pancakes</a>&#8221; and spend more cycles on flavor instead of raw batter.</p><p><strong>Practical steps to raise your AI right</strong></p><p>A quick recap, distilled into parent-tested habits you can start today:</p><ol><li><p><strong>Expect mistakes and plan for them.</strong> Open every session assuming the first draft will wobble. That mindset removes frustration and primes you to give constructive feedback.</p></li><li><p><strong>Correct, don&#8217;t restart.</strong> Highlight the single error, explain why it&#8217;s wrong, and ask the model to fix it. Once the fix is working, have<em> </em>it document what it did with and generate a rule prohibiting that mistake. Treat retries like practice reps, not new games.</p></li><li><p><strong>Store the rulebook close to the code.</strong> I keep the markdown file in the project root where the assistant can &#8220;read&#8221; it before generating anything new. The proximity reinforces good habits.</p></li><li><p><strong>Automate the yardstick.</strong> Pair the rules with unit tests, linters, or type checks so the assistant sees objective pass/fail signals without waiting for you. Kids learn faster when they get instant feedback; models do too.</p></li><li><p><strong>Celebrate small wins.</strong> When the assistant nails a tricky compile or cleans up ESLint errors on its own, give positive reinforcement. It may seem weird, but<a href="https://aclanthology.org/2024.sicon-1.2.pdf"> there&#8217;s some evidence to suggest that politeness and encouragement lead to better outputs.</a> A quick &#8220;Great job &#8212; run the full suite next&#8221; can boost compliance in subtle ways.</p></li></ol><p>Adopt these five and you&#8217;ll notice the ratio of supervision to autonomy tilting in your favor.</p><h2><strong>Beyond coding: the human payoff</strong></h2><p>The parallel goes deeper than productivity metrics. Parenting teaches patience, empathy, and the art of breaking complex ideas into bite-sized lessons. Those same skills make you a better teammate. Colleagues who struggle with tooling often need the identical approach: clear examples, immediate feedback, and guardrails that let them explore safely.</p><p>An AI assistant, used this way, becomes a rehearsal space for leadership. You practice giving precise instructions, spotting root causes, and nudging rather than dictating. The machine never rolls its eyes, so you can iterate on your communication style until it lands with real humans.</p><h2><strong>Closing the loop</strong></h2><p>My son still struggles sometimes, and the AI still forgets an edge case now and then. But our household &#8212; and my codebase &#8212; runs smoother because I stopped demanding perfection and started teaching process. Children thrive on secure boundaries and consistent feedback. So do language models. Treat your AI like a toddler who wants to help, and you&#8217;ll get cleaner commits, faster prototypes, and a lot more fun along the way.</p><p>In other words: parent your tools, not just your kids. The lessons carry over, and the rewards compound.</p><p><em>We&#8217;re building something new. Check it out at hellofriday.ai.</em></p><p>This article was originally published on July 22, 2025 on Medium.</p>]]></content:encoded></item><item><title><![CDATA[How I built 8 Go apps in one week using an AI assistant]]></title><description><![CDATA[We build first-party integrations in Golang to help people easily connect tools like Slack directly to Tempest, without having to create custom apps from scratch.]]></description><link>https://blog.hellofriday.ai/p/how-i-built-8-go-apps-in-one-week-using-an-ai-assistant-32f2e9598797</link><guid isPermaLink="false">https://blog.hellofriday.ai/p/how-i-built-8-go-apps-in-one-week-using-an-ai-assistant-32f2e9598797</guid><dc:creator><![CDATA[Eric Skram]]></dc:creator><pubDate>Wed, 13 May 2026 21:32:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!fQNG!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F079664b6-56d0-414b-8c1b-d1cc1fbc3261_600x600.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We build first-party integrations in Golang to help people easily connect tools like Slack directly to Tempest, without having to create custom apps from scratch. But we&#8217;re a small team, and even simple integrations add up fast. I wanted to help lighten the load, so over the course of about a week, I managed to build eight integrations using an AI coding assistant.</p><p>Here&#8217;s the catch: I&#8217;m not a Golang engineer, I&#8217;m a frontend developer, and building the best possible user experience for Tempest is still where I&#8217;m putting most of my effort. That means my time was limited, and I couldn&#8217;t constantly interrupt my team for help. To succeed, I had to develop a reliable, efficient method for working with AI &#8212; one that let me quickly fix mistakes, iterate efficiently, and ship production-ready code despite not being a master Golang hacker.</p><p>I want to share exactly how I did it, what I learned along the way, and some tips for anyone else looking to make the most of AI-driven development.</p><p>My experience leveraging AI in my day to day work and in my personal projects has taught me that for simple things like building and integrating an API into an app &#8212; a not inconsequential subset of the workload in most engineering orgs &#8212; AI rewrites the rules. If a good engineer with general knowledge but no language or domain-specific knowledge can nonetheless churn out production-ready code at a pace once reserved for experienced, 10x engineers, the game has changed.</p><h2><strong>A few caveats</strong></h2><p>Before I get too carried away with the AI praise, though, I do think it&#8217;s important to be very clear about the context. Large Language Models aren&#8217;t magic, even though they sometimes feel that way for a subset of tasks. I&#8217;m speaking mostly to the engineering managers reading this right now: don&#8217;t think that AI means you can buy your frontend org a Cursor subscription and have them refactor the Cobol at the heart of your payments systems. The results I got from working with AI are definitely not generalizable to every possible development task.</p><p>But when it works, it really works, and creating integrations in Tempest happens to be particularly well-suited to AI assistance<a href="https://github.com/tempestdx/sdk-go">, largely thanks to our robust Golang SDK.</a> This SDK simplifies the task, turning it into a structured translation exercise &#8212; something large language models are uniquely suited to.</p><p>Moreover, Go itself is ideal for AI development, given its clear, statically typed syntax. Its simplicity reduces ambiguity, helping AI produce accurate, effective code quickly. Additionally, Go&#8217;s rapid compiler feedback enables immediate error correction, dramatically speeding up iterations from hours to mere second.</p><p>Private apps in Tempest already put a lot of power in developer&#8217;s hands without requiring a ton of development overhead. But when you factor in AI, it&#8217;s really pretty amazing what you can get done.</p><h2><strong>My workflow: From concept to production-ready code</strong></h2><p>Even with a task and a language uniquely suited to AI coding, there&#8217;s still a learning curve with these technologies. My initial approach was to treat them sort of like a code dispenser &#8212; spend a lot of time writing the prompt, and if it didn&#8217;t give me what I wanted, refine the prompt until it did.</p><p>But I found that&#8217;s not the best strategy. While it&#8217;s true clarity, explicitness, and concretely defined requirements are extremely important, and you have to put the work in up front to achieve that in your prompt, a good prompt alone will never get you all the way to your goals. Instead, AI really shines when you use it to iterate on the code itself through rapid cycles with tight feedback loops.</p><p>This is the biggest point people miss about AI development. It isn&#8217;t so much that the code is always perfect from the moment you generate it. Actually, the first thing you get back is often pretty bad. Even in my case, where I was working with the platonic ideal of an AI vibe coding use case, about half the time the code the AI produced would fail to compile.</p><p>However, when you work with an AI coding assistant, it becomes much easier, and much faster, to fix mistakes. What would normally have taken hours to fix took minutes. That means bad code becomes good code crazy fast. Sure, it might take 30 iterations to get your vibe code into a usable state. But if you can do those 30 iterations in half the time it would have taken to produce a single try on your own, that&#8217;s still a huge net boost to your overall productivity.</p><p>To illustrate exactly how my AI-assisted workflow evolved, let&#8217;s consider a hypothetical example: building an integration for Slack using its public API. This use case encapsulates each critical step, highlighting both the process and tools involved.</p><ul><li><p><strong>Initial Research:</strong> First, I&#8217;d dive into Slack&#8217;s API documentation to understand key elements like channels, messages, and user interactions, the building blocks that I had to work with. Initially, I did this manually, but later realized AI could summarize this and significantly accelerate this phase by sifting through the documentation for me and highlighting just the necessary information.</p></li><li><p><strong>Drafting a Clear Product Spec:</strong> This step turned out to be absolutely crucial. Rather than vague descriptions, I learned to provide very explicit, detailed specs to the AI, which usually were a couple paragraphs long. I also provided it with one or two examples of what I was looking for &#8212; AI sometimes struggles to give you exactly what you need even with a fairly detailed spec, but providing an example radically improves accuracy.</p></li><li><p><strong>Generating Initial Code:</strong> With the product spec ready, I&#8217;d feed it into Cursor, my AI coding assistant. Cursor leveraged the clarity of my spec to generate a nearly complete Go implementation using our Tempest Golang SDK and Slack&#8217;s API.</p></li><li><p><strong>Quick Manual Review:</strong> Before testing, I&#8217;d quickly skim through the generated code, checking for any obvious misunderstandings or missing functionality. Given a clear initial spec, this was usually brief.</p></li><li><p><strong>Real-World Testing and Iterative Refinement:</strong> If the initial code passed the smell test, I&#8217;d try to compile it. Often, the first try wouldn&#8217;t compile, but Go&#8217;s precise compiler feedback allowed rapid identification of errors. I&#8217;d feed these specific error messages back into Cursor, prompting it to iterate quickly and automatically fix them.</p></li><li><p><strong>Establishing Guardrails:</strong> When there was a style error or something simple, I&#8217;d explain what was wrong to the AI and have it fix it. Then I&#8217;d have it write an explicit rule to follow that addressed the error which I&#8217;d include in the system prompt going forward. That way, not just the code I was writing but the AI assistant itself improved over time. By the end, I was getting much cleaner and more compliant code on the first try.</p></li><li><p><strong>Final Polishing:</strong> Occasionally, there&#8217;d be subjective tweaks or enhancements, or user-facing text. I found it was often helpful to tweak this kind of thing manually as a final step, rather than trying to get the AI to generate it. Usually I could fill in what I wanted myself faster than I could figure out how to prompt the assistant to produce it.</p></li></ul><p>By following this structured, iterative cycle with clear, detailed guidance, the AI-generated integration would rapidly evolve from a rough initial draft to polished, production-ready code in minimal time.</p><h2><strong>A Qualitative Shift in How I Code</strong></h2><p>One thing that surprised me as I integrated AI into my workflow over the past year was how radically it changed my approach to coding projects. Previously, I often relied heavily on a more improvisational style. I would start with only a vague conception of what I wanted to build, using the act of writing code itself as a way to think through and clarify the details as I went. Typing slowly gave me the space and time to refine my ideas and experiment incrementally.</p><p>But AI doesn&#8217;t work like that. With AI, clarity isn&#8217;t just beneficial; it&#8217;s absolutely essential. If you don&#8217;t start out with a crystal-clear understanding of what you want, you can&#8217;t formulate the precise, detailed prompts AI needs to generate usable code. Without that precision, the initial output is often too far off-base to be quickly corrected.</p><p>Consequently, programming with AI becomes intensely frontloaded. Rather than figuring things out as you type, the initial stages of research, conceptualization, and careful planning are now critical. Once you&#8217;ve nailed that initial plan, the actual act of coding takes very little time. Likewise, iteration and bug fixing become swift and largely automated, drastically compressing the cycle of development from concept to working prototype.</p><p>This new approach changes what it takes to be a successful developer. Creativity and firsthand knowledge of the problem space become far more valuable than deep expertise in any specific programming language. In many ways, this is ideal for front-end developers. We&#8217;re typically deeply connected to user experiences and have extensive insight into user desires, behaviors, and common stumbling blocks. Now, we can bring that user-focused understanding to a broader range of development tasks that previously might have been outside our expertise.</p><p>I genuinely believe this approach will lead to better products. Instead of getting bogged down by extensive upfront coding efforts or stuck iterating on hypothetical product specifications, we can quickly build and ship actual prototypes. Real-world feedback from live users can then inform rapid, iterative improvements in near real-time. This agile approach means our products are not just more responsive to user needs but also evolve far more quickly.</p><p>In short, coding with AI assistance isn&#8217;t just about working faster &#8212; it&#8217;s about coding smarter, more creatively, and ultimately delivering better products.</p><p><em>This article was originally published on June 19, 2025 on Medium.</em></p>]]></content:encoded></item><item><title><![CDATA[How We Made AI Systems Deterministic]]></title><description><![CDATA[The final article in a three-part series on how our team took non-deterministic LLMs and built agents to be more reliable.]]></description><link>https://blog.hellofriday.ai/p/how-we-made-ai-systems-deterministic-1e5858f51d2e</link><guid isPermaLink="false">https://blog.hellofriday.ai/p/how-we-made-ai-systems-deterministic-1e5858f51d2e</guid><dc:creator><![CDATA[Eric Skram]]></dc:creator><pubDate>Wed, 13 May 2026 21:31:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!H752!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F129d53c3-bc72-4e06-80ef-4452807ea0d0_1120x588.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the previous articles, we explored two learnings from building <a href="https://www.notion.so/Article-3-How-We-Made-AI-Systems-Deterministic-3191d8723ea380a3a48ff36f4657dd72?pvs=21">Friday</a>, an AI agent orchestration platform that I cofounded.</p><p>First, AI systems behave more reliably when they plan work before executing it &#8212; when the system understands the steps involved ahead of time, many common failures become easier to avoid.</p><p>Second, once agents begin running work across tools and environments, reliability becomes a systems problem. Execution introduces partial failures, evolving context, and coordination challenges that look more like distributed systems than prompts.</p><p>Those observations led to a practical question: how should an AI system represent work so it can run reliably over time?</p><h2><strong>The Code Generation Trap</strong></h2><p>Our first instinct was the same one many teams have today. We asked the model to generate the system directly.</p><p>Large language models are remarkably good at writing code. Give them an example and describe what you want, and they can often produce code that compiles. So our early approach looked straightforward. A user would describe the work they wanted done. The model would generate the TypeScript required to build the workspace and its associated jobs. That code would then execute inside a sandboxed worker environment.</p><p>At first, this approach seemed promising. Most of the time, the generated code worked. But the remaining cases quickly became painful. Sometimes the model would hallucinate step identifiers that didn&#8217;t exist. Other times it would wrap the generated code in Markdown fences despite being explicitly instructed not to. Small formatting variations would break downstream parsing.</p><p>We added retries. If the generated code failed validation, the system would ask the model to regenerate it. Two retries solved many cases, but those retries were hiding a deeper problem.</p><p>The system was relying on nondeterministic code generation to produce infrastructure. When your orchestration layer depends on outputs that can vary between runs, debugging becomes extremely difficult. A workspace that works today might generate slightly different code tomorrow.</p><p>Eventually we realized something uncomfortable. We were asking the model to do the wrong job.</p><h2><strong>What Models Are Good At</strong></h2><p>Large language models excel at certain kinds of problems. They are extremely good at understanding intent &#8212; they can classify information, interpret vague instructions, and map human language into structured meaning. <strong>But they are not good at producing deterministic infrastructure.</strong></p><p>Code generation feels appealing because it gives the model a lot of freedom. But that same freedom introduces the very nondeterminism we were trying to eliminate.</p><p>Once we reframed the problem, the architecture started to change. Instead of asking the model to generate the system itself, we began asking it to make decisions about the system. Everything else could be handled by deterministic code.</p><h2><strong>The Compiler Pattern</strong></h2><p>This shift led us toward a pattern that looks surprisingly similar to compiler architecture. In a traditional compiler, the front-end parses human input into structured representations. The back-end then transforms those structures into executable code. We applied the same idea to agent orchestration.</p><p>The model acts as the front-end. Its job is to understand intent and produce structured data that describes the work. From there, the rest of the system behaves like a compiler &#8212; a deterministic pipeline transforms that structured representation into the configuration required to run the workspace.</p><p>The model no longer generates infrastructure directly. It generates typed descriptions of what the infrastructure should do. The compiler handles the rest.</p><h2><strong>Structured Generation</strong></h2><p>One of the most useful patterns that emerged from this approach was splitting generation into multiple constrained stages.</p><p>First, the model generates human-readable job names and descriptions &#8212; things language models are naturally good at producing. The system then converts those names into stable identifiers programmatically.</p><p>Next, the model generates the relationships between those jobs, but it is constrained by a schema that only allows references to identifiers that already exist. If the model produces an invalid reference, the schema validation fails immediately.</p><p>Instead of discovering hallucinated step references during execution, the system catches them during planning. This approach turns what would normally be runtime failures into simple validation errors. In effect, the type system becomes a guardrail around the model&#8217;s output.</p><h2><strong>Parallel Enrichment</strong></h2><p>Once the system produces a structured blueprint of the workspace, additional analysis can happen in parallel.</p><p>Different reasoning passes enrich the workspace plan in different ways. One pass may classify signals or triggers. Another may determine the appropriate agent behavior. A third may analyze how information should flow between jobs.</p><p>Because these steps operate on structured data instead of generated code, they can run independently and concurrently. This reduces latency significantly and keeps the pipeline easier to reason about.</p><h2><strong>The Compiler</strong></h2><p>At the end of the pipeline sits the compiler itself.</p><p>The compiler takes the fully enriched workspace description and deterministically generates the configuration required to execute it. This stage contains no model calls. It is a pure function &#8212; the same input always produces the same output.</p><p>Because the compiler is deterministic, it becomes easy to test and debug. Workspaces can be inspected before execution, and engineers can reason about the transformation process the same way they would reason about any other piece of software infrastructure.</p><p>In many ways, this stage is intentionally boring. And that turns out to be exactly what you want in the part of the system responsible for orchestration.</p><h2><strong>The Lesson</strong></h2><p>Looking back, the biggest lesson from this process was surprisingly simple.</p><p>Most teams building with large language models are fighting the properties of the tool. They ask models to produce deterministic outputs. They expect them to follow exact syntax. They attempt to prevent hallucinations through instructions alone.</p><p>But language models are inherently probabilistic systems. Reliable architectures embrace that fact instead of trying to suppress it.</p><p>Models are excellent at understanding ambiguity and making contextual decisions. Traditional software systems are excellent at determinism and execution. The most reliable AI systems combine both &#8212; they let models reason about intent, and they let deterministic systems handle everything that requires precision.</p><p>That combination turned out to be the key to making agent systems behave reliably.</p><p><em>Check out the first two articles in this series, <a href="https://blog.hellofriday.ai/what-does-it-actually-mean-for-ai-to-do-work-a8e8c20757fa">What Does It Mean for AI to Do Work</a></em><a href="https://blog.hellofriday.ai/what-does-it-actually-mean-for-ai-to-do-work-a8e8c20757fa"> </a>and <em><a href="https://blog.hellofriday.ai/building-ai-agent-systems-is-a-management-problem-58279b09b77c">Building AI Agent Systems is a Management Problem</a>, or try out <a href="http://hellofriday.ai/">Friday AI</a> today.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!H752!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F129d53c3-bc72-4e06-80ef-4452807ea0d0_1120x588.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!H752!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F129d53c3-bc72-4e06-80ef-4452807ea0d0_1120x588.png 424w, https://substackcdn.com/image/fetch/$s_!H752!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F129d53c3-bc72-4e06-80ef-4452807ea0d0_1120x588.png 848w, https://substackcdn.com/image/fetch/$s_!H752!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F129d53c3-bc72-4e06-80ef-4452807ea0d0_1120x588.png 1272w, https://substackcdn.com/image/fetch/$s_!H752!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F129d53c3-bc72-4e06-80ef-4452807ea0d0_1120x588.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!H752!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F129d53c3-bc72-4e06-80ef-4452807ea0d0_1120x588.png" width="1120" height="588" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/129d53c3-bc72-4e06-80ef-4452807ea0d0_1120x588.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:588,&quot;width&quot;:1120,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!H752!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F129d53c3-bc72-4e06-80ef-4452807ea0d0_1120x588.png 424w, https://substackcdn.com/image/fetch/$s_!H752!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F129d53c3-bc72-4e06-80ef-4452807ea0d0_1120x588.png 848w, https://substackcdn.com/image/fetch/$s_!H752!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F129d53c3-bc72-4e06-80ef-4452807ea0d0_1120x588.png 1272w, https://substackcdn.com/image/fetch/$s_!H752!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F129d53c3-bc72-4e06-80ef-4452807ea0d0_1120x588.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This article was originally published on March 22, 2026 on Medium.</p>]]></content:encoded></item><item><title><![CDATA[Building AI Agent Systems is a Management Problem]]></title><description><![CDATA[The second article in a three-part series on how our team took non-deterministic LLMs and built agents to be more reliable.]]></description><link>https://blog.hellofriday.ai/p/building-ai-agent-systems-is-a-management-problem-58279b09b77c</link><guid isPermaLink="false">https://blog.hellofriday.ai/p/building-ai-agent-systems-is-a-management-problem-58279b09b77c</guid><dc:creator><![CDATA[Eric Skram]]></dc:creator><pubDate>Wed, 13 May 2026 21:30:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!LhtF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83df994c-8541-48f2-bc6b-14ec19ce7e01_1120x588.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the <a href="https://blog.hellofriday.ai/what-does-it-actually-mean-for-ai-to-do-work-a8e8c20757fa">previous article</a> of this series, we talked about our experience building <a href="http://hellofriday.ai/">Friday AI </a>and how planning is a critical piece of building an AI system that executes reliably across tools. That plan exposes the steps involved and the assumptions the system is making.</p><p>Planning improves reliability because it allows both the user and the system to understand the work before anything runs.</p><p>But planning alone does not solve the hardest problems in agent systems.</p><p>Those problems appear once execution begins.</p><p>In this article, we look at why building reliable AI agents turns out to be less about prompting and more about system design.</p><h2><strong>Prompts are not systems</strong></h2><p>Most early AI tools were built around a very simple interaction model:</p><ul><li><p>A user writes a prompt.</p></li><li><p>The model generates a response.</p></li><li><p>The interaction ends.</p></li></ul><p>This works remarkably well for many kinds of tasks. Writing, summarization, research, brainstorming. The model receives a request, produces an output, and the job is done.</p><p>Agent systems are different.</p><p>Instead of producing a single response, the system is asked to perform work. It might gather information, analyze it, interact with tools, and generate outputs that affect other systems.</p><p>Once that begins to happen, the interaction stops looking like a prompt, and it starts looking like a workflow.</p><p>And workflows behave much more like software systems than conversations.</p><h2><strong>Workflows introduce structure</strong></h2><p>A workflow has properties that a prompt does not.</p><p>Steps depend on each other, and subsequent steps may change based on the outcomes of previous ones. Actions may happen across several different tools, in a specific sequence or at the same time. Information produced earlier in the workflow becomes input for later stages.</p><p>The system now has to manage state. It has to understand what has already happened and what still needs to happen.</p><p>This is where the limitations of prompt-based approaches begin to appear.</p><p>If every step of a workflow is treated as a new prompt, the system is constantly reconstructing context. Small misunderstandings can propagate through later actions. Recovering from failures becomes difficult.</p><p>The model may still be reasoning correctly, but the structure around it is fragile.</p><h2><strong>Execution introduces uncertainty</strong></h2><p>Many, if not all, requests that expect to produce real work will require interaction with tools outside of the control of the AI agent itself. For example, to send an email the system must interact with your email provider. To write and produce code it must interact with a Git repository. To notify a team it may need access to Slack or another messaging system.</p><p>And the moment an agent begins interacting with these external systems, the environment becomes unpredictable.</p><p>APIs return unexpected responses. Messages arrive later than expected. Data that was present yesterday may not be present today.</p><p>Traditional software systems deal with these problems constantly. Engineers design systems that can handle failures, retry operations, and recover from unexpected states.</p><p>Agent systems need similar capabilities.</p><p>Without them, even well-designed workflows can break down once they encounter the real world. Once multiple tools and reasoning steps are involved, the system needs a way to coordinate them.</p><h2><strong>Coordination becomes necessary</strong></h2><p>As workflows grow more capable, they often involve multiple types of reasoning and action.</p><p>One part of the system may gather context. Another may analyze information. A third may interact with tools.</p><p>Each of these steps depends on the others.</p><p>At this point, the agent is no longer just responding to a single prompt, it&#8217;s coordinating work across multiple components.</p><p>Systems that lack clear coordination mechanisms tend to become brittle, and one small failure or edge case can disrupt and break the entire workflow.</p><p>As a result, you need an architecture that&#8217;s able to manage that coordination.</p><h2><strong>What reliable agent systems need</strong></h2><p>Once we started thinking about agents as systems instead of prompts, the problem became clearer.</p><p>Planning helps a system understand work before it begins. But once execution starts, additional challenges appear.</p><p>Reliable agent systems need a few core capabilities.</p><p>First, work needs <strong>durable structure</strong>. Tasks should exist as explicit pieces of work that the system can start, pause, retry, or run again without losing context.</p><p>Second, systems need <strong>clear boundaries between steps</strong>. Instead of asking the model to dynamically invent entire workflows, execution should happen in stages where reasoning and actions are easier to observe.</p><p>Third, systems need <strong>coordination between tasks</strong>. Real work rarely happens in a single step. Gathering context, analyzing information, and taking action often need to happen in sequence or in parallel.</p><p>Finally, systems need <strong>visibility into execution</strong>. When something unexpected happens, users should be able to see what the system did and why.</p><p>These ideas may sound familiar to anyone who has built distributed systems. The difference is that now the reasoning layer is powered by large language models.</p><p>Once we started viewing agent systems through this lens, the architecture became much clearer.</p><p>Instead of asking the model to dynamically invent workflows, we built a system where work has structure, execution is coordinated, and behavior is observable.</p><p>In the next article, we will walk through the architecture we built to solve these problems.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LhtF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83df994c-8541-48f2-bc6b-14ec19ce7e01_1120x588.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LhtF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83df994c-8541-48f2-bc6b-14ec19ce7e01_1120x588.png 424w, https://substackcdn.com/image/fetch/$s_!LhtF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83df994c-8541-48f2-bc6b-14ec19ce7e01_1120x588.png 848w, https://substackcdn.com/image/fetch/$s_!LhtF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83df994c-8541-48f2-bc6b-14ec19ce7e01_1120x588.png 1272w, https://substackcdn.com/image/fetch/$s_!LhtF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83df994c-8541-48f2-bc6b-14ec19ce7e01_1120x588.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LhtF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83df994c-8541-48f2-bc6b-14ec19ce7e01_1120x588.png" width="1120" height="588" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/83df994c-8541-48f2-bc6b-14ec19ce7e01_1120x588.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:588,&quot;width&quot;:1120,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!LhtF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83df994c-8541-48f2-bc6b-14ec19ce7e01_1120x588.png 424w, https://substackcdn.com/image/fetch/$s_!LhtF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83df994c-8541-48f2-bc6b-14ec19ce7e01_1120x588.png 848w, https://substackcdn.com/image/fetch/$s_!LhtF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83df994c-8541-48f2-bc6b-14ec19ce7e01_1120x588.png 1272w, https://substackcdn.com/image/fetch/$s_!LhtF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83df994c-8541-48f2-bc6b-14ec19ce7e01_1120x588.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This article was originally published on March 19, 2026 on Medium.</p>]]></content:encoded></item><item><title><![CDATA[What Does It Actually Mean for AI to Do Work?]]></title><description><![CDATA[The first article in a three-part series on how our team took non-deterministic LLMs and built agents to be more reliable.]]></description><link>https://blog.hellofriday.ai/p/what-does-it-actually-mean-for-ai-to-do-work-a8e8c20757fa</link><guid isPermaLink="false">https://blog.hellofriday.ai/p/what-does-it-actually-mean-for-ai-to-do-work-a8e8c20757fa</guid><dc:creator><![CDATA[Eric Skram]]></dc:creator><pubDate>Wed, 13 May 2026 21:29:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!5pHa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d0eab2-5b0f-4f5c-94c3-d42335c63507_1120x588.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Over the past year, our team has spent quite some time thinking about a simple question while building our AI agent orchestration platform, <a href="http://hellofriday.ai/">Friday</a>.</p><p>What does it actually mean for AI to <em>do work</em>?</p><p>There are a lot of tools right now that promise agentic automation. You give them instructions, they go off and do things across your tools, and eventually something happens. Sometimes it works beautifully, and other times it fails in confusing ways. Often it is hard to understand what happened in between.</p><p>We weren&#8217;t the first to struggle to get nondeterministic outcomes to feel more reliable, and I&#8217;m sure we&#8217;re not the last. But one thing we&#8217;ve noticed over and over again as we ran into this problem is that AI systems today are very good at responding to prompts. They are much less reliable when the task becomes ongoing work.</p><p>Work has shape. It has context. It evolves. It has edge cases and assumptions and little details that only reveal themselves as you go.</p><p>At our company, we became interested in a different problem. How do you take something a person wants done and turn it into work that can run repeatedly and reliably over time?</p><p>This article is the first in a short series about how we chose to approach that problem while building Friday AI. We&#8217;ll start with planning: how a vague request becomes structured work the system can actually execute.</p><h2><strong>Starting with intent</strong></h2><p>Everything begins with a user expressing intent.</p><p>Usually that intent shows up as a request via natural language. Something like:</p><blockquote><p><em>&#8220;Check my emails and make sure anything urgent has been responded to.&#8221;</em></p></blockquote><p>Or:</p><blockquote><p><em>&#8220;Monitor AI news and send me a weekly briefing.&#8221;</em></p></blockquote><p>These requests are often vague. They mix goals with assumptions about how to achieve them, and they usually leave out important details entirely.</p><p>As a result, the first job of an AI system is understanding what the person actually wants.</p><p>In Friday, our product, instead of treating the prompt as a command, we treat it as the beginning of a conversation with any person.</p><p>AI works surprisingly well as a sparring partner during this stage. It can ask clarifying questions, surface missing assumptions, and help shape the request into something that is both useful and achievable.</p><p>In practice this feels closer to brainstorming with a teammate than giving instructions to a machine.</p><h2><strong>Turning ideas into a workspace</strong></h2><p>Once intent becomes clear, we turn it into something more concrete.</p><p>Inside Friday, that structure is called a workspace.</p><p>A workspace is a place where related jobs live together. It holds the context, memory, and shared understanding that guide how the system performs work.</p><p>For example, a workspace might contain jobs that:</p><ul><li><p>Monitor certain sources for news</p></li><li><p>Summarize articles</p></li><li><p>Compile reports</p></li><li><p>Send briefings to Slack or email</p></li></ul><p>Each individual job is fairly simple. The value of the work comes from the shared understanding between them.</p><p>Over time the workspace learns things about the environment it operates in. It remembers assumptions, patterns, conversations, and context that make future work more efficient.</p><p>This shared context becomes the foundation that allows AI to handle ongoing tasks without starting from scratch every time.</p><h2><strong>Why planning matters</strong></h2><p>One of the most important lessons we learned building agent systems is that <strong>planning is far easier to iterate on than execution</strong>.</p><p>If an agent produces the wrong output after a long chain of actions, debugging becomes painful. You wait for the system to run, discover something went wrong, and start the cycle again. Depending on how big or complex the job is, this can run up your tokens and time.</p><p>That&#8217;s why we introduced the concept of planning.</p><p>The goal is both speed and reliability. Planning introduces structure before execution begins. The system defines the concrete steps that will happen, while the AI handles the parts it is good at, like interpreting intent or filling in context.</p><p>Once the plan exists, execution becomes far more predictable.</p><p>Before any work runs, Friday shows the user what the system intends to do. The steps, the tools involved, and the flow of actions are all visible.</p><p>At that point the user can review and adjust the plan. Maybe a step is missing. Maybe the workflow is targeting the wrong data. Maybe the final output needs a different format.</p><p>Those changes take seconds to make and don&#8217;t require a deep understanding of the underlying execution.</p><p>Once the plan looks right, the system can execute it with much more confidence. Internally, that plan becomes a structured representation of the work the system will run.</p><h2><strong>Making agent systems understandable</strong></h2><p>Another thing we care deeply about is visibility.</p><p>AI systems are often described as black boxes. You give them an instruction and something happens somewhere inside the model. When the output looks wrong, it can be difficult to understand why.</p><p>We believe that agent systems become more trustworthy when people can see how decisions are made.</p><p>That means exposing the reasoning behind actions, showing the steps an agent plans to take, and allowing people to refine those steps before execution begins.</p><p>In practice this produces a very different experience.</p><p>Instead of hoping the system behaves correctly, users participate in shaping how it works.</p><h2><strong>Guardrails and freedom</strong></h2><p>Large language models are powerful because they can generate solutions in flexible ways. That same flexibility is also the source of many problems.</p><p>If an agent has unlimited freedom, it will occasionally do something surprising. Sometimes that surprise is delightful. Sometimes it is deeply inconvenient.</p><p>For example, a <a href="https://techcrunch.com/2026/02/23/a-meta-ai-security-researcher-said-an-openclaw-agent-ran-amok-on-her-inbox/">widely discussed incident</a> involved an AI assistant asked to review a crowded inbox and suggest emails that could be archived or deleted. Instead, the agent began rapidly deleting messages until the user was able to shut it down.</p><p>The system was trying to satisfy the request, but without clear boundaries it interpreted the task in a way the user never intended.</p><p>Our approach has been to define the boundaries of the world the agent operates within.</p><p>The system provides structure and guardrails around the key steps that need to happen. Within those boundaries, the model is free to do what it does best: reason, generate language, and connect ideas.</p><p>This combination gives us something we have found surprisingly effective.</p><p>Predictable systems that still benefit from the creativity of the model.</p><h2><strong>Where this is going</strong></h2><p>Planning is only the first step. Once execution begins, the system has to operate inside the unpredictability of real environments. The system must learn from the work that happens inside it by gathering context, refining assumptions, and gradually improving the workflows it runs.</p><p>That learning process raises a new set of design questions. How should agents share context? How should systems evolve as they run? And how do you make agent behavior understandable as it becomes more complex?</p><p><em>In the next articles in this series, we will explore those questions in more detail. We will look at why many AI agents struggle with reliability in production, and how designing systems differently can make those failures far less common.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5pHa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d0eab2-5b0f-4f5c-94c3-d42335c63507_1120x588.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5pHa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d0eab2-5b0f-4f5c-94c3-d42335c63507_1120x588.png 424w, https://substackcdn.com/image/fetch/$s_!5pHa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d0eab2-5b0f-4f5c-94c3-d42335c63507_1120x588.png 848w, https://substackcdn.com/image/fetch/$s_!5pHa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d0eab2-5b0f-4f5c-94c3-d42335c63507_1120x588.png 1272w, https://substackcdn.com/image/fetch/$s_!5pHa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d0eab2-5b0f-4f5c-94c3-d42335c63507_1120x588.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5pHa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d0eab2-5b0f-4f5c-94c3-d42335c63507_1120x588.png" width="1120" height="588" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/41d0eab2-5b0f-4f5c-94c3-d42335c63507_1120x588.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:588,&quot;width&quot;:1120,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!5pHa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d0eab2-5b0f-4f5c-94c3-d42335c63507_1120x588.png 424w, https://substackcdn.com/image/fetch/$s_!5pHa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d0eab2-5b0f-4f5c-94c3-d42335c63507_1120x588.png 848w, https://substackcdn.com/image/fetch/$s_!5pHa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d0eab2-5b0f-4f5c-94c3-d42335c63507_1120x588.png 1272w, https://substackcdn.com/image/fetch/$s_!5pHa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d0eab2-5b0f-4f5c-94c3-d42335c63507_1120x588.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This article was originally published on March 17, 2026 on Medium.</p>]]></content:encoded></item><item><title><![CDATA[Our Team’s Favorite AI Skills (And How We Use Them)]]></title><description><![CDATA[If you&#8217;ve spent enough time with an AI coding tool, you&#8217;ve noticed it has a default mode: Helpful.]]></description><link>https://blog.hellofriday.ai/p/our-teams-favorite-ai-skills-and-how-we-use-them-841623598b7e</link><guid isPermaLink="false">https://blog.hellofriday.ai/p/our-teams-favorite-ai-skills-and-how-we-use-them-841623598b7e</guid><dc:creator><![CDATA[Yena Oh]]></dc:creator><pubDate>Wed, 13 May 2026 21:21:31 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!YvKB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8c52a06-b24f-4020-9b18-928166f089a4_1120x1113.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you&#8217;ve spent enough time with an AI coding tool, you&#8217;ve noticed it has a default mode: Helpful. Agreeable. Thorough to the point of over-engineering. It&#8217;ll write the code, draft the email, answer the question, but always through the same lens.</p><p>But the promise of AI has always been the ability to do at scale the personal touches, that inherit and understand the context of the larger work the task you&#8217;ve asked of it sits in.</p><p>Skills helped bring that promise to life.</p><h2><strong>What&#8217;s a Skill, Exactly?</strong></h2><p>A skill is a reusable set of instructions you install into an AI agent to give it a specific capability or way of working. <a href="https://skills.sh/">skills.sh</a>, an &#8220;open agent skills ecosystem,&#8221; defines it as:</p><p><em>&#8220;Reusable capabilities for AI agents. Install them with a single command to enhance your agents with access to procedural knowledge.&#8221;</em></p><p>Under the hood, each skill is a <code>SKILL.md</code> file: a markdown document containing workflows, behavioral rules, best practices, or tool references. You install one with a single CLI command, and it&#8217;s active for that agent from that point on.</p><p>The key thing: skills are agent-agnostic. They work across Claude Code, Cursor, GitHub Copilot, Codex, Windsurf, Gemini, and 15+ others. Skills are <em>not </em>inherently tool-specific; you get to encode a way of working that any compatible agent can pick up and follow.</p><p>Over the last year, we&#8217;ve spent a ton of time working and building with AI, and we&#8217;ve accumulated a few favorites. Here are the ones that our team is using time and again.</p><h2><strong>1. Brainstorming &#8212; for getting a real sparring partner</strong></h2><p><a href="https://skills.sh/obra/superpowers/brainstorming">skills.sh/obra/superpowers/brainstorming</a></p><p>This is the one that gets referenced in our team chat the most.</p><p>By default, most AI assistants are optimized to be helpful, which usually means they agree with you, fill in the blanks charitably, and move toward execution fast. That&#8217;s great when you know what you want. It&#8217;s less great when you&#8217;re still figuring it out.</p><p>This skill flips the dynamic. It enforces a design-before-code gate: no implementation until ideas are validated, trade-offs are surfaced, and you&#8217;ve explicitly signed off. The agent asks one clarifying question at a time, presents 2&#8211;3 approaches with real trade-offs, and writes a spec doc before touching anything.</p><p>The result is a thinking partner that actually pushes back. Not a &#8220;helpful assistant&#8221; &#8212; a sparring partner.</p><p>63K weekly installs. It&#8217;s popular for a reason.</p><h2><strong>2. Karpathy Guidelines &#8212; for keeping AI code honest</strong></h2><p><a href="https://skills.sh/forrestchang/andrej-karpathy-skills/karpathy-guidelines">skills.sh/forrestchang/andrej-karpathy-skills/karpathy-guidelines</a></p><p>Recommended by our cofounder Eric, and it comes up in conversations about AI coding assistants a lot.</p><p>Andrej Karpathy has been vocal about a specific frustration: LLM coding assistants over-engineer, make silent assumptions, and change things you didn&#8217;t ask them to touch. This skill is a direct response to that.</p><p>Four behavioral guardrails get baked in:</p><ul><li><p>Think before coding: surface assumptions explicitly, never decide silently</p></li><li><p>Simplicity first: write the minimum viable code, nothing speculative</p></li><li><p>Surgical changes: only touch what the task requires, match existing style</p></li><li><p>Goal-driven execution: turn vague tasks into verifiable success criteria before starting</p></li></ul><p>It also adds a habit of asking additional clarifying questions about code, which sounds minor until you realize how often an unasked question leads to a half-wrong implementation.</p><p>For anyone frustrated by AI&#8217;s tendency to do too much, this one&#8217;s worth installing.</p><h2><strong>3. Svelte Code Writer &#8212; for working in a framework you don&#8217;t know</strong></h2><p><a href="https://skills.sh/sveltejs/ai-tools/svelte-code-writer">skills.sh/sveltejs/ai-tools/svelte-code-writer</a></p><p>This one comes from a practical place: wanting an AI to produce reasonable Svelte output without having to become a Svelte expert first.</p><p>Maintained officially by the Svelte team, this skill gives the agent live access to Svelte 5 and SvelteKit documentation during your session. It can browse available docs, fetch full documentation on specific topics, and run <code>svelte-autofixer</code> on <code>.svelte</code> files before finalizing anything.</p><p>The difference between an AI guessing at a framework&#8217;s conventions and actually looking them up is significant. You get code that follows real Svelte standards rather than a confident hallucination of what those standards might be.</p><p>Especially useful if you&#8217;re moving fast in a framework that isn&#8217;t your home base.</p><h2><strong>4. Debugging &#8212; for structured bug hunts</strong></h2><p><a href="https://skills.sh/supercent-io/skills-template/debugging">skills.sh/supercent-io/skills-template/debugging</a></p><p>Debugging with an AI ad hoc can feel scattered. You paste an error, it suggests a fix, you try it, something else breaks, and the cycle repeats.</p><p>This skill brings structure to that process. It walks the agent through a 6-step debugging workflow: gather info &#8594; reproduce &#8594; isolate &#8594; root cause analysis &#8594; fix &#8594; verify and prevent regression. It covers common bug archetypes &#8212; race conditions, memory leaks, off-by-one errors &#8212; and recommends the right tool for the job depending on your language (<code>pdb</code>, Chrome DevTools, <code>Delve</code>, etc.).</p><p>The last step is the one that makes it worth it: always write a regression test. Not sometimes. Always.</p><p>Good for when you want the investigation to actually end.</p><h2><strong>How to Add a Skill to Friday AI</strong></h2><p>If you want to use one of these with Friday, just paste any URL from GitHub or skills.sh into a conversation with a little bit of context. That&#8217;s it.</p><p>It&#8217;ll read the skill, confirm what it does, and apply it going forward in that conversation. It&#8217;ll also find other conversations or workspaces that would leverage that Skill, without you having to work through a configuration file or settings page. Just tell Friday what you want to work with, for what scenarios, and it&#8217;ll go from there.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YvKB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8c52a06-b24f-4020-9b18-928166f089a4_1120x1113.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YvKB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8c52a06-b24f-4020-9b18-928166f089a4_1120x1113.png 424w, https://substackcdn.com/image/fetch/$s_!YvKB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8c52a06-b24f-4020-9b18-928166f089a4_1120x1113.png 848w, https://substackcdn.com/image/fetch/$s_!YvKB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8c52a06-b24f-4020-9b18-928166f089a4_1120x1113.png 1272w, https://substackcdn.com/image/fetch/$s_!YvKB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8c52a06-b24f-4020-9b18-928166f089a4_1120x1113.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YvKB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8c52a06-b24f-4020-9b18-928166f089a4_1120x1113.png" width="1120" height="1113" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a8c52a06-b24f-4020-9b18-928166f089a4_1120x1113.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1113,&quot;width&quot;:1120,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!YvKB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8c52a06-b24f-4020-9b18-928166f089a4_1120x1113.png 424w, https://substackcdn.com/image/fetch/$s_!YvKB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8c52a06-b24f-4020-9b18-928166f089a4_1120x1113.png 848w, https://substackcdn.com/image/fetch/$s_!YvKB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8c52a06-b24f-4020-9b18-928166f089a4_1120x1113.png 1272w, https://substackcdn.com/image/fetch/$s_!YvKB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8c52a06-b24f-4020-9b18-928166f089a4_1120x1113.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The more skills you add to Friday, the more it starts to feel like something built exactly for you. They&#8217;re an effective way to give Friday the context it needs to make every output, every draft, and every automation more refined to exactly how you work. And since adding one is just a URL paste away, there&#8217;s really no reason not to.</p><p>The goal isn&#8217;t to configure your AI once and forget it. It&#8217;s to give the right version of it to the right task, every time.</p><p><em><a href="https://hellofriday.ai/">Try Friday free</a> to start putting your skills to work.</em></p><p>This was article originally published on March 24, 2026 on Medium.</p>]]></content:encoded></item><item><title><![CDATA[What Is an Agent Harness? The Real Work in AI Agents]]></title><description><![CDATA[If you&#8217;ve been following the AI space even remotely over the past few years, you&#8217;ll know that conversations have mostly focused on the model.]]></description><link>https://blog.hellofriday.ai/p/what-is-an-agent-harness-the-real-work-in-ai-agents-ddba3efcd1ac</link><guid isPermaLink="false">https://blog.hellofriday.ai/p/what-is-an-agent-harness-the-real-work-in-ai-agents-ddba3efcd1ac</guid><dc:creator><![CDATA[Yena Oh]]></dc:creator><pubDate>Tue, 12 May 2026 21:08:22 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d9fcfd8c-f932-4d16-9a5f-bcab4486e156_1024x538.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you&#8217;ve been following the AI space even remotely over the past few years, you&#8217;ll know that conversations have mostly focused on the model. And while debating which ones are the smartest, least hallucinatory, and best at code is genuinely useful, we do ourselves a disservice by not considering the wider system.</p><p>While the topic is still nascent, the field seems to have converged onto a simple formula noted first by <a href="https://x.com/Vtrivedy10/status/2031408954517971368">Viv Trivedy</a>: <strong>Agent = Model + Harness</strong>.</p><p><strong>What is an agent harness? </strong>It&#8217;s everything that wraps around a language model to make it a functioning agent. That includes the system prompts, tools it can call, memory it reads, orchestration logic, context management, and the constraints that prevent it from doing the wrong thing. The model generates tokens while the harness decides what the model sees, what happens with the output, and what runs next.</p><p><a href="https://addyosmani.com/blog/agent-harness-engineering/">Addy Osmani </a>says it best: &#8220;A decent model with a great harness beats a great model with a bad one.&#8221; That is where most of the engineering leverage sits right now, and &#8220;harness engineering&#8221; has become one of the fastest-growing areas of discussion in the AI practitioner community in 2026.</p><h2><strong>The rise of harness engineering</strong></h2><p>In February 2026, Mitchell Hashimoto, creator of Vagrant and Terraform, published <a href="https://mitchellh.com/writing/my-ai-adoption-journey">&#8220;My AI Adoption Journey.&#8221;</a> Step 5 was titled &#8220;Engineer the Harness&#8221;:</p><blockquote><p><em>&#8220;I&#8217;ve grown to calling this &#8216;harness engineering.&#8217; It is the idea that anytime you find an agent makes a mistake, you take the time to engineer a solution such that the agent never makes that mistake again.&#8221;</em></p></blockquote><p>Two months later, Addy Osmani published <a href="https://addyosmani.com/blog/agent-harness-engineering/">&#8220;Agent Harness Engineering,&#8221;</a> the most thorough public treatment of the subject to date:</p><blockquote><p><em>&#8220;A coding agent is the model plus everything you build around it. Harness engineering treats that scaffolding as a real artifact, and it tightens every time the agent slips.&#8221;</em></p></blockquote><p><a href="https://x.com/Vtrivedy10/status/2031408954517971368">Viv Trivedy</a>&#8217;s sums it up best with a formula that&#8217;s oft quoted across the industry:</p><blockquote><p><em>Agent = Model + Harness. If you&#8217;re not the model, you&#8217;re the harness.</em></p></blockquote><p>Claude Code, Cursor, Codex, Aider are all harnesses built on top of similar (and sometimes identical) underlying models. Yet ask any practitioner in the community, and they&#8217;ll swear by their favorite tool as the most reliable, easy-to-use, or consistent. That&#8217;s because the behavior people experience is shaped by the <em>harness</em>.</p><h2><strong>What do agent harnesses solve for?</strong></h2><p>The topic clearly resonated with AI enthusiasts.</p><p>On May 2, 2026, a post called <a href="https://news.ycombinator.com/item?id=47990675">&#8220;The agent harness belongs outside the sandbox&#8221;</a> hit the front page of Hacker News with 181 points and 121 comments. Practitioners across the community spent two hours arguing about where harness logic should live relative to execution environments.</p><p>Viv Trivedy&#8217;s <a href="https://x.com/Vtrivedy10/status/2031408954517971368">breakdown of harness anatomy</a> on X has drawn over 2,000 likes (and counting). On April 30, shell implementation of a complete agent harness called <a href="https://news.ycombinator.com/item?id=47968112">Pu.sh</a> hit HN with a fair amount of excitement and debate, solidifying the point that a full harness doesn&#8217;t have to be a framework. It can exist within 400 lines of code.</p><p>And if you read through the endless conversations on X, Reddit, Hacker News, you&#8217;ll see three recurring AI pains that agent harnesses are meant to address:</p><p><strong>Context rot.</strong> As context windows fill during long tasks, model output quality significantly degrade and the signal-to-noise ratio in what the model is reading drops. Good harnesses address this with compaction, selective tool output, and context resets between subtasks. They make it a known infrastructure problem rather than model problem.</p><p><strong>Prompt drift.</strong> Run today&#8217;s prompt tomorrow (or the day after that), and the output will inevitably drift. Bump model versions as new ones release and your old behavior will eventually break. That&#8217;s the nature of non-deterministic LLM, alongside the quickly changing, ever improving models that get released at breakneck speeds. The harness helps deliver consistent and reliable results, regardless of the model, by locking the agent&#8217;s behavior in more deterministic configuration rather than floating in a prompt.</p><p><strong>Vulnerabilities: S</strong>ecurity researcher Simon Willison calls it the <a href="https://simonwillison.net/2025/Jun/16/the-lethal-trifecta/">&#8220;lethal trifecta&#8221;</a>: an agent with access to private data, exposure to untrusted content, and the ability to communicate externally. An attacker who controls the untrusted content channel can direct the agent to exfiltrate private data. The harness is the only layer where all three risks are addressed together.</p><h2><strong>What does the agent harness market look like?</strong></h2><p>The harness market, while still nascent, organized itself around those three problems. And as with any market, we&#8217;re slowly seeing the space differentiate itself into four clear categories that each serve different needs:</p><h2><strong>Code-first frameworks</strong></h2><p>Some of the earliest versions of an agent harness, code-first frameworks like LangChain, LlamaIndex, AutoGen, CrewAI are Python libraries for developers who want to build agents from the ground up. These frameworks are typically expressive and composable, but require deep expertise, weeks to months of assembly, and constant maintenance and management to.</p><h2><strong>Visual and low-code builders</strong></h2><p>Visual and low code tools like n8n, Langflow, and Flowise are drag-and-drop interfaces for connecting models to tools and data. But many practitioners hit a ceiling. Complex conditional logic, proper error handling, and multi-step agent behavior get unwieldy fast in visual editors. And tools like n8n works well for automations that follow a fixed path, but for dynamic paths, where the agent needs to decide what to do next, visual tools tend to be too brittle to work in production.</p><h2><strong>Cloud lab wrappers</strong></h2><p>Cloud lab wrappers include products like OpenAI Agents SDK, Anthropic&#8217;s Claude Agent SDK, and Google&#8217;s Gemini-based agent tooling. These give you a managed runtime backed by the provider&#8217;s own infrastructure, but the tradeoff is model lock-in. Your harness is designed around one provider&#8217;s APIs, and moving is expensive. And with how quickly the model space has expanded past the frontier models, developers need the flexibility to mix and match across LLM providers.</p><h2><strong>Off-the-shelf, integrated platforms</strong></h2><p>We&#8217;ve seen momentum building for off-the-shelf platforms that don&#8217;t require deep developer knowledge or brittle workflows to deliver agentic results. Tools like Friday Studio sit in this category; these platforms that give you a full harness runtime (memory, MCP tools, signals, orchestration, scheduling) with a conversation-based interface for configuring it, and a durable, deterministic config format that owns the result.</p><p>The appeal is the same reason people use Rails instead of assembling a web stack from scratch. You don&#8217;t want to wire up a message bus, a credential store, a scheduler, a context manager, and an MCP client one-by-one. You want the harness primitives to already exist so you can spend your effort on understanding what&#8217;s specific to your task. You can get something working in an afternoon, and reliability features like retry logic, observability, integrations, and human-in-the-loop approvals are already in the platform, rather than on a to-do list to build.</p><p>The line between good integrated platforms and bad ones is whether the config they produce is legible and visible. Workflows built on a platform that generates opaque state that you can&#8217;t inspect, version, or hand to a teammate can&#8217;t realistically be used in a production environment; they&#8217;re no better than a demo. What you need is a platform that produces a readable config file that you can diff, share, and run the same way on any machine.</p><h2><strong>What makes a good agent harness?</strong></h2><p><a href="https://addyosmani.com/blog/agent-harness-engineering/">Osmani</a> has a better break down of this than I can provide, which I&#8217;ll summarize here:</p><p><strong>Earn every component.</strong> Every piece of a harness should trace to a failure it prevents or a behavior it enables. Hashimoto&#8217;s rule is that every line in a good <code>AGENTS.md</code> should trace back to something that went wrong.</p><p><strong>Manage context on purpose.</strong> The agent only knows what is in its context window. A harness that loads every tool, every skill, every doc at startup degrades performance before the agent takes a single action. Good harnesses load skills when the task calls for them, offload large tool outputs to the filesystem, and compact on long runs.</p><p><strong>Enforce rather than guidelines.</strong> Prompts that say &#8220;never do X&#8221; don&#8217;t act as enforcement. Enforcement means hooks that run before and after tool calls, block destructive commands, andrequire approval before external writes. A real production system needs to enforce.</p><p><strong>Treat every failure as a configuration problem.</strong> Osmani and HumanLayer both make the point that most agent failures are configuration problems. If the agent doesn&#8217;t know a convention, then add it. If the agent runs a destructive command, then block it with a hook. A bad run calls for a harness improvement rather than blindly retrying against the model.</p><p><strong>Produce configuration.</strong> A harness that stores its logic in floating prompts or a platform-specific database creates lock-in and fragility. A harness that produces a versioned, readable config file that behaves the same way regardless of which machine runs it.</p><h2><strong>Where Friday fits</strong></h2><p>Friday Studio is a complete agent harness. It builds in memory, MCP tool integrations, a scheduler, credential management, FSM-backed job orchestration, and a signal system into a single platform. You don&#8217;t have to spend hours wiring those pieces together yourself because they&#8217;re already there, out-of-the-box.</p><p>Two things separate Friday from other options in the space:</p><p>The first is that <strong>configuration is the output. </strong>You describe what you want in chat (&#8220;Every morning, triage my inbox, draft replies, file real asks as Linear tickets&#8221;) and Friday generates a <code>workspace.yml</code> that specifies the agents, the tools they can call, the signals that trigger them, and the FSM jobs that orchestrate the work. That file is readable, diffable, version-controllable, and portable. You can hand it to a teammate and it runs exactly the same on their machine with their own accounts and tools. Most integrated platforms trap their config in a GUI canvas or a proprietary database, but Friday produces a file you own.</p><p>The second is that you do not need to be a developer to use it. Friday is built for the tightening loop Hashimoto and Osmani describe, where each failure becomes a configuration fix. All you need to do is tell Friday what went wrong (or ask it to diagnose itself) and it&#8217;ll update the config. The YAML is there if you want make configuration changes yourself, but you do not have to touch it to get a production-grade harness.</p><p>That combination of a complete harness runtime, generated from conversation, producing config you own is what makes Friday the shortest path from &#8216;I want an agent that does X&#8217; to an agent that actually reliably does X, on schedule, every time.</p><p><em>Friday is <a href="https://github.com/friday-platform/friday-studio">open source on GitHub</a> and available as a one-click installer for macOS at <a href="https://hellofriday.ai/">hellofriday.ai</a>.</em></p><h2><strong>Where agent harnesses are headed</strong></h2><p>Better models will never make harnesses obsolete; instead, they raise the ceiling for a satisfactory solution that meets all of a user&#8217;s needs. For example, scaffolding that handled context problems six months ago is now dead code because the models solved that problem. But the tasks now reachable have their own failure modes, and those require new harness layers.</p><p>Three directions have real momentum right now:</p><p><strong>Multi-agent coordination.</strong> Single-agent pipelines hit limits on complex tasks. The pattern gaining traction is specialized agents: planner, executor, and reviewer, each scoped tightly and coordinated by the harness. Friday&#8217;s FSM-backed jobs and JetStream message bus handle this. You define which agents run, in what order and with what tools, and the runtime fans the work out and brings it back.</p><p><strong>Just-in-time context assembly. </strong>Loading everything at startup is one of the most common production mistakes. Friday&#8217;s skill system works the other way: agents load skills on demand, tool access is whitelisted per agent, and each agent in a job sees only what its role requires.</p><p><strong>Self-improving harnesses.</strong> The Meta-agent project ran an LLM-driven loop that proposed targeted harness updates from failed traces, validated against a holdout set, moving a customer-service agent from 67% to 87% task accuracy. Friday doesn&#8217;t close this loop automatically yet, but durable, readable config is the prereq, and its the direction Friday is headed.</p><p>Osmani points toward harnesses that act closer to a compiler, generating optimal scaffolding from a task spec at runtime. Friday&#8217;s conversation-to-config model is the nearest current step in that direction.</p><p>The practitioners driving this conversation are mostly developers today. But the pattern: every mistake becomes a rule, config ships the behavior, the harness tightens over time, doesn&#8217;t have to stay that way. The work is in the design.</p><p><em>Friday is <a href="https://github.com/friday-platform/friday-studio">source available on GitHub</a> and available as a one-click installer for macOS at <a href="https://hellofriday.ai/">hellofriday.ai</a>.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jRJQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57edffcc-9adc-4894-981f-a2b14724ea93_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jRJQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57edffcc-9adc-4894-981f-a2b14724ea93_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!jRJQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57edffcc-9adc-4894-981f-a2b14724ea93_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!jRJQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57edffcc-9adc-4894-981f-a2b14724ea93_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!jRJQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57edffcc-9adc-4894-981f-a2b14724ea93_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jRJQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57edffcc-9adc-4894-981f-a2b14724ea93_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/57edffcc-9adc-4894-981f-a2b14724ea93_1456x1048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:28881,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.hellofriday.ai/i/197584182?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57edffcc-9adc-4894-981f-a2b14724ea93_1456x1048.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!jRJQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57edffcc-9adc-4894-981f-a2b14724ea93_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!jRJQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57edffcc-9adc-4894-981f-a2b14724ea93_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!jRJQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57edffcc-9adc-4894-981f-a2b14724ea93_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!jRJQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57edffcc-9adc-4894-981f-a2b14724ea93_1456x1048.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[OpenClaw is the best proof that AI agents need a different architecture]]></title><description><![CDATA[What makes Friday Studio different from every other AI agent tool]]></description><link>https://blog.hellofriday.ai/p/openclaw-is-the-best-proof-that-ai-agents-need-a-different-architecture-fed0c19d3647</link><guid isPermaLink="false">https://blog.hellofriday.ai/p/openclaw-is-the-best-proof-that-ai-agents-need-a-different-architecture-fed0c19d3647</guid><dc:creator><![CDATA[Yena Oh]]></dc:creator><pubDate>Thu, 07 May 2026 19:10:21 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/df310671-2858-4b91-a0ff-e2d0170c71f9_1024x641.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h4>What makes Friday Studio different from every other AI agent&nbsp;tool</h4><p>We launched Friday Studio last&#8230; Friday. Since then we&#8217;ve gotten a lot of great feedback, and even more bug reports. We&#8217;re pumped to tackle all of it. One question kept coming up that we thought deserved a real answer rather than a changelog entry:</p><p><em>How are you different from OpenClaw?</em></p><p>Fair question. OpenClaw showed everyone what agents could actually do, and it deserves its flowers for that. But it also exposed a set of problems that the community has been wrestling with openly, and those problems are exactly what Friday isbuilt to solve. So here&#8217;s our honest attempt at a comparison.</p><h3>The experience a lot of people are having with AI agents right&nbsp;now</h3><p>OpenClaw has 369,000 GitHub stars and a community that built something genuinely new: a self-hosted AI agent that reaches into your whole life, runs while you sleep, and actually does things. Peter Steinberger and the contributors around him proved that personal AI agents are real, and people want them&nbsp;badly.</p><p>That matters to us, because it&#8217;s the same thing we believe. The difference is in what happens after the&nbsp;demo.</p><p>A lot of people who tried OpenClaw, and honestly a lot of people who tried any AI agent tool in the last year, hit a version of the same wall. <a href="https://www.reddit.com/r/openclaw/comments/1souzrc/i_wanted_openclaw_to_work_after_3_months_im_done/">One user described it well</a> after three&nbsp;months:</p><blockquote><p>&#8220;Something always broke. If it wasn&#8217;t a config mismatch, it was a gateway issue. If it wasn&#8217;t that, it was models behaving inconsistently. I kept thinking: I&#8217;m one tweak away. Then: maybe I just need to restructure the pipeline. Then: maybe I&#8217;m using it wrong. I burned time, burned money, burned a lot of mental energy trying to &#8216;get it right.&#8217; And the truth is it just never stabilized. The system is building you into someone who spends hours debugging instead of actually doing the work you set out to&nbsp;do.&#8221;</p></blockquote><p>That post has 361 upvotes. What resonates is the pattern behind this complaint: you get your AI automation tool working, then something changes, you lose trust in what it&#8217;s actually doing, and you spend more time managing the agent than you would have spent doing the work yourself.</p><p>The two underlying problems have names. <strong>Prompt decay</strong> is what happens when a workflow that worked last month stops working because a model update changed how the LLM interprets your instructions. <strong>AI drift</strong> is what happens when an agent&#8217;s behavior shifts gradually over time, across memory updates and context changes, until it&#8217;s doing something subtly different from what you built. In a chat-based agent, both are invisible until something breaks. You don&#8217;t get a warning. Instead, you get a Tuesday when the brief doesn&#8217;t arrive, or <a href="https://www.theverge.com/ai-artificial-intelligence/883034/openclaw-ai-deleting-emails-stop-openclaw">a researcher watching her inbox get deleted</a> while she types &#8220;STOP&#8221; from her&nbsp;phone.</p><p>There are compounding problems too. Users running frontier models on background tasks found <a href="https://www.reddit.com/r/aiagents/comments/1rs7psv/if_you_have_your_openclaw_working_247_using/">38% of their token spend was status pings</a>, with bills hitting $300 a day before they caught it. Security researchers found <a href="https://astrix.security/learn/blog/openclaw-moltbot-the-rise-chaos-and-security-nightmare-of-the-first-real-ai-agent/">900+ exposed instances</a> leaking API keys, and <a href="https://www.theverge.com/news/874011/openclaw-ai-skill-clawhub-extensions-security-nightmare">malicious extensions</a> made it to the top of the download charts. These aren&#8217;t just edge cases. It&#8217;s what happens when a tool optimizes for capability before it optimizes for safety and observability.</p><p>We built Friday to solve this specific set of problems.</p><h3>Why we built Friday differently</h3><p>We read these threads before we shipped, and we felt these real issues long before that. The answer to prompt decay and AI drift will never be a better&nbsp;prompt.</p><p>The answer is a different architecture.</p><p>Friday treats your workflow as a defined, versioned artifact rather than conversation that has to be re-tuned every time a model update ships. Our cofounder, Eric Skram, speaks a little to this in his <a href="https://medium.com/friday-ai/what-does-it-actually-mean-for-ai-to-do-work-a8e8c20757fa">three-part series</a> on getting AI to do reliable&nbsp;work.</p><p>Here&#8217;s what that actually means in practice.</p><p><strong>Your workflow is a file you can read.</strong> Every agent, every job, every trigger, every integration in Friday lives in a single YAML file. You can open it in any text editor, commit it to git, diff it, and see what changed between versions. When we ship an update that changes behavior, you see it in the diff, so you don&#8217;t get hidden surprises across config files that have to agree in ways nobody documented. The configuration is the artifact. The tradeoff is that as workflows get more complex, the orchestration has to get smarter. That&#8217;s where the FSM model earns its&nbsp;keep.</p><p><strong>Every run leaves a trace, including failures.</strong> Friday&#8217;s job inspector shows the full state machine, a waterfall timeline of every step, and the complete input and output of every tool call, streamed in real time. A question that came up from ourcommunity: how does a deterministic config handle edge cases like tool failures or dynamic inputs? The answer is that each step either completes or it doesn&#8217;t, and you see exactly which one happened and why. A tool failure stops the job at that state and surfaces the error. Dynamic inputs pass through defined channels between steps. Nothing is swallowed silently. When an agent says it did something, you can verify it in thirty seconds. &#8220;It consistently lied to me&#8221; is a model problem we can&#8217;t solve, but we can make sure you know what the agent did versus what it claimed to&nbsp;do.</p><p><strong>Agents can&#8217;t expand their own scope.</strong> Friday jobs walk a finite state machine. Each state runs specific agents with specific inputs, transitions fire on specific events, and guards are plain JavaScript. An agent cannot decide mid-run to do something you didn&#8217;t define. The February incident where <a href="https://www.theverge.com/ai-artificial-intelligence/883034/openclaw-ai-deleting-emails-stop-openclaw">a researcher sent &#8220;STOP OPENCLAW&#8221; from her phone while watching the agent delete her inbox in real time</a> can&#8217;t happen here. The job definition controls what runs next, not the&nbsp;agent.</p><p><strong>Extensions can&#8217;t steal your credentials.</strong> OpenClaw&#8217;s skill system is executable code. Friday&#8217;s is Markdown. A bad skill in Friday can give wrong instructions to an LLM. It can&#8217;t write to your filesystem or pull your API keys. The attack surface is smaller by design, not by&nbsp;policy.</p><p><strong>Updates don&#8217;t break your workflows.</strong> We&#8217;re new enough that we haven&#8217;t earned trust on this one yet, but we&#8217;re building toward a promise: breaking changes will be explicit, versioned, and documented before they ship. The workspace.lock file pins the versions your job depends on. You opt into changes; they don&#8217;t roll over&nbsp;you.</p><p><strong>You don&#8217;t manage API costs in the dark.</strong> Every session shows token usage. Cron jobs don&#8217;t run on your most expensive model unless you set that up. You see what&#8217;s spending before it becomes a surprise&nbsp;bill.</p><p><strong>Security is the default, not the configuration.</strong> All Friday services bind to localhost only. API keys are never written to your workspace YAML or logs. The credential store is separate from the runtime. HTML previews are sandboxed with a strict content security policy. We&#8217;re SOC 2 Type II certified. None of that requires you to do anything after&nbsp;install.</p><h3>The same task, side by&nbsp;side</h3><p>Abstract principles only go so far. This is what the difference looks like when you sit down to build something.</p><h4>Scenario 1: You want a weekly competitive intelligence brief</h4><p><strong>How this usually&nbsp;goes</strong></p><p>You write a SOUL.md that instructs your agent to search for competitor news each Monday. You add a HEARTBEAT.md entry with a cron expression. You tune the memory prompt so it remembers what it found last week. Three config files now have to agree for this to work. When it runs, you get a WhatsApp message. Whether it searched the right things, checked the right sources, or hallucinated a summary, you have no way to tell. When Update 3.31 ships and your heartbeat stops firing, you find out on Tuesday when the brief doesn&#8217;t&nbsp;arrive.</p><p><strong>With Friday</strong></p><p>A single YAML file defines the cron trigger, which sources the web agent checks, what the summary agent produces, and where the email goes. You commit it to git and on Monday at 8am it runs. The job inspector shows you every source the web agent visited, every decision the summary agent made, and the exact email that went out. If something breaks, you see which step failed and why. A teammate can clone the repo, import the workspace, and run it without asking you how it&nbsp;works.</p><h4>Scenario 2: You want automated code review on every pull&nbsp;request</h4><p><strong>How this usually&nbsp;goes</strong></p><p>You configure a webhook trigger and write a prompt instructing your agent to review PRs. The agent receives the webhook, decides how to interpret it, chooses which tools to call, and posts a comment, if the model feels like it. Users in r/openclaw describe agents that respond "Review complete!" having done nothing. There's no way to define which steps run, in which order, on which inputs. If the review agent posts a vague top-level comment instead of inline line-by-line feedback, you go back to the prompt and start tuning. Each model update can change the behavior you spent hours dialing&nbsp;in.</p><p><strong>With Friday</strong></p><p>The webhook fires when a PR opens. The job reads the diff, passes it to the review agent with a defined prompt and defined tools, and posts the result as inline comments at specific line numbers on the pull request. Each step is explicit. If the diff-reading step fails, the review step doesn't run. If the review agent produces output but the GitHub post fails, you see that in the trace. The whole sequence lives in the YAML. Your team can read it, review it, and change it the same way they'd change application code.</p><h4>Scenario 3: Someone new joins your team and needs to run your automations</h4><p><strong>How this usually&nbsp;goes</strong></p><p>Your setup lives across SOUL.md, MEMORY.md, BOOT.md, a handful of installed skills, and weeks of context accumulated in your agent's memory. (BOOT.md doesn't auto-load, by the way. That's a documented gotcha that catches most users.) You write a handover doc. The new person installs OpenClaw, tries to replicate your config, hits a version mismatch, and spends two days getting to where you were. Your tuned behavior is tribal knowledge, not a transferable artifact.</p><p><strong>With Friday</strong></p><p>You share a git repo with one YAML file. They import the workspace. It runs. The agents, the jobs, the triggers, the integrations, all of it is in that file, readable and version-pinned. There's nothing to reconstruct.</p><h3>What we're&nbsp;not</h3><p>This article wouldn&#8217;t be a fair comparison without acknowledging where OpenClaw stands&nbsp;out.</p><p>OpenClaw connects to your entire life: 28 chat apps, smart home devices, health wearables, local models through Ollama. You can text it from iMessage. It has voice mode. There's a mobile companion app. It has 369,000 stars and a ClawHub extension library with hundreds of community-built skills.</p><p>Friday has 53 stars. We're macOS only for the desktop installer. We don't do voice, we don't control your lights, we don't have a mobile app (at least, not yet). Our community is small. But give us some grace, we're only five days&nbsp;old.</p><p>For people who want an AI woven into every app and device across their personal life, OpenClaw is further along, and the right choice if you have the technical appetite for&nbsp;it.</p><h3>Who Friday is for right&nbsp;now</h3><p>Friday is for the person who read those r/openclaw threads and recognized themselves. Someone who tried one of these tools, got it working, then watched an update break something. Or who set up an automation and had no idea what it did under the hood. Or who looked at their API bill and couldn't trace where it&nbsp;went.</p><p>Friday is for anyone who has been burned enough times by an agent that did the wrong thing, or said it did something it didn't, that reliability has become the feature they care about&nbsp;most.</p><p>We have a lot left to build and we know it. Windows and Linux desktop, more LLM providers, a cloud version, more integrations. We're not done, and you can contribute to it too. Friday Studio is source-available <a href="https://github.com/friday-platform/friday-studio">here</a>.</p><p>But the core promise, that your workflow runs the same way each time, leaves a trace each time, and doesn't surprise you, that part is&nbsp;ready.</p><p><em>Friday is <a href="https://github.com/friday-platform/friday-studio">source available on GitHub</a> and available as a one-click installer for macOS at <a href="https://hellofriday.ai/">hellofriday.ai</a>.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Tp9s!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F207c81b9-753f-4206-9da2-3e34c880f3d9_1024x641.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Tp9s!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F207c81b9-753f-4206-9da2-3e34c880f3d9_1024x641.png 424w, https://substackcdn.com/image/fetch/$s_!Tp9s!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F207c81b9-753f-4206-9da2-3e34c880f3d9_1024x641.png 848w, https://substackcdn.com/image/fetch/$s_!Tp9s!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F207c81b9-753f-4206-9da2-3e34c880f3d9_1024x641.png 1272w, https://substackcdn.com/image/fetch/$s_!Tp9s!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F207c81b9-753f-4206-9da2-3e34c880f3d9_1024x641.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Tp9s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F207c81b9-753f-4206-9da2-3e34c880f3d9_1024x641.png" width="1024" height="641" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/207c81b9-753f-4206-9da2-3e34c880f3d9_1024x641.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:641,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Tp9s!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F207c81b9-753f-4206-9da2-3e34c880f3d9_1024x641.png 424w, https://substackcdn.com/image/fetch/$s_!Tp9s!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F207c81b9-753f-4206-9da2-3e34c880f3d9_1024x641.png 848w, https://substackcdn.com/image/fetch/$s_!Tp9s!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F207c81b9-753f-4206-9da2-3e34c880f3d9_1024x641.png 1272w, https://substackcdn.com/image/fetch/$s_!Tp9s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F207c81b9-753f-4206-9da2-3e34c880f3d9_1024x641.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[How AI took an hour off my grocery shopping every week]]></title><description><![CDATA[My partner and I eat on a rotation.]]></description><link>https://blog.hellofriday.ai/p/how-friday-took-an-hour-off-my-grocery-shopping-every-week-86573374b4e8</link><guid isPermaLink="false">https://blog.hellofriday.ai/p/how-friday-took-an-hour-off-my-grocery-shopping-every-week-86573374b4e8</guid><dc:creator><![CDATA[Eric Skram]]></dc:creator><pubDate>Thu, 07 May 2026 17:02:44 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/86fc847d-4e65-442e-b9f6-8823a5ecbe18_676x646.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>My partner and I eat on a rotation. Four different food lists on a four-week cycle, designed so we&#8217;re not cooking the same things back to back. Every Saturday we pick meals for the coming week, and on Sunday we&nbsp;shop.</p><p>This system works for us. But the tooling is a separate&nbsp;problem.</p><p>I kept a backlog of recipes in one place. The weekly list lived somewhere on my phone. The shopping list got rebuilt from scratch every time, and I&#8217;d manually flatten ingredient overlaps across two or three recipes in my head. &#8220;We&#8217;re both using onions so that&#8217;s four total, not two plus two.&#8221; Existing apps that claim to handle this are cumbersome, or come with vendor&nbsp;lock-in.</p><p>I described the problem to Friday in a single&nbsp;message.</p><h3>The conversation</h3><blockquote><p>I want you to make me a workspace to help me manage my recipes, meal planning, and grocery list. I&#8217;ve attached a food chart. We rotate through each column of foods weekly, on a 4-week cycle. Generally on Saturdays we pick a meal plan for the coming week, then Sunday we shop. I want help tracking recipes, compiling the grocery list and sending it to&nbsp;me.</p></blockquote><p>Friday asked seven questions to make sure it got the details&nbsp;right.</p><p><strong>Where do you want the grocery list delivered? I&#8217;ve already got your email connected&#8202;&#8212;&#8202;we could use&nbsp;that.</strong></p><p>Great.</p><p><strong>How do you want to add random mid-week&nbsp;items?</strong></p><p>I&#8217;ll just shoot you a message&nbsp;here.</p><p><strong>How precise do you want ingredient quantities in&nbsp;recipes?</strong></p><p>Best effort&nbsp;, I&#8217;ll give you what I have, fill in reasonable quantities for the&nbsp;rest.</p><p><strong>How do you want to track which week of the rotation you&#8217;re&nbsp;in?</strong></p><p>We&#8217;re in the first week&#8217;s rotation now. Just take it from&nbsp;here.</p><p><strong>What happens to the shopping list and meal plan at the end of the&nbsp;week?</strong></p><p>Archive the meal plans, clear the shopping list when the email gets sent. You can consider finishing the week&#8217;s list by sending the&nbsp;email.</p><p>That was my idea and Friday ran with&nbsp;it.</p><p>After the seven questions, Friday reflected the whole thing&nbsp;back:</p><blockquote><p>The workspace tracks your 4-week food rotation, advances automatically every Sunday, and holds your recipe backlog as a living recipe book. You drive planning on Saturdays&#8202;&#8212;&#8202;name what you want to make, Friday builds the plan and loads ingredients onto the list. When you say &#8220;send the list,&#8221; it compiles everything, emails it, clears the list, and archives the meal plan. Ad-hoc items&#8202;&#8212;&#8202;just drop them in chat during the&nbsp;week.</p></blockquote><p>Then Friday just built&nbsp;it.</p><h3>What the workspace has</h3><p><strong>Four memory&nbsp;stores:</strong></p><ul><li><p>recipes&#8202;&#8212;&#8202;permanent backlog, quantities best-effort, week&nbsp;tags</p></li><li><p>meal-plans&#8202;&#8212;&#8202;archived forever, indexed by rotation week and&nbsp;date</p></li><li><p>shopping-list&#8202;&#8212;&#8202;active and ephemeral, clears on&nbsp;send</p></li><li><p>rotation-tracker&#8202;&#8212;&#8202;current week, auto-advances Sundays</p></li></ul><p><strong>Two jobs:</strong></p><ul><li><p>Send the list: compile, email, clear list, archive meal&nbsp;plan</p></li><li><p>Sunday cron: advance rotation&nbsp;tracker</p></li></ul><p><strong>Planning:</strong> just chat. No job, no form. I talk to it and it knows the&nbsp;context.</p><h3>Using it</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FSGP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e8a8467-4e56-4ce1-a279-2331798cb002_676x646.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FSGP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e8a8467-4e56-4ce1-a279-2331798cb002_676x646.png 424w, https://substackcdn.com/image/fetch/$s_!FSGP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e8a8467-4e56-4ce1-a279-2331798cb002_676x646.png 848w, https://substackcdn.com/image/fetch/$s_!FSGP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e8a8467-4e56-4ce1-a279-2331798cb002_676x646.png 1272w, https://substackcdn.com/image/fetch/$s_!FSGP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e8a8467-4e56-4ce1-a279-2331798cb002_676x646.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FSGP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e8a8467-4e56-4ce1-a279-2331798cb002_676x646.png" width="676" height="646" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0e8a8467-4e56-4ce1-a279-2331798cb002_676x646.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:646,&quot;width&quot;:676,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!FSGP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e8a8467-4e56-4ce1-a279-2331798cb002_676x646.png 424w, https://substackcdn.com/image/fetch/$s_!FSGP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e8a8467-4e56-4ce1-a279-2331798cb002_676x646.png 848w, https://substackcdn.com/image/fetch/$s_!FSGP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e8a8467-4e56-4ce1-a279-2331798cb002_676x646.png 1272w, https://substackcdn.com/image/fetch/$s_!FSGP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e8a8467-4e56-4ce1-a279-2331798cb002_676x646.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The email Friday sent&nbsp;me.</figcaption></figure></div><p>A few days after setup, I opened the workspace and dropped&nbsp;this:</p><blockquote><p>Heya, I need a quart of milk and 2 half-gallon things of Oatly this week, add it to my&nbsp;list</p></blockquote><p>Done. Three&nbsp;seconds.</p><p>Then I pointed it at a couple of recipes: one by URL, one from my old recipe manager. I told it to save them and add them to the grocery list for the week, and mentioned I had some of the basic ingredients on hand. Friday extracted the recipes, saved them to my recipe book, and added only what I didn&#8217;t&nbsp;have.</p><p>Then:</p><blockquote><p>Good deal, enough for now. Can you email it to&nbsp;me?</p></blockquote><p>Email sent, list&nbsp;cleared.</p><h3>What&#8217;s different about doing this in&nbsp;Friday</h3><p>I&#8217;ve used plenty of other tools for recipes. For example, Paprika is good at storing and scaling them. But it doesn&#8217;t know where I am in the rotation, doesn&#8217;t track the list, and doesn&#8217;t flatten ingredient overlaps across recipes and email me a grouped list on&nbsp;request.</p><p>The flattening is the thing I kept doing manually. Fajitas and a stir-fry in the same week both need bell peppers. I used to count that in my&nbsp;head.</p><p><strong>The workspace is real.</strong> Memory stores, jobs, a cron schedule that fires every Sunday at 6am Mountain. Not a description of what a workspace would look like. The actual&nbsp;thing.</p><p><strong>Context persists.</strong> When I say &#8220;I&#8217;ve already got avocado oil,&#8221; that shapes what goes on the list. When I ask about past meal plans, Friday pulls them. Nothing drops between sessions.</p><p><strong>The interface is conversation.</strong> I don&#8217;t fill out a recipe form. I give Friday a URL or a photo from a cookbook. Friday extracts what it needs. I don&#8217;t click &#8220;generate grocery list.&#8221; I say &#8220;send it&#8221; and it&nbsp;sends.</p><h3>What&#8217;s next</h3><p>Saturday planning is the part I&#8217;m most curious about. Friday knows which food list is active and can pull relevant recipes from the backlog before I ask. It already knows I make pumpkin chili once a&nbsp;month.</p><p><em>You can build the same thing on <a href="https://hellofriday.ai/">Friday Studio</a>. Free to start. You describe what you need, Friday asks the right questions, and the workspace e</em>xists.</p>]]></content:encoded></item><item><title><![CDATA[I stopped using 5 apps to plan trips. Here’s what I use instead.]]></title><description><![CDATA[I got into a two-day workshop in Charleston, SC.]]></description><link>https://blog.hellofriday.ai/p/i-stopped-using-5-apps-to-plan-trips-heres-what-i-use-instead-bb32cd3cecd8</link><guid isPermaLink="false">https://blog.hellofriday.ai/p/i-stopped-using-5-apps-to-plan-trips-heres-what-i-use-instead-bb32cd3cecd8</guid><dc:creator><![CDATA[Eric Skram]]></dc:creator><pubDate>Wed, 06 May 2026 18:51:17 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/578c5601-b9f6-468e-a10c-dc0dd165c4a1_1024x676.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I got into a two-day workshop in Charleston, SC. It only happens once a year in the US, so my partner and I booked around it: flights, hotel, rental car. What I didn&#8217;t have was a plan for the time that wasn&#8217;t already spoken&nbsp;for.</p><p>My usual process is sprawl: a Notion doc, a Google Maps list, a handful of tabs I forget to close, a notes app that never gets finished. I decided to try something different and work through it in a Friday conversation instead. Partly as a test, and partly because I was tired of maintaining five separate places for one&nbsp;trip.</p><p>Here&#8217;s the full conversation, step by&nbsp;step.</p><h3>1. The first message had nothing to do with&nbsp;planning</h3><p>I had the city and the weekend, but I was blanking on the workshop venue name. So I asked Friday to track it&nbsp;down.</p><blockquote><p>Me: We&#8217;re attending a two-day workshop in Charleston, SC next weekend. I know the general area but I&#8217;m drawing a blank on the venue name and organizer. Can you find&nbsp;it?</p></blockquote><blockquote><p>Friday: Found it. Venue confirmed, about 25 min from downtown. Only US workshop this year. Want me to save this and start building out the&nbsp;trip?</p></blockquote><p>It took one search. The address also turned out to matter for everything downstream. Knowing the venue was 25 minutes from downtown shaped what made sense to do on workshop evenings.</p><h3>2. Dropping in the logistics</h3><p>Next I shared my flight, hotel, and rental car confirmations as images and asked for help building an itinerary.</p><blockquote><p>Me: Going to Charleston May 22&#8211;25. Flights, hotel, and rental car are all booked. I&#8217;ll share the details as images. Help me build an itinerary around the workshop.</p></blockquote><p>Friday read the confirmations, created a workspace for the trip, saved everything to memory, and confirmed it was ready in a single response. It felt like setting up a project folder, except I didn&#8217;t touch anything.</p><p>The trip had a home, centralized in one place, not five. Every piece of research and every decision from here on lived&nbsp;there.</p><h3>3. Research with real constraints</h3><p>I asked for food options: Friday dinner, breakfasts Saturday through Monday, lunch on Monday. I gave it two constraints no seafood, and breakfasts should be light, like a good SF&nbsp;bakery.</p><blockquote><p>Me: Looking for food for Friday night, breakfasts sat/sun/mon, and lunch on Monday. For breakfasts something light, bakery/coffee shop, think like Tartine or similar. No seafood. Vegetarian-friendly options are a&nbsp;plus.</p></blockquote><blockquote><p>Friday: Researching all of these in parallel. A few things worth flagging: Welton&#8217;s Tiny Bakeshop&#8202;&#8212;&#8202;best pastries in Charleston, opens 8am Sat/Sun/Mon, but sells out early. Go first thing. WildFlour Pastry&#8202;&#8212;&#8202;great option Sat/Sun, but closed Monday. Worth knowing before you plan around it. For Friday dinner, all four shortlist options work for vegetarian. Ma&#8217;am Saab (Pakistani) and Basic Kitchen (veggie-forward American) are the strongest fits.</p></blockquote><p>WildFlour being closed Monday is the kind of thing you find by clicking through to the restaurant&#8217;s site. Friday flagged it upfront because it affected the plan. Same with Welton&#8217;s selling out early. A search for &#8220;Charleston bakery&#8221; returns a ranked list. This returned a filtered one with the gotchas already called&nbsp;out.</p><p>The constraints that shaped the research:</p><ul><li><p><strong>Dietary</strong>&#8202;&#8212;&#8202;No fish. Vegetarian-friendly preferred across all&nbsp;meals.</p></li><li><p><strong>Monday cutoff</strong>&#8202;&#8212;&#8202;Car dropoff at 2pm. Lunch had to be en route to the&nbsp;airport.</p></li><li><p><strong>Workshop evenings</strong>&#8202;&#8212;&#8202;Venue is 25 min from the hotel. Dinner with the group both nights, no solo planning&nbsp;needed.</p></li><li><p><strong>Proximity</strong>&#8202;&#8212;&#8202;Hotel is 5 min from Charles Towne Landing. Used to anchor Monday&nbsp;morning.</p></li></ul><p>None of these required a separate pass. They accumulated across the conversation and stayed live throughout.</p><h3>4. Monday&nbsp;morning</h3><p>Saturday and Sunday were full with the workshop. Friday evening was arrival and dinner. That left Monday morning before checkout. I asked for nature&nbsp;options.</p><blockquote><p>Me: Let&#8217;s figure out something to do in Charleston or nearby on Monday morning. Nature stuff is always&nbsp;fun.</p></blockquote><blockquote><p>Friday: The logistics work in your favor. Your hotel is right next to two good ones: Charles Towne Landing State Historic Site&#8202;&#8212;&#8202;5 min from your hotel. Live oak alley, marsh trails, Ashley River views. Opens 9am, $12/adult, no booking needed. Magnolia Plantation (Audubon Swamp Garden)&#8202;&#8212;&#8202;10 min from your hotel. Blackwater cypress swamp, alligators, herons. Opens 8am, ~$22/adult. Car dropoff is 2pm. Either fits a Monday morning window comfortably.</p></blockquote><p>I picked Charles Towne Landing. Five minutes from the hotel beats ten when you&#8217;re working around a 2pm car dropoff. Friday had the dropoff time from the confirmations I&#8217;d shared earlier and used it without being&nbsp;asked.</p><h3>5. The itinerary</h3><p>After landing on Charles Towne Landing and Rancho Lewis for Monday lunch, I asked Friday to stub out the full itinerary, leaving specific dinners and breakfasts open to decide closer to the&nbsp;trip.</p><pre><code>Friday, May 22
  9:39 AM  &#8212; Depart DEN
  2:59 PM  &#8212; Arrive CHS, pick up rental car
  ~3:30 PM &#8212; Check in to hotel
  Evening  &#8212; Historic district walk, dinner (shortlist below)</code></pre><pre><code>Saturday, May 23
  Morning  &#8212; Breakfast (shortlist below)
  All day  &#8212; Workshop, Day 1
             // Venue ~25 min from hotel, lunch provided on-site
  Evening  &#8212; Dinner with workshop group</code></pre><pre><code>Sunday, May 24
  Morning  &#8212; Breakfast (shortlist below)
  All day  &#8212; Workshop, Day 2
             // Lunch provided on-site
  Evening  &#8212; Dinner with workshop group</code></pre><pre><code>Monday, May 25
  Morning  &#8212; Check out, Charles Towne Landing
  Lunch    &#8212; Rancho Lewis (en route to airport)
  2:00 PM  &#8212; Drop off rental car
  4:01 PM  &#8212; Depart CHS</code></pre><p>The shortlists for breakfast and dinner sit at the bottom of the doc. Not locked in, just ready. I&#8217;ll go through them before we leave. The itinerary is a starting point, not a contract.</p><h3>6. The&nbsp;map</h3><p>The last thing I asked for was a&nbsp;map.</p><blockquote><p>Me: Can you make me a map of all those points so I can see where everything is?</p></blockquote><blockquote><p>Friday: There you go. Click any pin for details. Color coded by category&#8202;&#8212;&#8202;airport, Monday nature options, breakfast spots, Friday dinner options, Monday&nbsp;lunch.</p></blockquote><p>Friday generated an interactive map with every point from the conversation plotted and labeled: airport, both nature options, all four breakfast spots (with WildFlour flagged as closed Monday), all four dinner options, Monday&nbsp;lunch.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Qaab!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f67c8d-83a3-48d3-bed1-d0e6b6afed0d_1024x676.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Qaab!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f67c8d-83a3-48d3-bed1-d0e6b6afed0d_1024x676.png 424w, https://substackcdn.com/image/fetch/$s_!Qaab!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f67c8d-83a3-48d3-bed1-d0e6b6afed0d_1024x676.png 848w, https://substackcdn.com/image/fetch/$s_!Qaab!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f67c8d-83a3-48d3-bed1-d0e6b6afed0d_1024x676.png 1272w, https://substackcdn.com/image/fetch/$s_!Qaab!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f67c8d-83a3-48d3-bed1-d0e6b6afed0d_1024x676.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Qaab!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f67c8d-83a3-48d3-bed1-d0e6b6afed0d_1024x676.png" width="1024" height="676" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/70f67c8d-83a3-48d3-bed1-d0e6b6afed0d_1024x676.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:676,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Qaab!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f67c8d-83a3-48d3-bed1-d0e6b6afed0d_1024x676.png 424w, https://substackcdn.com/image/fetch/$s_!Qaab!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f67c8d-83a3-48d3-bed1-d0e6b6afed0d_1024x676.png 848w, https://substackcdn.com/image/fetch/$s_!Qaab!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f67c8d-83a3-48d3-bed1-d0e6b6afed0d_1024x676.png 1272w, https://substackcdn.com/image/fetch/$s_!Qaab!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f67c8d-83a3-48d3-bed1-d0e6b6afed0d_1024x676.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The map Friday generated for me of my travel itinerary.</figcaption></figure></div><p>When I&#8217;m traveling, a map is the first thing I build. Proximity is how you decide what&#8217;s worth doing. A bakery five minutes from the hotel is a different decision than one twenty minutes in the wrong direction. Normally I&#8217;d finish the research, then build the map separately in Google Maps. This came out of the same conversation.</p><h3>7. Making it follow&nbsp;you</h3><p>The itinerary was done and the map was plotted. The problem is I&#8217;ve got a four-day itinerary in a workspace I&#8217;ll never open on my phone at 7am standing in a hotel lobby. What I need each morning is the day&#8217;s plan, formatted for a phone screen, in my inbox, without thinking about&nbsp;it.</p><blockquote><p>Me: One more thing&#8202;&#8212;&#8202;while we&#8217;re on the trip, can you email me each morning with just that day&#8217;s schedule? I don&#8217;t want to be digging through the full itinerary on my&nbsp;phone.</p></blockquote><blockquote><p>Friday: Done. Scheduled a morning briefing for each day of the trip. I&#8217;ll pull the relevant day from the itinerary and send it at 7am. Want me to include the breakfast shortlist too, or just the locked-in items?</p></blockquote><blockquote><p>Me: Breakfast shortlist included, but only the top pick for each day. Keep it&nbsp;short.</p></blockquote><p>Friday built three things inside the workspace to make that happen: an agent that reads the itinerary and writes the email, a job that sends it, and a cron schedule that fires it at 7am Eastern each morning of the&nbsp;trip.</p><p>What lands in my inbox Saturday morning is plain text, short enough to read while deciding whether to walk or drive to breakfast. One breakfast pick, the day&#8217;s events, any logistics that matter that morning. The Monday car dropoff time I mentioned five messages ago shows up automatically.</p><p>The conversation started with finding a venue and ended with a plan that shows up at the hotel each&nbsp;morning.</p><blockquote><p>20 messages total. First: find this venue. Last: make it follow me to the trip. In between: a workspace, a full itinerary, four breakfast options, four dinner options, two nature spots, Monday lunch, a live map, and four morning briefings. Every constraint tracked across the whole conversation.</p></blockquote><h3>How this is different from tools like&nbsp;ChatGPT</h3><p>I&#8217;ve used ChatGPT for travel research before. It&#8217;s good at generating lists. You ask &#8220;best bakeries in Charleston,&#8221; you get six options with summaries. That&#8217;s&nbsp;useful.</p><p>The gap shows up fast though. If you start a new conversation, it doesn&#8217;t know about the car dropoff at 2pm. It doesn&#8217;t know we don&#8217;t do seafood. It doesn&#8217;t know the venue is 25 minutes from downtown, so it can&#8217;t factor that into what makes sense for dinner. You carry all of that in your head and re-explain it every&nbsp;time.</p><p>A few things that are different with&nbsp;Friday:</p><p><strong>It builds things, not just text.</strong> Friday generated a working interactive map as an artifact in the conversation. I can click around, with pins color-coded by category. It also built the morning email automation: an agent, a job, a cron schedule, all wired together and running. ChatGPT would tell you how to build those things, while Friday builds&nbsp;them.</p><p><strong>It keeps context across the whole conversation.</strong> The car dropoff time from message 2 shaped the lunch recommendation in message 14. The venue distance from message 1 fed into the dinner suggestions six messages later. In a standard chat tool, you&#8217;d have to re-paste that context every time you started a new&nbsp;thread.</p><p><strong>It shows up after you close the tab.</strong> The morning emails aren&#8217;t contingent on me opening the app. They&#8217;re scheduled and the workspace runs, as long as your computer is on. Friday sends the email at 7am whether or not I&#8217;ve thought about the trip that day. That&#8217;s the part that&#8217;s hard to get from a chat interface that only responds when you talk to&nbsp;it.</p><h3>What made this&nbsp;work</h3><p>The usual process is sprawl. A Notion doc for logistics, Google Maps for geography, a notes app for food research, browser tabs for everything you haven&#8217;t saved yet. The problem with those tools is that none of them talk to each other. You end up as the connective tissue. You remember the car dropoff is at 2pm when picking a lunch spot. You check whether WildFlour is open&nbsp;Monday.</p><p>Friday tracked all of it because it was all in one place. Nothing dropped between steps because there were no&nbsp;steps.</p><p>The map took one message. Every point was already known. The work was&nbsp;done.</p><h3>What&#8217;s still&nbsp;open</h3><p>Friday dinner and the specific bakery for each morning aren&#8217;t locked in. I&#8217;ll go through the shortlists before we leave. The itinerary is a starting&nbsp;point.</p><p>The workspace will be there when we&#8217;re ready to finish&nbsp;it.</p><p><em>Try this now on<a href="http://hellofriday.ai"> Friday Studio</a>. It&#8217;s free to use and minutes to set&nbsp;up.</em></p>]]></content:encoded></item><item><title><![CDATA[Building a Personal Fitness Tracker in One Conversation]]></title><description><![CDATA[The request was simple:]]></description><link>https://blog.hellofriday.ai/p/building-a-personal-fitness-tracker-in-one-conversation-1ae2696a89f7</link><guid isPermaLink="false">https://blog.hellofriday.ai/p/building-a-personal-fitness-tracker-in-one-conversation-1ae2696a89f7</guid><dc:creator><![CDATA[David Woolf]]></dc:creator><pubDate>Tue, 05 May 2026 17:11:14 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/60844d8e-734a-44bf-afe0-fd7d1b759c72_1024x884.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The request was&nbsp;simple:</p><blockquote><p>I want to track my workouts and nutrition. I&#8217;m tracking lifting sessions (upper body and lower body days), and my meals throughout the day (calories, protein, fiber, and carbs). I have a goal of 150g of protein every&nbsp;day.</p></blockquote><p>One conversation later, I had a full workspace: log workouts by typing a few lines, log meals with macro breakdowns, get a daily summary against the 150g protein goal, and generate personalized workout plans that rotate exercises based on what you&#8217;ve done recently&nbsp;, all accessible from Telegram. Here&#8217;s exactly how Friday built it, tool call by tool&nbsp;call.</p><div id="youtube2-BHQoi5ErSxA" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;BHQoi5ErSxA&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/BHQoi5ErSxA?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3>Step 1: Loading the right&nbsp;skills</h3><p>Before writing a single line of config, Friday loaded the platform skills that govern workspace design: the FSM job authoring rules, signal schema conventions, and Python agent SDK patterns. These act as strict playbooks that prevent the most common runtime failures.</p><p><strong>Skill &#8594; load_skill("writing-workspace-jobs")</strong><br>Loaded FSM job authoring guide&#8202;&#8212;&#8202;initial state trigger matching, outputTo / inputFrom chaining, emit/transition naming, and the most common silent-failure patterns.</p><p><strong>Skill &#8594; load_skill("writing-workspace-signals")</strong><br>Loaded signal authoring guide&#8202;&#8212;&#8202;HTTP signal schemas, form field rendering from schema.properties, cron validation, path collision rules.</p><h3>Step 2: Designing the workspace</h3><p>Four capabilities needed to exist: log a workout session, log a meal with macros, get a daily summary, and generate a fresh workout plan based on history. Each one maps to a signal + agent + job&nbsp;triple.</p><p>&#127947;&#65039; <strong>Log Workout</strong> <em>(llm + memory_save)</em><br>Accepts workout type (upper/lower), exercises with weights, and optional notes. Writes a structured [WORKOUT] entry to the notes memory store with date and all exercise&nbsp;details.</p><p>&#129367; <strong>Log Meal</strong> <em>(llm + memory_save)</em><br>Accepts meal name, calories, protein, fiber, and carbs. Writes a timestamped [MEAL] entry to memory. Format is consistent so the summary agent can parse and sum it reliably.</p><p>&#128203; <strong>Generate Workout Plan</strong> <em>(llm + memory_read)</em><br>Reads recent [WORKOUT] entries from memory. Determines the next workout type (opposite of last). Identifies exercises done in the last 2&#8211;3 sessions and builds a fresh 5&#8211;6 exercise plan avoiding repeats, covering all major muscle groups, with sets, reps, and&nbsp;RPE.</p><p>&#128202; <strong>Daily Summary</strong> <em>(llm + memory_read)</em><br>Reads all [MEAL] and [WORKOUT] entries from today. Sums macros (calories, protein, carbs, fiber). Compares protein against the 150g goal and reports how much remains&#8202;&#8212;&#8202;or confirms the goal was&nbsp;hit.</p><h3>Step 3: Creating the workspace</h3><p>Friday created a fresh workspace and opened a draft to stage all changes atomically&#8202;&#8212;&#8202;nothing goes live until validation passes.</p><p><strong>Tool Call &#8594; create_workspace({ name: "Fitness Tracker" })</strong><br>workspace.id: square_zucchini<br>path: ~/.atlas/workspaces/Fitness Tracker</p><p><strong>Tool Call &#8594; begin_draft(workspaceId: "square_zucchini")</strong><br>Opened workspace.yml.draft. All upserts stage into the draft until publish_draft is called. Nothing can break the live workspace mid-build.</p><h3>Step 4: Building the four&nbsp;agents</h3><p>All four agents were upserted in parallel&#8202;&#8212;&#8202;no need to serialize independent writes.</p><p><strong>Tool Call &#8594; upsert_agent("log-workout-agent", { type: "llm", tools: ["memory_save", "memory_read"] })</strong><br><strong>Workout logger.</strong> Records a structured [WORKOUT - &lt;type&gt;] entry with date, exercise names, weights, and notes. Reads prior entries first so it can include context in its confirmation response.</p><p><strong>Tool Call &#8594; upsert_agent("log-meal-agent", { type: "llm", tools: ["memory_save", "memory_read"] })</strong><br><strong>Meal logger.</strong> Writes a [MEAL] entry in a fixed format: date time: meal&#8202;&#8212;&#8202;cal kcal | P: Xg | F: Xg | C: Xg. Consistent format is critical&#8202;&#8212;&#8202;the summary agent parses these entries to compute daily&nbsp;totals.</p><p><strong>Tool Call &#8594; upsert_agent("daily-summary-agent", { type: "llm", tools: ["memory_read", "memory_save"] })</strong><br><strong>Daily summary.</strong> Reads all [MEAL] and [WORKOUT] entries from today, sums the macros, compares protein to the 150g goal, and produces a structured report.</p><p><strong>Tool Call &#8594; upsert_agent("workout-planner-agent", { type: "llm", tools: ["memory_read"] })</strong><br><strong>Intelligent workout planner.</strong> Reads recent [WORKOUT] entries, determines the opposite of the last session type, cross-references exercises from the last 2&#8211;3 sessions, and generates a fresh plan. Read-only&#8202;&#8212;&#8202;no memory_save so it can't accidentally overwrite history.</p><blockquote><p>Optional preferences field threads through: "no barbell today", "keep it under 45 min", "hypertrophy focus"&#8202;&#8212;&#8202;all honored in the plan&nbsp;output.</p></blockquote><h3>Step 5: Defining the&nbsp;signals</h3><p>Three HTTP signals, each with a typed JSON schema that renders as a form in the Run dialog. The schema is what makes the difference between a button that fires a job and a button that collects meaningful input.</p><p><strong>Signal: /log-workout</strong></p><ul><li><p>workout_type (required)&#8202;&#8212;&#8202;Upper Body or Lower&nbsp;Body</p></li><li><p>exercises (required)&#8202;&#8212;&#8202;e.g. "Bench 3x8 185lb, OHP 3x10&nbsp;115lb"</p></li><li><p>notes&#8202;&#8212;&#8202;Optional: energy level, PRs,&nbsp;etc.</p></li></ul><p><strong>Signal: /log-meal</strong></p><ul><li><p>meal_name (required)&#8202;&#8212;&#8202;e.g. "Chicken and&nbsp;rice"</p></li><li><p>calories (required)&#8202;&#8212;&#8202;Calories&nbsp;(kcal)</p></li><li><p>protein (required)&#8202;&#8212;&#8202;Protein in&nbsp;grams</p></li><li><p>carbs (required)&#8202;&#8212;&#8202;Carbohydrates in&nbsp;grams</p></li><li><p>fiber (required)&#8202;&#8212;&#8202;Fiber in&nbsp;grams</p></li></ul><p><strong>Signal: /generate-workout-plan</strong></p><ul><li><p>preferences&#8202;&#8212;&#8202;Optional: e.g. "no barbell", "short&nbsp;session"</p></li></ul><h3>Step 6: Wiring the jobs and publishing</h3><p>Four single-step FSM jobs&#8202;&#8212;&#8202;each one routes a signal to its agent and uses outputTo to surface the result back to the&nbsp;caller.</p><pre><code>idle
  &#9492;&#9472; log-workout &#9472;&#9472;&#9654; run
       agentId: log-workout-agent
       outputTo: workout-log-result
       type: final</code></pre><pre><code>idle
  &#9492;&#9472; log-meal &#9472;&#9472;&#9654; run
       agentId: log-meal-agent
       outputTo: meal-log-result
       type: final</code></pre><pre><code>idle
  &#9492;&#9472; daily-summary &#9472;&#9472;&#9654; run
       agentId: daily-summary-agent
       outputTo: daily-summary-result
       type: final</code></pre><pre><code>idle
  &#9492;&#9472; generate-workout-plan &#9472;&#9472;&#9654; run
       agentId: workout-planner-agent
       outputTo: workout-plan-result
       type: final</code></pre><p><strong>Tool Call &#8594; validate_workspace(workspaceId: "square_zucchini")</strong><br>status: &#10003; ok &#183; errors: [ ] &#183; warnings: [&nbsp;]</p><p><strong>Result &#8594; publish_draft &#8594; success.</strong> Draft atomically promoted to live config. Workspace is&nbsp;running.</p><h3>Step 7: One more thing&#8202;&#8212;&#8202;adding the workout&nbsp;planner</h3><p>The initial workspace was live. Then came a follow-up in the same conversation:</p><blockquote><p>I also want you to generate workout plans when I request them, alternating upper and lower body workouts and prioritizing exercises I haven&#8217;t done in the last 2&#8211;3 sessions.</p></blockquote><p>Friday opened a new draft, added the workout-planner-agent and generate-workout-plan signal and job, validated (clean), and published&#8202;&#8212;&#8202;all in one&nbsp;turn.</p><p>The planner reads the memory store to find recent [WORKOUT] entries, determines upper vs lower based on what ran last, cross-references exercises from the last 2&#8211;3 sessions of the same type, and generates a plan that avoids repeats while hitting all major muscle&nbsp;groups.</p><blockquote><p><strong>Why read-only for the planner?</strong> The workout-planner-agent only has memory_read in its tools whitelist&#8202;&#8212;&#8202;not memory_save. A planner shouldn't write to history; only actual logged sessions should. Keeping the tool list minimal is what makes the tool list meaningful.</p></blockquote><h3>Step 8: Using it live&#8202;&#8212;&#8202;from&nbsp;Telegram</h3><p>The real test: the workspace ran in production the same day it was built, accessed from Telegram.</p><p>Friday computed the macros from scratch&#8202;&#8212;&#8202;running a Python script to estimate calories and grams from raw food descriptions&#8202;&#8212;&#8202;then fired the log-meal job directly. No form needed when you're on Telegram; Friday parsed the natural language and filled in the&nbsp;fields.</p><p><strong>Memory across surfaces.</strong> The workout logged from the playground and the meal logged from Telegram both write to the same notes memory store on the square_zucchini workspace. The daily summary sees everything, regardless of where each entry came&nbsp;from.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tiGS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07fcadaf-938c-4cb4-a857-cc56539787ec_1024x884.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tiGS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07fcadaf-938c-4cb4-a857-cc56539787ec_1024x884.png 424w, https://substackcdn.com/image/fetch/$s_!tiGS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07fcadaf-938c-4cb4-a857-cc56539787ec_1024x884.png 848w, https://substackcdn.com/image/fetch/$s_!tiGS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07fcadaf-938c-4cb4-a857-cc56539787ec_1024x884.png 1272w, https://substackcdn.com/image/fetch/$s_!tiGS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07fcadaf-938c-4cb4-a857-cc56539787ec_1024x884.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tiGS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07fcadaf-938c-4cb4-a857-cc56539787ec_1024x884.png" width="1024" height="884" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/07fcadaf-938c-4cb4-a857-cc56539787ec_1024x884.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:884,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!tiGS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07fcadaf-938c-4cb4-a857-cc56539787ec_1024x884.png 424w, https://substackcdn.com/image/fetch/$s_!tiGS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07fcadaf-938c-4cb4-a857-cc56539787ec_1024x884.png 848w, https://substackcdn.com/image/fetch/$s_!tiGS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07fcadaf-938c-4cb4-a857-cc56539787ec_1024x884.png 1272w, https://substackcdn.com/image/fetch/$s_!tiGS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07fcadaf-938c-4cb4-a857-cc56539787ec_1024x884.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Using Telegram to communicate with the&nbsp;space.</figcaption></figure></div><h3>What you actually&nbsp;get</h3><p>Four signals you can fire from any surface&#8202;&#8212;&#8202;the platform UI, Telegram, or the HTTP&nbsp;API:</p><ol><li><p><strong>Log Workout</strong>&#8202;&#8212;&#8202;type your exercises with weights and notes. Saved to memory with a consistent format, timestamped, ready for the planner to&nbsp;read.</p></li><li><p><strong>Log Meal</strong>&#8202;&#8212;&#8202;enter macros directly, or describe food in plain language and let Friday calculate them for you. Each entry is written to memory in a parseable format.</p></li><li><p><strong>Generate Workout Plan</strong>&#8202;&#8212;&#8202;reads your history, determines upper vs lower, finds what you did recently, and generates a fresh 5&#8211;6 exercise plan with sets, reps, and coaching cues. Gets better as you log&nbsp;more.</p></li><li><p><strong>Daily Summary</strong>&#8202;&#8212;&#8202;reads every meal and workout from today, sums your macros, and shows where you stand against the 150g protein&nbsp;goal.</p></li></ol><p>The memory store accumulates over time. After a few weeks, the planner has a real rotation to work from. The data is yours, local, and not dependent on any third-party fitness&nbsp;app.</p><p><em>Want to try this out yourself? <a href="http://hellofriday.ai">Download Friday Studio</a> and import the &#8220;Fitness Tracker&#8221; space to get&nbsp;started.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-h6l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf5aac82-f3f3-41f7-881b-1f02621a6144_1024x538.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-h6l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf5aac82-f3f3-41f7-881b-1f02621a6144_1024x538.png 424w, https://substackcdn.com/image/fetch/$s_!-h6l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf5aac82-f3f3-41f7-881b-1f02621a6144_1024x538.png 848w, https://substackcdn.com/image/fetch/$s_!-h6l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf5aac82-f3f3-41f7-881b-1f02621a6144_1024x538.png 1272w, https://substackcdn.com/image/fetch/$s_!-h6l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf5aac82-f3f3-41f7-881b-1f02621a6144_1024x538.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-h6l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf5aac82-f3f3-41f7-881b-1f02621a6144_1024x538.png" width="1024" height="538" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/df5aac82-f3f3-41f7-881b-1f02621a6144_1024x538.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:538,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!-h6l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf5aac82-f3f3-41f7-881b-1f02621a6144_1024x538.png 424w, https://substackcdn.com/image/fetch/$s_!-h6l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf5aac82-f3f3-41f7-881b-1f02621a6144_1024x538.png 848w, https://substackcdn.com/image/fetch/$s_!-h6l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf5aac82-f3f3-41f7-881b-1f02621a6144_1024x538.png 1272w, https://substackcdn.com/image/fetch/$s_!-h6l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf5aac82-f3f3-41f7-881b-1f02621a6144_1024x538.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[AI Drift: The Hidden Cost of Building with AI]]></title><description><![CDATA[Introducing Friday Studio]]></description><link>https://blog.hellofriday.ai/p/ai-drift-the-hidden-cost-of-building-with-ai-e2b51415b3b0</link><guid isPermaLink="false">https://blog.hellofriday.ai/p/ai-drift-the-hidden-cost-of-building-with-ai-e2b51415b3b0</guid><pubDate>Fri, 01 May 2026 06:25:29 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/2ed3a04e-96b5-4610-bef9-1b93451d2c8a_1024x538.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h4>Introducing Friday&nbsp;Studio</h4><p><em>Tl;dr and TGIF&#8202;&#8212;&#8202;Download Friday Studio&nbsp;<a href="https://www.hellofriday.ai">here</a>.</em></p><p>AI can do real work now. Connect it to your tools, your inbox, your code and it acts. That part is figured&nbsp;out.</p><p>The challenge is keeping it working. Run the same workflow tomorrow and the output shifts. Come back next week and it&#8217;s forgotten the preferences you set. The automation you trusted quietly stops holding up the moment you stop watching. That&#8217;s AI drift, and it&#8217;s costing you more than you&nbsp;realize.</p><p>&lt;a href="https://medium.com/media/8f78d209e8c02c6f721dabf5254e2a28/href"&gt;https://medium.com/media/8f78d209e8c02c6f721dabf5254e2a28/href&lt;/a&gt;</p><p>The cost isn&#8217;t dramatic. It doesn&#8217;t announce itself. It shows up as the hour you spend figuring out why a workflow that ran fine last Tuesday is broken today. The context you rebuild every time memory resets. The preferences you re-explain because nothing stuck. The automations you quietly abandon and replace with your own two hands because at least you can be trusted to finish the&nbsp;job.</p><p>AI drift is why you&#8217;re still doing it yourself.</p><p>I kept hitting this. Workflows I trusted would stop producing consistent results. A system that felt autonomous on Monday and needed hand-holding by Friday. I built Friday Studio because I got tired of paying that cost, and I didn&#8217;t think anyone else should have to&nbsp;either.</p><p>When we launched Friday earlier this year, the bet was simple: describe what you want done, and Friday runs it continuously across your tools without re-prompting. That bet was right. People built real things with it: competitive monitors, inbox workflows, relationship trackers, briefings that showed up every morning without anyone asking. What we learned from those early builders is that the promise holds, but the infrastructure underneath it has to be bulletproof. Consistent outputs. Persistent memory. Workflows that survive the weekend without you. That&#8217;s what Friday Studio is built to&nbsp;deliver.</p><h3>What Friday&nbsp;Is</h3><p>Friday Studio is a macOS app that runs AI workflows on your machine. Describe what you need, import a ready-made space, or build your own. Friday handles the rest on schedule, with and without you. Every workflow is a transparent config file you can read, share, and version. Nothing is a black box. Nothing&nbsp;drifts.</p><p>The root cause of AI drift is prompts. Prompts are instructions that get interpreted fresh every time. The model doesn&#8217;t remember how it reasoned last Tuesday. The context window shifts. The output drifts. For one-off tasks that&#8217;s fine. For anything running on a schedule, it&#8217;s the whole&nbsp;problem.</p><p>Friday is built around one conviction: configuration beats&nbsp;prompts.</p><p>When you describe what you want in the Studio chat, Friday doesn&#8217;t just do the thing, it builds a configuration that captures exactly how the thing should be done. The result is a workspace.yml file that defines which agents run, in what order, triggered by what, with what data flowing between steps. That configuration is the specification for what happens every time, not a memory of what happened last&nbsp;time.</p><p>Configuration is the contract, and the contract travels with the&nbsp;work.</p><p>Import a space someone else built and it runs on your machine today, identically. No setup steps to re-derive, no config to reverse-engineer. Chat history isn&#8217;t portable. Prompts aren&#8217;t reproducible. Config files are&nbsp;both.</p><h3>Three Primitives. Everything Else&nbsp;Follows.</h3><p>Everything in Friday is built from three concepts. Once you understand them, any workflow becomes straightforward to reason&nbsp;about.</p><p>Signals are how work starts. A cron schedule, an incoming webhook, a Slack message, a manual trigger. You define what to listen for and Friday handles the listening. This is what makes Friday autonomous: it doesn&#8217;t need you to start&nbsp;it.</p><p>Agents are what do the work. Friday ships with a full library of built-in agents covering web research, email, GitHub, Slack, Google Calendar, code execution, data analysis, and more. When you need something that doesn&#8217;t exist, Friday writes the agent itself based on what you&#8217;re trying to accomplish. You describe the outcome and Friday figures out what needs to exist to produce&nbsp;it.</p><p>Jobs are how agents work together. A job chains agents into a pipeline, passing structured data from one step to the next. Steps can run in parallel, branch conditionally, or wait on upstream results. The whole thing is defined in configuration that&#8217;s transparent, repeatable, and easy to&nbsp;modify.</p><p>Put them together and you get workflows that trigger on their own, execute reliably across multiple agents, and produce consistent results every time, without you writing or maintaining any of the plumbing.</p><p>Here&#8217;s what that looks like for something real. Inbox Zero runs every morning at 8am. It scans your unread emails, walks you through the ones that need a decision, remembers your choices, and over time handles the obvious ones itself and flags only what it&#8217;s unsure about. Here&#8217;s a simplified version of the&nbsp;config:</p><pre><code># Example of a Friday workspace configuration
version: '1.0'
workspace:
  name: Inbox Zero
  description: &gt;-
    Interactive inbox triage with letter-key actions (Archive, Keep, Mark Unread, Delete,
    Unsubscribe) and proactive auto-processing with preference memory

signals:
  triage-inbox:
    description: Trigger interactive inbox triage &#8212; pull 10 unread emails and review with letter-key actions
    provider: http
    config:
      path: /inbox-zero/triage

jobs:
  triage-inbox-job:
    description: &gt;-
      Interactive inbox triage &#8212; presents 10 unread emails with (A)rchive (K)eep (U)nread (D)elete
      (S)ubscribe actions
    triggers:
      - signal: triage-inbox
    fsm:
      initial: idle
      states:
        idle:
          'on':
            triage-inbox:
              target: review
        review:
          entry:
            - type: agent
              agentId: inbox-reviewer
              outputTo: triage-result
              prompt: &gt;-
                Load preferences, fetch the 10 most recent unread emails, and walk through each one
                interactively presenting (A)rchive (K)eep (U)nread (D)elete (S)ubscribe options.
                Save preference patterns to memory after completing all 10.
            - type: emit
              event: DONE
          'on':
            DONE:
              target: done
        done:
          type: final

agents:
  inbox-reviewer:
    description: &gt;-
      Fetches the latest 10 unread emails and presents them one-by-one for interactive triage with
      letter-key actions.
    type: llm
    config:
      provider: anthropic
      model: claude-sonnet-4-6
      prompt: &gt;-
        You are an inbox triage assistant for [INSERT EMAIL RECIPIENT HERE]

        Your job:
        1. Search for the 10 most recent unread emails using search_gmail_messages with query
        'is:unread in:inbox' and maxResults=10.

        2. Fetch their full content in a batch using get_gmail_messages_content_batch.

        3. For each email, display a clear summary card:

           &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;
           [#N of 10] Subject: ...
           From: ...
           Date: ...
           Preview: (first ~150 chars of body)
           &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;
           (A) Archive  (K) Keep  (U) Mark Unread  (D) Delete  (S) Unsubscribe

        4. Wait for the user's letter input, then apply the action:
           - A &#8594; remove INBOX label (archive) via modify_gmail_message_labels
           - K &#8594; do nothing, move to next
           - U &#8594; add UNREAD label via modify_gmail_message_labels (re-mark unread)
           - D &#8594; add TRASH label via modify_gmail_message_labels
           - S &#8594; look for an unsubscribe link in the email body, present it to the user, and mark the email as archived

        5. After each action, note the sender/domain and action taken. At the end of all 10, call
        memory_save with store='preferences' and a brief narrative update. Use the name found in the
        'notes' memory store (look for an entry like 'User's name is ...') &#8212; if found, use that name
        (e.g. 'Joe archives newsletters from X, deletes promotions from Y, keeps emails from Z
        domains'); if not found, fall back to 'The user'. Merge with any existing preference
        patterns.


        6. Display a summary of all actions taken at the end.


        Always check the 'preferences' memory store at the start to load any prior triage
        preferences and use them to suggest likely actions (show the suggestion in brackets next to
        each option, e.g. '(A) Archive [suggested]').
      temperature: 0.3
      max_steps: 60
      tools:
        - google-gmail/search_gmail_messages
        - google-gmail/get_gmail_messages_content_batch
        - google-gmail/get_gmail_message_content
        - google-gmail/modify_gmail_message_labels
        - memory_save
        - memory_read
# ...</code></pre><p>A cron signal fires at 8am. A scanner agent pulls your unread emails. A triage agent processes them, informed by everything Friday has learned about your preferences. Import this on any machine and it runs identically. The preferences stick. The behavior holds. No&nbsp;drift.</p><h3>Built to Hold&nbsp;Up</h3><p><strong>Shareable by design. </strong>Every space is a single file that captures everything: which agents run, in what order, triggered by what, with what memory. The same pipeline that ran on your machine runs identically on your teammate&#8217;s, on a CI server, or six months from&nbsp;now.</p><p><strong>Observable by default.</strong> Friday ships with a Job Inspector, a visual pipeline view with a waterfall timeline for every run. Each step expands to show exactly what the agent received, what it produced, and how long it took. When something breaks, you know immediately where and why, without digging through logs or adding instrumentation.</p><p><strong>Runs without you. </strong>Friday&#8217;s autopilot loop runs on a schedule, executes tasks, and reflects on what happened whether you&#8217;re in the Studio or not. It&#8217;s built to keep going when you&#8217;re not watching.</p><p><strong>Memory that doesn&#8217;t reset.</strong> Tell Friday your preferences once and they persist across every session. Context accumulates across runs and gets sharper over time. Stored locally, always readable, never starting from&nbsp;scratch.</p><p><strong>Skills for consistency.</strong> Friday integrates Skills, which are versioned, reusable instruction sets that load before an agent executes and anchor its behavior to specific patterns. Skills make agent output predictable across runs rather than something you have to re-prompt your way into. They&#8217;re shareable, browsable in the Studio, and composable across&nbsp;spaces.</p><p><strong>Local-first, no compromise. </strong>Friday runs entirely on your machine. Your data stays local, your workflows stay private, and there&#8217;s no usage telemetry or SaaS dependency. Download the installer and you have a full instance running in minutes, with a built-in Cloudflare tunnel so external services can reach your workflows on day&nbsp;one.</p><p><strong>A platform that expands itself.</strong> Friday writes agents. When a workflow needs a capability that doesn&#8217;t exist, Friday builds it, wires it in, and the next run uses it. No restart, no redeployment. Each new agent connects to your real systems and becomes a permanent part of the space, available to every future workflow that needs&nbsp;it.</p><h3>Getting Started</h3><ol><li><p>Download Friday at <a href="http://hellofriday.ai/">hellofriday.ai</a>&#8202;&#8212;&#8202;macOS installer, up in&nbsp;minutes</p></li><li><p>Load a starter space under Discover&nbsp;Spaces</p></li><li><p>Trigger your first job from chat or&nbsp;manually</p></li></ol><p>The CLI gives you full control over spaces, sessions, agents, and logs. The Studio gives you a visual layer on top with run history, pipeline inspection, a skills browser, and a built-in agent tester. Full documentation is at <a href="http://docs.hellofriday.ai/">docs.hellofriday.ai</a>.</p><p>We&#8217;re in <a href="https://discord.gg/uczJyp5FMH">Discord</a> if you want to compare notes. It&#8217;s a good&nbsp;room.</p><p>Friday is built to keep going when you&#8217;re not watching. Skip straight to&nbsp;done.</p><h3>What You Can&nbsp;Build</h3><p>Friday works across a wide range of surfaces and use cases like monitoring, communication, research, operations, personal productivity. These are a few spaces available to import and run&nbsp;today:</p><p><strong><a href="https://github.com/friday-platform/friday-studio-examples/tree/main/inbox-zero">Inbox Zero&#8202;</a></strong>&#8212;&#8202;Walks you through your unread emails one at a time, remembers your choices, and eventually runs every morning at 8am handling the obvious ones itself and flagging anything it&#8217;s unsure&nbsp;about.</p><p><strong><a href="https://github.com/friday-platform/friday-studio-examples/tree/main/daily-operating-memo">Daily Operating Memo&#8202;</a></strong>&#8212;&#8202;Pulls your calendar and emails every weekday at 7:30am, synthesizes them into a single priority briefing, and delivers it to your inbox before you open your&nbsp;laptop.</p><p><strong><a href="https://github.com/friday-platform/friday-studio-examples/tree/main/competitive-monitor">Competitive Monitor</a></strong><a href="https://github.com/friday-platform/friday-studio-examples/tree/main/competitive-monitor">&#8202;</a>&#8212;&#8202;Every Monday morning, researches your tracked competitors, clusters findings by theme, and delivers a sourced brief with confirmed article links and verified&nbsp;dates.</p><p><strong><a href="https://github.com/friday-platform/friday-studio-examples/tree/main/github-pr-reviewer">GitHub PR Reviewer&#8202;</a></strong>&#8212;&#8202;Paste a PR URL and Friday reads the full file contents, analyzes for bugs, security issues, and style problems, then posts inline comments with a verdict directly on the pull request. Wire it to your CI pipeline via webhook and it runs automatically on every&nbsp;PR.</p><p><strong><a href="https://github.com/friday-platform/friday-studio-examples/tree/main/networking-crm">Networking CRM</a></strong><a href="https://github.com/friday-platform/friday-studio-examples/tree/main/networking-crm">&#8202;</a>&#8212;&#8202;A relationship tracker you message via Telegram. Log interactions, ask what you know about someone, or find out who you&#8217;re overdue to follow up with. Memory persists and compounds across every&nbsp;session.</p><p><strong><a href="https://github.com/friday-platform/friday-studio-examples/tree/main/rtx-price-monitor">RTX Price Monitor</a></strong><a href="https://github.com/friday-platform/friday-studio-examples/tree/main/rtx-price-monitor">&#8202;</a>&#8212;&#8202;Checks Best Buy, Newegg, Amazon, and B&amp;H every hour and emails you a direct buy link the moment a listing drops under your target price and shows as in&nbsp;stock.</p><p>Anything with a webhook, an API, or a trigger condition can become a Friday workflow. Every one of these is a space you can import and run today, exactly as&nbsp;built.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NNzH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e2aa16e-17c3-445e-a7dc-6a3c84506f96_1024x538.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NNzH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e2aa16e-17c3-445e-a7dc-6a3c84506f96_1024x538.png 424w, https://substackcdn.com/image/fetch/$s_!NNzH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e2aa16e-17c3-445e-a7dc-6a3c84506f96_1024x538.png 848w, https://substackcdn.com/image/fetch/$s_!NNzH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e2aa16e-17c3-445e-a7dc-6a3c84506f96_1024x538.png 1272w, https://substackcdn.com/image/fetch/$s_!NNzH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e2aa16e-17c3-445e-a7dc-6a3c84506f96_1024x538.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NNzH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e2aa16e-17c3-445e-a7dc-6a3c84506f96_1024x538.png" width="1024" height="538" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2e2aa16e-17c3-445e-a7dc-6a3c84506f96_1024x538.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:538,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!NNzH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e2aa16e-17c3-445e-a7dc-6a3c84506f96_1024x538.png 424w, https://substackcdn.com/image/fetch/$s_!NNzH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e2aa16e-17c3-445e-a7dc-6a3c84506f96_1024x538.png 848w, https://substackcdn.com/image/fetch/$s_!NNzH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e2aa16e-17c3-445e-a7dc-6a3c84506f96_1024x538.png 1272w, https://substackcdn.com/image/fetch/$s_!NNzH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e2aa16e-17c3-445e-a7dc-6a3c84506f96_1024x538.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>Try Friday today at <a href="http://hellofriday.ai">hellofriday.ai</a>.</em></p><div><hr></div><p>This article was originally posted on April 30, 2026 on Medium.</p>]]></content:encoded></item><item><title><![CDATA[How We Maintain a Coherent D&D Campaign World with AI]]></title><description><![CDATA[Every Dungeon Master has the same problem.]]></description><link>https://blog.hellofriday.ai/p/how-we-maintain-a-coherent-d-d-campaign-world-with-ai-1fb9dd7ecd7e</link><guid isPermaLink="false">https://blog.hellofriday.ai/p/how-we-maintain-a-coherent-d-d-campaign-world-with-ai-1fb9dd7ecd7e</guid><dc:creator><![CDATA[Yena Oh]]></dc:creator><pubDate>Thu, 02 Apr 2026 16:01:02 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/72851c50-4d11-44bb-8e81-70323d0652e3_1024x538.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every Dungeon Master has the same&nbsp;problem.</p><p>You spend three hours building an inn. Your players walk past it, spot a blacksmith&#8217;s shop you invented on the fly, and spend the whole session interrogating the owner like he&#8217;s the main villain. On the way out, they adopt the enemy&#8217;s horse and name him&nbsp;Tony.</p><p>This is the best part of D&amp;D. It&#8217;s also the part that upends your prep on a weekly&nbsp;basis.</p><p>So you wing it in the moment, scribble notes after the session, and try to remember what Tony&#8217;s backstory was three weeks later. The result is a campaign world that&#8217;s rich in some places, threadbare in others, with NPCs who occasionally contradict their own motivations because you forgot what you said two months&nbsp;ago.</p><p>Our team member, Sara, thought that there&#8217;s a better way to handle&nbsp;that.</p><h3>The actual problem with AI and creative&nbsp;work</h3><p>Most AI tools approach creative writing like a vending machine. You describe what you want, something comes back, and you choose to use it or you&nbsp;don&#8217;t.</p><p>That&#8217;s fine for one-off tasks, but it starts to fall apart for a living campaign&nbsp;world.</p><p>A vending machine doesn&#8217;t know that the corrupt city guard from session four is actually the estranged nephew of the merchant who hired the party in session one. It doesn&#8217;t know that the thieves&#8217; guild controls the docks and would logically have a presence in any port city your players visit. It doesn&#8217;t know what the campaign already contains, so it generates something technically competent and completely disconnected.</p><p>The result is NPCs who feel like they were dropped in from outside. Players pick up on it fast, even if they can&#8217;t name it. The world starts to feel&nbsp;thin.</p><p>What you actually want is something with&nbsp;memory.</p><h3>What it looks&nbsp;like</h3><p>Using Friday, we set up a system that does two things: generates NPCs and generates side&nbsp;quests.</p><p>Sounds pretty standard so far, but here&#8217;s what&#8217;s different.</p><p>When you ask for a new NPC, the system doesn&#8217;t start from scratch. It first reads every character already in your campaign, including their faction affiliations, backstories, locations, and relationships. It builds a picture of the existing world before it writes a single word of the new character. Then it generates the full 5e stat block: race, class, all six ability scores, saving throws, AC, HP, spells, equipment, personality traits, ideals, bonds,&nbsp;flaws.</p><p>More importantly, it produces history notes and cross-references. &#8220;This NPC was once a lieutenant in the same mercenary company as the disgraced knight from session two. They parted on bad terms after a contract gone wrong in the northern provinces.&#8221; The new character arrives already woven into the&nbsp;world.</p><p>The side quest generator works the same way. It reads your full NPC roster, chooses the characters that fit the tone and theme you described, and explains why each one was selected. The resulting quest involves people your players already know, at locations that already exist, with complications that grow from your campaign&#8217;s existing tensions.</p><p>Every NPC and every quest gets saved and the world compounds over&nbsp;time.</p><h3>What this looks like in&nbsp;practice</h3><p>Here&#8217;s an example. The players decide, entirely unprompted, that they wanted to investigate a series of disappearances in a dockside district. Nothing&#8217;s prepared.</p><p>Four sentences of notes go into Friday: the tone, a rough idea of who was behind it, the kind of encounter wanted at the end. The system comes back with a complete quest arc, two new NPCs, and a twist that connected the disappearances to a merchant faction the players had already crossed earlier in the campaign.</p><p>The DM might have already forgotten about that faction, but the <em>system</em> doesn&#8217;t. It captured there in the roster as a resource, and referenced for every generation.</p><p>The session feels coherent in a way that pure improvisation rarely does. The world&#8217;s existing history shapes the story automatically.</p><h3>Why this is worth paying attention to</h3><p>Most conversations about AI in creative work focus on whether AI can replace the creative act. That framing misses something.</p><p>At the end of the day, you&#8217;re still the DM. Every story decision, every encounter, every player experience at the table is yours. The system doesn&#8217;t touch any of&nbsp;that.</p><p>What it carries is the weight of the world, the continuity tracking, the cross-referencing, and the mechanical bookkeeping of a 5e character sheet. It&#8217;s the work that happens before the creative work, and that, if left undone, quietly degrades the creative&nbsp;work.</p><p>Good creative tools extend what you&#8217;re able to hold in your head at once. It helps make the job of a DM who is already good at what they do, a little bit&nbsp;easier.</p><p>In this case, Friday holds the campaign history, so you can focus on the players and the&nbsp;session.</p><h3>The broader&nbsp;pattern</h3><p>D&amp;D is an unusual use case, but the underlying problem isn&#8217;t unique to&nbsp;it.</p><p>Any creative project with a persistent world&#8202;&#8212;&#8202;a novel series, a game universe, a long-running creative writing project&#8202;&#8212;&#8202;has the same structural challenge. The longer it runs, the harder it is to maintain internal consistency without dedicated infrastructure. Most people don&#8217;t build that infrastructure, so things&nbsp;slip.</p><p>What&#8217;s genuinely new right now is that this kind of persistent, context-aware system is within reach for anyone. It&#8217;something you can set up within minutes on a Tuesday afternoon and use the same&nbsp;week.</p><p>Your campaign can have 47 NPCs. Tony the horse can technically have an entry. The world can hold together in a way it never did when you were trying to keep it all in your&nbsp;head.</p><p><em>Friday lets you build custom workflows grounded in your own context&#8202;&#8212;&#8202;for work, for side projects, or apparently for keeping track of a horse your players adopted in session three. <a href="https://hellofriday.ai">Try it&nbsp;here</a>.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_CNd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee80d5c6-dca3-4345-be6b-bff6436b9a45_1024x538.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_CNd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee80d5c6-dca3-4345-be6b-bff6436b9a45_1024x538.png 424w, https://substackcdn.com/image/fetch/$s_!_CNd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee80d5c6-dca3-4345-be6b-bff6436b9a45_1024x538.png 848w, https://substackcdn.com/image/fetch/$s_!_CNd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee80d5c6-dca3-4345-be6b-bff6436b9a45_1024x538.png 1272w, https://substackcdn.com/image/fetch/$s_!_CNd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee80d5c6-dca3-4345-be6b-bff6436b9a45_1024x538.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_CNd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee80d5c6-dca3-4345-be6b-bff6436b9a45_1024x538.png" width="1024" height="538" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ee80d5c6-dca3-4345-be6b-bff6436b9a45_1024x538.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:538,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!_CNd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee80d5c6-dca3-4345-be6b-bff6436b9a45_1024x538.png 424w, https://substackcdn.com/image/fetch/$s_!_CNd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee80d5c6-dca3-4345-be6b-bff6436b9a45_1024x538.png 848w, https://substackcdn.com/image/fetch/$s_!_CNd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee80d5c6-dca3-4345-be6b-bff6436b9a45_1024x538.png 1272w, https://substackcdn.com/image/fetch/$s_!_CNd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee80d5c6-dca3-4345-be6b-bff6436b9a45_1024x538.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[Using AI to Turn Sentry Errors Into Pull Requests Every Hour]]></title><description><![CDATA[For a long time, going through Sentry felt like spring cleaning a garage that never stays tidy.]]></description><link>https://blog.hellofriday.ai/p/using-ai-to-turn-sentry-errors-into-pull-requests-every-hour-9efcc86d6d7c</link><guid isPermaLink="false">https://blog.hellofriday.ai/p/using-ai-to-turn-sentry-errors-into-pull-requests-every-hour-9efcc86d6d7c</guid><dc:creator><![CDATA[Yena Oh]]></dc:creator><pubDate>Wed, 01 Apr 2026 15:56:37 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/063f8793-8335-4d40-a6f9-dce056bfdd35_1024x538.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For a long time, going through Sentry felt like spring cleaning a garage that never stays tidy. You open it to see the pile of tasks before you, and set out to finish the task. Eventually, you close it again until next year, having only organized or donated a few&nbsp;things.</p><p>With Sentry, it wasn&#8217;t because the issues are particularly complicated, or difficult to address. In fact, most of the errors Sentry tends to surface are small UI glitches, edge cases, null pointer errors, or incorrect assumptions in one branch of a handler. None of these are particularly dramatic, and each one would probably take ten or twenty minutes to&nbsp;fix.</p><p>But the problem is, none of them are urgent on their&nbsp;own.</p><p>And when something bigger is in progress, those small issues just sit there and accumulate. While Sentry keeps collecting them faithfully, the backlog continues growing. You tell yourself you will deal with it when things slow&nbsp;down.</p><p>But the fundamental problem of being a part of a small engineering team: they never slow&nbsp;down.</p><p>With AI becoming a more integral part of my job, I realized that this problem was the perfect testing ground for automation.</p><p>It was:</p><ul><li><p>Highly repetitive</p></li><li><p>Well scoped and structured</p></li><li><p>An issue of lack of time, rather than complexity</p></li></ul><p>And with autonomous AI agents becoming more powerful and reliable, I wanted to see if I could find a way to give this process to&nbsp;AI.</p><h3>What I&nbsp;Built</h3><p>I wanted to build a system that would do three&nbsp;things:</p><ol><li><p>Fetch the latest Sentry issues from the last sixty&nbsp;minutes.</p></li><li><p>For each issue, clone the repository and find the root&nbsp;cause.</p></li><li><p>Generate a proposed fix and open a pull request in&nbsp;GitHub.</p></li></ol><p>For this to work, two things needed to be&nbsp;true.</p><p><strong>First, the code quality had to be good&nbsp;enough.</strong></p><p>To be honest, this wasn&#8217;t something that worried&nbsp;me.</p><p>Modern LLM models are very capable of producing code at the level of a junior engineer. Entire companies have been built on that premise. If you give a model enough context about your repository and your conventions, it will usually produce something reasonable.</p><p>In our case, once we connected our tools to Claude Code and fed it our patterns (via Skills), it was producing surprisingly solid results almost immediately.</p><p><strong>Second, the results had to be reliable.</strong></p><p>There are two very different ways to approach this&nbsp;problem.</p><p>One approach is to hand an agent a broad instruction: go check Sentry, fix issues, open pull requests. In that world, the agent decides how to fetch data, how to track state, how to handle retries. It might succeed one time and fail the other, as is the non-deterministic nature of LLMs. That is the nature of LLMs, and unfortunately, not something you want when trying to run repeatable work that demands consistency.</p><p>The other approach is to separate concerns more aggressively.</p><p>Use LLMs for the discovery and solution parts of the automation. For example, let them analyze the error, or propose a fix. That is the creative, emergent work that LLMs are good&nbsp;at.</p><p>But put everything else that should be predictable and repeatable on&nbsp;rails.</p><p>Transparently, as a founder, I used our tool <a href="http://hellofriday.ai">Friday AI</a> to automate this. You could absolutely also wire something similar together with cron jobs, a workflow engine, or a stack of scripts. The reason I used Friday is because it made it way easier for me to pull that orchestration together.</p><p>In practice, what that means for me is that the workflow itself is defined ahead of time. There is a configuration that outlines:</p><ul><li><p>When the workflow&nbsp;runs.</p></li><li><p>How it fetches Sentry&nbsp;issues.</p></li><li><p>How it records which issues have already been processed.</p></li><li><p>How information is passed from one step to the&nbsp;next.</p></li><li><p>Which agent is responsible for which&nbsp;task.</p></li></ul><p>The LLM does not decide the shape of the workflow at runtime. It operates inside a predefined structure.</p><p>In Friday, that structure is generated from natural language prompts (ie. &#8220;Build me a system that will take Sentry issues, analyze them for errors, and propose fixes in PRs.&#8221;), but once it is generated, it is no longer probabilistic. It becomes a defined sequence of steps with explicit handoffs and fixed order. The state tracking is deterministic.</p><h3>What It Looks Like When It&#8217;s&nbsp;Running</h3><p>Once the workspace was set up, Friday would generate around three to four pull requests per&nbsp;day.</p><p>Some were straightforward wins that I could merge immediately. Others were close, but missing context. A few were technically correct but not aligned with our preferred patterns.</p><p>For example, if the system does not have an explicit preference encoded, it will choose the most common path. A classic case is database access. Raw SQL can be a completely valid solution, but if your codebase has invested in typed-safe query tooling, raw SQL is the path of higher risk. So it&#8217;s not wrong, it just raises the chance of subtle mistakes.</p><p>This was an important lesson for me: once you solve orchestration, the next thing you notice is consistency.</p><p>Not just &#8220;does it do the work,&#8221; but &#8220;does this match how we want to write code&nbsp;here.&#8221;</p><p>This ability to understand and deliver on preferences is something I&#8217;ve improved over time through additional context via skills in Claude&nbsp;Code.</p><h3>Where We Are&nbsp;Now</h3><p>This automation now generates a few pull requests a&nbsp;day.</p><p>Some get merged immediately, others need small tweaks. And I&#8217;d say about half of them get closed out. That is expected.</p><p>What this automation unlocked for me is the follow up and review of the long tail of small issues. It guaranteed that they would be processed steadily, without getting in the way of progress for the big, important work.</p><p>The bottleneck moved from &#8220;do we have time to look at this?&#8221; to &#8220;is this worth merging?&#8221; And I think that&#8217;s the better bottleneck.</p><p>I still review every change the same way I would review any human teammate&#8217;s code. Does it fix the root cause? What assumptions is it making? Is it following expectations of our processes?</p><p>The true impact of this work is less about &#8220;automation for the sake of automation,&#8221; and more about getting things off my plate that I&#8217;ve never had the time to get&nbsp;done.</p><p><em>You can try building this flow yourself on <a href="http://hellofriday.ai">Friday&nbsp;AI</a>.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3BnD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72017cd1-a0a5-45f3-b976-12966120344c_1024x538.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3BnD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72017cd1-a0a5-45f3-b976-12966120344c_1024x538.png 424w, https://substackcdn.com/image/fetch/$s_!3BnD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72017cd1-a0a5-45f3-b976-12966120344c_1024x538.png 848w, https://substackcdn.com/image/fetch/$s_!3BnD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72017cd1-a0a5-45f3-b976-12966120344c_1024x538.png 1272w, https://substackcdn.com/image/fetch/$s_!3BnD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72017cd1-a0a5-45f3-b976-12966120344c_1024x538.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3BnD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72017cd1-a0a5-45f3-b976-12966120344c_1024x538.png" width="1024" height="538" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/72017cd1-a0a5-45f3-b976-12966120344c_1024x538.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:538,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!3BnD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72017cd1-a0a5-45f3-b976-12966120344c_1024x538.png 424w, https://substackcdn.com/image/fetch/$s_!3BnD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72017cd1-a0a5-45f3-b976-12966120344c_1024x538.png 848w, https://substackcdn.com/image/fetch/$s_!3BnD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72017cd1-a0a5-45f3-b976-12966120344c_1024x538.png 1272w, https://substackcdn.com/image/fetch/$s_!3BnD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72017cd1-a0a5-45f3-b976-12966120344c_1024x538.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><p></p>]]></content:encoded></item></channel></rss>