<?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[Table For One: Vibe Coding Lab]]></title><description><![CDATA[Ready to paste agents and skills that will help you be smarter and more productive.]]></description><link>https://oneplease.substack.com/s/vibe-coding-lab</link><image><url>https://substackcdn.com/image/fetch/$s_!FgKk!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff291ffc6-e72f-4864-95e0-0d566d07cfd5_1280x1280.png</url><title>Table For One: Vibe Coding Lab</title><link>https://oneplease.substack.com/s/vibe-coding-lab</link></image><generator>Substack</generator><lastBuildDate>Wed, 08 Jul 2026 14:40:42 GMT</lastBuildDate><atom:link href="https://oneplease.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Durva Mathure]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[oneplease@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[oneplease@substack.com]]></itunes:email><itunes:name><![CDATA[Durva Mathure]]></itunes:name></itunes:owner><itunes:author><![CDATA[Durva Mathure]]></itunes:author><googleplay:owner><![CDATA[oneplease@substack.com]]></googleplay:owner><googleplay:email><![CDATA[oneplease@substack.com]]></googleplay:email><googleplay:author><![CDATA[Durva Mathure]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Vibe Coding Lab #3: The Agent That Finds Your Best Distribution Channel]]></title><description><![CDATA[How I vibe-coded a channel research pipeline that interviews you, scans your competitors, and finds the best channels to build on]]></description><link>https://oneplease.substack.com/p/vibe-coding-lab-3-the-agent-that</link><guid isPermaLink="false">https://oneplease.substack.com/p/vibe-coding-lab-3-the-agent-that</guid><dc:creator><![CDATA[Durva Mathure]]></dc:creator><pubDate>Fri, 19 Jun 2026 23:17:33 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8de43123-b526-4b52-a6e7-4765aafe1007_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Somewhere around my sixth month of building Shezaar, I was posting on LinkedIn, Instagram, TikTok, Substack, and Reddit because every founder I knew had a presence on at least one of them and I had no better way to figure out where I should be. Two months of that got me some polite comments and likes from the same people across platforms, exactly zero leads, and a mild skill at editing short videos.</p><p>Then I burned out and stopped everything for a month.</p><p>The distribution problem for solo founders is not that we do not know social media presence matters. We know it does. The problem is that there is no reliable way to figure out which channel is worth the specific hours, given our voice and audience and what we want to accomplish.</p><p>So we pick based on what other founders are doing, or what we last read about, or where we feel most comfortable posting. To find out whether it was the right call only after six months.</p><p>So, naturally I built something to help with this. Channel Scout is a six-skill pipeline that does what a &#8220;distribution consultant&#8221; or &#8220;GTM consultant&#8221; (if they exist) does, running locally on your Claude Pro or Max subscription with no API keys and no extra cost.</p><p>Here are the only two commands:</p><p><code>/channel-scout</code> is the full strategy session. This is what you run the first time. It interviews you, scans your competitors, selects a channel, designs kill criteria, tests post drafts. So that by the end, you have two channels to bet on and a metric that tells you when something is not working out.</p><p><code>/channel-scout coach</code> is the daily run. One coaching note, one dashboard refresh, one check of your kill criteria. Runs automatically if you want, or can be triggered manually.</p><div><hr></div><h1>Before You Start</h1><p>This is built for Claude Code, so you need a Pro or Max plan. If you have never used Claude Code before, the install takes about five minutes and there are tutorial links in the README.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://oneplease.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://oneplease.substack.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h1>How It Works</h1><p>The first time you run <code>/channel-scout</code>, five skills fire in sequence. The full session runs under 90 minutes, with natural stopping points if you need to break. If you stop mid-way, running <code>/channel-scout</code> again picks up exactly where you left off.</p><p>These are the five skills:</p><p><strong><span data-color="#d4943a" style="color: rgb(212, 148, 58);">ONBOARD</span></strong> interviews you, asking what you are building, who it is for, your three closest competitors, how many hours per week you can give to distribution, and what channels you have already tried. While you answer, it fetches your information and homepage in the background to create specific search parameters, ICP descriptors, and competitor feed. By the end of the interview, Channel Scout knows your constraints.</p><p><strong><span data-color="#d4943a" style="color: rgb(212, 148, 58);">SCAN</span></strong> uses those parameters to fetch competitor information and find three to five channels that would work for you. For each channel it identifies, it extracts the winning content template: the hook pattern that gets traction on that platform, the typical post length, the posting cadence that works. It rates each channel on audience saturation, content gap, and ICP fit.</p><p><strong><span data-color="#d4943a" style="color: rgb(212, 148, 58);">PREDICT</span></strong> is the part I found hardest to build manually. It scores voice fit for each channel, meaning how much rewriting your natural writing style would need to work on that platform. Then it runs something I called a wind tunnel: three synthetic personas built from real top-performing post language on each channel. Your angle goes through all three.</p><p>Channels that would require more weekly hours than you said you have get penalized. At the end, PREDICT picks two channels and writes the full reasoning to a prediction file you can read, question, and push back on.</p><p><strong><span data-color="#d4943a" style="color: rgb(212, 148, 58);">PROBE</span></strong> drafts two native test posts per channel in your voice, sets your posting cadence from the intel data, and writes kill criteria. Not &#8220;give it three months and see.&#8221; Specific numbers. If LinkedIn impressions stay below 180 after seven posts, stop. You agree to that number before the first post goes out.</p><p><strong><span data-color="#d4943a" style="color: rgb(212, 148, 58);">COACH</span></strong> runs every morning, reading a rolling context stack: not your full history, just your scorecard, yesterday&#8217;s summary, and the most recent weekly synthesis. It checks your kill criteria, writes one coaching note, and regenerates your dashboard, opening it automatically.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Aohc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcdbfceb-1f84-48c9-b6b9-f3e7226944af_1280x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Aohc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcdbfceb-1f84-48c9-b6b9-f3e7226944af_1280x1080.png 424w, https://substackcdn.com/image/fetch/$s_!Aohc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcdbfceb-1f84-48c9-b6b9-f3e7226944af_1280x1080.png 848w, https://substackcdn.com/image/fetch/$s_!Aohc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcdbfceb-1f84-48c9-b6b9-f3e7226944af_1280x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!Aohc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcdbfceb-1f84-48c9-b6b9-f3e7226944af_1280x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Aohc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcdbfceb-1f84-48c9-b6b9-f3e7226944af_1280x1080.png" width="1280" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fcdbfceb-1f84-48c9-b6b9-f3e7226944af_1280x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1080,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:166995,&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://oneplease.substack.com/i/202733801?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcdbfceb-1f84-48c9-b6b9-f3e7226944af_1280x1080.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_!Aohc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcdbfceb-1f84-48c9-b6b9-f3e7226944af_1280x1080.png 424w, https://substackcdn.com/image/fetch/$s_!Aohc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcdbfceb-1f84-48c9-b6b9-f3e7226944af_1280x1080.png 848w, https://substackcdn.com/image/fetch/$s_!Aohc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcdbfceb-1f84-48c9-b6b9-f3e7226944af_1280x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!Aohc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcdbfceb-1f84-48c9-b6b9-f3e7226944af_1280x1080.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><h1>The Number That Matters</h1><p>The problem was not that I picked the wrong channels. I picked five channels at once, had no criteria for any of them, and burned out before a single one could tell me anything useful. Had I run some experiment like Channel Scout first, it would have surfaced two channels worth betting on and given me a number to watch after the first post went out. It would have told me that given my ICP, my strongest channels were Substack and Reddit.</p><p>That is the piece I would have wanted before I opened a TikTok account in 2025.</p><p>Now this is not a content system and I am building an individual system for each channel. But those will work only after you have identified the right channels for you.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xY1n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0462e529-ac2b-40d5-97f6-f1b7ebd1b23f_1280x1240.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xY1n!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0462e529-ac2b-40d5-97f6-f1b7ebd1b23f_1280x1240.png 424w, https://substackcdn.com/image/fetch/$s_!xY1n!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0462e529-ac2b-40d5-97f6-f1b7ebd1b23f_1280x1240.png 848w, https://substackcdn.com/image/fetch/$s_!xY1n!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0462e529-ac2b-40d5-97f6-f1b7ebd1b23f_1280x1240.png 1272w, https://substackcdn.com/image/fetch/$s_!xY1n!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0462e529-ac2b-40d5-97f6-f1b7ebd1b23f_1280x1240.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xY1n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0462e529-ac2b-40d5-97f6-f1b7ebd1b23f_1280x1240.png" width="1280" height="1240" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0462e529-ac2b-40d5-97f6-f1b7ebd1b23f_1280x1240.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1240,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:165534,&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://oneplease.substack.com/i/202733801?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0462e529-ac2b-40d5-97f6-f1b7ebd1b23f_1280x1240.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_!xY1n!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0462e529-ac2b-40d5-97f6-f1b7ebd1b23f_1280x1240.png 424w, https://substackcdn.com/image/fetch/$s_!xY1n!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0462e529-ac2b-40d5-97f6-f1b7ebd1b23f_1280x1240.png 848w, https://substackcdn.com/image/fetch/$s_!xY1n!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0462e529-ac2b-40d5-97f6-f1b7ebd1b23f_1280x1240.png 1272w, https://substackcdn.com/image/fetch/$s_!xY1n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0462e529-ac2b-40d5-97f6-f1b7ebd1b23f_1280x1240.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><h1>How To Install It</h1><p>Two commands in Claude Code:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;29c5716b-c33e-478b-8389-4d11e451db58&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">/plugin marketplace add DM1195/tableforone-channel-scout
/plugin install channel-scout@tableforone-channel-scout</code></pre></div><p>Then type:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;355d8546-37f2-4d85-a24c-79fe36d098b8&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">/channel-scout</code></pre></div><p>Channel Scout asks for your company name, creates a folder at <code>~/channel-scout/[your-company]/</code>, and starts the ONBOARD interview. Answer in plain English. Ten minutes in you will have a profile and a watchlist. By end of session you will have two channels to test, two draft posts per channel in your voice, and a kill criteria number for each.</p><p>All files live locally. Nothing is sent anywhere. Nothing expires.</p><div><hr></div><h1>The Daily Coach</h1><p>At the end of your first session, you choose how the daily run works.</p><p><strong>Automatic</strong> registers a launchd task on Mac or a crontab on Linux that fires at your chosen time. If your laptop was asleep, it runs when you open it.</p><p><strong>On open</strong> adds a SessionStart hook to your Claude Code settings so the coaching run starts every time you open Claude Code.</p><p><strong>Manual</strong> means you run <code>/channel-scout coach</code> yourself.</p><p>The coaching note is short. Post performance against kill criteria. What shifted in the competitor feeds overnight, if anything changed. One specific recommendation for today.</p><p>The dashboard is a static HTML file Channel Scout regenerates after every coach run: scorecard table, today&#8217;s note, competitor activity, kill criteria status in one page.</p><p>Channel Scout does not read your full post history every morning. It reads the rolling stack, and competitor feeds only get fetched if something actually changed since the last run. That is token discipline built into the design. A daily process should not become an expensive one.</p><div><hr></div><h1>What I&#8217;d Do Differently</h1><p>I tried to make the PREDICT output final. Two channels, full reasoning, done. But the wind tunnel results surprised me often enough that I wanted to be able to push back on the picks. The tool now writes the full reasoning to prediction.md, and if you run <code>/channel-scout</code> again and tell it you want to revisit a pick, it re-runs PROBE with adjusted parameters instead of just confirming the first output.</p><p>I wish I had designed for that iteration loop from the start. The first version assumed the model would always surface the same two obvious channels. It does not, and the divergence cases are often the more interesting ones.</p><p>If the channel picks surprise you, or something breaks on your setup, reply and tell me what it gave you.</p><p>Durva</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kvWj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc184f0d7-0022-4adf-8c03-2b2074b2321d_12288x1536.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kvWj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc184f0d7-0022-4adf-8c03-2b2074b2321d_12288x1536.heic 424w, https://substackcdn.com/image/fetch/$s_!kvWj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc184f0d7-0022-4adf-8c03-2b2074b2321d_12288x1536.heic 848w, https://substackcdn.com/image/fetch/$s_!kvWj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc184f0d7-0022-4adf-8c03-2b2074b2321d_12288x1536.heic 1272w, https://substackcdn.com/image/fetch/$s_!kvWj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc184f0d7-0022-4adf-8c03-2b2074b2321d_12288x1536.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kvWj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc184f0d7-0022-4adf-8c03-2b2074b2321d_12288x1536.heic" width="1456" height="182" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c184f0d7-0022-4adf-8c03-2b2074b2321d_12288x1536.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:182,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:52086,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://oneplease.substack.com/i/202733801?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc184f0d7-0022-4adf-8c03-2b2074b2321d_12288x1536.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kvWj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc184f0d7-0022-4adf-8c03-2b2074b2321d_12288x1536.heic 424w, https://substackcdn.com/image/fetch/$s_!kvWj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc184f0d7-0022-4adf-8c03-2b2074b2321d_12288x1536.heic 848w, https://substackcdn.com/image/fetch/$s_!kvWj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc184f0d7-0022-4adf-8c03-2b2074b2321d_12288x1536.heic 1272w, https://substackcdn.com/image/fetch/$s_!kvWj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc184f0d7-0022-4adf-8c03-2b2074b2321d_12288x1536.heic 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><ul><li><p><strong><a href="https://oneplease.substack.com/p/vibe-coding-lab-2-the-tool-to-help?r=3o96ba">Vibe Coding Lab #2: The Tool To Help You Visualize Your Product</a></strong></p></li><li><p><strong><a href="https://oneplease.substack.com/p/vibe-coding-lab-1-the-morning-brief?r=3o96ba">Vibe Coding Lab #1: The Morning Brief To Make You 10x Smarter</a></strong></p><p></p><div><hr></div></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://oneplease.substack.com/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">Table For One is a reader-supported publication. To receive new posts and support my work, consider becoming a subscriber.</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[Vibe Coding Lab #2: The Tool To Help You Visualize Your Product]]></title><description><![CDATA[I built a tool to see inside the app I vibe-coded]]></description><link>https://oneplease.substack.com/p/vibe-coding-lab-2-the-tool-to-help</link><guid isPermaLink="false">https://oneplease.substack.com/p/vibe-coding-lab-2-the-tool-to-help</guid><dc:creator><![CDATA[Durva Mathure]]></dc:creator><pubDate>Tue, 02 Jun 2026 23:06:20 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/0ec35bbf-ba2f-4177-bff7-7377de1dde55_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You vibe-coded something. It worked for a while and then something broke. And there was no way for you to easily fix it.</p><p>So you&#8217;re three hours deep asking Claude to &#8220;find the issue&#8221; and it&#8217;s finding things, but none of them are the actual thing.</p><p>I&#8217;ve been there.</p><p>When you vibe-code, the AI builds fast and you ship faster. Somewhere in between, the code outpaces your understanding of it. The logic exists, but it exists in the AI&#8217;s &#8220;head&#8221;, not yours. So when something breaks, you can&#8217;t point to what or where. You grep through files. You ask Claude for help without being specific. You&#8217;re scared to delete anything because you don&#8217;t know what depends on it.</p><p>That&#8217;s not a skill issue. That&#8217;s a visibility issue.</p><p>Sprintt is the agent library I&#8217;m building for solo founders. It has 127 functions and 42 dependencies across 28 features. I built every one with Claude. Until last week, I couldn&#8217;t tell you what most of them did. I was exactly where you are.</p><p>So I built a tool that shows you what&#8217;s 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_!s8i8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7969d547-313c-457c-aaa4-314743f5a0eb_2564x1574.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!s8i8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7969d547-313c-457c-aaa4-314743f5a0eb_2564x1574.png 424w, https://substackcdn.com/image/fetch/$s_!s8i8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7969d547-313c-457c-aaa4-314743f5a0eb_2564x1574.png 848w, https://substackcdn.com/image/fetch/$s_!s8i8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7969d547-313c-457c-aaa4-314743f5a0eb_2564x1574.png 1272w, https://substackcdn.com/image/fetch/$s_!s8i8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7969d547-313c-457c-aaa4-314743f5a0eb_2564x1574.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!s8i8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7969d547-313c-457c-aaa4-314743f5a0eb_2564x1574.png" width="1456" height="894" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7969d547-313c-457c-aaa4-314743f5a0eb_2564x1574.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:894,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:544836,&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://oneplease.substack.com/i/200363088?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7969d547-313c-457c-aaa4-314743f5a0eb_2564x1574.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_!s8i8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7969d547-313c-457c-aaa4-314743f5a0eb_2564x1574.png 424w, https://substackcdn.com/image/fetch/$s_!s8i8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7969d547-313c-457c-aaa4-314743f5a0eb_2564x1574.png 848w, https://substackcdn.com/image/fetch/$s_!s8i8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7969d547-313c-457c-aaa4-314743f5a0eb_2564x1574.png 1272w, https://substackcdn.com/image/fetch/$s_!s8i8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7969d547-313c-457c-aaa4-314743f5a0eb_2564x1574.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><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://docs.google.com/document/d/148lHxOfFby0xkttoOqDl0g-Mjbwq3UF0LgUmLNh8AP8/edit?usp=sharing&quot;,&quot;text&quot;:&quot;Skip Explanation And Get The Prompts&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://docs.google.com/document/d/148lHxOfFby0xkttoOqDl0g-Mjbwq3UF0LgUmLNh8AP8/edit?usp=sharing"><span>Skip Explanation And Get The Prompts</span></a></p><h1>Overview Of The Skill: What It Does</h1><p>This <em><strong>simple and free claude skill</strong></em> helps you visualize your vibe-coded product and identify the gaps you could have missed. Point it at any project folder. A browser tab opens with three views of your codebase: three different ways of looking at the same code, depending on what you&#8217;re trying to figure out.</p><h3><strong>App Flow:</strong></h3><p>Three columns: pages on the left, database tables in the middle, external services and API routes on the right. Pages are grouped by URL section: all your /admin/* pages together, all your /onboarding/* together etc. Each page is a card you can expand to see the components inside it. Each component shows what data it queries, where it navigates, what server actions it calls. Arrows connect components to the specific tables and services they touch.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5jU_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2eb4adc-762c-4d37-bd5f-1aa562f3b840_2564x1574.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5jU_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2eb4adc-762c-4d37-bd5f-1aa562f3b840_2564x1574.png 424w, https://substackcdn.com/image/fetch/$s_!5jU_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2eb4adc-762c-4d37-bd5f-1aa562f3b840_2564x1574.png 848w, https://substackcdn.com/image/fetch/$s_!5jU_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2eb4adc-762c-4d37-bd5f-1aa562f3b840_2564x1574.png 1272w, https://substackcdn.com/image/fetch/$s_!5jU_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2eb4adc-762c-4d37-bd5f-1aa562f3b840_2564x1574.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5jU_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2eb4adc-762c-4d37-bd5f-1aa562f3b840_2564x1574.png" width="1456" height="894" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f2eb4adc-762c-4d37-bd5f-1aa562f3b840_2564x1574.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:894,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:495869,&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://oneplease.substack.com/i/200363088?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2eb4adc-762c-4d37-bd5f-1aa562f3b840_2564x1574.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_!5jU_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2eb4adc-762c-4d37-bd5f-1aa562f3b840_2564x1574.png 424w, https://substackcdn.com/image/fetch/$s_!5jU_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2eb4adc-762c-4d37-bd5f-1aa562f3b840_2564x1574.png 848w, https://substackcdn.com/image/fetch/$s_!5jU_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2eb4adc-762c-4d37-bd5f-1aa562f3b840_2564x1574.png 1272w, https://substackcdn.com/image/fetch/$s_!5jU_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2eb4adc-762c-4d37-bd5f-1aa562f3b840_2564x1574.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><h3>Constellation:</h3><p>Same data, radial layout. Four concentric rings: pages on the outside, then API routes, then database tables, external services at the center. Routes and tables don&#8217;t sit randomly. They gravitate toward the pages that use them. If your agents table is read by both dashboard and admin pages, it floats between those sections. The layout shows you something no file tree does: how siloed or shared each resource actually is.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ep0B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F111209bc-e4ee-4676-b732-65abd7debcd0_2564x1574.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ep0B!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F111209bc-e4ee-4676-b732-65abd7debcd0_2564x1574.png 424w, https://substackcdn.com/image/fetch/$s_!ep0B!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F111209bc-e4ee-4676-b732-65abd7debcd0_2564x1574.png 848w, https://substackcdn.com/image/fetch/$s_!ep0B!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F111209bc-e4ee-4676-b732-65abd7debcd0_2564x1574.png 1272w, https://substackcdn.com/image/fetch/$s_!ep0B!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F111209bc-e4ee-4676-b732-65abd7debcd0_2564x1574.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ep0B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F111209bc-e4ee-4676-b732-65abd7debcd0_2564x1574.png" width="1456" height="894" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/111209bc-e4ee-4676-b732-65abd7debcd0_2564x1574.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:894,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:728147,&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://oneplease.substack.com/i/200363088?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F111209bc-e4ee-4676-b732-65abd7debcd0_2564x1574.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_!ep0B!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F111209bc-e4ee-4676-b732-65abd7debcd0_2564x1574.png 424w, https://substackcdn.com/image/fetch/$s_!ep0B!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F111209bc-e4ee-4676-b732-65abd7debcd0_2564x1574.png 848w, https://substackcdn.com/image/fetch/$s_!ep0B!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F111209bc-e4ee-4676-b732-65abd7debcd0_2564x1574.png 1272w, https://substackcdn.com/image/fetch/$s_!ep0B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F111209bc-e4ee-4676-b732-65abd7debcd0_2564x1574.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><h3>Function Map:</h3><p>Every function in the codebase as a block, grouped by file. Click one to see what calls it and what it calls. Dead code flagged. Linter issues surfaced. Claude writes a plain-English explanation of what each function does, and if it has bugs, generates a ready-to-paste fix prompt for Cursor. This is the deep-dive view for when something&#8217;s broken and you need to actually trace it.</p><p>Two toggles work across the views:</p><ul><li><p><strong>Heatmap.</strong> Colors nodes by connection count. Tables go blue for reads, red for writes. Pages get more saturated the more routes call them. Lets you see at a glance which tables are your hottest and which pages are doing the most work.</p></li><li><p><strong>Orphans.</strong> Highlights anything with zero connections. A page no route leads to. A table nothing reads. A service nothing imports. Orphan doesn&#8217;t always mean broken. Sometimes the connection is dynamic, sometimes the analyzer missed it. But now you have something specific to investigate instead of a vague sense that something&#8217;s off.</p></li></ul><p>Your code never leaves your machine.</p><h1><strong>How To Get It Running</strong></h1><p>Two ways. Pick one.</p><h3>The Fast Way (1 Minute)</h3><p>If you have <a href="https://docs.claude.com/">Claude Code</a> installed and don&#8217;t mind downloading from my free GitHub repo, paste these two commands:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;aef95dd0-2a0b-4b16-bde7-6d1cfe80fe10&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">/plugin marketplace add DM1195/tableforone-codebase-visualizer
/plugin install codebase-visualizer@tableforone-codebase-visualizer</code></pre></div><p>Then in any project, ask Claude Code: <em>&#8220;map my codebase&#8221;</em> and point it to a folder.</p><h3>Build It Yourself</h3><p>If you&#8217;d rather build it yourself, or customize it for your stack, it&#8217;s five prompts run in sequence in Claude Code, about 30 to 45 minutes. The prompts produce the function-level analyzer, the app flow parser, the visualization, the constellation layout, and the skill wrapper that orchestrates it all.</p><p>The full prompts, the design constraints, and the gotchas are in <a href="https://docs.google.com/document/d/148lHxOfFby0xkttoOqDl0g-Mjbwq3UF0LgUmLNh8AP8/edit?usp=sharing">this</a> doc. One thing to note: don&#8217;t paste all five at once. Run each, see what you get, fix what&#8217;s off, then move on.</p><p>The plugin is open source. Repo <a href="https://docs.google.com/document/d/148lHxOfFby0xkttoOqDl0g-Mjbwq3UF0LgUmLNh8AP8/edit?usp=sharing">here</a>. The doc has the full setup, all five prompts, and a few features I cut from this post for length.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://docs.google.com/document/d/148lHxOfFby0xkttoOqDl0g-Mjbwq3UF0LgUmLNh8AP8/edit?usp=sharing&quot;,&quot;text&quot;:&quot;Get The Prompts&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://docs.google.com/document/d/148lHxOfFby0xkttoOqDl0g-Mjbwq3UF0LgUmLNh8AP8/edit?usp=sharing"><span>Get The Prompts</span></a></p><h2>What This Is Really About</h2><p>The work isn&#8217;t writing code anymore. The work is seeing what you built.</p><p>Once you&#8217;ve shipped something you can&#8217;t see inside, your options narrow fast: abandon it, or rebuild it from scratch. Most founders pick one of those after losing weeks. The hope is that now you don&#8217;t have to.</p><div><hr></div><p><em>If something doesn&#8217;t work, send me a message. Wrong stack, missing feature, broken on your setup, whatever it is. I&#8217;d rather know than have you hit a wall and give up on it.</em></p><p><em>And if you&#8217;re a solo founder trying to figure out how to build and ship without a team behind you, <strong>Table For One</strong> is where I write. The tools, the decisions, the mistakes, written specifically for people building solo. Free to subscribe.</em></p><p><em>- Durva</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://oneplease.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://oneplease.substack.com/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Vibe Coding Lab #1: The Morning Brief To Make You 10x Smarter]]></title><description><![CDATA[How to create a daily newspaper curated just for you with Claude]]></description><link>https://oneplease.substack.com/p/vibe-coding-lab-1-the-morning-brief</link><guid isPermaLink="false">https://oneplease.substack.com/p/vibe-coding-lab-1-the-morning-brief</guid><dc:creator><![CDATA[Durva Mathure]]></dc:creator><pubDate>Wed, 13 May 2026 03:06:08 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3ac1831a-9726-4170-a10c-cded75999aa8_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><p><em>This is a new Tuesday series where I share the small tools I build for myself, with the actual instructions you need to set them up. You don&#8217;t need to know how to code. You need to be able to copy and paste. First up: a daily personal newspaper that publishes itself at 6am, costs a few cents a day, and lives at a URL you bookmark on your phone.</em></p><div><hr></div><p>Like most founders, I subscribe to about a hundred Substacks (okay, maybe twenty). I have at least three podcasts on rotation that I want to listen to and never do. I have set news alerts for my industry. And most mornings used to start the same way. Coffee. Scrolling my mailbox for news. Checking what&#8217;s happening on Twitter. Feeling overwhelmed and shutting my phone.</p><p>The result? In almost every founder meetup or dinner I was the last person who knew what was happening in the world of tech.</p><p>So one day I decided to use Claude to my advantage.</p><p>I built a morning brief agent that runs at 6am Pacific every day. It reads news from a list of topics I care about, scans five founder-heavy subreddits and Twitter, opens the newsletters that landed in my Gmail in the last 24 hours, and checks for new podcast episodes from a curated list of shows. It assembles all of that into a single beautifully designed webpage, with framed paintings from the Art Institute of Chicago laid between the sections, and publishes it to a private URL I&#8217;ve bookmarked on my phone. No email. No app. No notification. Just a bookmark I open with my coffee.</p><p>The whole thing costs about a nickel a day in Claude usage. The hosting is free. The setup, if you follow this post, takes about thirty minutes.</p><p>Here it is. Steal it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YXeb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1ea794-2136-4817-8b7b-0dfbb2fd4ce0_2438x1568.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YXeb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1ea794-2136-4817-8b7b-0dfbb2fd4ce0_2438x1568.heic 424w, https://substackcdn.com/image/fetch/$s_!YXeb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1ea794-2136-4817-8b7b-0dfbb2fd4ce0_2438x1568.heic 848w, https://substackcdn.com/image/fetch/$s_!YXeb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1ea794-2136-4817-8b7b-0dfbb2fd4ce0_2438x1568.heic 1272w, https://substackcdn.com/image/fetch/$s_!YXeb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1ea794-2136-4817-8b7b-0dfbb2fd4ce0_2438x1568.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YXeb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1ea794-2136-4817-8b7b-0dfbb2fd4ce0_2438x1568.heic" width="1456" height="936" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba1ea794-2136-4817-8b7b-0dfbb2fd4ce0_2438x1568.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:936,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:109851,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://oneplease.substack.com/i/197435341?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1ea794-2136-4817-8b7b-0dfbb2fd4ce0_2438x1568.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!YXeb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1ea794-2136-4817-8b7b-0dfbb2fd4ce0_2438x1568.heic 424w, https://substackcdn.com/image/fetch/$s_!YXeb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1ea794-2136-4817-8b7b-0dfbb2fd4ce0_2438x1568.heic 848w, https://substackcdn.com/image/fetch/$s_!YXeb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1ea794-2136-4817-8b7b-0dfbb2fd4ce0_2438x1568.heic 1272w, https://substackcdn.com/image/fetch/$s_!YXeb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1ea794-2136-4817-8b7b-0dfbb2fd4ce0_2438x1568.heic 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><h1>A Note Before We Start</h1><p>I built this using Claude Code. If you've never used it, here are the install tutorials. PS you need the Pro plan.</p><p>For <a href="https://youtu.be/QsjrBQK0lTg?si=ECsa6uUZd6Ecsgkm">Mac</a><br>For <a href="https://youtu.be/H4zZ1TJtgGs?si=rAiJKJkB03W8gF2N">Windows</a></p><p>You don&#8217;t need to learn to code. Claude Code understands plain English. You&#8217;ll see grey boxes throughout this post. You don&#8217;t read or edit them. You paste them into Claude Code when I tell you to, and Claude Code does the rest.</p><p>You also don&#8217;t have to use every section. There are five (news, social, substack, podcasts, and art). Pick what you want during the setup step below. The post will tell you to skip the agents you didn&#8217;t pick.</p><p>The rest of this post assumes you have Claude Code running.</p><div><hr></div><h1>The Move That Actually Matters</h1><p>I&#8217;ve vibe coded over twenty projects, some for me and some for my clients, so trust me when I say this. Ideate before you build. The order matters more than the prompts.</p><p>I did not start in Claude Code. I started in Claude Design. Before I wrote a single instruction for an agent, I designed what the finished brief would look like. The layout, the typography, the framed art, the section order. Once I knew what I was building toward, the agents almost wrote themselves, because I had a template with empty slots and I just needed to fill them.</p><p>You should do the same. Skip the ideation step (this post is the ideation, the sources and sections and order are already decided). But the design is yours. Open Claude Design and paste this:</p><pre><code><code>I'm building a daily morning brief that will live on a webpage I bookmark on my phone. It pulls from a few sources I care about. [ADD WHAT YOU ACTUALLY CARE ABOUT] Design what this should look like. I want it to feel like a [ADD WHAT YOU WANT IT TO LOOK AND FEEL LIKE]. Each section should feel distinct. Ask me thoughtful questions before you start designing. Show me a draft I can iterate on. Then ask me what I want to change.</code></code></pre><p>The first version will be rough. Iterate. Change the colors. Move the art. Make the headlines bigger. Try a serif. Try a sans. I spent an hour just getting the gold frames around the paintings to look like real frames instead of yellow rectangles. It matters more than you think. This is the thing you&#8217;ll open every morning.</p><p>When you like the design, save the HTML. You&#8217;ll hand it to Claude Code in the next step.</p><div><hr></div><h1>How The Thing Is Organized</h1><p>In Claude Code, you can create something called a <em>skill</em>. It&#8217;s a folder of instructions Claude Code reads whenever you ask it to do a particular kind of task. Think of a skill as a job description you write once and Claude Code refers to every time.</p><p>The morning brief skill is one folder with a handful of files inside it. A main instruction file (the orchestrator, which is the manager), a config file with your preferences, sub-agent files (one per section you chose), and the template file you just designed. The folder lives at <code>~/.claude/skills/</code>, inside a subfolder you'll name during the next step. The squiggle (<code>~</code>) is shorthand for your computer&#8217;s main user folder.</p><p>You&#8217;re not going to build this folder yourself. Claude Code will, in the next step.</p><div><hr></div><h1>Make It Yours</h1><p>This is the most important step. We're going to do the personalization and the setup in one go. By the end, you'll have your folders, your config file, your template, and an orchestrator built around exactly the sections you want.</p><p>Tell Claude Code:</p><pre><code><code>I want to build a daily morning brief. Interview me to set it up.             
                                                                                                                                                                  
  Step 1 &#8212; Understand what I actually need                                                                                                                        
                                                                                                                                                                  
  Before asking about sections or topics, ask me these four questions (one at a time, wait for each answer before continuing):
                                                                                                                                                                  
  1. What problem does this brief solve for you? What would you do differently if you had better information each morning?                                      
  2. What's something you wish you'd known 3 months ago &#8212; a story, a shift, a number &#8212; that you only found out too late?                                          
  3. What's one space adjacent to your work that you're curious about but don't currently follow?                                                                 
  4. When you think about the content you currently read, what feels like noise &#8212; topics that show up but you always skip?                                        
                                                                                                                                                                  
  Use my answers to build a picture of what I actually need signal on. You'll use this to suggest topics in Step 3.                                             
                                                                                                                                                                  
  Step 2 &#8212; Choose sections                                                                                                                                        
                                                                                                                                                                  
  Ask me which sections I want:                                                                                                                                   
  - News &#8212; Google News on topics I follow                                                                                                                         
  - Social &#8212; Reddit and Twitter/X                                                                                                                                 
  - Substack &#8212; newsletters in my Gmail                                                                                                                          
  - Podcasts &#8212; new episodes from shows I follow
  - Art &#8212; a daily painting curator from the Art Institute of Chicago (this is handled automatically in the orchestrator &#8212; no setup needed from me)
                                                                                                                                                                  
  Step 3 &#8212; Interview me on each section I chose                                 
                                                                                                                                                                  
  For News: Based on my answers in Step 1, suggest 8&#8211;10 specific topic strings I could track &#8212; not generic labels like "entrepreneurship" but precise search    
  phrases like "founder case study", "frontier AI startup adoption", "creator economy solo founder". Walk me through each suggestion and explain why you're       
  recommending it based on what I told you. Let me accept, reject, or modify each one. Also ask: how many articles per day (default 6), and max age in hours      
  (default 24).                                                                                                                                                   
                                                                                                                                                                  
  For Social: Ask which subreddits I want. Suggest 4&#8211;6 based on my topics &#8212; include at least one that isn't the obvious choice. For Twitter/X: ask if there are   
  specific accounts I want to track. If I don't have names, suggest 4&#8211;5 handles relevant to my topic mix and explain who they are. Save confirmed handles as a    
  twitter_handles array in config. Ask for max threads (default 5).                                                                                             

  For Substack: Ask if I've connected the Gmail MCP connector in Claude settings. If I haven't, walk me through it: open Claude settings &#8594; Connectors &#8594; Gmail &#8594;   
  authorize. Wait for confirmation. Ask for my Gmail address and whether there are any senders I want to skip (promotional Substack emails, digest roundups,
  etc.).                                                                                                                                                          
                                                                                                                                                                
  For Podcasts: Ask me for show names. Look up the RSS feed URL for each show on the web and save it alongside the show name. If you can't find an RSS feed, tell 
  me and skip it. Do not invent URLs. Ask for max age in hours (default 48).    
                                                                                                                                                                  
  Step 4 &#8212; GitHub and timezone                                                                                                                                  
                                                                                                                                                                  
  Ask for my GitHub username and timezone.                                     
                                                                                                                                                                  
  Step 5 &#8212; HTML template                                                                                                                                        

  Ask me to paste the HTML template I designed. Save it as templates/template.html.                                                                               
                                                                                
  Step 6 &#8212; Create the skill                                                                                                                                       
                                                                                                                                                                
  Ask what to name the skill folder. Validate: no spaces, no slashes, letters/numbers/hyphens/underscores only. If ~/.claude/skills/{name}/ already exists, tell  
  me and ask whether to pick a different name or overwrite.                     
                                                                                                                                                                  
  Create the folder at ~/.claude/skills/{name}/ with three subfolders: agents/, staging/, templates/. Save my HTML at templates/template.html.                  
                                                                                                                                                                  
  Step 7 &#8212; Write config.json            
                                                                                                                                                                  
  Write config.json in the skill root with this shape:                                                                                                            
                                                                                
  {                                                                                                                                                               
    "schedule": { "time": "07:00", "timezone": "America/New_York" },                                                                                            
    "delivery": {                                                                                                                                                 
      "github_pages_url": "https://{username}.github.io/morning-brief/",        
      "github_repo": "{username}/morning-brief",                                                                                                                  
      "github_pat_file": "~/.config/morning-brief/github-pat"                                                                                                   
    },                                                                                                                                                            
    "topics": ["...confirmed topic strings..."],                                
    "news": { "articles_per_run": 6, "max_age_hours": 24 },                                                                                                       
    "social": {                                                                                                                                                 
      "platforms": ["reddit", "twitter"],                                                                                                                         
      "subreddits": ["..."],                                                                                                                                    
      "twitter_handles": ["..."],                                                                                                                                 
      "max_threads": 5                                                                                                                                            
    },                                                                                                                                                            
    "substack": {                                                                                                                                                 
      "gmail_account": "...",                                                                                                                                   
      "max_age_hours": 24,                                                                                                                                        
      "skip_senders": ["reaction@mg1.substack.com", "forum@mg1.substack.com", "no-reply@substack.com"]
    },                                                                                                                                                            
    "podcasts": {                                                                                                                                               
      "feeds": [{ "name": "Show Name", "url": "https://..." }],
      "max_age_hours": 48                                                      
    },                                                                                                                                                            
    "learnings": {                      
      "articles_path": "~/notes/learnings/articles/",                                                                                                             
      "podcasts_path": "~/notes/learnings/podcasts/"                                                                                                              
    }                                                                           
  }                                                                                                                                                               
                                                                                                                                                                
  Step 8 &#8212; Write SKILL.md                                                                                                                                         
                                                                                                                                                                  
  Write SKILL.md in the skill root. It is the orchestrator that runs daily. It must do the following in order:                                                    
                                                                                                                                                                  
  1. Read config.json and today's date in four formats: display (Monday, May 12, 2026), uppercase display, filename (2026-05-12), issue number (No. 12 for the  
  12th).                                                                        
  2. Read the instruction files for each chosen agent, then spawn all of them simultaneously as parallel sub-agents. Each agent writes its output to              
  ./staging/{name}.json. The agents are:                                       
    - agents/news-agent.md &#8594; staging/news.json                                                                                                                    
    - agents/social-agent.md &#8594; staging/social.json                                                                                                              
    - agents/substack-agent.md &#8594; staging/substack.json                                                                                                            
    - agents/podcast-agent.md &#8594; staging/podcast.json                                                                                                              
  3. Art curation (handled directly in the orchestrator &#8212; no separate agent):   
    - Read staging/art-state.json for seen_ids and rotation history                                                                                               
    - Pick today's search term by day-of-month using a 13-term rotation: impressionism, post-impressionism, realism, american scene painting, modernism, landscape
   painting, portrait, still life, romanticism, baroque painting, genre painting, expressionism, urban scene                                                      
    - Fetch from AIC API: https://api.artic.edu/api/v1/artworks/search?q={term}&amp;fields=id,title,artist_display,date_display,medium_display,image_id,description,st
  yle_titles,subject_titles&amp;limit=50&amp;query[term][is_public_domain]=true                                                                                           
    - Filter: image_id must be present and not in seen_ids. Pick&nbsp;4.                                                                                               
    - For each, write 2&#8211;3 sentences grounded only in API data (style_titles, subject_titles, medium_display, description). Do not invent biographical details.    
    - Build image URLs: https://www.artic.edu/iiif/2/{image_id}/full/1600,/0/default.jpg                                                                          
    - Update art-state.json: append today's 4 ids to seen_ids, trim to 120, update history.                                                                       
  4. Read all four staging JSON files.                                                                                                                          
  5. Read templates/template.html. Replace every &lt;!-- INJECT:NAME --&gt; marker with the appropriate content. Never leave any marker unreplaced in the output. Key   
  injections:                                                                                                                                                     
    - INJECT:DATE, INJECT:DATE_UPPER, INJECT:ISSUE_NUMBER, INJECT:TALLY                                                                                           
    - INJECT:COVER_HEADLINE &#8212; 6&#8211;10 word editorial headline across today's themes                                                                                  
    - INJECT:COVER_STAND &#8212; 2&#8211;3 sentence framing of today's edition, under 45 words                                                                                
    - News section: use articles[0] from news.json as the lead; articles[1&#8230;N] as grid cards                                                                       
    - Art: inject 4 artwork URLs, titles, artists, dates, mediums, and curator notes                                                                              
    - Social: sentiment, pullquote (not pull_quote), and threads (not items) from social.json                                                                     
    - Substack: newsletters array from substack.json                                                                                                              
    - Podcast section: inject only if has_episodes is true in podcast.json; omit entirely if false                                                                
    - INJECT:COLOPHON_TALLY, INJECT:COLOPHON_ART, INJECT:YEAR                                                                                                     
  6. Write assembled HTML to staging/morning-brief-YYYY-MM-DD.html. Verify no &lt;!-- INJECT:... --&gt; markers remain before writing.                                  
  7. Push to GitHub Pages via the Contents API (GET the SHA first, then PUT). Also push to archive/YYYY-MM-DD.html. If the PAT file is missing or the API errors, 
  log and continue &#8212; do not abort.                                                                                                                                
  8. Save learnings: write one markdown file per run to learnings.articles_path and (if episodes exist) learnings.podcasts_path.                                  
  9. Print a completion summary: date, live URL, article/newsletter/episode counts, learnings path.                                                               
                                                                                                                                                                  
  Add this rule at the end of SKILL.md: If any agent fails, omit that section from the template and continue. Do not block the brief on one bad fetch.            
                                                                                                                                                                  
  Step 9 &#8212; Show me what we built                                                                                                                                  
                                                                                                                                                                  
  Print the full folder structure so I can see everything that was created.</code></code></pre><p>Claude Code will ask the questions one by one. Answer in plain English. By the end, your folders exist, your config file is written, your template is in place, and your orchestrator is built around exactly the agents you want. If you said you don&#8217;t care about podcasts, there&#8217;s no podcast agent in your orchestrator. If you only want news and art, that&#8217;s all your orchestrator runs.</p><p>Don&#8217;t worry about the format Claude Code uses to show you the folders. It&#8217;ll look like a little tree of file names. If the folders you expected are in there, you&#8217;re good.</p><p>The failure-handling line at the end is doing more work than it looks. The first version of this whole system would crash whenever Reddit was slow to respond, which was often. Now if any one source breaks, the brief just ships without that section. An imperfect brief at 6am beats a perfect brief at noon.</p><p>This is the only part of the build where you&#8217;re talking about yourself instead of pasting. The whole brief reads to <em>you</em>, not to me. So this step is the one that matters most.</p><div><hr></div><h1>The News Agent</h1><p><em><strong>Skip this if you didn&#8217;t pick it during the interview.</strong></em></p><p>This one handles news. It reads Google News for the topics in your config, picks the most relevant ones for a solo founder, writes a short summary of each, and adds two things I find more useful than the summaries themselves. The first is Claude&#8217;s Take, one sharp sentence on what the article actually signals, not just what it says. The second is a content angle, a specific post idea the article suggests, so I can grab it later when I&#8217;m staring at a blank Substack draft.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4Eka!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ea35314-f48d-4c5d-b205-cf82a5cce6dc_2438x1566.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4Eka!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ea35314-f48d-4c5d-b205-cf82a5cce6dc_2438x1566.heic 424w, https://substackcdn.com/image/fetch/$s_!4Eka!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ea35314-f48d-4c5d-b205-cf82a5cce6dc_2438x1566.heic 848w, https://substackcdn.com/image/fetch/$s_!4Eka!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ea35314-f48d-4c5d-b205-cf82a5cce6dc_2438x1566.heic 1272w, https://substackcdn.com/image/fetch/$s_!4Eka!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ea35314-f48d-4c5d-b205-cf82a5cce6dc_2438x1566.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4Eka!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ea35314-f48d-4c5d-b205-cf82a5cce6dc_2438x1566.heic" width="1456" height="935" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0ea35314-f48d-4c5d-b205-cf82a5cce6dc_2438x1566.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:935,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:222643,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://oneplease.substack.com/i/197435341?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ea35314-f48d-4c5d-b205-cf82a5cce6dc_2438x1566.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4Eka!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ea35314-f48d-4c5d-b205-cf82a5cce6dc_2438x1566.heic 424w, https://substackcdn.com/image/fetch/$s_!4Eka!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ea35314-f48d-4c5d-b205-cf82a5cce6dc_2438x1566.heic 848w, https://substackcdn.com/image/fetch/$s_!4Eka!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ea35314-f48d-4c5d-b205-cf82a5cce6dc_2438x1566.heic 1272w, https://substackcdn.com/image/fetch/$s_!4Eka!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ea35314-f48d-4c5d-b205-cf82a5cce6dc_2438x1566.heic 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>Tell Claude Code:</p><pre><code><code>Create a file inside the agents folder, named news-agent.md, with the following contents:

You are the News agent for the Morning Brief.

1. Fetch the Google News RSS feed for each topic listed in
   config.json under "news_topics". Construct URLs like:
   https://news.google.com/rss/search?q={topic}&amp;hl=en-US

2. Dedupe across feeds by URL and by title similarity.

3. For each remaining article, score it 1-5 on relevance to
   "a solo founder building a B2B or prosumer product." 5
   means must-read. 1 means skip.

4. Keep only articles scored 4 or 5. From those, pick ONE lead
   (highest score, breaks ties by recency) and up to 4 secondaries.

5. For each kept article, write:
   - title (rewrite for clarity; do not parrot SEO headlines)
   - summary (2-3 sentences, what happened and why)
   - claude_take (ONE sentence. What does this actually signal,
     not what does it say. Sharp. No hedging.)
   - content_angle (ONE sentence. A specific Substack or
     LinkedIn post premise this article suggests for a solo
     founder to write.)
   - source, url, published_at

6. Write the result to ./staging/news.json with this shape:
   { "lead": {...}, "secondary": [...] }

Do not include articles you scored below 4. A short brief is
better than a padded one.</code></code></pre><p>The Claude's Take field is what makes this read like a real publication instead of a feed reader. Anyone can summarize an article. Naming the signal underneath is the editorial muscle. That one sentence is the reason I read the brief instead of just looking at headlines.</p><div><hr></div><h1>The Social Agent</h1><p><em><strong>Skip this if you didn&#8217;t pick it during the interview.</strong></em></p><p>This one handles Reddit and Twitter. It pulls the threads doing well in your subreddits (above a minimum threshold of upvotes and comments, so dead threads get skipped) and the highest-signal tweets from the accounts you follow. For each one, it writes a short take on the community mood and what it means, not on what the thread is about. It produces a sentiment breakdown (a quick read on whether the founder internet feels positive, neutral, or negative today), and it pulls one sharp anonymous quote as a daily pull quote.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!k_aJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67e8e73c-2733-4a6b-8cfb-f4e36f586d47_2438x1554.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!k_aJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67e8e73c-2733-4a6b-8cfb-f4e36f586d47_2438x1554.heic 424w, https://substackcdn.com/image/fetch/$s_!k_aJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67e8e73c-2733-4a6b-8cfb-f4e36f586d47_2438x1554.heic 848w, https://substackcdn.com/image/fetch/$s_!k_aJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67e8e73c-2733-4a6b-8cfb-f4e36f586d47_2438x1554.heic 1272w, https://substackcdn.com/image/fetch/$s_!k_aJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67e8e73c-2733-4a6b-8cfb-f4e36f586d47_2438x1554.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!k_aJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67e8e73c-2733-4a6b-8cfb-f4e36f586d47_2438x1554.heic" width="1456" height="928" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/67e8e73c-2733-4a6b-8cfb-f4e36f586d47_2438x1554.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:928,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:206177,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://oneplease.substack.com/i/197435341?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67e8e73c-2733-4a6b-8cfb-f4e36f586d47_2438x1554.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!k_aJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67e8e73c-2733-4a6b-8cfb-f4e36f586d47_2438x1554.heic 424w, https://substackcdn.com/image/fetch/$s_!k_aJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67e8e73c-2733-4a6b-8cfb-f4e36f586d47_2438x1554.heic 848w, https://substackcdn.com/image/fetch/$s_!k_aJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67e8e73c-2733-4a6b-8cfb-f4e36f586d47_2438x1554.heic 1272w, https://substackcdn.com/image/fetch/$s_!k_aJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67e8e73c-2733-4a6b-8cfb-f4e36f586d47_2438x1554.heic 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>Tell Claude Code:</p><pre><code><code>Create a file inside the agents folder, named social-agent.md, with the following contents:

You are the Social agent for the Morning Brief.

1. For each subreddit in config.json under "subreddits", fetch
   the top posts from the last 24 hours via:
   https://www.reddit.com/r/{name}/top.json?t=day&amp;limit=15
   Filter to threads with score &gt;= 50 or comments &gt;= 25.

2. For each Twitter handle listed in config.json under
   "twitter_handles", fetch the user's recent tweets (last 24
   hours) using the Twitter MCP connector if available. If no
   connector is set up, fall back to scraping the public
   profile via nitter.net or similar mirror. Filter to tweets
   with likes &gt;= 100 OR retweets &gt;= 25 OR replies &gt;= 20.

3. For each remaining Reddit thread, read the post and top 5
   comments. For each remaining tweet, read the tweet and top
   replies. Then write:
   - title (use the original)
   - source ("reddit/r/{name}" or "twitter/@{handle}")
   - signal (2-3 sentences. NOT what the thread is about. What
     the community mood is, and what that mood means for a
     solo founder paying attention.)
   - url, score, comments

4. Across all items kept, produce a single sentiment object:
   { "positive": int, "neutral": int, "negative": int }
   The three values must sum to 100. Base this on overall
   tone for the day, not any one thread.

5. Pick ONE pull quote from the day's items. A real comment
   or tweet, no more than 30 words, attributed by username.
   Choose for sharpness, not popularity.

6. Write to ./staging/social.json:
   { "sentiment": {...}, "pull_quote": {...}, "items": [...] }

If no items cleared the filters on either source, write
{ "has_content": false } and stop.</code></code></pre><p>The pull quote is my favorite feature. One sharp anonymous voice every morning, sitting under the sentiment bar. It's the thing that makes the brief feel like a person put it together instead of an algorithm.</p><div><hr></div><h1>The Substack Agent</h1><p><em>Skip this if you didn&#8217;t pick it during the interview.</em></p><p>This one reads your actual Gmail. It uses an MCP connector, which is a permission slip you give Claude to talk to another app on your behalf. You&#8217;ll connect Gmail once in your Claude settings, and after that this agent can read newsletters that landed overnight. It writes a short summary of each, pulls out the most useful idea, and suggests a content angle in case you want to write a response later.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uf0B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe857641-7888-4073-a538-6ab7a9470861_2554x1558.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uf0B!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe857641-7888-4073-a538-6ab7a9470861_2554x1558.heic 424w, https://substackcdn.com/image/fetch/$s_!uf0B!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe857641-7888-4073-a538-6ab7a9470861_2554x1558.heic 848w, https://substackcdn.com/image/fetch/$s_!uf0B!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe857641-7888-4073-a538-6ab7a9470861_2554x1558.heic 1272w, https://substackcdn.com/image/fetch/$s_!uf0B!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe857641-7888-4073-a538-6ab7a9470861_2554x1558.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uf0B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe857641-7888-4073-a538-6ab7a9470861_2554x1558.heic" width="1456" height="888" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fe857641-7888-4073-a538-6ab7a9470861_2554x1558.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:888,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:252321,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://oneplease.substack.com/i/197435341?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe857641-7888-4073-a538-6ab7a9470861_2554x1558.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uf0B!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe857641-7888-4073-a538-6ab7a9470861_2554x1558.heic 424w, https://substackcdn.com/image/fetch/$s_!uf0B!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe857641-7888-4073-a538-6ab7a9470861_2554x1558.heic 848w, https://substackcdn.com/image/fetch/$s_!uf0B!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe857641-7888-4073-a538-6ab7a9470861_2554x1558.heic 1272w, https://substackcdn.com/image/fetch/$s_!uf0B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe857641-7888-4073-a538-6ab7a9470861_2554x1558.heic 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>Tell Claude Code:</p><pre><code><code>Create a file inside the agents folder, named substack-agent.md, with the following contents:

You are the Substack agent for the Morning Brief.

1. Use the Gmail MCP connector to search for emails received in
   the last 24 hours from senders listed in config.json under
   "newsletter_senders".

2. For each email, extract the article body (strip the email
   chrome, footers, unsubscribe links). Get the canonical URL
   from the email if present.

3. For each newsletter, write:
   - title (the post title, not the email subject if different)
   - author (sender name, cleaned)
   - summary (3-4 sentences. What the piece argues. Not "the
     author talks about." What they actually claim.)
   - key_insight (ONE sentence. The single most useful idea
     for a solo founder, stated as a takeaway not a quote.)
   - content_angle (ONE sentence. A response, counterpoint, or
     extension a solo founder could write this week.)
   - url, received_at

4. Write to ./staging/substack.json as a list. If nothing came
   in overnight, write [] and stop. An empty Substack section
   is fine. A fake one is not.</code></code></pre><h1>The Podcast Agent</h1><p><em><strong>Skip this if you didn&#8217;t pick it during the interview.</strong></em></p><p>This one checks for new podcast episodes in the last three days from a list of shows in your config. It only keeps episodes that are actually relevant, and for those, it writes a short summary plus a few timestamped key moments so you know what to skip to. If nothing new and good came out, the whole podcast section gets omitted from the brief that day.</p><p>Tell Claude Code:</p><pre><code><code>Create a file inside the agents folder, named podcast-agent.md, with the following contents:

You are the Podcast agent for the Morning Brief.

1. For each show listed in config.json under "podcasts", search
   for episodes published in the last 72 hours. Use the show's
   RSS feed URL from the config.

2. For each new episode, score 1-5 on relevance to a solo
   founder building a B2B or prosumer product. Keep only
   episodes scored 4 or 5.

3. For each kept episode, write:
   - title, show, host, duration, published_at, audio_url
   - summary (3 sentences. What the episode is actually about,
     not the marketing description.)
   - key_moments: a list of up to 3 objects, each:
     { "timestamp": "HH:MM:SS", "note": "what's said here" }

4. Write to ./staging/podcast.json:
   { "has_episodes": true, "episodes": [...] }

   If no episodes cleared the bar, write:
   { "has_episodes": false }

   The orchestrator will omit the Podcast section entirely
   when has_episodes is false. Do not pad.</code></code></pre><p>The podcast agent reads RSS feed URLs from your config. The interview step already looked these up for you when you named your shows, so you shouldn't have to do anything here. If a podcast section never shows up and you think it should, the RSS URL is probably the thing to check first.</p><div><hr></div><h1>The Art Curator</h1><p><em><strong>Skip this if you didn't pick it during the interview. If you change your mind later, paste the prompt below and ask Claude Code to add the curator to your orchestrator.</strong></em></p><p>This is the part I&#8217;m proudest of, and it&#8217;s what turns the brief from a dashboard into something that feels like a magazine.</p><p>Every edition includes four paintings from the Art Institute of Chicago&#8217;s collection. The AIC has a free public image service (no account, no key) that serves high-resolution versions of everything they own. About a hundred thousand works.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ofY4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff07e8112-b17b-4a0f-b63f-0d2211adfc92_2436x1180.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ofY4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff07e8112-b17b-4a0f-b63f-0d2211adfc92_2436x1180.heic 424w, https://substackcdn.com/image/fetch/$s_!ofY4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff07e8112-b17b-4a0f-b63f-0d2211adfc92_2436x1180.heic 848w, https://substackcdn.com/image/fetch/$s_!ofY4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff07e8112-b17b-4a0f-b63f-0d2211adfc92_2436x1180.heic 1272w, https://substackcdn.com/image/fetch/$s_!ofY4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff07e8112-b17b-4a0f-b63f-0d2211adfc92_2436x1180.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ofY4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff07e8112-b17b-4a0f-b63f-0d2211adfc92_2436x1180.heic" width="1456" height="705" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f07e8112-b17b-4a0f-b63f-0d2211adfc92_2436x1180.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:705,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:113327,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://oneplease.substack.com/i/197435341?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff07e8112-b17b-4a0f-b63f-0d2211adfc92_2436x1180.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ofY4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff07e8112-b17b-4a0f-b63f-0d2211adfc92_2436x1180.heic 424w, https://substackcdn.com/image/fetch/$s_!ofY4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff07e8112-b17b-4a0f-b63f-0d2211adfc92_2436x1180.heic 848w, https://substackcdn.com/image/fetch/$s_!ofY4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff07e8112-b17b-4a0f-b63f-0d2211adfc92_2436x1180.heic 1272w, https://substackcdn.com/image/fetch/$s_!ofY4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff07e8112-b17b-4a0f-b63f-0d2211adfc92_2436x1180.heic 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 curator is a sub-agent. Every morning it picks one art movement from a rotating list of thirteen (impressionism, post-impressionism, baroque, urban scene, surrealism, and so on), searches the AIC for that movement, filters out anything that&#8217;s appeared in the last thirty days, and selects four fresh paintings. The next day, a different movement. By day fourteen it&#8217;s cycled through all thirteen and starts over, but with completely different paintings, because the previous set is still on the recently-seen list. Nothing repeats within a month.</p><p>For each painting, the curator writes a short story in a specific voice. The factual base comes from the AIC&#8217;s own metadata (style, museum description, medium, year). The curator can only assert things the data supports. No invented biographies, no fake anecdotes. The story is short, in second person, with a little bite.</p><p>Tell Claude Code:</p><pre><code><code>Create a file inside the agents folder, named art-curator.md, with the following contents:

You are the Art Curator for the Morning Brief.

Your job is to pick 4 fresh paintings from the Art Institute
of Chicago's public collection every day, and write a short
story for each in the voice described below.

1. Read ./staging/art-state.json. It contains:
   - "seen_ids": AIC artwork IDs that have appeared in the
     brief in the last 30 days
   - "movement_rotation": a 13-item list of art movements
     ["impressionism", "post-impressionism", "baroque",
      "urban scene", "surrealism", "japanese woodblock",
      "american modernism", "cubism", "fauvism",
      "abstract expressionism", "renaissance", "romanticism",
      "realism"]
   - "rotation_index": integer 0-12, wraps around

2. Pick today's movement using rotation_index. Search the AIC
   API:
   https://api.artic.edu/api/v1/artworks/search
     ?q={movement}
     &amp;fields=id,title,artist_display,style_titles,
             description,medium_display,date_display,image_id
     &amp;limit=50

3. Filter out:
   - Any artwork whose id appears in seen_ids
   - Any without an image_id
   - Any without an artist_display

4. From the remaining candidates, select 4. Prioritize
   variety (no two works by the same artist) and recognizable
   quality (works with a museum description tend to be the
   majors).

5. For each painting, write:
   - image_id (use directly from the API)
   - title (use the API's title)
   - artist (just the name, no dates)
   - year (from date_display)
   - story: 2-4 sentences, second person, with bite. Use
     style_titles, description, and medium_display as the
     factual base. ONLY assert what the API data supports.
     Do not invent biographical details, prices, or anecdotes.

6. Write the result to ./staging/art.json as a list of 4
   objects.

7. Update ./staging/art-state.json:
   - Append today's 4 ids to seen_ids
   - Drop any ids older than 30 editions
   - Increment rotation_index by 1, wrapping at 13

If the API errors or fewer than 4 candidates clear the filter,
write { "fallback": true } and stop.</code></code></pre><p>The line about not inventing biographies is the one I rewrote the most. The curator is good at writing in voice. It&#8217;s a little too good at inventing context to fit the voice. The first version once told me, confidently, that a 17th-century Dutch painter had been disowned by his family. He had not. He had simply painted a lot of taverns.</p><p>So now the stories are quieter sometimes. But they&#8217;re true.</p><div><hr></div><h1>Publishing It</h1><p>Now for the last step. You need three things to happen: your brief has to live on the internet somewhere, it has to run automatically every morning, and you have to know the URL to bookmark.</p><p>All three happen in one prompt. Claude Code will walk you through the parts you have to click yourself, wait for you to confirm each one, verify it worked, schedule the brief to run at the time you want, and give you the URL at the end.</p><p>Tell Claude Code:</p><pre><code><code>I'm ready to ship my morning brief. Walk me through this one step at a time. Wait for me to confirm each step is done before moving to the next, and verify the result whenever you can. First, help me set up GitHub Pages. Tell me how to create a free GitHub account (if I don't have one), how to make a new public repository called morning-brief, how to turn on GitHub Pages in the repo settings, and how to generate a personal access token with the right permissions. After each click step, ask me to confirm. After I confirm the token, save it to my config.json. Then verify the GitHub repo and Pages are set up correctly by checking the URL. Second, ask me what time I want the brief to run and which timezone I'm in. Convert that into the right cron schedule for UTC and set up a Claude Code remote routine that runs my news-digest skill at that time, every day. Third, run the brief once now as a test so we can confirm the whole pipeline works end to end. If anything fails, tell me what failed and how to fix it. Finally, give me the bookmark URL where my brief will live, and tell me when the next scheduled run is.</code></code></pre><p>That&#8217;s the last thing you have to paste.</p><p>When Claude Code finishes, you&#8217;ll have a URL. Open it on your phone. Bookmark it. Tomorrow morning, when you reach for your coffee, that&#8217;s where you&#8217;ll go.</p><p>If you get stuck on the GitHub part, reply to this email or message me and I&#8217;ll walk you through it.</p><div><hr></div><h1>What I&#8217;d Do Differently</h1><p>I tried to make every section equally important. Same card size, same length, same weight. It read like a feed. The fix was hierarchy. Make the most important thing the biggest and the least important thing the smallest. One lead article gets a drop cap. Four secondary articles sit in a grid below it. The sentiment bar is a thin strip, not a section. Podcasts only show up when there&#8217;s something worth listening to.</p><p>I also included too much. Eight subreddits. Ten newsletters. Six podcasts. The brief got long and I started skimming. So I cut everything in half. I read all of it now. Fewer inputs, sharper outputs.</p><p>The first version had no failure handling. One slow API call would kill the entire 6am run. Now every agent has a quiet contract. If you fail, the brief still ships without your section. Things break. The brief still comes out at 6am.</p><div><hr></div><h1>Ready To Steal</h1><p>My whole system is in this post. Top to bottom. The design step, the interview, the agents you chose, the art curator, the deploy, the schedule. Paste them in order. The interview does the heavy lifting in the middle. By the time you&#8217;re done, you have a bookmark.</p><p>It&#8217;s set up for me. The topics, the subreddits, the senders, the podcasts. The first thing you should do, before anything else, is design your own brief and run the interview. Make it yours. The whole point is that it <em><strong>reads to you, not to me</strong></em>.</p><p>If you build something with this, reply and send me the link. I want to see what your 6am looks like.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://oneplease.substack.com/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">Thanks for reading Table For One! Subscribe for free to receive new posts and support my work.</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></channel></rss>